View a markdown version of this page

對託管在 AgentCore 外部的代理程式執行 A/B 測試 - Amazon Bedrock AgentCore

對託管在 AgentCore 外部的代理程式執行 A/B 測試

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

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

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

先決條件

除了一般 A/B 測試先決條件之外,您還需要:

  1. 在閘道上啟用 AgentCore 閘道追蹤,讓工作階段可以歸因於變體。

  2. 您的代理程式已新增為使用支援通訊協定的 AgentCore 閘道上的傳遞目標。

步驟 1:檢測您的代理程式以取得 AgentCore 可觀測性

注意

對於 Lambda 託管的代理程式,連接適用於 AWS OpenTelemetry 的 Lambda Layer,並設定下列環境變數:

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。登入資料提供者授權閘道將每個傳出請求簽署為 lambda 服務的函數 URL:

注意
  • 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)。使用 輪詢每個目標,get-gateway-target直到 statusREADY

注意

iamCredentialProvider IAM 驗證的傳遞目標需要 。對於service設定為 的 Lambda 函數 URLlambda。閘道 IAM 角色必須在每個函數的 ARN lambda:InvokeFunction上同時具有 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 測試組態,將到達控制目標的所有流量分割至控制目標 (C) 和處理 (T1) 目標。

範例
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_configserviceNames 將 設定為端點的 service.name,並將 logGroupNames設定為其事件日誌群組。然後使用 建立測試create_ab_testperVariantOnlineEvaluationConfig。如需完整的 boto3 範例,包括傳送流量、輪詢結果和停止測試,請參閱使用目標型路由執行 A/B 測試,從建立 A/B 測試步驟開始。

疑難排解

A/B 測試在傳送流量後未顯示任何結果

  • 確認閘道追蹤已啟用 (步驟 4:啟用 AgentCore 閘道追蹤) — 如果沒有閘道追蹤,彙總管道就無法將工作階段歸因於變體。

  • 確認每個線上評估組態的 serviceNames符合端點的 ,service.namelogGroupNames包含端點的事件日誌群組。線上評估aws/spans會自動讀取,因此您不會列出它,但必須列出事件日誌群組 (訊息內容)。

  • 結果會在工作階段對設定的 閒置後出現sessionTimeoutMinutes,然後在下一個評分週期的大約 15 分鐘內出現。