Probar agentes conversacionales usando Direct Line

La API Direct Line actúa como interfaz de comunicación para que las aplicaciones cliente interactúen con agentes conversacionales creados con Copilot Studio. La API Direct Line facilita la transmisión de mensajes entre la aplicación cliente y el agente a través de secuencias WebSocket o solicitudes HTTP. Para las pruebas de rendimiento, Direct Line permite que las herramientas de pruebas de carga repliquen el comportamiento real del usuario, generen carga y midan los tiempos de respuesta.

Comunicación con Direct Line mediante WebSockets

Puede implementar agentes conversacionales creados con Copilot Studio en aplicaciones web como iFrame embebidos o mediante un lienzo personalizado. Ambas opciones de despliegue utilizan comunicación WebSocket con Direct Line. Si despliega su agente conversacional en una aplicación utilizando uno de estos métodos, el script de prueba de rendimiento debe emplear comunicación WebSocket para generar una carga que se asemeje al comportamiento real del usuario y medir el rendimiento con un alto grado de confianza.

Las aplicaciones cliente que usan Direct Line y comunicación por WebSocket deben seguir este flujo:

  1. Para iniciar una conversación, una aplicación cliente debe primero obtener un token de conversación. Si el agente está configurado con un secreto Direct Line, obtenga un token llamando al punto de conexión regional Direct Line. Los tokens para agentes que no utilizan secretos se pueden obtener desde el punto de conexión del token.
  2. La aplicación cliente inicia una conversación utilizando el token y recibe un ID de conversación y una URL de flujo WebSocket.
  3. Los mensajes de usuario se envían mediante una solicitud HTTP POST con el ID de conversación.
  4. Los mensajes del agente conversacional se reciben a través del flujo WebSocket de Direct Line.

Captura de pantalla que muestra el flujo de comunicación de Direct Line usando WebSockets.

Comunicarse con Direct Line usando HTTP GET

Si tu herramienta de pruebas de carga no puede usar comunicación WebSocket, o si tu aplicación cliente no utiliza comunicación WebSocket, puedes recibir actividades mediante enviando HTTP GET en su lugar. Como se muestra en el siguiente diagrama, el flujo de inicio de conversación no cambia.

Captura de pantalla que muestra el flujo de comunicación de Direct Line usando HTTP GET.

Medir los tiempos de respuesta

Para evaluar cómo la carga afecta la experiencia del usuario, asegúrese de que sus scripts de prueba de rendimiento rastreen e informen el tiempo de respuesta para los siguientes pasos:

Paso Impacto sobre la experiencia de usuario
Generar token El tiempo que tarda en iniciar una nueva conversación
Iniciar conversación El tiempo que tarda en iniciar una nueva conversación
Enviar actividad El tiempo que tarda en enviar un mensaje de usuario nuevo (no incluye la respuesta del agente)
Recibir actividades/Obtener actividades El tiempo que tarda un agente en responder

Rastrear los tiempos de respuesta para Generate Token, Start Conversation y Send Activity es sencillo para las herramientas de prueba de carga, ya que estos pasos utilizan solicitudes HTTP estándar. Sin embargo, medir el tiempo que tarda un agente en responder a los mensajes de usuario es más complejo, debido a las siguientes razones:

  • El envío y la recepción de actividades a través de Direct Line siguen un patrón asincrónico. Cuando se envía un mensaje de usuario mediante una solicitud de Enviar Actividad, la respuesta no es un mensaje del agente. En cambio, simplemente confirma que el mensaje del usuario ha sido publicado correctamente.

  • Según su diseño, un agente conversacional podría enviar cualquier cantidad de mensajes en respuesta a un mensaje del usuario. Por lo tanto, en la mayoría de los casos, deberías medir el tiempo que tarda un agente en responder como el tiempo que transcurre desde un mensaje de usuario hasta el último mensaje del agente. En el siguiente ejemplo, un solo mensaje de usuario activa tres mensajes de agente, con llamadas a la API ejecutándose entre ellos. Cada mensaje tarda aproximadamente dos segundos en llegar; sin embargo, desde la perspectiva del usuario, el agente tarda seis segundos en responder a la solicitud del usuario.

    Captura de pantalla que muestra el tiempo de respuesta entre mensajes.

Identifica la última respuesta del agente

Para medir el tiempo que tarda el agente en completar sus respuestas, tu script de pruebas de rendimiento necesita:

  • Identifica el último mensaje del agente que sigue a un mensaje de usuario
  • Calcule la diferencia de tiempo entre las dos

El protocolo subyacente que utiliza Copilot Studio no tiene un concepto de 'última respuesta', ya que tanto agentes como usuarios pueden enviar mensajes en cualquier momento. Por lo tanto, tu script de pruebas de rendimiento debe asumir que si el agente no envía un mensaje dentro de un plazo determinado, no se envían más mensajes hasta que se envíe el siguiente mensaje de usuario. La implementación de esta lógica varía según cómo tu script se comunique con Direct Line.

Utilizar WebSockets

Al comunicarse con Direct Line sobre WebSockets, supongamos que el agente no envía más mensajes cuando no se pueden leer más marcos desde WebSocket. Puede que esto se indique con un tiempo de espera al intentar leer el siguiente marco, aunque el comportamiento exacto depende de su implementación. Para una implementación de referencia que utilice WebSockets, considera utilizar HTTP GET.

Usar HTTP GET

Los scripts de pruebas de rendimiento que utilizan HTTP GET en lugar de WebSockets deben consultar el punto de conexión Actividades para obtener el conjunto completo de mensajes de usuario y agente. Al hacer polling, asegúrate de proporcionar suficiente tiempo para que tu agente responda. Por ejemplo, si tu agente debe llamar a una API de backend para responder a una consulta del usuario y la API puede tardar hasta cinco segundos en responder, tu script no debe consultar el punto de conexión de Actividades hasta que hayan transcurrido cinco segundos.

La siguiente carga útil simplificada representa la respuesta que recibe el punto de conexión de Actividades:

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

Al analizar la carga útil y calcular los tiempos de respuesta, ten en cuenta las siguientes pautas:

  • Los mensajes del agente tienen la propiedad role: bot, mientras que los mensajes del usuario no tienen ninguna propiedad role.
  • Los mensajes del agente enviados en respuesta a mensajes del usuario tienen la propiedad replyToId, que toma el valor de la propiedad id del mensaje de usuario.
  • Puedes calcular los tiempos de respuesta del agente como la diferencia entre el momento en que se envió el mensaje del usuario y el momento en que se envió el último mensaje del agente que responde a ese mensaje.