Simule usuarios realistas para evaluar agentes de IA de múltiples turnos en Strands Evals

La evaluación de las interacciones de los agentes en un solo turno sigue un patrón que la mayoría de los equipos comprenden bien. Usted proporciona una entrada, recopila la salida y juzga el resultado. Marcos como Strands Assessment SDK hacen que este proceso sea sistemático a través de evaluadores que evalúan la utilidad, la fidelidad y el uso de las herramientas. En una publicación de blog anterior, cubrimos cómo crear conjuntos de evaluación integrales para agentes de IA que utilizan estas capacidades. Sin embargo, las conversaciones de producción rara vez se detienen en un momento.

Los usuarios reales participan en intercambios que se desarrollan en múltiples turnos. Hacen preguntas de seguimiento cuando las respuestas están incompletas, cambian de dirección cuando surge nueva información y expresan frustración cuando sus necesidades no se satisfacen. Un asistente de viaje que maneja bien "Resérveme un vuelo a París" de forma aislada podría tener dificultades cuando el mismo usuario continúa con "En realidad, ¿podemos mirar trenes?". o "¿Qué pasa con los hoteles cerca de la Torre Eiffel?" Probar estos patrones dinámicos requiere más que casos de prueba estáticos con entradas fijas y salidas esperadas.

La principal dificultad es la escala porque no se pueden llevar a cabo manualmente cientos de conversaciones de varios turnos cada vez que su agente cambia, y escribir flujos de conversación con guiones lo encierra en rutas predeterminadas que pasan por alto cómo se comportan los usuarios reales. Lo que los equipos de evaluación necesitan es una forma de generar usuarios realistas y orientados a objetivos mediante programación y permitirles conversar de forma natural con un agente en múltiples turnos. En esta publicación, exploramos cómo ActorSimulator en Strands Assessments SDK aborda este desafío con una simulación de usuario estructurada que se integra en su proceso de evaluación.

Por qué la evaluación multiturno es fundamentalmente más difícil

La evaluación de un solo turno tiene una estructura sencilla. Los insumos se conocen de antemano, los resultados son autónomos y el contexto de evaluación se limita a ese único intercambio. Las conversaciones de varios turnos rompen cada uno de estos supuestos.

En una interacción de varios turnos, cada mensaje depende de todo lo anterior. La segunda pregunta del usuario depende de cómo el agente respondió a la primera. Una respuesta parcial genera un seguimiento de lo que se omitió, un malentendido lleva al usuario a reformular su solicitud original y una sugerencia sorprendente puede llevar la conversación en una nueva dirección.

Estos comportamientos adaptativos crean rutas de conversación que no se pueden predecir en el momento del diseño de la prueba. Un conjunto de datos estático de pares de E/S, sin importar cuán grande sea, no puede capturar esta calidad dinámica porque el siguiente mensaje de usuario "correcto" depende de lo que acaba de decir el agente.

Las pruebas manuales cubren esta brecha en teoría pero fallan en la práctica. Los evaluadores pueden llevar a cabo conversaciones realistas de varios turnos, pero hacerlo para cada escenario, en cada tipo de persona, después de cada cambio de agente no es sostenible. A medida que crecen las capacidades del agente, la cantidad de rutas de conversación crece de manera combinatoria, mucho más allá de lo que los equipos pueden explorar manualmente.

Algunos equipos recurren a la ingeniería de avisos como un atajo, pidiendo a un modelo de lenguaje grande (LLM) que "actúe como un usuario" durante las pruebas. Sin definiciones estructuradas de personas y un seguimiento explícito de objetivos, estos enfoques producen resultados inconsistentes. El comportamiento del usuario simulado varía entre ejecuciones, lo que dificulta comparar evaluaciones a lo largo del tiempo o identificar regresiones genuinas frente a variaciones aleatorias. Un enfoque estructurado para la simulación de usuarios puede cerrar esta brecha combinando el realismo de la conversación humana con la repetibilidad y escala de las pruebas automatizadas.

