Freigeben über


Testen Sie konversationelle Agenten mit Direct Line

Die Direct Line API fungiert als Kommunikationsschnittstelle für Client-Anwendungen, um mit konversationellen Agenten zu interagieren, die mit Copilot Studio entwickelt wurden. Die Direct Line API erleichtert die Übertragung von Nachrichten zwischen der Client-Anwendung und dem Agenten entweder über WebSocket-Streams oder HTTP-Anfragen. Für Leistungstests ermöglicht Direct Line Lasttest-Tools, um tatsächliches Benutzerverhalten zu replizieren, Lasten zu generieren und Antwortzeiten zu messen.

Kommunikation mit der Direktleitung über WebSockets

Konversationsagenten, die mit Copilot Studio entwickelt wurden, werden entweder als eingebettete iframes oder über eine benutzerdefinierte Leinwand in Webanwendungen bereitgestellt. Beide Bereitstellungsoptionen nutzen WebSocket-Kommunikation mit Direct Line. Wenn Ihr Conversational Agent mit einer dieser Methoden auf eine Anwendung eingesetzt wird, sollte Ihr Performance-Test-Skript WebSocket-Kommunikation nutzen, um eine Last zu erzeugen, die dem echten Nutzerverhalten ähnelt, und die Leistung mit hoher Sicherheit zu messen.

Client-Anwendungen, die Direct Line und WebSocket-Kommunikation nutzen, sollten diesem Ablauf folgen:

  1. Um eine Konversation zu initiieren, muss eine Client-Anwendung zunächst ein Konversationstoken erhalten. Wenn Ihr Agent mit einem Direct Line Secret konfiguriert ist, erhalten Sie ein Token, indem Sie den Direct Line regionalen Endpunkt aufrufen. Token für Agenten, die keine Geheimnisse verwenden, können vom Token-Endpunkt bezogen werden.
  2. Die Client-Anwendung startet eine Konserverung mit dem Token und erhält eine Konversations-ID sowie eine WebSocket-Stream-URL.
  3. Benutzernachrichten werden gesendet, indem eine HTTP-POST-Anfrage mit der Conversation-ID gesendet wird.
  4. Nachrichten des konversationellen Agenten werden über den WebSocket-Stream empfangen.

Screenshot, der den Fluss der Direktleitungskommunikation mit WebSockets zeigt.

Kommunizieren Sie mit der Direktleitung über HTTP GET

Wenn Ihr Lasttest-Tool keine WebSocket-Kommunikation nutzen kann oder Ihre klientorientierte Anwendung keine WebSocket-Kommunikation nutzt, können Sie Aktivitäten erhalten, indem Sie stattdessen HTTP GET senden . Wie im folgenden Diagramm gezeigt, ändert sich der Ablauf der Gesprächsinitiierung nicht.

Screenshot, der den Fluss der Direktverbindung mit HTTP GET zeigt.

Messen Sie die Reaktionszeiten

Um zu bewerten, wie sich die Belastung auf die Nutzererfahrung auswirkt, stellen Sie sicher, dass Performance-Testskripte die Antwortzeit für die folgenden Schritte verfolgen und berichten:

Schritt Auswirkungen auf die Nutzererfahrung
Token generieren Die Zeit, die es dauert, ein neues Gespräch zu beginnen
Starte ein Gespräch Die Zeit, die es dauert, ein neues Gespräch zu beginnen
Aktivität senden Die Zeit, die es dauert, eine Nachricht für einen neuen Nutzer zu senden (ohne die Antwort des Agenten)
Aktivitäten erhalten/Aktivitäten erhalten Die Zeit, die ein Agent braucht, um zu antworten

