

# 對託管在 AgentCore 外部的代理程式執行 A/B 測試
<a name="ab-testing-3p-agents"></a>

您可以 A/B 測試在 AgentCore 執行期外執行的代理程式，並在任何地方託管代理程式，例如 AWS Lambda、Amazon EKS 或 Amazon ECS。對於 A/B 測試代理程式，AgentCore 閘道會路由變體之間的流量、每個工作階段的線上評估分數，而且服務會計算每個變體的統計重要性。當您的代理程式不在 AgentCore 執行時間上時，您需要對其進行可觀測性檢測，並自行將其註冊為 AgentCore 閘道目標，並啟用閘道追蹤，以便工作階段可以歸因於變體。

A/B 測試支援[具有單一代理程式執行時間的組態套件](ab-testing-config-bundle.md)，以及[具有兩個代理程式端點的目標型路由](ab-testing-target-based.md)。此頁面說明如何在啟用追蹤的 AgentCore 閘道上將 HTTP 可連線代理程式端點設定為目標。然後，AgentCore 閘道追蹤會提供變體屬性，而代理端點上的可觀測性會提供訊息內容以供評分。

此頁面是使用[目標型路由執行 A/B 測試的](ab-testing-target-based.md)附錄。它僅涵蓋非執行期代理程式所需的額外設定 — 使用 Lambda 託管代理程式 （函數 URL 後方） 作為範例；相同的方法適用於您註冊為 AgentCore 閘道目標的任何 HTTP 可連線代理程式端點 — 然後將您傳回該頁面以建立和執行測試。

## 先決條件
<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 託管的代理程式，連接適用於 [AWS OpenTelemetry 的 Lambda Layer](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`。登入資料提供者授權閘道將每個傳出請求簽署為 `lambda` 服務的函數 URL：

**注意**  
`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`)。使用 輪詢每個目標，`get-gateway-target`直到 `status`為 `READY`。

**注意**  
 `iamCredentialProvider` IAM 驗證的傳遞目標需要 。對於`service`設定為 的 Lambda 函數 URL`lambda`。閘道 IAM 角色必須在每個函數的 ARN `lambda:InvokeFunction`上同時具有 `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`設定為其事件日誌群組。然後使用 建立測試`create_ab_test``perVariantOnlineEvaluationConfig`。如需完整的 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 分鐘內出現。