View a markdown version of this page

Simulazione utente - Fondamento Amazon AgentCore

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:

  1. Inizio: il corridore invia il input campo dello scenario al tuo agente al primo turno.

  2. L'agente risponde: il tuo agente elabora l'input e restituisce una risposta.

  3. 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.

  4. 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.

  5. 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

context

Sì

Informazioni di base sull'attore. Descrive la situazione e tutti i dettagli pertinenti che l'attore dovrebbe conoscere.

goal

Sì

Cosa vuole ottenere l'attore nella conversazione. L'attore segnala il completamento quando determina che l'obiettivo è stato raggiunto.

traits

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

model_id

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

scenario_id

Sì

—

Identificatore univoco per lo scenario.

scenario_description

No

""

Metadati opzionali che descrivono lo scenario. Utili per organizzare e identificare gli scenari nei risultati.

actor_profile

Sì

—

L'identità e l'obiettivo dell'attore. Consulta Profilo dell'attore.

input

Sì

—

Il primo messaggio inviato al tuo agente per iniziare la conversazione.

max_turns

No

10

Numero massimo di turni prima che la conversazione si interrompa. Deve essere almeno 1.

assertions

No

—

Asserzioni in linguaggio naturale sul comportamento previsto. Utilizzato da valutatori a livello di sessione come. Builtin.GoalSuccessRate

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:

  1. Obiettivo completato: l'attore determina che l'obiettivo è stato raggiunto e segnalastop: true. Questo è il risultato previsto.

  2. Numero massimo di turni raggiunto: La conversazione raggiunge il max_turns limite. Questo funge da protezione di sicurezza. Se i tuoi scenari raggiungono spesso il limite di turni, valuta la possibilità di aumentare max_turns o semplificare l'obiettivo dell'attore.

  3. 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_turns troppo 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 è disponibileexpected_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.