Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Simulación de usuario
La simulación de usuarios utiliza a un LLM-backed actor para que desempeñe el papel de un usuario final que interactúa con su agente. Tú defines el perfil y el objetivo del actor, y este mantiene una conversación de varios turnos con tu agente hasta que se alcanza el objetivo o se alcanza el límite de turnos.
nota
La simulación de usuario invoca modelos de Amazon Bedrock del lado del SDK para generar las respuestas del actor. A estas llamadas se les aplican las tarifas de invocación estándar del modelo Amazon Bedrock. Para obtener más información, consulte la página de AgentCore precios.
Esto es útil cuando quieres:
-
Haz una prueba con variaciones realistas: el actor genera diferentes frases, preguntas de seguimiento y rutas de conversación en cada tirada, lo que expone casos extremos que los escenarios creados a mano no tienen en cuenta.
-
Evalúe las conversaciones abiertas: en el caso de los agentes que gestionan diálogos de formato libre (atención al cliente, tutoría, asesoramiento), los escenarios simulados reflejan mejor el comportamiento real de los usuarios que las secuencias por turnos fijos.
-
Amplíe la cobertura de los escenarios: en lugar de escribir a mano docenas de guiones de varios turnos, defina perfiles de actores con diferentes personajes y objetivos y deje que el actor genere las conversaciones.
-
Prueba de regresión con diversidad: ejecuta el mismo perfil de actor varias veces para comprobar que tu agente maneja expresiones variadas con la misma intención.
La simulación de usuarios funciona tanto con los ejecutores de conjuntos de datos por lotes como bajo demanda.
Funcionamiento
El ejecutor procesa cada escenario simulado a través de un ciclo de conversación:
-
Inicio: el corredor envía el
inputcampo del escenario a tu agente en el primer turno. -
El agente responde: el agente procesa la entrada y devuelve una respuesta.
-
El actor evalúa: el LLM-backed actor recibe la respuesta del agente y decide qué hacer a continuación en función de su perfil y objetivo. El actor produce una respuesta estructurada que contiene:
-
Razonamiento: el razonamiento interno del actor para responder (por ejemplo, «El agente me ofreció opciones de vuelo pero no me preguntó por la hora que prefería). Debo especificar que prefiero los vuelos matutinos»). Esto es útil para depurar por qué el actor se comportó de una manera determinada.
-
Mensaje: el siguiente mensaje que se va a enviar al agente.
-
Señal de parada: un valor booleano que indica si el actor considera que ha alcanzado su objetivo.
-
-
Continuar o detener: si el actor señala que ha completado el objetivo (
stop: true) o que se alcanza el recuento de turnosmax_turns, la conversación finaliza. De lo contrario, el siguiente mensaje del actor se convierte en la entrada para el siguiente turno. -
Evaluar: Una vez finalizada la conversación, el ejecutor evalúa la sesión utilizando los evaluadores configurados, al igual que en los escenarios predefinidos.
Perfil del actor
Cada escenario simulado requiere una ActorProfile que defina quién es el actor y qué quiere lograr:
| Campo | Obligatorio | Descripción |
|---|---|---|
|
|
Sí |
Información básica sobre el actor. Describe la situación y cualquier detalle relevante que el actor deba conocer. |
|
|
Sí |
Lo que el actor quiere lograr en la conversación. El actor señala que se ha completado cuando determina que se ha alcanzado la meta. |
|
|
No |
Key-value parejas que describen las características del actor (por ejemplo, nivel de experiencia, estilo de comunicación, paciencia). El valor predeterminado es vacío. |
{ "actor_profile": { "context": "A customer who purchased a laptop last week and it arrived with a cracked screen", "goal": "Get a replacement laptop shipped within 2 business days", "traits": { "expertise": "non-technical", "tone": "frustrated but polite", "patience": "low" } } }
Configuración de simulación
SimulationConfigControla el comportamiento del actor y se establece en la configuración de evaluación del corredor:
| Campo | Predeterminado | Description (Descripción) |
|---|---|---|
|
|
Modelo predeterminado |
El identificador de modelo de Amazon Bedrock utilizado para el LLM de actor. Elija un modelo que pueda seguir instrucciones personales complejas. Si se omite, se usa el modelo predeterminado. |
from bedrock_agentcore.evaluation import SimulationConfig simulation_config = SimulationConfig( model_id="<model-id>", )
esquema de conjunto de datos
Un escenario simulado usa actor_profile y input en lugar deturns:
{ "scenarios": [ { "scenario_id": "geography-student", "scenario_description": "A curious student asks geography questions", "actor_profile": { "traits": {"expertise": "novice", "tone": "curious"}, "context": "A student studying world geography who wants to learn about capitals", "goal": "Find out the capital cities of at least two different countries" }, "input": "Hi! I'm studying geography. Can you help me learn about world capitals?", "max_turns": 5, "assertions": [ "Agent provides accurate capital city information", "Agent is helpful and encouraging to the student" ] } ] }
| Campo | Obligatorio | Predeterminado | Description (Descripción) |
|---|---|---|---|
|
|
Sí |
— |
Identificador único para el escenario. |
|
|
No |
|
Metadatos opcionales que describen el escenario. Son útiles para organizar e identificar escenarios en los resultados. |
|
|
Sí |
— |
La identidad y el objetivo del actor. Consulte Perfil del actor. |
|
|
Sí |
— |
El primer mensaje enviado a tu agente para iniciar la conversación. |
|
|
No |
10 |
Número máximo de turnos antes de que se detenga la conversación. Debe ser, como mínimo, 1. |
|
|
No |
— |
Afirmaciones en lenguaje natural sobre el comportamiento esperado. Utilizado por evaluadores a nivel de sesión, como. |
nota
Los escenarios simulados no admiten expected_trajectory la opción por turno expected_response porque el flujo de la conversación no se conoce de antemano. assertionsUtilízalo para obtener la verdad básica con escenarios simulados.
FileDatasetProviderdetecta automáticamente el tipo de escenario a partir de la estructura JSON: los escenarios con un actor_profile campo (y sin turns campo) se cargan como. SimulatedScenario
Utilizándolo con el ejecutor de conjuntos de datos por lotes
En el siguiente ejemplo, se ejecuta una evaluación de escenario simulada con el ejecutor de conjuntos de datos por lotes. Configure simulation_config BatchEvaluationRunConfig e incluya SimulatedScenario instancias en el conjunto de datos:
import boto3 import json from bedrock_agentcore.evaluation import ( BatchEvaluationRunner, BatchEvaluationRunConfig, BatchEvaluatorConfig, CloudWatchDataSourceConfig, SimulationConfig, AgentInvokerInput, AgentInvokerOutput, Dataset, SimulatedScenario, ActorProfile, ) AGENT_ARN = "arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/MyAgent-abc123" # Replace with your agent runtime ARN REGION = "us-west-2" # Replace with your region RUNTIME_ID = AGENT_ARN.split("/")[-1] AGENT_NAME = RUNTIME_ID.rsplit("-", 1)[0] ENDPOINT_NAME = "DEFAULT" LOG_GROUP = f"/aws/bedrock-agentcore/runtimes/{RUNTIME_ID}-{ENDPOINT_NAME}" SERVICE_NAME = f"{AGENT_NAME}.{ENDPOINT_NAME}" ACTOR_MODEL_ID = "global.anthropic.claude-haiku-4-5-20251001-v1:0" # Replace with your preferred model # Define the dataset with simulated scenarios dataset = Dataset( scenarios=[ SimulatedScenario( scenario_id="support-frustrated-customer", scenario_description="A frustrated customer with a defective product", actor_profile=ActorProfile( traits={"expertise": "non-technical", "tone": "frustrated but polite"}, context="Purchased a laptop last week that arrived with a cracked screen", goal="Get a replacement laptop shipped within 2 business days", ), input="I received my laptop and the screen is cracked. I need help.", max_turns=8, assertions=[ "Agent acknowledges the issue and apologizes", "Agent offers a replacement or refund", "Agent provides a timeline for resolution", ], ), SimulatedScenario( scenario_id="support-billing-question", scenario_description="A customer with a billing discrepancy", actor_profile=ActorProfile( traits={"expertise": "moderate", "tone": "calm"}, context="Noticed a double charge on the last credit card statement", goal="Get the duplicate charge reversed and confirmation of the refund", ), input="I see two charges for the same order on my statement. Can you look into this?", max_turns=6, assertions=[ "Agent investigates the billing issue", "Agent confirms whether a duplicate charge exists", ], ), ] ) # Configure the evaluation config = BatchEvaluationRunConfig( batch_evaluation_name="simulated-support-eval", evaluator_config=BatchEvaluatorConfig( evaluator_ids=[ "Builtin.GoalSuccessRate", "Builtin.Helpfulness", ], ), data_source=CloudWatchDataSourceConfig( service_names=[SERVICE_NAME], log_group_names=[LOG_GROUP], ingestion_delay_seconds=180, ), simulation_config=SimulationConfig( model_id=ACTOR_MODEL_ID, ), polling_timeout_seconds=1800, polling_interval_seconds=30, ) # Define the agent invoker agentcore_client = boto3.client("bedrock-agentcore", region_name=REGION) def agent_invoker(inp: AgentInvokerInput) -> AgentInvokerOutput: payload = inp.payload if isinstance(payload, str): raw_bytes = json.dumps({"prompt": payload}).encode() elif isinstance(payload, dict): raw_bytes = json.dumps(payload).encode() else: raw_bytes = json.dumps({"prompt": str(payload)}).encode() print(f"[{inp.session_id}] > sending payload: {raw_bytes.decode()}") response = agentcore_client.invoke_agent_runtime( agentRuntimeArn=AGENT_ARN, runtimeSessionId=inp.session_id, payload=raw_bytes, ) response_body = response["response"].read() print(f"[{inp.session_id}] < received response: {response_body.decode()}") return AgentInvokerOutput(agent_output=json.loads(response_body)) # Run the evaluation runner = BatchEvaluationRunner(region=REGION) result = runner.run_dataset_evaluation( config=config, dataset=dataset, agent_invoker=agent_invoker, ) # Display results print(f"Status: {result.status}") if result.evaluation_results: er = result.evaluation_results print(f"Sessions completed: {er.number_of_sessions_completed}") print(f"Sessions failed: {er.number_of_sessions_failed}") for summary in er.evaluator_summaries or []: avg = summary.statistics.average_score if summary.statistics else None print(f" {summary.evaluator_id}: avg={avg}")
Utilizándolo con el ejecutor de conjuntos de datos bajo demanda
El ejecutor de conjuntos de datos bajo demanda sigue el mismo patrón. Configure simulation_config EvaluationRunConfig e incluya SimulatedScenario instancias en el conjunto de datos:
nota
On-demand las evaluaciones se cobran en función del consumo. Para obtener más información, consulta la página AgentCore de precios
from bedrock_agentcore.evaluation import ( OnDemandEvaluationDatasetRunner, EvaluationRunConfig, EvaluatorConfig, CloudWatchAgentSpanCollector, SimulationConfig, FileDatasetProvider, ) AGENT_ARN = "arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/MyAgent-abc123" # Replace with your agent runtime ARN REGION = "us-west-2" # Replace with your region RUNTIME_ID = AGENT_ARN.split("/")[-1] ENDPOINT_NAME = "DEFAULT" LOG_GROUP = f"/aws/bedrock-agentcore/runtimes/{RUNTIME_ID}-{ENDPOINT_NAME}" ACTOR_MODEL_ID = "global.anthropic.claude-haiku-4-5-20251001-v1:0" # Replace with your preferred model # Load dataset (auto-detects simulated scenarios from actor_profile field) dataset = FileDatasetProvider("simulated_dataset.json").get_dataset() # Create span collector span_collector = CloudWatchAgentSpanCollector( log_group_name=LOG_GROUP, region=REGION, ) # Configure with simulation support config = EvaluationRunConfig( evaluator_config=EvaluatorConfig( evaluator_ids=["Builtin.GoalSuccessRate", "Builtin.Helpfulness"], ), evaluation_delay_seconds=180, max_concurrent_scenarios=5, simulation_config=SimulationConfig( model_id=ACTOR_MODEL_ID, ), ) # Run runner = OnDemandEvaluationDatasetRunner(region=REGION) result = runner.run( agent_invoker=agent_invoker, dataset=dataset, span_collector=span_collector, config=config, ) for scenario in result.scenario_results: print(f"Scenario: {scenario.scenario_id} ({scenario.status})") for evaluator in scenario.evaluator_results: for r in evaluator.results: print(f" {evaluator.evaluator_id}: {r.get('value')} ({r.get('label')})")
Condiciones de detención
Una conversación simulada finaliza cuando se cumple alguna de las siguientes condiciones:
-
Objetivo cumplido: el actor determina que su objetivo se ha alcanzado y lo señala
stop: true. Este es el resultado esperado. -
Se ha alcanzado el número máximo de turnos: la conversación ha alcanzado el
max_turnslímite. Esto actúa como un mecanismo de seguridad. Si tus escenarios suelen superar el límite de turnos, considera aumentarmax_turnso simplificar el objetivo del actor. -
No se produce ningún mensaje: el actor no produce ningún mensaje siguiente, pero no indica explícitamente que se detenga. Esto se trata como la consecución de una meta implícita.
Consejos para crear escenarios simulados eficaces
-
Sea específico en cuanto al objetivo: los objetivos vagos, como «tener una conversación», conducen a interacciones desenfocadas. Los objetivos específicos, como «obtener un reembolso por el pedido #12345», dan al actor un objetivo claro.
-
Usa los rasgos para controlar la dificultad: un actor con
"expertise": "expert"hace preguntas más difíciles que uno con"expertise": "novice". Usa las características para evaluar a tu agente en diferentes segmentos de usuarios. -
Establece límites de turnos realistas: la mayoría de las conversaciones de atención al cliente se resuelven en 5 a 10 turnos. Si se establece un nivel
max_turnsdemasiado alto, se desperdicia computación; si se establece un nivel demasiado bajo, se pueden interrumpir las conversaciones antes de alcanzar el objetivo. -
Usa afirmaciones para obtener la verdad básica: dado que el flujo de la conversación es dinámico, no
expected_responseestá disponible por turno. Escribe afirmaciones que describan el resultado que esperas, independientemente del camino específico que hayas tomado. -
Elige un modelo de actor apropiado: El modelo de actor debe ser lo suficientemente capaz como para mantener una personalidad coherente a lo largo de los turnos. Los modelos más pequeños funcionan para personas simples; las personas complejas con objetivos matizados se benefician de modelos más capaces.