View a markdown version of this page

Commencer à évaluer les lots - Amazon Bedrock AgentCore

Commencer à évaluer les lots

Cette procédure pas à pas vous permet de passer d'un agent déployé à des résultats d'évaluation par lots à l'aide d'un agent du support client d'Acme Store. Vous allez créer l'agent, le déployer, générer des exemples de sessions, exécuter une évaluation par lots et lire les résultats.

Avant de commencer

Assurez-vous d’avoir :

  • La AgentCore CLI installée (agentcore --version)

  • AWS informations d'identification avec autorisations pour bedrock-agentcore et logs

  • Recherche de transactions activée dans CloudWatch

  • Python 3.10+ (pour les exemples de boto3)

Pour plus de détails, consultez la section Conditions préalables.

Les constantes suivantes sont utilisées dans les exemples boto3. Remplacez-les par vos propres valeurs après avoir déployé l'agent :

REGION = "us-west-2" AGENT_ARN = "arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/AcmeSupport-abc123" SERVICE_NAME = "AcmeSupport-abc123.DEFAULT" LOG_GROUP = "/aws/bedrock-agentcore/runtimes/AcmeSupport-abc123-DEFAULT"

Étape 1 : créer et déployer l'exemple d'agent

Créez un AgentCore projet et remplacez le code d'agent par défaut par celui de l'agent de support client Acme Store. Cet agent dispose de cinq outils pour gérer les commandes, les retours, l'expédition, les remises et les escalades.

Création du projet

agentcore create --name AcmeSupport --framework Strands --model-provider Bedrock --memory none cd AcmeSupport

Remplacez le code de l'agent

Ouvrez app/AcmeSupport/main.py et remplacez son contenu par ce qui suit :

"""Acme Store customer support agent.""" from strands import Agent, tool from strands.models.bedrock import BedrockModel from bedrock_agentcore.runtime import BedrockAgentCoreApp app = BedrockAgentCoreApp() MODEL_ID = "global.anthropic.claude-sonnet-4-6" SYSTEM_PROMPT = ( "You are a helpful customer support assistant for Acme Store. " "Help customers with their orders, returns, and shipping questions." ) @tool def lookup_order(order_id: str) -> str: """Look up an order by ID and return its status, item, and delivery details.""" orders = { "ORD-1001": { "status": "delivered", "item": "Blue T-Shirt (L)", "delivered": "2026-03-28", "total": "$29.99", }, "ORD-1002": { "status": "in_transit", "item": "Running Shoes (10)", "shipped": "2026-03-30", "est_delivery": "2026-04-05", "total": "$89.99", }, "ORD-1003": { "status": "delayed", "item": "Wireless Headphones", "shipped": "2026-03-25", "est_delivery": "2026-03-29", "days_late": 5, "total": "$59.99", }, "ORD-1004": { "status": "processing", "item": "Yoga Mat", "ordered": "2026-04-02", "total": "$34.99", }, "ORD-1005": { "status": "delivered", "item": "Coffee Maker", "delivered": "2026-03-20", "total": "$149.99", }, } return str(orders.get(order_id, {"error": f"Order {order_id} not found"})) @tool def initiate_return(order_id: str, reason: str) -> str: """Initiate a return for an order. Sends a return label to the customer.""" return ( f"Return initiated for {order_id}. Reason: {reason}. " "Return label sent to customer email. Please ship within 14 days." ) @tool def check_shipping_status(order_id: str) -> str: """Check detailed shipping status including carrier location and delays.""" statuses = { "ORD-1002": ( "Package is with carrier, currently in Portland OR. " "On schedule for April 5." ), "ORD-1003": ( "Package delayed at distribution center in Memphis TN. " "Original delivery was March 29. Now 5 days late. " "Acme Store policy: orders delayed 3+ days qualify for 15% discount." ), } return statuses.get(order_id, f"No active shipment found for {order_id}.") @tool def apply_discount(order_id: str, discount_percent: int, reason: str) -> str: """Apply a percentage discount to an order and issue a refund.""" return ( f"Applied {discount_percent}% discount to {order_id}. " f"Reason: {reason}. Refund will appear in 3-5 business days." ) @tool def escalate_to_human(reason: str) -> str: """Escalate the conversation to a human support agent.""" return ( f"Escalated to human agent. Reason: {reason}. " "Estimated wait time: 3 minutes." ) agent = Agent( model=BedrockModel(model_id=MODEL_ID), tools=[lookup_order, initiate_return, check_shipping_status, apply_discount, escalate_to_human], system_prompt=SYSTEM_PROMPT, ) @app.entrypoint def invoke(payload, context): result = agent(payload.get("prompt", "Hello")) return {"response": str(result)} if __name__ == "__main__": app.run()