¿Qué hace que un buen usuario simulado?

Las pruebas basadas en simulación están bien establecidas en otras disciplinas de la ingeniería. Los simuladores de vuelo prueban las respuestas de los pilotos ante escenarios que serían peligrosos o imposibles de reproducir en el mundo real. Los motores de juegos utilizan agentes impulsados ​​por IA para explorar millones de rutas de comportamiento de los jugadores antes del lanzamiento. El mismo principio se aplica a la IA conversacional. Usted crea un entorno controlado donde actores realistas interactúan con su sistema en condiciones que usted define y luego mide los resultados.

Para la evaluación de agentes de IA, un usuario simulado útil comienza con una persona consistente. Uno que se comporta como un experto técnico en un momento y como un novato confundido en el siguiente produce datos de evaluación poco fiables. Coherencia significa mantener el mismo estilo de comunicación, nivel de experiencia y rasgos de personalidad en cada intercambio, tal como lo haría una persona real.

Igualmente importante es el comportamiento impulsado por objetivos. Los usuarios reales acuden a un agente con algo que quieren lograr. Persisten hasta lograrlo, ajustan su enfoque cuando algo no funciona y reconocen cuando se ha cumplido su objetivo. Sin objetivos explícitos, un usuario simulado tiende a finalizar las conversaciones demasiado pronto o a continuar haciendo preguntas indefinidamente, lo cual no refleja un uso real.

El usuario simulado también debe responder de forma adaptativa a lo que dice el agente, no seguir un guión predeterminado. Cuando el agente hace una pregunta aclaratoria, el actor debe responderla con carácter. Si la respuesta es incompleta, el actor continúa con lo que quedó fuera en lugar de seguir adelante. Si la conversación se desvía del tema, el actor la desvía hacia el objetivo original. Estos comportamientos adaptativos hacen que las conversaciones simuladas sean valiosas como datos de evaluación porque ejercen la misma dinámica de conversación que enfrenta su agente en producción.

Desarrollar la coherencia de la personalidad, el seguimiento de objetivos y el comportamiento adaptativo en un marco de simulación es lo que diferencia la simulación estructurada del usuario de las indicaciones ad hoc. ActorSimulator en Strands Evals está diseñado exactamente en torno a estos principios.

Cómo funciona ActorSimulator

ActorSimulator implementa estas cualidades de simulación a través de un sistema que envuelve un agente de Strands configurado para comportarse como una persona de usuario realista. El proceso comienza con la generación del perfil. Dado un caso de prueba que contiene una consulta de entrada y una descripción de tarea opcional, ActorSimulator utiliza un LLM para crear un perfil de actor completo. Un caso de prueba con información "Necesito ayuda para reservar un vuelo a París" y una descripción de la tarea "Completar la reserva del vuelo dentro del presupuesto" podría producir un viajero preocupado por su presupuesto con experiencia de nivel principiante y un estilo de comunicación informal. La generación de perfiles le da a cada conversación simulada un carácter distinto y consistente.

Con el perfil establecido, el simulador gestiona paso a paso la conversación. Mantiene el historial de conversaciones completo y genera cada respuesta en contexto, manteniendo el comportamiento del usuario simulado alineado con su perfil y objetivos en todo momento. Cuando su agente aborda solo una parte de la solicitud, el usuario simulado naturalmente da seguimiento a las lagunas. Una pregunta aclaratoria de su agente obtiene una respuesta que se mantiene coherente con la persona. La conversación se siente orgánica porque cada respuesta refleja tanto la personalidad del actor como todo lo dicho hasta el momento.

El seguimiento de objetivos se ejecuta junto con la conversación. ActorSimulator incluye una herramienta integrada de evaluación de la consecución de objetivos que el usuario simulado puede invocar para evaluar si se ha cumplido su objetivo original. Cuando se cumple el objetivo o el usuario simulado determina que el agente no puede completar su solicitud, el simulador emite una señal de alto y la conversación finaliza. Si se alcanza el número máximo de turnos antes de alcanzar el objetivo, la conversación también se detiene. Esto le da una señal de que es posible que el agente no esté resolviendo las necesidades de los usuarios de manera eficiente. Este mecanismo garantiza que las conversaciones tengan un final natural en lugar de ejecutarse indefinidamente o interrumpirse arbitrariamente.

