Test degli agenti conversazionali con Direct Line

L'L'API Direct Line funge da interfaccia di comunicazione tra applicazioni client e agenti conversazionali sviluppati con Copilot Studio. L'API Direct Line facilita la trasmissione di messaggi tra l'applicazione client e l'agente tramite flussi WebSocket o richieste HTTP. Per i test delle prestazioni, Direct Line consente agli strumenti di test di carico di riprodurre il comportamento degli utenti, generare carico e misurare i tempi di risposta.

Comunicare con Direct Line utilizzando WebSocket

È possibile distribuire agenti conversazionali creati con Copilot Studio nelle applicazioni web come iFrame incorporati oppure mediante un canvas personalizzato. Entrambe le opzioni di distribuzione utilizzano la comunicazione WebSocket con Direct Line. Se distribuisci il tuo agente conversazionale in un'app utilizzando uno di questi metodi, il tuo script di test delle prestazioni dovrebbe utilizzare la comunicazione WebSocket per simulare un carico che riproduca il comportamento reale degli utenti e misurare le prestazioni con un alto livello di affidabilità.

Le applicazioni client che utilizzano la comunicazione Direct Line e WebSocket dovrebbero seguire questo flusso:

  1. Per avviare una conversazione, un'applicazione client deve prima ottenere un token di conversazione. Se l'agente è configurato con un segreto Direct Line, ottieni un token tramite l'endpoint regionale Direct Line. I token per gli agenti che non utilizzano segreti possono essere ottenuti dall'endpoint del token.
  2. L'applicazione client avvia una conversazione utilizzando il token e riceve un ID della conversazione e un URL di flusso WebSocket.
  3. I messaggi utente vengono inviati inviando una richiesta HTTP POST con l'ID della conversazione.
  4. I messaggi dall'agente conversazionale vengono ricevuti tramite il flusso WebSocket.

Screenshot del flusso della comunicazione Direct Line tramite WebSocket.

Comunicare con Direct Line utilizzando HTTP GET

Se il tuo strumento di test di carico non può usare la comunicazione WebSocket o se la tua applicazione rivolta al client non utilizza la comunicazione WebSocket, puoi ricevere attività inviando HTTP GET invece. Come mostrato nel diagramma seguente, il flusso di avvio della conversazione non cambia.

Screenshot che mostra il flusso della comunicazione Direct Line tramite HTTP GET.

Misurare i tempi di risposta

Per valutare come il carico influisce sull'esperienza utente, assicurati che i tuoi script di test delle prestazioni monitorino e riportino i tempi di risposta per i seguenti passaggi:

Procedi Impatto sull'esperienza utente
Generare token Il tempo necessario per iniziare una nuova conversazione
Avvia conversazione Il tempo necessario per iniziare una nuova conversazione
Invia attività Il tempo necessario per inviare un nuovo messaggio utente (non include la risposta dell'agente)
Ricevi attività/Ottieni attività Il tempo che impiega un agente a fornire una risposta

Il monitoraggio dei tempi di risposta per Genera token, Avvia conversazione e Invia attività è semplice per gli strumenti di test di carico, poiché questi passaggi utilizzano richieste HTTP standard. Tuttavia, misurare il tempo che impiega un agente a rispondere ai messaggi degli utenti è più complesso, per i seguenti motivi:

  • L’invio e la ricezione di attività tramite Direct Line seguono un modello asincrono. Quando un messaggio utente viene inviato tramite una richiesta Invia attività, la risposta non è un messaggio dell'agente. Invece, si limita a confermare che il messaggio utente è stato inviato con successo.

  • In base alla sua progettazione, un agente conversazionale può inviare un numero qualsiasi di messaggi in risposta a un messaggio utente. Di norma, il tempo di risposta dell'agente dovrebbe essere misurato come l'intervallo che intercorre tra un messaggio dell'utente e l'ultimo messaggio dell'agente. Nel seguente esempio, un singolo messaggio dell'utente provoca l'invio di tre messaggi dell'agente, intervallati da chiamate API. Ogni messaggio impiega circa due secondi per arrivare; tuttavia, dal punto di vista dell'utente, l'agente impiega sei secondi per rispondere alla sua richiesta.

    Uno screenshot che mostra il tempo di risposta tra i messaggi.

Identificare l'ultima risposta dell'agente

Per misurare il tempo che impiega un agente a completare le risposte, il tuo script di test delle prestazioni deve:

  • Identifica l'ultimo messaggio dell'agente che segue un messaggio utente
  • Calcolare la differenza di tempo tra le due date

Il protocollo sottostante utilizzato da Copilot Studio non prevede il concetto di "ultima risposta", poiché sia gli agenti che gli utenti possono inviare messaggi in qualsiasi momento. Pertanto, il tuo script di test delle prestazioni deve assumere che, se l'agente non invia un messaggio entro un determinato intervallo di tempo, non verrà inviato alcun messaggio fino al prossimo messaggio dell'utente. L'implementazione di questa logica varia in base a come il tuo script comunica con Direct Line.

Usare WebSocket

Quando comunichi con Direct Line tramite WebSocket, presumi che l'agente non invii più messaggi quando non si possono leggere più frame dai WebSocket. Potresti riscontrare un timeout durante il tentativo di lettura del frame successivo, anche se il comportamento esatto dipende dalla tua implementazione. Per un'implementazione di riferimento che utilizza WebSocket, considera l'uso di HTTP GET.

Utilizzare HTTP GET

Gli script di test delle prestazioni che utilizzano HTTP GET invece dei WebSocket dovrebbero interrogare l'endpoint Attività per ottenere tutti i messaggi utente e agente. Quando esegui il polling, assicurati di lasciare tempo sufficiente affinché il tuo agente possa rispondere. Ad esempio, se il tuo agente deve chiamare un'API backend per rispondere a una query dell'utente e l'API impiega fino a cinque secondi per rispondere, il tuo script non dovrebbe eseguire il polling dell'endpoint Attività fino a quando non sono passati cinque secondi.

Il seguente payload semplificato rappresenta la risposta proveniente dall'endpoint Attività.

[
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000012",
    "timestamp": "2025-01-07T09:12:22.0329242Z",
    "from": {
      "id": "a688eb7d-092a-42a8-8ef5-73123b9c2aaa",
      "name": ""
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "I also want to set up a new account",
  },
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000017",
    "timestamp": "2025-01-07T09:12:24.5478686Z",
    "from": {
      "id": "4b56bfa5-5574-5bb3-7aa3-99b8798b9d90",
      "name": "Load Testing",
      "role": "bot"
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "Sure, please bear with me as I set up your new account",
    "replyToId": "98SryQaHr2rGthOGpChPK2-us|0000012",
  },
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000018",
    "timestamp": "2025-01-07T09:12:33.1960413Z",
    "from": {
      "id": "4b56bfa5-5574-5bb3-7aa3-99b8798b9d90",
      "name": "Load Testing",
      "role": "bot"
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "Almost done! Thank you for your patience",
    "replyToId": "98SryQaHr2rGthOGpChPK2-us|0000012",
  },
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000019",
    "timestamp": "2025-01-07T09:12:41.9166159Z",
    "from": {
      "id": "4b56bfa5-5574-5bb3-7aa3-99b8798b9d90",
      "name": "Load Testing",
      "role": "bot"
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "All done! Your new account is now active.",
    "inputHint": "acceptingInput",
    "replyToId": "98SryQaHr2rGthOGpChPK2-us|0000012"
  }
]

Quando analizzi il payload e calcoli i tempi di risposta, segui queste linee guida:

  • I messaggi dell'agente includono la proprietà role: bot, mentre i messaggi dell'utente non includono la proprietà role.
  • I messaggi dell'agente inviati in risposta ai messaggi dell'utente hanno la proprietà replyToId, il cui valore è quello della proprietà id del messaggio dell'utente.
  • Puoi calcolare i tempi di risposta dell'agente come la differenza di tempo tra il messaggio dell'utente e l'ultimo messaggio dell'agente che risponde al messaggio dell'utente.