Tester les assistants conversationnels à l’aide de Direct Line

L’API Direct Line agit comme une interface de communication permettant aux applications clientes d’interagir avec des assistants conversationnels créés avec Copilot Studio. L’API Direct Line facilite la transmission des messages entre l’application cliente et l’assistant via des flux WebSocket ou des requêtes HTTP. Pour les tests de performance, Direct Line permet aux outils de test de charge de reproduire le comportement réel de l’utilisateur, de générer de la charge et de mesurer les temps de réponse.

Communiquez avec Direct Line à l’aide de WebSockets

Vous pouvez déployer des assistants conversationnels créés avec Copilot Studio dans des applications Web soit sous forme d’iFrames intégrés, soit en utilisant un canevas personnalisé. Les deux options de déploiement utilisent la communication WebSocket avec Direct Line. Si vous déployez votre assistant conversationnel dans une application en utilisant l’une de ces méthodes, votre script de test de performance doit utiliser la communication WebSocket pour générer une charge similaire au comportement réel des utilisateurs et mesurer les performances avec un haut degré de confiance.

Les applications clientes qui utilisent Direct Line et la communication WebSocket doivent suivre ce processus :

  1. Pour initier une conversation, une application cliente doit d’abord obtenir un jeton de conversation. Si votre assistant est configuré avec un secret Direct Line, obtenez un jeton en appelant le point de terminaison Direct Line régional. Les jetons pour les assistants n’utilisant pas de clés secrètes peuvent être obtenus à partir du point de terminaison du jeton.
  2. L’application cliente lance une conversation en utilisant le jeton, et reçoit un identifiant de conversation ainsi qu’une URL de flux WebSocket.
  3. Les messages utilisateur sont envoyés en effectuant une requête HTTP POST avec l’identifiant de conversation.
  4. Les messages de l’assistant conversationnel sont reçus via le flux WebSocket.

Capture d’écran montrant le flux de communication Direct Line utilisant WebSockets.

Communiquer avec Direct Line en utilisant HTTP GET

Si votre outil de test de charge ne peut pas utiliser la communication WebSocket, ou si votre application côté client n’utilise pas la communication WebSocket, vous pouvez recevoir des activités en envoyant une requête HTTP GET à la place. Comme indiqué dans le schéma suivant, le flux d’initiation de conversation ne change pas.

Capture d’écran montrant le flux de communication Direct Line utilisant HTTP GET.

Mesurer les temps de réponse

Pour évaluer l’impact de la charge sur l’expérience utilisateur, assurez-vous que vos scripts de test de performance suivent et rapportent le temps de réponse pour les étapes suivantes :

Étape Impact sur l’expérience utilisateur
Générer un jeton Le temps nécessaire pour initier une nouvelle conversation
Démarrer une conversation Le temps nécessaire pour initier une nouvelle conversation
Activité d’envoi Le temps nécessaire pour envoyer un nouveau message utilisateur (n’inclut pas la réponse de l’assistant)
Recevoir des activités / récupérer des activités Le temps nécessaire à un assistant pour répondre

Le suivi des temps de réponse pour la génération de jeton, le démarrage de conversation et l’envoi d’activité est simple pour les outils de test de charge, car ces étapes utilisent des requêtes HTTP standard. Cependant, mesurer le temps nécessaire à un assistant pour répondre aux messages de l’utilisateur est plus complexe, pour les raisons suivantes :

  • L’envoi et la réception d’activités via Direct Line suivent un mode asynchrone. Lorsqu’un message utilisateur est envoyé via une requête Send Activity, la réponse n’est pas un message de l’assistant. En réalité, la réponse confirme simplement que le message utilisateur a été publié avec succès.

  • D’après sa conception, un assistant conversationnel peut renvoyer n’importe quel nombre de messages en réponse à un message utilisateur. Par conséquent, dans la plupart des cas, vous devriez mesurer le temps nécessaire à un assistant pour répondre comme le temps qui s’écoule entre un message utilisateur et le dernier message d’assistant. Dans l’exemple suivant, un seul message utilisateur déclenche trois messages de l’assistant, entrecoupés d’appels API. Chaque message met environ deux secondes à revenir ; cependant, du point de vue de l’utilisateur, il faut six secondes à l’assistant pour répondre à sa demande.

    Capture d’écran montrant le temps de réponse entre les messages.

Identifier la dernière réponse de l’assistant

Pour mesurer le temps qu’un assistant met à compléter ses réponses, votre script de test de performance doit :

  • Identifier le dernier message de l’assistant qui suit un message de l’utilisateur
  • Calculer l’écart entre deux dates

Le protocole sous-jacent utilisé par Copilot Studio n’a pas de concept de « dernière réponse », car les assistants et les utilisateurs peuvent envoyer des messages à tout moment. Par conséquent, votre script de test de performance doit supposer que si l’assistant n’envoie pas de message dans un délai donné, aucun autre message n’est envoyé avant l’envoi du message utilisateur suivant. L’implémentation de cette logique varie selon la façon dont votre script communique avec Direct Line.

Utiliser WebSockets

Lors de la communication avec Direct Line via WebSockets, il faut supposer que l’assistant n’envoie plus aucun message lorsque plus aucune trame ne peut être lue depuis le WebSocket. Vous pouvez voir cela indiqué par un timeout lors d’une tentative de lecture de la trame suivante, bien que le comportement exact dépende de votre implémentation. Pour une implémentation de référence utilisant WebSockets, envisagez d’utiliser HTTP GET.

Utiliser HTTP GET

Les scripts de test de performance utilisant HTTP GET au lieu de WebSockets devraient interroger le point de terminaison Activités pour obtenir l’ensemble complet des messages utilisateur et agent. Lors du sondage, veillez à laisser suffisamment de temps à votre assistant pour répondre. Par exemple, si votre assistant doit appeler une API backend pour répondre à une requête utilisateur, et que l’API prend jusqu’à cinq secondes pour répondre, votre script ne devrait pas interroger le point de terminaison Activities avant que cinq secondes se soient écoulées.

La charge utile simplifiée suivante représente la réponse provenant du point de terminaison Activités :

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

Lorsque vous analysez le payload et calculez les temps de réponse, suivez les directives suivantes :

  • Les messages de l’assistant ont la propriété role: bot, tandis que les messages de l’utilisateur n’ont aucune propriété role.
  • Les messages de l’assistant envoyés en réponse aux messages de l’utilisateur possèdent la propriété replyToId, dont la valeur est celle de la propriété id du message utilisateur.
  • Vous pouvez calculer les temps de réponse de l’assistant en mesurant l’écart entre le message utilisateur et le dernier message de l’assistant qui répond à ce message.