Déployer et vérifier

agentcore deploy

Après le déploiement, vérifiez que l'agent est en cours d'exécution :

agentcore invoke --prompt "What's the status of order ORD-1001?"

Vous devriez voir une réponse avec les détails de la commande. Notez l'ARN d'exécution, le nom du service et le groupe de journaux provenant de agentcore status --json : vous en aurez besoin pour les exemples de boto3.

Note

Si vous avez déjà déployé un agent sur AgentCore Runtime avec l'observabilité activée, ignorez cette étape et utilisez votre propre agent pour le reste de la procédure pas à pas.

Étape 2 : générer des exemples de sessions

Invoquez l'agent à l'aide de diverses instructions pour créer des sessions d'évaluation. Ces instructions couvrent différents scénarios : recherches de commandes, retours, délais d'expédition, demandes de remises et interactions avec plusieurs outils.

Exemple
AgentCore CLI
agentcore invoke --runtime AcmeSupport --prompt "What's the status of my order ORD-1001?" agentcore invoke --runtime AcmeSupport --prompt "I need to return order ORD-1001, the shirt doesn't fit." agentcore invoke --runtime AcmeSupport --prompt "What's the shipping status on ORD-1002?" agentcore invoke --runtime AcmeSupport --prompt "My order ORD-1003 is delayed, can you help?" agentcore invoke --runtime AcmeSupport --prompt "I'd like to check on order ORD-1004 please." agentcore invoke --runtime AcmeSupport --prompt "Can you look up order ORD-1005 for me?" agentcore invoke --runtime AcmeSupport --prompt "I want to return the coffee maker from order ORD-1005, it's defective." agentcore invoke --runtime AcmeSupport --prompt "Where is my order ORD-1002? It should have arrived by now." agentcore invoke --runtime AcmeSupport --prompt "ORD-1003 is really late, I want a discount." agentcore invoke --runtime AcmeSupport --prompt "Can you check order ORD-1001 and tell me when it was delivered?"
AWS SDK (boto3)
import boto3 import json import uuid client = boto3.client("bedrock-agentcore", region_name=REGION) prompts = [ "What's the status of my order ORD-1001?", "I need to return order ORD-1001, the shirt doesn't fit.", "What's the shipping status on ORD-1002?", "My order ORD-1003 is delayed, can you help?", "I'd like to check on order ORD-1004 please.", "Can you look up order ORD-1005 for me?", "I want to return the coffee maker from order ORD-1005, it's defective.", "Where is my order ORD-1002? It should have arrived by now.", "ORD-1003 is really late, I want a discount.", "Can you check order ORD-1001 and tell me when it was delivered?", ] for i, prompt in enumerate(prompts): session_id = f"acme-eval-{uuid.uuid4().hex[:12]}" print(f"[{i+1}/10] {prompt[:60]}...") response = client.invoke_agent_runtime( agentRuntimeArn=AGENT_ARN, runtimeSessionId=session_id, payload=json.dumps({"prompt": prompt}).encode(), ) response_body = response["response"].read() print(f" Done (session: {session_id})") print("\nAll sessions created.")

Attendez 2 à 3 minutes après le dernier appel pour CloudWatch assimiler la télémétrie avant de continuer.

Étape 3 : Exécuter l'évaluation par lots

Lancez une évaluation par lots pour évaluer toutes les sessions récentes. Le service découvre les sessions à partir CloudWatch des journaux, exécute chaque évaluateur par rapport à chaque session et renvoie des résultats agrégés.

Exemple
AgentCore CLI
agentcore run batch-evaluation \ --runtime AcmeSupport \ --evaluator Builtin.GoalSuccessRate Builtin.Helpfulness Builtin.Faithfulness \ --wait