Cada respuesta del usuario simulado también incluye un razonamiento estructurado junto con el texto del mensaje. Puede inspeccionar por qué el usuario simulado decidió decir lo que dijo, si estaba dando seguimiento a información faltante, expresando confusión o redirigiendo la conversación. Esta transparencia es valiosa durante el desarrollo de la evaluación porque puede ver el razonamiento detrás de cada giro, lo que hace más sencillo rastrear dónde las conversaciones tienen éxito o se desvían.

Empezando con ActorSimulator

Para comenzar, deberá instalar el SDK de evaluación de Strands mediante: pip install strands-agents-evals. Para una configuración paso a paso, puede consultar nuestra documentación o nuestro blog anterior para obtener más detalles. Poner estos conceptos en práctica requiere un código mínimo. Usted define un caso de prueba con una consulta de entrada y una descripción de la tarea que captura el objetivo del usuario. ActorSimulator maneja automáticamente la generación de perfiles, la gestión de conversaciones y el seguimiento de objetivos.

El siguiente ejemplo evalúa a un agente asistente de viajes a través de una conversación simulada de varios turnos.

from strands import Agente from strands_evals import ActorSimulator, Caso, Experimento # Define tu caso de prueba case = Case( input="Quiero planificar un viaje a Tokio con hotel y actividades", metadata={"task_description": "Paquete de viaje completo organizado"} ) # Crea el agente que deseas evaluar agente = Agente( system_prompt="Eres un asistente de viaje útil.", callback_handler=None ) # Crea un simulador de usuario a partir del caso de prueba user_sim = ActorSimulator.from_case_for_user_simulator( case=case, max_turns=5 ) # Ejecutar la conversación de varios turnos user_message = case.input conversation_history =[]while user_sim.has_next(): # El agente responde al usuario agent_response = agente(user_message) agent_message = str(agent_response) conversation_history.append({ "role": "assistant", "content": agent_message }) # El simulador genera el siguiente mensaje de usuario user_result = user_sim.act(agent_message) user_message = str(user_result.structured_output.message) conversacion_history.append({ "role": "user", "content": user_message }) print(f"Conversación completada en {len(conversation_history) // 2} turnos")

El bucle de conversación continúa hasta que has_next() devuelve False, lo que sucede cuando se cumplen los objetivos del usuario simulado o el usuario simulado determina que el agente no puede completar la solicitud o se alcanza el límite máximo de turnos. El historial de conversación resultante contiene la transcripción completa de varios turnos, lista para su evaluación.

Integración con canales de evaluación

Un bucle de conversación independiente es útil para experimentos rápidos, pero la evaluación de la producción requiere capturar rastros e introducirlos en su proceso de evaluación. El siguiente ejemplo combina ActorSimulator con la colección de telemetría OpenTelemetry y el mapeo de sesiones de Strands Evals. La función de tarea ejecuta una conversación simulada y recopila intervalos de cada turno, luego los asigna a una sesión estructurada para su evaluación.

