View a markdown version of this page

Simulation utilisateur - Base rocheuse de l'Amazonie AgentCore

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Simulation utilisateur

La simulation utilisateur fait appel à un LLM-backed acteur pour jouer le rôle d'un utilisateur final interagissant avec votre agent. Vous définissez le profil et l'objectif de l'acteur, et celui-ci mène une conversation à plusieurs reprises avec votre agent jusqu'à ce que l'objectif soit atteint ou que la limite de tours soit atteinte.

Note

La simulation utilisateur fait appel aux modèles Amazon Bedrock du côté du SDK pour générer les réponses de l'acteur. Des frais d'appel du modèle Amazon Bedrock standard s'appliquent à ces appels. Pour plus de détails, consultez la page AgentCore des tarifs.

Ceci est utile lorsque vous souhaitez :

  • Testez avec des variations réalistes : l'acteur génère des phrasés, des questions de suivi et des trajectoires de conversation différents à chaque exécution, exposant des cas extrêmes que les scénarios écrits à la main omettent.

  • Évaluez les conversations ouvertes : pour les agents qui gèrent un dialogue libre (support client, tutorat, conseil), les scénarios simulés reflètent mieux le comportement réel de l'utilisateur que les séquences à tour de rôle fixe.

  • Élargissez la couverture des scénarios : au lieu d'écrire à la main des dizaines de scripts en plusieurs étapes, définissez des profils d'acteurs avec des personnages et des objectifs différents et laissez l'acteur générer les conversations.

  • Test de régression avec diversité : exécutez plusieurs fois le même profil d'acteur pour vérifier que votre agent gère différentes expressions de la même intention.

La simulation utilisateur fonctionne à la fois avec les exécuteurs de jeux de données à la demande et par lots.

Comment ça marche

Le coureur traite chaque scénario simulé par le biais d'une boucle de conversation :

  1. Départ : le coureur envoie le input champ du scénario à votre agent lors du premier tour.

  2. L'agent répond : votre agent traite la saisie et renvoie une réponse.

  3. L'acteur évalue : l' LLM-backed acteur reçoit la réponse de l'agent et décide de la marche à suivre en fonction de son profil et de son objectif. L'acteur produit une réponse structurée contenant :

    • Raisonnement : le raisonnement interne de l'acteur pour justifier sa réponse (par exemple, « L'agent m'a proposé des options de vol mais ne m'a pas demandé l'heure que je préférais. Je dois préciser que je préfère les vols du matin. »). Ceci est utile pour comprendre pourquoi l'acteur s'est comporté d'une certaine manière.

    • Message : le message suivant à envoyer à l'agent.

    • Signal d'arrêt : booléen indiquant si l'acteur considère que son objectif est atteint.

  4. Continuer ou arrêter : si l'acteur indique que l'objectif est atteint (stop: true) ou si le nombre de tours est atteintmax_turns, la conversation prend fin. Dans le cas contraire, le message suivant de l'acteur devient l'entrée pour le tour suivant.

  5. Evaluer : Une fois la conversation terminée, le coureur évalue la session à l'aide des évaluateurs configurés, comme pour les scénarios prédéfinis.

Profil de l'acteur

Chaque scénario simulé nécessite un ActorProfile qui définit qui est l'acteur et ce qu'il souhaite réaliser :

Champ Obligatoire Description

context

Oui

Informations générales sur l'acteur. Décrit la situation et tous les détails pertinents que l'acteur devrait connaître.

goal

Oui

Ce que l'acteur veut réaliser dans la conversation. L'acteur signale l'achèvement lorsqu'il détermine que l'objectif a été atteint.

traits

Non

Key-value paires décrivant les caractéristiques de l'acteur (par exemple, niveau d'expertise, style de communication, patience). La valeur par défaut est vide.

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

Configuration de simulation

Le SimulationConfig contrôle le comportement de l'acteur et est défini sur la configuration d'évaluation du coureur :

Champ Par défaut Description

model_id

Modèle par défaut

L'identifiant de modèle Amazon Bedrock utilisé pour l'acteur LLM. Choisissez un modèle capable de suivre des instructions personnelles complexes. En cas d'omission, le modèle par défaut est utilisé.

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