Par défaut, agentcore run batch-evaluation démarre la tâche et revient immédiatement (sans blocage). Passez --wait au bloc jusqu'à ce que la tâche atteigne l'état terminal. Avec--wait, la CLI résout le groupe de CloudWatch journaux et le nom du service à partir de la configuration de votre projet, démarre le travail, bloque jusqu'à ce qu'il atteigne un état terminal, puis imprime les scores moyens par évaluateur :

Batch evaluation completed: acme-eval-a1b2c3d4

Sessions: 10 completed, 0 failed, 10 total

Evaluator                           Avg Score
─────────────────────────────────────────────
Builtin.GoalSuccessRate             0.7200
Builtin.Helpfulness                 0.8100
Builtin.Faithfulness                0.8500

Results saved to .cli/jobs/batch-eval-results/

Ajoutez --json pour émettre des résultats lisibles par machine (y compris batchEvaluationId et par évaluateuraverageScore) pour les scripts, et pour étiqueter l'exécution afin -n <name> de pouvoir comparer les résultats entre les exécutions. Par exemple :

agentcore run batch-evaluation \ --runtime AcmeSupport \ --evaluator Builtin.GoalSuccessRate Builtin.Helpfulness Builtin.Faithfulness \ -n acme_baseline \ --wait
AWS SDK (boto3)
import boto3 import uuid import time import json eval_client = boto3.client("bedrock-agentcore", region_name=REGION) # Start the batch evaluation response = eval_client.start_batch_evaluation( batchEvaluationName=f"acme_baseline_{uuid.uuid4().hex[:8]}", evaluators=[ {"evaluatorId": "Builtin.GoalSuccessRate"}, {"evaluatorId": "Builtin.Helpfulness"}, {"evaluatorId": "Builtin.Faithfulness"}, ], dataSourceConfig={ "cloudWatchLogs": { "serviceNames": [SERVICE_NAME], "logGroupNames": [LOG_GROUP], } }, clientToken=str(uuid.uuid4()), ) batch_eval_id = response["batchEvaluationId"] print(f"Started: {batch_eval_id}") # Poll until complete while True: result = eval_client.get_batch_evaluation(batchEvaluationId=batch_eval_id) status = result["status"] print(f"Status: {status}") if status in ("COMPLETED", "COMPLETED_WITH_ERRORS", "FAILED", "STOPPED"): break time.sleep(30) print(json.dumps(result, indent=4, default=str))

Étape 4 : lire les détails de chaque session

Les scores agrégés vous donnent une vue d'ensemble. Pour consulter les scores par tour et par évaluateur pour chaque session, utilisez les commandes de visualisation intégrées de la CLI ou lisez les événements d'évaluation directement à partir des journaux. CloudWatch

Exemple
AgentCore CLI

La CLI fournit des commandes de première classe pour afficher les tâches d'évaluation par lots terminées et leurs résultats. Affichez une tâche spécifique en fonction de son ID de tâche d'évaluation par lots ou listez les tâches précédentes :

# View a batch evaluation job and its results agentcore view batch-evaluation acme-eval-a1b2c3d4 # List batch evaluation jobs agentcore batch-evaluations history

Ces commandes s'exécutent de manière interactive lorsqu'aucun indicateur n'est indiqué. Ajoutez --json pour une sortie non interactive lisible par machine, par exemple. agentcore view batch-evaluation acme-eval-a1b2c3d4 --json

AWS SDK (boto3)
# Get the output location from the batch evaluation result output = result["outputConfig"]["cloudWatchConfig"] log_group = output["logGroupName"] log_stream = output["logStreamName"] # Read the events logs_client = boto3.client("logs", region_name=REGION) response = logs_client.get_log_events( logGroupName=log_group, logStreamName=log_stream, ) for event in response["events"]: event_attrs = json.loads(event["message"]).get("attributes", {}) print(f"Score: {event_attrs.get('gen_ai.evaluation.score.value')}") print(f"Label: {event_attrs.get('gen_ai.evaluation.score.label')}") print(f"Explanation: {event_attrs.get('gen_ai.evaluation.explanation', '')[:200]}") print()

Étapes suivantes