View a markdown version of this page

批量数据集运行器 - 亚马逊基岩 AgentCore

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

批量数据集运行器

BatchEvaluationRunner委托人通过和 GetBatchEvaluation API 将收集和评估完全跨越到服务中StartBatchEvaluation。在为每个场景调用代理后,运行器会提交批处理作业并进行轮询直至完成,返回汇总结果。

当您需要汇总多个会话的分数而无需自己管理跨度收集时,可使用批处理运行器;用于基线测量、大型数据集和 pre/post 比较。

工作原理

运行器分四个阶段处理场景:

  1. 调用:所有场景都使用线程池并行运行。每个场景都有一个唯一的会话 ID,并在一个按顺序执行的场景内切换,以维护对话上下文。

  2. 等待:可配置的摄取延迟(默认值:180 秒) CloudWatch 允许采集遥测数据。延迟一次性支付,而不是按场景支付。

  3. 提交:运行者使用 CloudWatch 日志组、调StartBatchEvaluation用阶段的会话 ID、评估者 ID 和数据集中的真实情况进行调用。

  4. 轮询:运行者轮询GetBatchEvaluation直到作业达到终端状态并返回汇总结果。

代理调用者

跑步者需要一个代理调用器,一个在单回合内调用你的代理的可调用对象。调用者与框架无关:您可以通过 boto3 invoke_agent_runtime、直接函数调用、HTTP 请求或任何其他方法调用代理。

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))
字段 Type 说明

AgentInvokerInput.payload

str 或 dict

来自数据集的转弯输入。

AgentInvokerInput.session_id

str

在场景中所有回合都保持稳定。将其传递给您的代理以维护对话上下文。

AgentInvokerOutput.agent_output

Any

代理的回应。

示例

以下示例从 JSON 文件加载数据集并运行批量评估。有关数据集格式,请参阅数据集架构。

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}")

获取每个会话的详细信息

汇总结果显示所有会话的平均值。要查看每个会话、每个评估者的分数,请从以下地址获取评估事件: 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()

配置参考

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 )
字段 默认值 说明

batch_evaluation_name

—

批量评估作业的名称。

evaluator_config.evaluator_ids

—

评估器 ID 列表(内置或自定义)。

data_source.service_names

—

服务名称,用于标识您的代理的踪迹 CloudWatch。

data_source.log_group_names

—

CloudWatch 存储代理遥测数据的日志组名称。

data_source.ingestion_delay_seconds

180

调用后等待摄取跨度 CloudWatch 所需的秒数。

polling_timeout_seconds

1800

等待批处理作业完成的最大秒数。

polling_interval_seconds

30

轮询请求之间的秒数。

simulation_config

无

模拟场景的配置。SimulationConfig(model_id="…​")当数据集包含SimulatedScenario实例时设置。参见用户模拟。

结果结构

跑步者返回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_failures列出了在提交批处理作业之前代理调用失败的场景。这些会话不包含在批量评估中。

  • output_data_config指向写入每个会话详细信息的 CloudWatch 日志流。runner.fetch_evaluation_events(result)用来阅读。

错误处理

  • 场景调用失败被记录为FailedScenario但不会阻塞批处理作业;只会提交成功的会话。

  • 如果所有场景都失败,则运行者ValueError在调用 API 之前加注。

  • 轮询超时:TimeoutError如果任务超过polling_timeout_seconds。

  • 作业失败:RuntimeError如果批量评估状态为FAILED或STOPPED。