schéma du jeu de données

Un scénario simulé utilise actor_profile et input au lieu de turns :

{ "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" ] } ] }
Champ Obligatoire Par défaut Description

scenario_id

Oui

—

Identifiant unique du scénario.

scenario_description

Non

""

Métadonnées facultatives décrivant le scénario. Utile pour organiser et identifier des scénarios dans les résultats.

actor_profile

Oui

—

L'identité et l'objectif de l'acteur. Consultez Profil de l'acteur.

input

Oui

—

Le premier message envoyé à votre agent pour démarrer la conversation.

max_turns

Non

10

Nombre maximum de tours avant la fin de la conversation. Doit avoir au moins pour valeur 1.

assertions

Non

—

Assertions en langage naturel concernant le comportement attendu. Utilisé par les évaluateurs au niveau des sessions tels que. Builtin.GoalSuccessRate

Note

Les scénarios simulés ne prennent pas en charge expected_trajectory ou par tour expected_response car le flux de conversation n'est pas connu à l'avance. À utiliser assertions pour obtenir la vérité sur le terrain avec des scénarios simulés.

FileDatasetProviderdétecte automatiquement le type de scénario à partir de la structure JSON : les scénarios comportant un actor_profile champ (et aucun turns champ) sont chargés en tant queSimulatedScenario.

Utilisation avec le lanceur de jeu de données par lots

L'exemple suivant exécute une évaluation de scénario simulée à l'aide du générateur de jeu de données par lots. simulation_configActivez BatchEvaluationRunConfig et incluez des SimulatedScenario instances dans l'ensemble de données :

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}")

Utilisation avec le générateur de données à la demande

Le générateur d'ensembles de données à la demande suit le même schéma. simulation_configActivez EvaluationRunConfig et incluez des SimulatedScenario instances dans l'ensemble de données :

Note

On-demand les évaluations sont facturées en fonction de la consommation. Pour plus de détails, consultez la page AgentCore des tarifs.

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')})")

Conditions d'arrêt

Une conversation simulée prend fin lorsque l'une des conditions suivantes est remplie :

  1. Objectif atteint : L'acteur détermine que son objectif a été atteint et signalestop: true. C'est le résultat escompté.

  2. Nombre maximum de tours atteints : la conversation atteint sa max_turns limite. Cela agit comme un filet de sécurité. Si vos scénarios atteignent fréquemment la limite de tours, envisagez d'augmenter max_turns ou de simplifier l'objectif de l'acteur.

  3. Aucun message produit : l'acteur ne produit aucun message suivant mais ne signale pas explicitement l'arrêt. Ceci est considéré comme une réalisation implicite de l'objectif.

Conseils pour des scénarios simulés efficaces

  • Soyez précis dans votre objectif : des objectifs vagues tels que « avoir une conversation » entraînent des interactions floues. Des objectifs spécifiques tels que « obtenir un remboursement pour la commande #12345 » donnent à l'acteur un objectif clair.

  • Utilisez les traits pour contrôler la difficulté : un acteur pose des questions plus difficiles qu'un acteur qui "expertise": "expert" pose des questions plus difficiles qu'un autre"expertise": "novice". Utilisez les caractéristiques pour tester votre agent auprès de différents segments d'utilisateurs.

  • Fixez des limites de tours réalistes : la plupart des conversations avec le support client se résolvent en 5 à 10 tours. Un niveau de gaspillage max_turns trop élevé permet de calculer ; un réglage trop faible peut interrompre les conversations avant que l'objectif ne soit atteint.

  • Utilisez des assertions pour obtenir la vérité sur le terrain : le flux de conversation étant dynamique, le nombre par tour n'expected_responseest pas disponible. Rédigez des assertions qui décrivent le résultat que vous attendez, quel que soit le chemin emprunté.

  • Choisissez un modèle d'acteur approprié : Le modèle d'acteur doit être suffisamment capable de maintenir une personnalité cohérente à tour de rôle. Les modèles plus petits fonctionnent pour des personnages simples ; les personnages complexes avec des objectifs nuancés bénéficient de modèles plus performants.