View a markdown version of this page

Simulación de usuario - Amazon Bedrock AgentCore

Simulación de usuario

La simulación de usuario utiliza un LLM-backed actor para interpretar el papel de un usuario final que interactúa con su agente. Usted define el perfil y el objetivo del actor, y el actor entabla una conversación de varios turnos con su agente hasta que se alcance el objetivo o se alcance el límite de turnos.

nota

La simulación de usuario invoca los modelos de Amazon Bedrock del lado del SDK para generar las respuestas del actor. A estas llamadas se les aplican cargos de invocación estándar del modelo Amazon Bedrock. Para obtener más información, consulte la página de AgentCore precios.

Esto resulta útil cuando quieres:

  • Prueba con variaciones realistas: el actor genera diferentes frases, preguntas de seguimiento y rutas de conversación en cada ejecución, lo que expone casos extremos que los escenarios creados a mano pasan por alto.

  • Evalúe las conversaciones abiertas: en el caso de los agentes que gestionan diálogos de forma libre (atención al cliente, tutoría, asesoramiento), los escenarios simulados reflejan mejor el comportamiento real de los usuarios que las secuencias de turnos fijos.

  • Amplíe la cobertura de los escenarios: en lugar de escribir docenas de guiones de varios turnos a mano, 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 distintas expresiones con la misma intención.

La simulación de usuario 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:

  1. Inicio: el corredor envía el input campo del escenario a tu agente en el primer turno.

  2. El agente responde: tu agente procesa la entrada y devuelve una respuesta.

  3. 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 su respuesta (por ejemplo, «El agente me ofreció opciones de vuelo, pero no me preguntó cuál era mi hora preferida). Debo especificar que prefiero los vuelos matutinos»). Esto es útil para depurar por qué el actor se comportó de cierta manera.

    • Mensaje: el siguiente mensaje que se va a enviar al agente.

    • Señal de parada: booleana que indica si el actor considera que su objetivo ha sido alcanzado.

  4. Continuar o parar: si el actor indica que se ha completado el objetivo (stop: true) o se ha alcanzado el número de turnosmax_turns, la conversación termina. De lo contrario, el siguiente mensaje del actor se convierte en la entrada para el siguiente turno.

  5. Evaluar: una vez finalizada la conversación, el corredor evalúa la sesión utilizando los evaluadores configurados, al igual que con los escenarios predefinidos.

Perfil del actor

Cada escenario simulado requiere una definición ActorProfile que defina quién es el actor y qué quiere conseguir:

Campo Obligatorio Descripción

context

Información básica sobre el actor. Describe la situación y cualquier detalle relevante que el actor deba conocer.

goal

Lo que el actor quiere lograr en la conversación. El actor señala que se ha completado cuando determina que se ha alcanzado el objetivo.

traits

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)

model_id

Modelo predeterminado

El ID de modelo de Amazon Bedrock utilizado para el actor LLM. Elija un modelo que pueda seguir instrucciones personales complejas. Si se omite, se utilizará el modelo por defecto.

from bedrock_agentcore.evaluation import SimulationConfig simulation_config = SimulationConfig( model_id="<model-id>", )

esquema del conjunto de datos

Un escenario simulado utiliza 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)

scenario_id

Identificador único del escenario.

scenario_description

No

""

Metadatos opcionales que describen el escenario. Útiles para organizar e identificar escenarios en los resultados.

actor_profile

La identidad y el objetivo del actor. Consulte Perfil del actor.

input

El primer mensaje enviado a su agente para iniciar la conversación.

max_turns

No

10

Número máximo de turnos antes de que se detenga la conversación. Debe ser, como mínimo, 1.

assertions

No

Afirmaciones en lenguaje natural sobre el comportamiento esperado. Utilizado por evaluadores a nivel de sesión, como. Builtin.GoalSuccessRate

nota

Los escenarios simulados no son compatibles expected_trajectory ni por turno expected_response porque el flujo de la conversación no se conoce de antemano. Úsalo assertions para obtener información 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 comoSimulatedScenario.

Se utiliza con el ejecutor de conjuntos de datos por lotes

En el siguiente ejemplo, se ejecuta una evaluación de un escenario simulado 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. Configura simulation_config EvaluationRunConfig e incluye 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:

  1. Objetivo cumplido: el actor determina que su objetivo se ha alcanzado y lo señalastop: true. Este es el resultado esperado.

  2. Número máximo de turnos alcanzado: la conversación alcanza el max_turns límite. Esto actúa como una barrera de seguridad. Si tus escenarios llegan con frecuencia al límite de turnos, considera aumentar max_turns o simplificar el objetivo del actor.

  3. No se produce ningún mensaje: el actor no emite ningún mensaje siguiente, pero no indica explícitamente que pare. Esto se considera el cumplimiento implícito de una meta.

Consejos para escenarios simulados efectivos

  • Sea específico en el objetivo: los objetivos vagos, como «mantener una conversación», conducen a interacciones desenfocadas. Los objetivos específicos, como «obtener un reembolso por el pedido #12345», dan al actor un punto final claro.

  • Usa rasgos para controlar la dificultad: un actor "expertise": "expert" hace preguntas más difíciles que uno que las tiene"expertise": "novice". Usa estas 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 valor max_turns demasiado alto, se desperdician recursos informáticos; si se establece un nivel demasiado bajo, se pueden interrumpir las conversaciones antes de alcanzar el objetivo.

  • Utiliza afirmaciones para demostrar la verdad fundamental: dado que el flujo de la conversación es dinámico, no expected_response está disponible el turno por turno. Escribe afirmaciones que describan el resultado que esperas, independientemente del camino específico que tomes.

  • Elige un modelo de actor apropiado: El modelo de actor debe ser lo suficientemente capaz como para mantener una personalidad coherente en todos 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.