Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Simulazione utente
La simulazione utente utilizza un LLM-backed attore per interpretare il ruolo di un utente finale che interagisce con il tuo agente. Tu definisci il profilo e l'obiettivo dell'attore e l'attore avvia una conversazione a più turni con il tuo agente fino al raggiungimento dell'obiettivo o al raggiungimento del limite di turni.
Nota
La simulazione utente richiama i modelli Amazon Bedrock sul lato SDK per generare le risposte dell'attore. A queste chiamate si applicano le tariffe standard di richiamo del modello Amazon Bedrock. Per i dettagli, consulta la pagina dei prezzi. AgentCore
Ciò è utile quando desideri:
-
Prova con variazioni realistiche: l'attore genera frasi, domande di approfondimento e percorsi di conversazione diversi a ogni esecuzione, esponendo casi limite che gli scenari scritti a mano sfuggono.
-
Valuta le conversazioni aperte: per gli agenti che gestiscono dialoghi in formato libero (assistenza clienti, tutoraggio, consulenza), gli scenari simulati riflettono meglio il comportamento reale degli utenti rispetto alle sequenze a turni fissi.
-
Amplia la copertura degli scenari: invece di scrivere a mano dozzine di script a più turni, definisci i profili degli attori con personaggi e obiettivi diversi e lascia che sia l'attore a generare le conversazioni.
-
Test di regressione con diversità: esegui più volte lo stesso profilo di attore per verificare che il tuo agente gestisca diverse espressioni dello stesso intento.
La simulazione utente funziona sia con i gestori di set di dati su richiesta che in batch.
Come funziona
Il runner elabora ogni scenario simulato attraverso un ciclo di conversazione:
-
Inizio: il corridore invia il
inputcampo dello scenario al tuo agente al primo turno. -
L'agente risponde: il tuo agente elabora l'input e restituisce una risposta.
-
L'attore valuta: l' LLM-backed attore riceve la risposta dell'agente e decide cosa fare dopo in base al suo profilo e al suo obiettivo. L'attore produce una risposta strutturata contenente:
-
Motivazione: il ragionamento interno dell'attore alla base della sua risposta (ad esempio, «L'agente mi ha fornito delle opzioni di volo ma non mi ha chiesto l'orario che preferivo. Devo specificare che preferisco i voli mattutini.»). Questo è utile per capire perché l'attore si è comportato in un certo modo.
-
Messaggio: il messaggio successivo da inviare all'agente.
-
Segnale di stop: un valore booleano che indica se l'attore considera raggiunto il suo obiettivo.
-
-
Continua o interrompi: se l'attore segnala il completamento dell'obiettivo (
stop: true) o il numero dei turni viene raggiuntomax_turns, la conversazione termina. Altrimenti, il messaggio successivo dell'attore diventa l'input per il turno successivo. -
Valutazione: al termine della conversazione, il corridore valuta la sessione utilizzando i valutatori configurati, come negli scenari predefiniti.
Profilo dell'attore
Ogni scenario simulato richiede una ActorProfile dichiarazione che definisca chi è l'attore e cosa vuole ottenere:
| Campo | Richiesto | Descrizione |
|---|---|---|
|
|
Sì |
Informazioni di base sull'attore. Descrive la situazione e tutti i dettagli pertinenti che l'attore dovrebbe conoscere. |
|
|
Sì |
Cosa vuole ottenere l'attore nella conversazione. L'attore segnala il completamento quando determina che l'obiettivo è stato raggiunto. |
|
|
No |
Key-value coppie che descrivono le caratteristiche dell'attore (ad esempio, livello di competenza, stile di comunicazione, pazienza). L'impostazione predefinita è vuota. |
{ "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" } } }
Configurazione della simulazione
SimulationConfigControlla il comportamento dell'attore ed è impostato nella configurazione di valutazione del corridore:
| Campo | Predefinita | Description |
|---|---|---|
|
|
Modello predefinito |
L'ID del modello Amazon Bedrock utilizzato per l'attore LLM. Scegli un modello in grado di seguire istruzioni personali complesse. Se omesso, viene utilizzato il modello predefinito. |
from bedrock_agentcore.evaluation import SimulationConfig simulation_config = SimulationConfig( model_id="<model-id>", )
Schema del set di dati
Uno scenario simulato utilizza actor_profile e input invece di: 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" ] } ] }
| Campo | Obbligatorio | Predefinita | Description |
|---|---|---|---|
|
|
Sì |
— |
Identificatore univoco per lo scenario. |
|
|
No |
|
Metadati opzionali che descrivono lo scenario. Utili per organizzare e identificare gli scenari nei risultati. |
|
|
Sì |
— |
L'identità e l'obiettivo dell'attore. Consulta Profilo dell'attore. |
|
|
Sì |
— |
Il primo messaggio inviato al tuo agente per iniziare la conversazione. |
|
|
No |
10 |
Numero massimo di turni prima che la conversazione si interrompa. Deve essere almeno 1. |
|
|
No |
— |
Asserzioni in linguaggio naturale sul comportamento previsto. Utilizzato da valutatori a livello di sessione come. |
Nota
Gli scenari simulati non supportano expected_trajectory né funzionano per turno expected_response perché il flusso della conversazione non è noto in anticipo. Usali assertions per garantire la verità concreta con scenari simulati.
FileDatasetProviderrileva automaticamente il tipo di scenario dalla struttura JSON: gli scenari con un actor_profile campo (e nessun turns campo) vengono caricati come. SimulatedScenario
Utilizzo con il batch dataset runner
L'esempio seguente esegue una valutazione simulata dello scenario utilizzando il batch dataset runner. Attiva BatchEvaluationRunConfig e simulation_config includi le SimulatedScenario istanze nel set di dati:
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}")
Utilizzo con il dataset runner su richiesta
L'on-demand dataset runner segue lo stesso schema. Attiva EvaluationRunConfig e simulation_config includi le SimulatedScenario istanze nel set di dati:
Nota
On-demand le valutazioni vengono addebitate in base al consumo. Per i dettagli, consulta la pagina AgentCore dei prezzi.
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')})")
Condizioni di interruzione
Una conversazione simulata termina quando viene soddisfatta una delle seguenti condizioni:
-
Obiettivo completato: l'attore determina che l'obiettivo è stato raggiunto e segnala
stop: true. Questo è il risultato previsto. -
Numero massimo di turni raggiunto: La conversazione raggiunge il
max_turnslimite. Questo funge da protezione di sicurezza. Se i tuoi scenari raggiungono spesso il limite di turni, valuta la possibilità di aumentaremax_turnso semplificare l'obiettivo dell'attore. -
Nessun messaggio prodotto: l'attore non produce alcun messaggio successivo ma non segnala esplicitamente l'interruzione. Questo viene considerato come un completamento implicito dell'obiettivo.
Suggerimenti per scenari simulati efficaci
-
Sii preciso nell'obiettivo: obiettivi vaghi come «avere una conversazione» portano a interazioni sfocate. Obiettivi specifici come «ottenere un rimborso per l'ordine #12345" forniscono all'attore un obiettivo chiaro.
-
Usa i tratti per controllare la difficoltà: un attore con
"expertise": "expert"domande più difficili di uno con"expertise": "novice". Usa le caratteristiche per testare il tuo agente su diversi segmenti di utenti. -
Imposta limiti di turno realistici: la maggior parte delle conversazioni con l'assistenza clienti si risolve in 5-10 turni. Impostare uno spreco di calcolo
max_turnstroppo elevato; impostarlo su un valore troppo basso potrebbe interrompere le conversazioni prima del raggiungimento dell'obiettivo. -
Usa le asserzioni come base di verità: poiché il flusso di conversazione è dinamico, per turno non è disponibile
expected_response. Scrivi asserzioni che descrivano il risultato che ti aspetti indipendentemente dal percorso specifico intrapreso. -
Scegli un modello di attore appropriato: Il modello di attore dovrebbe essere sufficientemente capace da mantenere un personaggio coerente in tutti i turni. I modelli più piccoli funzionano per personaggi semplici; i personaggi complessi con obiettivi sfumati traggono vantaggio da modelli più capaci.