

# 对托管在外部的代理进行 A/B 测试 AgentCore
<a name="ab-testing-3p-agents"></a>

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

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

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

## 先决条件
<a name="ab-testing-3p-prereqs"></a>

除了[一般的 A/B 测试先决条件](ab-testing-prereqs.md)外，您还需要：

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

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

## 第 1 步：对您的代理进行 AgentCore 可观察性检测
<a name="ab-testing-3p-step1-observability"></a>

**注意**  
按照[为托管在外部的代理启用可观察性 AgentCore](observability-configure.md#observability-configure-3p)进行完整设置。

对于 Lambda-hosted 代理，请附加 [AWS Lambda 层 OpenTelemetry](https://aws-otel.github.io/docs/getting-started/lambda#adot-lambda-layer-arns)并设置以下环境变量：

```
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 公开您的代理
<a name="ab-testing-3p-step2-http"></a>

必须能够通过 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 网关目标
<a name="ab-testing-3p-step3-target"></a>

将每个端点注册为 AgentCore 网关上的 HTTP **直通**目标。[有关直通目标的详细信息（包括`protocolType`、粘性和凭据选项），请参阅 HTTP 直通目标。](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-http-passthrough.html)

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

**注意**  
`stickinessConfiguration`告诉网关使用`x-session-id`标头来识别哪些请求属于同一个会话。当您开始或停止 A/B 测试时，会话粘性可以使飞行中的会话不受影响：网关继续将正在进行的会话路由到它们已经分配到的相同目标，并且在测试运行时仅根据您的 A/B 测试处理权重路由新的会话。
为了便于观察，您的代理还必须在其跟踪上下文中设置相同的会话 ID（例如，作为`session.id`行李）。这使在线评估可以对代理会话和跟踪进行评分，并将其归因于正确的 A/B 测试处理。

**Example**  

```
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 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 函数，网址设置为`service`。`lambda`网关 IAM 角色`lambda:InvokeFunction`在每个函数的 ARN 上必须同时具有`lambda:InvokeFunctionUrl`和。

## 步骤 4：启用 AgentCore 网关跟踪
<a name="ab-testing-3p-step4-gateway-tracing"></a>

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

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

## 步骤 5：创建并运行 A/B 测试
<a name="ab-testing-3p-step5-run"></a>

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

1.  **为每个变体端点创建一个在线评估配置。**请参阅[创建在线评估](create-online-evaluations.md)。对于每个配置，请使用您在中配置的`service.name`和事件日志组[第 1 步：对您的代理进行 AgentCore 可观察性检测](#ab-testing-3p-step1-observability)。

1.  **创建并运行 A/B 测试。**关注使用[基于目标的路由运行 A/B 测试](ab-testing-target-based.md)，从 “**创建 A/B 测试”** 步骤开始 — 使用创建测试`perVariantOnlineEvaluationConfig`、发送流量、投票结果、停止并部署获胜者。

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

**Example**  
为每个变体添加一个在线评估配置（使用中的`service.name`和事件日志组[第 1 步：对您的代理进行 AgentCore 可观察性检测](#ab-testing-3p-step1-observability)作为数据源），然后在`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`并结束测试。
使用为每个变体创建一个在线评估配置`create_online_evaluation_config`。设置`serviceNames`为终端节点及其事件日志组。`service.name` `logGroupNames`然后使用创建测试`perVariantOnlineEvaluationConfig`。`create_ab_test`有关完整的 boto3 示例（包括发送流量、轮询结果和停止测试），请参阅从 “[**创建 A/B **测试” 步骤开始，使用基于目标的路由运行](ab-testing-target-based.md)测试。 A/B 

## 问题排查
<a name="ab-testing-3p-troubleshooting"></a>

### A/B 发送流量后测试未显示任何结果
<a name="ab-testing-3p-no-results"></a>
+ 确认网关跟踪已启用（[步骤 4：启用 AgentCore 网关跟踪](#ab-testing-3p-step4-gateway-tracing)）——没有网关跟踪，聚合管道就无法将会话归因于变体。
+ 确认每个在线评估配置都与端点`serviceNames`相匹配，`service.name`并且`logGroupNames`包括端点的事件日志组。在线评估`aws/spans`会自动读取，因此您无需将其列出，但必须列出事件日志组（消息内容）。
+ 在配置的会话处于空闲状态之后`sessionTimeoutMinutes`，然后在下一个评分周期的大约 15 分钟内，结果就会出现。