Die Nachverfolgung der Antwortzeiten für Token generieren, Konversation starten und Senden ist für Lasttest-Tools unkompliziert, da diese Schritte Standard-HTTP-Anfragen verwenden. Die Messung der Zeit, die ein Agent benötigt, um auf Nutzernachrichten zu reagieren, ist jedoch aus folgenden Gründen komplexer:

  • Das Senden und Empfangen von Aktivitäten über Direct Line folgt einem asynchronen Muster. Wenn eine Benutzernachricht mit einer Aktivität senden-Anfrage gesendet wird, ist die Antwort keine Nachricht vom Agenten. Stattdessen bestätigt es lediglich, dass die Nutzernachricht erfolgreich gepostet wurde.

  • Basierend auf seinem Design könnte ein Konversationsagent beliebig viele Nachrichten als Antwort auf eine Benutzernachricht zurücksenden. Daher sollten Sie in den meisten Fällen die Zeit, die ein Agent benötigt, um zu antworten, als die Zeit messen, die zwischen einer Benutzernachricht und der letzten Agentennachricht vergeht. Im folgenden Beispiel löst eine einzelne Benutzernachricht drei Agenten-Nachrichten aus, wobei API-Aufrufe dazwischen laufen. Jede Nachricht benötigt etwa zwei Sekunden, um zurückzukommen; Aus Sicht des Nutzers benötigt der Agent jedoch sechs Sekunden, um auf die Anfrage des Nutzers zu reagieren.

    Screenshot, der die Antwortzeit zwischen den Nachrichten zeigt.

Identifizieren Sie die letzte Reaktion des Agenten

Um die Zeit zu messen, die ein Agent benötigt, um seine Antworten abzuschließen, muss Ihr Performance-Test-Skript:

  • Identifizieren Sie die letzte Agentennachricht, die auf eine Benutzernachricht folgt
  • Berechnen Sie den Zeitunterschied zwischen den beiden

Das zugrundeliegende Protokoll, das Copilot Studio verwendet, hat kein Konzept einer "letzten Antwort", da sowohl Agenten als auch Nutzer jederzeit Nachrichten senden können. Daher muss dein Performance-Test-Skript davon ausgehen, dass, wenn der Agent innerhalb eines bestimmten Zeitrahmens keine Nachricht sendet, keine weiteren Nachrichten gesendet werden, bis die nächste Benutzernachricht gesendet wird. Die Umsetzung dieser Logik variiert je nachdem, wie dein Skript mit Direct Line kommuniziert.

Verwenden Sie WebSockets

Bei der Kommunikation mit Direct Line über WebSockets wird davon ausgegangen, dass der Agent keine weiteren Nachrichten sendet, wenn keine weiteren Frames vom WebSocket gelesen werden können. Man kann sehen, dass dies durch eine Auszeit angezeigt wird, wenn man versucht, den nächsten Frame zu lesen, wobei das genaue Verhalten jedoch von deiner Implementierung abhängt. Für eine Referenzimplementierung, die WebSockets verwendet, sollten Sie HTTP GET verwenden.

Verwende HTTP GET

Leistungstestskripte, die HTTP GET statt WebSockets verwenden, sollten den Activitys-Endpunkt abfragen, um die gesamte Menge an Benutzer- und Agentennachrichten zu erhalten. Stellen Sie bei der Umfrage sicher, dass Ihr Makler genügend Zeit zur Antwort einräumt. Wenn Ihr Agent zum Beispiel eine Backend-API aufrufen muss, um auf eine Benutzeranfrage zu antworten, und die API bis zu 5 Sekunden benötigt, sollte Ihr Skript den Activitys-Endpunkt erst nach 5 Sekunden abfragen.

Die folgende vereinfachte Nutzlast stellt die Antwort dar, die vom Aktivitäten-Endpunkt zurückkommt:

[
  {
    "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"
  }
]

Wenn Sie die Nutzlast analysieren und die Antwortzeiten berechnen, beachten Sie die folgenden Richtlinien:

  • Nachrichten vom Agenten haben die Eigenschaft role: bot, während Nachrichten vom Benutzer keine Eigenschaft role besitzen.
  • Agentennachrichten, die als Antwort auf Benutzernachrichten gesendet werden, besitzen die Eigenschaft replyToId, die einen Wert der id Eigenschaft der Benutzernachricht hat.
  • Du kannst die Antwortzeiten des Agenten als Zeitunterschied zwischen der Benutzernachricht und der letzten Agentennachricht berechnen, die auf die Benutzernachricht antwortet.