de opentelemetry.sdk.trace.export importar BatchSpanProcessor de opentelemetry.sdk.trace.export.in_memory_span_exporter importar InMemorySpanExporter de strands importar Agente de strands_evals importar ActorSimulator, Caso, Experimento de strands_evals.evaluators importar UtilidadEvaluador de strands_evals.telemetry importar StrandsEvalsTelemetry de strands_evals.mappers import StrandsInMemorySessionMapper # Configurar telemetría para capturar rastros de agentes telemetría = StrandsEvalsTelemetry() memoria_exporter = InMemorySpanExporter() span_processor = BatchSpanProcessor(memory_exporter) telemetry.tracer_provider.add_span_processor(span_processor) def evaluación_task(caso: Caso) -> dict: # Crear simulador user_sim = ActorSimulator.from_case_for_user_simulator( case=case, max_turns=3 ) # Crear agente agente = Agente( system_prompt="Eres un asistente de viaje útil.", callback_handler=None ) # Acumular intervalos en la conversación all_target_spans =[]user_message = case.input while user_sim.has_next(): Memory_exporter.clear() agent_response = agente(user_message) agent_message = str(agent_response) # Capturar telemetría turn_spans = list(memory_exporter.get_finished_spans()) all_target_spans.extend(turn_spans) # Generar el siguiente mensaje de usuario user_result = user_sim.act(agent_message) user_message = str(user_result.structured_output.message) # Asignar a la sesión para evaluación mapper = StrandsInMemorySessionMapper() session = mapper.map_to_session( all_target_spans, session_id="test-session" ) return {"output": agent_message, "trajectory": session} # Crear conjunto de datos de evaluación test_cases = [ Case( name="booking-simple", input="Necesito reservar un vuelo a París la próxima semana", metadata={ "category": "booking", "task_description": "Reserva de vuelo confirmada" } ) ] evaluador = HelpnessEvaluator() dataset = Experiment(cases=test_cases, evaluador=evaluator) # Ejecutar informe de evaluaciones = Experiment.run_evaluaciones(evaluación_task) informe.run_display()

Este enfoque captura rastros completos del comportamiento de su agente a lo largo de los turnos de conversación. Los intervalos incluyen llamadas a herramientas, invocaciones de modelos e información de tiempo para cada turno de la conversación simulada. Al mapear estos intervalos en una sesión estructurada, la interacción completa de múltiples turnos está disponible para evaluadores como GoalSuccessRateEvaluator y HelpnessEvaluator, que luego pueden evaluar la conversación como un todo, en lugar de turnos aislados.

Perfiles de actores personalizados para pruebas específicas

La generación automática de perfiles cubre bien la mayoría de los escenarios de evaluación, pero algunos objetivos de prueba requieren personas específicas. Es posible que desee verificar que su agente maneja a un usuario experto impaciente de manera diferente que a un paciente principiante, o que responde adecuadamente a un usuario con necesidades específicas de un dominio. Para estos casos, ActorSimulator acepta un perfil de actor completamente definido que usted controla.

de strands_evals.types.simulation import ActorProfile de strands_evals import ActorSimulator de strands_evals.simulation.prompt_templates.actor_system_prompt import ( DEFAULT_USER_SIMULATOR_PROMPT_TEMPLATE ) # Definir un perfil de actor personalizado actor_profile = ActorProfile( traces={ "personality": "analítico y orientado a los detalles", "communication_style": "direct and técnico", "expertise_level": "expert", "patience_level": "low" }, context="Viajero de negocios experimentado con estatus de élite que valora la eficiencia", actor_goal="Reserve un vuelo en clase ejecutiva con preferencias de asiento específicas y acceso a sala VIP" ) # Inicialice el simulador con un perfil personalizado user_sim = ActorSimulator( actor_profile=actor_profile, inicial_query="Necesito reservar un vuelo en clase ejecutiva a Londres el próximo martes", system_prompt_template=DEFAULT_USER_SIMULATOR_PROMPT_TEMPLATE, max_turns=10)

Al definir rasgos como el nivel de paciencia, el estilo de comunicación y la experiencia, puede probar sistemáticamente el desempeño de su agente en diferentes segmentos de usuarios. Un agente que obtiene una buena puntuación entre los usuarios pacientes y no técnicos, pero una mala puntuación entre los expertos impacientes, revela una brecha de calidad específica que se puede abordar. Ejecutar el mismo objetivo en múltiples configuraciones de personas convierte la simulación de usuario en una herramienta para comprender las fortalezas y debilidades de su agente por tipo de usuario.

Mejores prácticas para la evaluación basada en simulación

Estas mejores prácticas le ayudarán a aprovechar al máximo la evaluación basada en simulación:

Establezca max_turns según la complejidad de la tarea, utilizando 3-5 para tareas enfocadas y 8-10 para flujos de trabajo de varios pasos. Si la mayoría de las conversaciones llegan al límite sin completar el objetivo, auméntalo. Escriba descripciones de tareas específicas que el simulador pueda evaluar. "Ayudar al usuario a reservar un vuelo" es demasiado vago para juzgar su finalización de forma fiable, mientras que "reserva de vuelo confirmada con fechas, destino y precio" ofrece un objetivo concreto. Utilice perfiles generados automáticamente para una amplia cobertura entre tipos de usuarios y perfiles personalizados para reproducir patrones específicos de sus registros de producción, como un experto impaciente o un usuario nuevo. Concéntrese en los patrones de su conjunto de pruebas en lugar de en las transcripciones individuales. Las redirecciones constantes del usuario simulado sugieren que el agente se está desviando del tema, y ​​la disminución de las tasas de cumplimiento de objetivos después de un cambio de agente apunta a una regresión. Comience con un pequeño conjunto de casos de prueba que cubran sus escenarios más comunes y amplíelo a casos extremos y personas adicionales a medida que madure su práctica de evaluación.

Conclusión

Mostramos cómo ActorSimulator en Strands Evals permite una evaluación sistemática y de múltiples turnos de agentes de IA conversacionales a través de una simulación de usuario realista. En lugar de depender de casos de prueba estáticos que capturan solo intercambios únicos, puede definir objetivos y personas y permitir que los usuarios simulados interactúen con su agente a través de conversaciones naturales y adaptables. Las transcripciones resultantes se introducen directamente en el mismo proceso de evaluación que utiliza para las pruebas de un solo turno, brindándole puntuaciones de utilidad, tasas de éxito de objetivos y seguimientos detallados en cada turno de conversación.

Para comenzar, explore los ejemplos de trabajo en el repositorio de muestras de Strands Agents. Para los equipos que evalúan agentes implementados a través de Amazon Bedrock AgentCore, el siguiente ejemplo de evaluaciones de AgentCore demuestra cómo simular interacciones con agentes implementados. Comience con un puñado de casos de prueba que representen sus escenarios de usuario más comunes, ejecútelos a través de ActorSimulator y evalúe los resultados. A medida que madure su práctica de evaluación, amplíela para cubrir más personas, casos extremos y patrones de conversación.

Sobre los autores

Ishan Singh

Ishan es científico aplicado sénior en Amazon Web Services, donde ayuda a los clientes a crear soluciones y productos de IA generativa innovadores y responsables. Con una sólida experiencia en IA/ML, Ishan se especializa en la creación de soluciones de IA generativa que impulsan el valor empresarial. Fuera del trabajo, le gusta jugar voleibol, explorar senderos para bicicletas locales y pasar tiempo con su esposa y su perro, Beau.

Jonathan Buck

Jonathan es ingeniero de software sénior en Amazon Web Services. Su trabajo se centra en la creación de entornos de agentes, evaluación e infraestructura posterior a la capacitación para respaldar la productización de sistemas de agentes.

Vinayak Arannil

Vinayak es un científico aplicado sénior del equipo de Amazon Bedrock AgentCore. Con varios años de experiencia, ha trabajado en varios dominios de la IA, como visión por computadora, procesamiento del lenguaje natural, sistemas de recomendación, etc. Actualmente, Vinayak ayuda a desarrollar nuevas capacidades en AgentCore y Strands, lo que permite a los clientes evaluar sus aplicaciones Agentic con facilidad, precisión y eficiencia.

Abhishek Kumar

Abhishek es científico aplicado en AWS y trabaja en la intersección de la inteligencia artificial y el aprendizaje automático, centrándose en la observabilidad, simulación y evaluación de agentes. Sus principales intereses de investigación se centran en los sistemas conversacionales agentes. Antes de ocupar su puesto actual, Abhishek pasó dos años en Alexa, Amazon, donde contribuyó a crear y entrenar modelos que impulsaron las capacidades principales de Alexa.