Ejecutor de conjuntos de datos por lotes
Los BatchEvaluationRunner delegados transfieren la recopilación y la evaluación por completo al servicio a través de las GetBatchEvaluation API StartBatchEvaluation y. Tras invocar a su agente para cada escenario, el encargado envía un trabajo por lotes y sondea hasta que se complete, y devuelve los resultados agregados.
Utilice el sistema de procesamiento por lotes cuando necesite sumar las puntuaciones de varias sesiones sin tener que gestionar usted mismo la recopilación de intervalos, para realizar mediciones de referencia, conjuntos de datos de gran tamaño y realizar comparaciones. pre/post
Funcionamiento
El ejecutor procesa los escenarios en cuatro fases:
-
Invocar: todos los escenarios se ejecutan simultáneamente mediante un grupo de subprocesos. Cada escenario recibe un identificador de sesión único y, dentro de un escenario, se ejecuta secuencialmente para mantener el contexto de la conversación.
-
Espera: un retraso de ingesta configurable (predeterminado: 180 segundos) permite CloudWatch ingerir los datos de telemetría. Este retraso se paga una vez, no por escenario.
-
Enviar: el ejecutor llama
StartBatchEvaluationcon el grupo de CloudWatch registros, los ID de sesión de la fase de invocación, los ID del evaluador y la información básica del conjunto de datos. -
Encuesta: el corredor sondea
GetBatchEvaluationhasta que el trabajo alcance un estado terminal y devuelva los resultados agregados.
Invocador de agentes
El corredor requiere un invocador de agentes, un invocador que invoca a tu agente durante un solo turno. El invocador es independiente del marco: puedes llamar a tu agente mediante boto3invoke_agent_runtime, una llamada directa a una función, una solicitud HTTP o cualquier otro método.
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))
| Campo | Tipo | Description (Descripción) |
|---|---|---|
|
|
|
El turno es la entrada del conjunto de datos. |
|
|
|
Estable en todos los giros de un escenario. Transmita esta información a su agente para mantener el contexto de la conversación. |
|
|
|
La respuesta del agente. |
Ejemplo
El siguiente ejemplo carga un conjunto de datos desde un archivo JSON y ejecuta la evaluación por lotes. Para conocer el formato del conjunto de datos, consulte Esquema del conjunto de datos.
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}")
Obteniendo detalles por sesión
Los resultados agregados muestran los promedios de todas las sesiones. Para ver las puntuaciones por sesión y por evaluador, busque los eventos de evaluación en: 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()
Referencia de la configuración
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 )
| Campo | Predeterminado | Description (Descripción) |
|---|---|---|
|
|
— |
Nombre del trabajo de evaluación por lotes. |
|
|
— |
Lista de identificadores de evaluadores (integrados o personalizados). |
|
|
— |
Nombre del servicio que identifica las huellas de su agente. CloudWatch |
|
|
— |
CloudWatch nombres de grupos de registros donde se almacena la telemetría del agente. |
|
|
180 |
Hay que esperar segundos después de la invocación para CloudWatch ingerir los intervalos. |
|
|
1800 |
Tiempo máximo de espera para que se complete el trabajo por lotes. |
|
|
30 |
Segundos entre las solicitudes de sondeo. |
|
|
Ninguno |
Configuración para escenarios simulados. Se establece |
Estructura de resultados
El corredor devuelve unBatchEvaluationResult:
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_failuresenumera los escenarios en los que la invocación del agente falló antes de que se enviara el trabajo por lotes. Estas sesiones no se incluyen en la evaluación por lotes. -
output_data_configapunta al flujo de CloudWatch registro en el que se escriben los detalles de cada sesión. Se usarunner.fetch_evaluation_events(result)para leerlo.
Gestión de errores
-
Los errores de invocación del escenario se registran como trabajo por lotes,
FailedScenariopero no lo bloquean; solo se envían las sesiones correctas. -
Si todos los escenarios fallan, el ejecutor se activa
ValueErrorantes de llamar a la API. -
Tiempo de espera de la encuesta:
TimeoutErrorsi el trabajo lo superapolling_timeout_seconds. -
Job fallido:
RuntimeErrorsi el estado de evaluación del lote esFAILEDoSTOPPED.