View a markdown version of this page

对托管在外部的代理进行 A/B 测试 AgentCore - Amazon Bedrock AgentCore

对托管在外部的代理进行 A/B 测试 AgentCore

您可以使用托管在任何地方(例如在 AWS Lambda、Amazon EKS 或 Amazon ECS 上)的代理来 A/B 测试在 AgentCore 运行时之外运行的代理。对于 A/B 测试代理, AgentCore 网关在变体之间路由流量,在线评估对每个会话进行评分,服务计算每个变体的统计显著性。当您的代理不在 AgentCore Runtime 上时,您需要对其进行检测以确定其可观察性,然后自己将其注册为 AgentCore 网关目标,然后启用网关跟踪,以便可以将会话归因于变体。

A/B 测试支持具有单个代理运行时的配置捆绑包以及具有两个代理端点的基于目标的路由。本页介绍如何在启用跟踪的情况下将 HTTP 可访问代理端点设置为 AgentCore 网关上的目标。然后, AgentCore 网关跟踪提供变体归因,代理端点上的可观察性提供消息内容以进行评分。

本页是使用基于目标的路由进行 A/B 测试的附录。它仅涵盖非运行时代理所需的额外设置——以 Lambda-hosted 代理(在函数 URL 后面)为例;同样的方法适用于您注册为 AgentCore 网关目标的任何 HTTP-reachable 代理端点——然后将您发送回该页面以创建和运行测试。

先决条件

除了一般的 A/B 测试先决条件外,您还需要:

  1. AgentCore 在网关上启用了网关跟踪,因此可以将会话归因于变体。

  2. 使用支持的协议,您的代理作为直通目标添加到 AgentCore 网关上。

第 1 步:对您的代理进行 AgentCore 可观察性检测

对于 Lambda-hosted 代理,请附加 AWS Lambda 层 OpenTelemetry并设置以下环境变量:

aws lambda update-function-configuration \ --function-name <function-name> \ --region <region> \ --layers <adot-python-layer-arn> \ --environment "Variables={ AGENT_OBSERVABILITY_ENABLED=true, OTEL_PROPAGATORS='baggage,xray-lambda,tracecontext', OTEL_PYTHON_DISTRO=aws_distro, OTEL_PYTHON_CONFIGURATOR=aws_configurator, OTEL_LOGS_EXPORTER=otlp, OTEL_TRACES_EXPORTER=otlp, OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf, OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true, OTEL_AWS_APPLICATION_SIGNALS_ENABLED=false, OTEL_EXPORTER_OTLP_LOGS_HEADERS='x-aws-log-group=/aws/bedrock-agentcore/agents/<function-name>/runtime-logs,x-aws-log-stream=runtime-logs,x-aws-metric-namespace=agentcore', OTEL_RESOURCE_ATTRIBUTES='service.name=<function-name>', AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument }"

一个最小的 Lambda 处理程序,用于解析函数 URL 请求并设置会话负担:

import base64, json from strands import Agent from strands.models.bedrock import BedrockModel from opentelemetry import baggage, context _model = BedrockModel(model_id="global.anthropic.claude-sonnet-4-5-20250929-v1:0") def lambda_handler(event, _context): # Lambda function URL payload format 2.0: JSON body is in event["body"], no httpMethod. raw = event.get("body") if raw is not None and event.get("isBase64Encoded"): raw = base64.b64decode(raw).decode() body = json.loads(raw) if isinstance(raw, str) else (raw or event) session_id = _session_id(event) token = context.attach(baggage.set_baggage("session.id", session_id)) try: agent = Agent(model=_model, system_prompt="You are a helpful assistant. Be concise.") result = agent(body.get("prompt", "Hello")) finally: context.detach(token) return {"response": str(result), "sessionId": session_id} def _session_id(event): return (event.get("headers") or {}).get("x-session-id") or "default"

对于基于目标的路由,请将其部署两次(控制和处理),并根据您正在测试的更改进行部署,例如不同的提示model_id或系统提示。

第 2 步:通过 HTTP 公开您的代理

必须能够通过 AgentCore 网关可以调用的 HTTP 端点访问代理。在 Lambda 示例中,为每个函数创建一个带有 IAM 身份验证的函数 URL:

aws lambda create-function-url-config \ --function-name cs-agent-control \ --auth-type AWS_IAM \ --region us-west-2

重复此操作即可发挥治疗功能。(对于容器或自托管代理,请改为公开 HTTPS 端点并跳至步骤 3。)

步骤 3:将您的代理注册为 AgentCore 网关目标

将每个端点注册为 AgentCore 网关上的 HTTP 直通目标。有关直通目标的详细信息(包括protocolType、粘性和凭据选项),请参阅 HTTP 直通目标。

要将 Lambda 函数 URL 注册为目标,protocolType请设置为CUSTOM并提供。iamCredentialProvider凭证提供者授权网关将发往函数 URL 的每个出站请求作为服务进行签名:lambda

注意
  • stickinessConfiguration告诉网关使用x-session-id标头来识别哪些请求属于同一个会话。当您开始或停止 A/B 测试时,会话粘性可以使飞行中的会话不受影响:网关继续将正在进行的会话路由到它们已经分配到的相同目标,并且在测试运行时仅根据您的 A/B 测试处理权重路由新的会话。

  • 为了便于观察,您的代理还必须在其跟踪上下文中设置相同的会话 ID(例如,作为session.id行李)。这使在线评估可以对代理会话和跟踪进行评分,并将其归因于正确的 A/B 测试处理。

