Exécuteur de jeux de données Batch
Les BatchEvaluationRunner délégués couvrent entièrement la collecte et l'évaluation du service via les GetBatchEvaluation API StartBatchEvaluation and. Après avoir appelé votre agent pour chaque scénario, le coureur soumet une tâche par lots et interroge jusqu'à ce qu'elle soit terminée, renvoyant des résultats agrégés.
Utilisez le batch runner lorsque vous avez besoin de scores agrégés sur de nombreuses sessions sans avoir à gérer vous-même la collecte des intervalles ; pour les mesures de référence, les grands ensembles de données et les pre/post comparaisons.
Comment ça marche
Le runner traite les scénarios en quatre phases :
-
Invoke : tous les scénarios s'exécutent simultanément à l'aide d'un pool de threads. Chaque scénario reçoit un identifiant de session unique et transforme un scénario exécuté de manière séquentielle pour maintenir le contexte de la conversation.
-
Attendre : un délai d'ingestion configurable (par défaut : 180 secondes) permet d' CloudWatch ingérer les données de télémétrie. Ce délai est payé une seule fois, et non par scénario.
-
Soumettre : le coureur appelle
StartBatchEvaluationavec le groupe de CloudWatch log, les identifiants de session depuis la phase d'invocation, les identifiants de l'évaluateur et les informations de base issues de l'ensemble de données. -
Sondage : le candidat interroge
GetBatchEvaluationjusqu'à ce que la tâche atteigne un état terminal et renvoie les résultats agrégés.
Invocateur de l'agent
Le coureur a besoin d'un invocateur d'agent, un appelable qui invoque votre agent pour un seul tour. L'invocateur est indépendant du framework : vous pouvez appeler votre agent via boto3invoke_agent_runtime, un appel de fonction direct, une requête HTTP ou toute autre méthode.
import json import boto3 from bedrock_agentcore.evaluation import AgentInvokerInput, AgentInvokerOutput REGION = "<region-code>" AGENT_ARN = "arn:aws:bedrock-agentcore:<region-code>:<account-id>:runtime/<agent-id>" LOG_GROUP = "/aws/bedrock-agentcore/runtimes/<agent-id>-DEFAULT" SERVICE_NAME = "<agent-id>.DEFAULT" agentcore_client = boto3.client("bedrock-agentcore", region_name=REGION) def agent_invoker(invoker_input: AgentInvokerInput) -> AgentInvokerOutput: payload = invoker_input.payload if isinstance(payload, str): payload = json.dumps({"prompt": payload}).encode() elif isinstance(payload, dict): payload = json.dumps(payload).encode() print(f"[{invoker_input.session_id}] > sending payload: {payload.decode()}") response = agentcore_client.invoke_agent_runtime( agentRuntimeArn=AGENT_ARN, runtimeSessionId=invoker_input.session_id, payload=payload, ) response_body = response["response"].read() print(f"[{invoker_input.session_id}] < received response: {response_body.decode()}") return AgentInvokerOutput(agent_output=json.loads(response_body))
| Champ | Type | Description |
|---|---|---|
|
|
|
Entrée du tour de l'ensemble de données. |
|
|
|
Stable à tous les virages d'un scénario. Transmettez-le à votre agent pour maintenir le contexte de la conversation. |
|
|
|
La réponse de l'agent. |
Exemple
L'exemple suivant charge un ensemble de données à partir d'un fichier JSON et exécute l'évaluation par lots. Pour le format du jeu de données, voir Schéma du jeu de données.
from bedrock_agentcore.evaluation import ( BatchEvaluationRunner, BatchEvaluationRunConfig, BatchEvaluatorConfig, CloudWatchDataSourceConfig, FileDatasetProvider, ) # Load dataset from a local file (see Dataset schema for format) dataset = FileDatasetProvider("dataset.json").get_dataset() # Or load from the Dataset Management service from bedrock_agentcore.evaluation import DatasetClient, DatasetManagementServiceProvider ds_client = DatasetClient(region_name=REGION) dataset = DatasetManagementServiceProvider(dataset_id="my-dataset-id", client=ds_client).get_dataset() # Configure the batch evaluation config = BatchEvaluationRunConfig( batch_evaluation_name="dataset-batch-eval", evaluator_config=BatchEvaluatorConfig( evaluator_ids=[ "Builtin.GoalSuccessRate", "Builtin.Correctness", "Builtin.TrajectoryExactOrderMatch", "Builtin.Helpfulness", ], ), data_source=CloudWatchDataSourceConfig( service_names=[SERVICE_NAME], log_group_names=[LOG_GROUP], ingestion_delay_seconds=180, ), polling_timeout_seconds=1800, polling_interval_seconds=30, ) # Run runner = BatchEvaluationRunner(region=REGION) result = runner.run_dataset_evaluation( agent_invoker=agent_invoker, dataset=dataset, config=config, ) # Display aggregate results print(f"Status: {result.status}") print(f"Batch evaluation ID: {result.batch_evaluation_id}") 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}") print(f"Total sessions: {er.total_number_of_sessions}") for summary in er.evaluator_summaries or []: avg = summary.statistics.average_score if summary.statistics else None print(f" {summary.evaluator_id}: avg={avg}")
Récupération des détails par session
Les résultats agrégés indiquent les moyennes de toutes les sessions. Pour voir les scores par session et par évaluateur, récupérez les événements d'évaluation depuis : CloudWatch
if result.output_data_config: events = runner.fetch_evaluation_events(result) print(f"\nEvaluation events: {len(events)}") for ev in events: attrs = ev.get("attributes", {}) print(f" session: {attrs.get('session.id', '')[:40]}") print(f" evaluator: {attrs.get('gen_ai.evaluation.name')}") print(f" score: {attrs.get('gen_ai.evaluation.score.value')}") print(f" label: {attrs.get('gen_ai.evaluation.score.label')}") print()
Référence de configuration
BatchEvaluationRunConfig( batch_evaluation_name="my-batch-eval", # Job name evaluator_config=BatchEvaluatorConfig( evaluator_ids=["Builtin.GoalSuccessRate"], ), data_source=CloudWatchDataSourceConfig( service_names=["MyAgent.DEFAULT"], # Exactly 1 service name log_group_names=[LOG_GROUP], # 1-5 log group names ingestion_delay_seconds=180, # Wait for CW ingestion (default: 180) ), polling_timeout_seconds=1800, # Max wait for job completion (default: 1800) polling_interval_seconds=30, # Poll interval (default: 30) simulation_config=None, # Set SimulationConfig for simulated scenarios )
| Champ | Par défaut | Description |
|---|---|---|
|
|
— |
Nom de la tâche d'évaluation par lots. |
|
|
— |
Liste des identifiants d'évaluateur (intégrés ou personnalisés). |
|
|
— |
Nom du service identifiant les traces de votre agent dans CloudWatch. |
|
|
— |
CloudWatch noms des groupes de journaux dans lesquels la télémétrie des agents est stockée. |
|
|
180 |
Quelques secondes à attendre après l'invocation pour CloudWatch ingérer des spans. |
|
|
1800 |
Nombre maximal de secondes à attendre pour que le traitement par lots soit terminé. |
|
|
30 |
Quelques secondes entre les demandes de sondage. |
|
|
Aucune |
Configuration pour les scénarios simulés. Définissez le |
Structure des résultats
Le coureur renvoie un BatchEvaluationResult :
BatchEvaluationResult ├── batch_evaluation_id: str ├── batch_evaluation_arn: str ├── batch_evaluation_name: str ├── status: str ├── created_at: datetime ├── evaluation_results: Optional[BatchEvaluationSummary] │ ├── number_of_sessions_completed: int │ ├── number_of_sessions_in_progress: int │ ├── number_of_sessions_failed: int │ ├── number_of_sessions_ignored: int │ ├── total_number_of_sessions: int │ └── evaluator_summaries: List │ ├── evaluator_id: str │ ├── statistics.average_score: float │ ├── total_evaluated: int │ └── total_failed: int ├── error_details: Optional[List[str]] ├── agent_invocation_failures: List[FailedScenario] └── output_data_config: Optional[CloudWatchOutputDataConfig] ├── log_group_name: str └── log_stream_name: str
-
agent_invocation_failuresrépertorie les scénarios dans lesquels l'appel de l'agent a échoué avant que le traitement par lots ne soit soumis. Ces sessions ne sont pas incluses dans l'évaluation par lots. -
output_data_configpointe vers le flux de CloudWatch journal dans lequel sont écrits les détails de chaque session.runner.fetch_evaluation_events(result)Utilisez-le pour le lire.
Gestion des erreurs
-
Les échecs d'invocation du scénario sont enregistrés
FailedScenariomais ne bloquent pas le traitement par lots ; seules les sessions réussies sont soumises. -
Si tous les scénarios échouent, le lanceur déclenche l'appel
ValueErroravant d'appeler l'API. -
Délai d'interrogation :
TimeoutErrorsi la tâche dépassepolling_timeout_seconds. -
Échec du job :
RuntimeErrorsi le statut d'évaluation du lot estFAILEDouSTOPPED.