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 conduce 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. Per queste chiamate si applicano le tariffe di invocazione standard del modello Amazon Bedrock. Per maggiori dettagli, consulta la pagina dei prezzi. AgentCore
Questa funzionalità è utile quando desideri:
-
Prova con variazioni realistiche: l'attore genera frasi, domande di approfondimento e percorsi di conversazione diversi a ogni esecuzione, esponendo casi estremi che gli scenari scritti a mano sfuggono.
-
Valuta le conversazioni aperte: per gli agenti che gestiscono dialoghi in forma libera (assistenza clienti, tutoraggio, consulenza), gli scenari simulati rispecchiano meglio il comportamento reale degli utenti rispetto alle sequenze a turni fissi.
-
Amplia la copertura degli scenari: invece di scrivere a mano dozzine di sceneggiature 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 diversificato: esegui lo stesso profilo di attore più volte per verificare che il tuo agente gestisca diverse espressioni dello stesso intento.
Come funziona
Il runner elabora ogni scenario simulato attraverso un ciclo di conversazione:
-
Inizio: il corridore invia il
inputcampo dello scenario al tuo agente come 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 alla base della risposta dell'attore (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 ritiene che il proprio obiettivo sia stato raggiunto.
-
-
Continua o interrompi: se l'attore segnala il completamento dell'obiettivo (
stop: true) o il conteggio dei turni è arrivatomax_turns, la conversazione termina. Altrimenti, il messaggio successivo dell'attore diventa l'input per il turno successivo. -
Valuta: una volta completata la conversazione, il corridore valuta la sessione utilizzando i valutatori configurati, come negli scenari predefiniti.
Profilo dell'attore
Ogni scenario simulato richiede un ActorProfile nome 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 rilevanti che l'attore dovrebbe conoscere. |
|
|
Sì |
Cosa vuole ottenere l'attore durante la 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 esperienza, stile di comunicazione, pazienza). Il valore predefinito è vuoto. |
{ "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. Utile per organizzare e identificare gli scenari nei risultati. |
|
|
Sì |
— |
L'identità e l'obiettivo dell'attore. Per informazioni, consulta Profilo dell'attore. |
|
|
Sì |
— |
Il primo messaggio inviato al tuo agente per iniziare la conversazione. |
|
|
No |
10 |
Numero massimo di turni prima dell'interruzione della conversazione. 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 o per turno expected_response perché il flusso di conversazione non è noto in anticipo. Utilizzalo assertions per ottenere risultati concreti 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 includi le SimulatedScenario istanze nel set simulation_config 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
Il programma di esecuzione del set di dati su richiesta segue lo stesso schema. Imposta simulation_config EvaluationRunConfig e 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 stabilisce che l'obiettivo è stato raggiunto e segnala
stop: true. Questo è il risultato atteso. -
Numero massimo di giri raggiunto: la conversazione raggiunge il
max_turnslimite. Questo funge da backstop 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 di interrompere. Questo viene considerato come un completamento implicito dell'obiettivo.
Suggerimenti per scenari simulati efficaci
-
Sii specifico 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 che
"expertise": "expert"pone domande più difficili di uno con cui."expertise": "novice"Usa le caratteristiche per testare il tuo agente su diversi segmenti di utenti. -
Stabilisci limiti di turni realistici: la maggior parte delle conversazioni con l'assistenza clienti si risolve in 5-10 turni. Impostare un valore
max_turnstroppo elevato comporta sprechi di calcolo; impostarlo su un valore troppo basso può interrompere le conversazioni prima che l'obiettivo venga raggiunto. -
Usa le asserzioni come fondamento della verità: poiché il flusso di conversazione è dinamico, il metodo 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: L'attore modello dovrebbe essere abbastanza capace da mantenere un personaggio coerente tra i turni. I modelli più piccoli funzionano per personaggi semplici; i personaggi complessi con obiettivi diversificati traggono vantaggio da modelli più capaci.