AgentCore CLI
agentcore add gateway-target \ --name customer-support-control \ --gateway cs-3p-abtest-gw \ --type passthrough \ --passthrough-endpoint https://<control-id>.lambda-url.us-west-2.on.aws/ \ --passthrough-protocol CUSTOM \ --stickiness-identifier '$context.header.x-session-id' \ --stickiness-timeout 28800 \ --signing-service lambda \ --signing-region us-west-2
AWS CLI
aws bedrock-agentcore-control create-gateway-target \ --gateway-identifier cs-3p-abtest-gw-abc123 \ --name customer-support-control \ --region us-west-2 \ --target-configuration '{ "http": { "passthrough": { "endpoint": "https://<control-id>.lambda-url.us-west-2.on.aws/", "protocolType": "CUSTOM", "stickinessConfiguration": { "identifier": "$context.header.x-session-id", "timeout": 28800 } } } }' \ --credential-provider-configurations '[ { "credentialProviderType": "GATEWAY_IAM_ROLE", "credentialProvider": { "iamCredentialProvider": { "service": "lambda", "region": "us-west-2" } } } ]'

对于基于目标的路由,对治疗端点重复此操作(命名customer-support-treatment)。使用 until i status s 对每个get-gateway-target目标进行轮询READY

注意

iamCredentialProvider是 IAM-authenticated 直通目标所必需的。对于 Lambda 函数,网址设置为servicelambda网关 IAM 角色lambda:InvokeFunction在每个函数的 ARN 上必须同时具有lambda:InvokeFunctionUrl和。

步骤 4:启用 AgentCore 网关跟踪

在 AgentCore 网关上启用跟踪交付,使其向发送变体归因跨度。aws/spans要从控制台启用跟踪,请打开网关详细信息页面,然后选择 “记录交付和跟踪” → “跟踪” → “启用”。有关更多信息,请参阅将跟踪交付配置为 CloudWatch

一旦流量开始流动,每个网关跨度都带有aws.agentcore.gateway.routing_experiment_arnaws.agentcore.gateway.routing_experiment_variant_name(例如CT1)属性以及请求traceId的属性。在线评估管道通过以下方式将网关跨度与您的代理跨度相连traceId,这就是每个已评分的会话归因于其变体的方式。如果没有网关跟踪,仍会对会话进行评分,但不能将其归因于变体, A/B 测试也不会生成每个变体的结果。

步骤 5:创建并运行 A/B 测试

您的代理现在是发射遥测的网关目标。还剩下两个步骤:

  1. 为每个变体端点创建一个在线评估配置。请参阅创建在线评估。对于每个配置,请使用您在中配置的service.name和事件日志组第 1 步:对您的代理进行 AgentCore 可观察性检测

  2. 创建并运行 A/B 测试。关注使用基于目标的路由运行 A/B 测试,从 “创建 A/B 测试” 步骤开始 — 使用创建测试perVariantOnlineEvaluationConfig、发送流量、投票结果、停止并部署获胜者。

当您通过网关发送流量时,请将其定向到控制变体的目标。网关根据您的 A/B 测试配置将到达控制目标的所有流量分成控制 (CT1) 和治疗 () 目标。

AgentCore CLI

为每个变体添加一个在线评估配置(使用中的service.name和事件日志组第 1 步:对您的代理进行 AgentCore 可观察性检测作为数据源),然后在target-based模式下开始测试:

agentcore add online-eval \ --name cs-control-eval \ --evaluator Builtin.Correctness \ --service-name customer-support-control \ --log-group-name /aws/bedrock-agentcore/agents/cs-agent-control/runtime-logs \ --enable-on-create agentcore add online-eval \ --name cs-treatment-eval \ --evaluator Builtin.Correctness \ --service-name customer-support-treatment \ --log-group-name /aws/bedrock-agentcore/agents/cs-agent-treatment/runtime-logs \ --enable-on-create agentcore deploy agentcore run ab-test \ --name cs-3p-abtest \ --gateway cs-3p-abtest-gw \ --mode target-based \ --control-target customer-support-control \ --treatment-target customer-support-treatment \ --control-online-eval cs-control-eval \ --treatment-online-eval cs-treatment-eval \ --control-weight 50 \ --treatment-weight 50 \ --wait

agentcore status用于在测试运行时查看每个变体的结果agentcore stop并结束测试。

AWS SDK (boto3)

使用为每个变体创建一个在线评估配置create_online_evaluation_config。设置serviceNames为终端节点及其事件日志组。service.name logGroupNames然后使用创建测试perVariantOnlineEvaluationConfigcreate_ab_test有关完整的 boto3 示例(包括发送流量、轮询结果和停止测试),请参阅从 “创建 A/B 测试” 步骤开始,使用基于目标的路由运行测试。 A/B

问题排查

A/B 发送流量后测试未显示任何结果

  • 确认网关跟踪已启用(步骤 4:启用 AgentCore 网关跟踪)——没有网关跟踪,聚合管道就无法将会话归因于变体。

  • 确认每个在线评估配置都与端点serviceNames相匹配,service.name并且logGroupNames包括端点的事件日志组。在线评估aws/spans会自动读取,因此您无需将其列出,但必须列出事件日志组(消息内容)。

  • 在配置的会话处于空闲状态之后sessionTimeoutMinutes,然后在下一个评分周期的大约 15 分钟内,结果就会出现。