View a markdown version of this page

AgentCore の外部でホストされているエージェントの A/B テストを実行する - Amazon Bedrock AgentCore

AgentCore の外部でホストされているエージェントの A/B テストを実行する

A/B は、Lambda、Amazon EKS、Amazon ECS AWS など、任意の場所でホストされているエージェントを使用して、AgentCore ランタイムの外部で実行されるエージェントをテストできます。A/B テストエージェントの場合、AgentCore ゲートウェイはバリアント間でトラフィックをルーティングし、各セッションのオンライン評価スコアをルーティングし、サービスはバリアントごとの統計的有意性を計算します。エージェントを AgentCore ランタイムにない場合は、オブザーバビリティのために計測し、AgentCore ゲートウェイターゲットとして自分で登録し、ゲートウェイトレースを有効にして、セッションをバリアントに属性付けできるようにする必要があります。

A/B テストでは、単一のエージェントランタイムの設定バンドルと、2 つのエージェントエンドポイントを使用したターゲットベースのルーティングがサポートされています。このページでは、トレースを有効にして、HTTP 到達可能なエージェントエンドポイントを AgentCore ゲートウェイのターゲットとして設定する方法を示します。次に、AgentCore ゲートウェイトレースはバリアント属性を提供し、エージェントエンドポイントのオブザーバビリティはスコアリング用のメッセージコンテンツを提供します。

このページは、ターゲットベースのルーティングで A/B テストを実行するための付録です。例として Lambda がホストするエージェント (関数 URL の背後) を使用する、ランタイム以外のエージェントが必要とする追加セットアップのみを対象としています。AgentCore ゲートウェイターゲットとして登録した HTTP 到達可能なエージェントエンドポイントにも同じアプローチが適用され、テストを作成および実行するためにそのページに戻ります。

前提条件

一般的な A/B テストの前提条件に加えて、以下が必要です。

  1. AgentCore ゲートウェイトレースがゲートウェイで有効になっているため、セッションをバリアントに属性付けできます。

  2. エージェントは、サポートされているプロトコルを使用して AgentCore ゲートウェイのパススルーターゲットとして を追加しました。

ステップ 1: AgentCore オブザーバビリティのためにエージェントを計測する

Lambda がホストするエージェントの場合は、AWS Lambda Layer for 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 }"

関数 URL リクエストを解析し、セッションのバランサーを設定する最小限の Lambda ハンドラー。

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 回デプロイします。

ステップ 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 への各アウトバウンドリクエストに署名することを許可します。

注記
  • は、 x-session-idヘッダーを使用して、同じセッションに属するリクエストを認識するようにゲートウェイにstickinessConfiguration指示します。セッションの維持は、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になるまで、各ターゲットを でポーリングstatusしますREADY

注記

iamCredentialProvider は、IAM 認証パススルーターゲットに必要です。Lambda 関数の URL が serviceに設定されている場合lambda。ゲートウェイ IAM ロールには、各関数の ARN lambda:InvokeFunctionlambda:InvokeFunctionUrlと の両方が必要です。

ステップ 4: AgentCore ゲートウェイトレースを有効にする

AgentCore ゲートウェイでトレース配信を有効にして、バリアント属性スパンを に出力しますaws/spans。コンソールからトレースを有効にするには、ゲートウェイの詳細ページを開き、ログ配信とトレーストレース → 有効化を選択します。詳細については、CloudWatch へのトレース配信を設定する」を参照してください。

トラフィックがフローを開始すると、各ゲートウェイスパンには、リクエストtraceIdの とともに aws.agentcore.gateway.routing_experiment_arnおよび aws.agentcore.gateway.routing_experiment_variant_name (例: Cまたは T1) 属性が保持されます。オンライン評価パイプラインは、ゲートウェイスパンをエージェントのスパンに で結合します。これはtraceId、スコアリングされた各セッションがそのバリアントに属性付けられる方法です。ゲートウェイトレースがないと、セッションは引き続きスコアリングされますが、バリアントに帰属させることはできません。また、A/B テストではバリアントごとの結果は生成されません。

ステップ 5: A/B テストを作成して実行する

エージェントは、テレメトリを出力するゲートウェイターゲットになりました。2 つのステップが残ります。

  1. バリアントエンドポイントごとに 1 つのオンライン評価設定を作成します。「オンライン評価の作成」を参照してください。設定ごとに、 で設定した service.nameおよび イベントロググループを使用しますステップ 1: AgentCore オブザーバビリティのためにエージェントを計測する

  2. A/B テストを作成して実行します。「A/B テストの作成」ステップから始めて、ターゲットベースのルーティングで A/B テストを実行する — でテストを作成しperVariantOnlineEvaluationConfig、トラフィックを送信し、結果をポーリングして、勝者を停止してデプロイします。

ゲートウェイ経由でトラフィックを送信するときは、コントロールバリアントのターゲットに転送します。ゲートウェイは、コントロールターゲットに到着するすべてのトラフィックを、A/B テスト設定に従ってコントロール (C) ターゲットと処理 (T1) ターゲットに分割します。

AgentCore CLI

データソースステップ 1: AgentCore オブザーバビリティのためにエージェントを計測するとして の service.nameおよび イベントロググループを使用して、バリアントごとに 1 つのオンライン評価設定を追加し、 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)

を使用して、バリアントごとに 1 つのオンライン評価設定を作成しますcreate_online_evaluation_configserviceNames をエンドポイントの に設定service.nameし、 logGroupNamesをイベントロググループに設定します。次にcreate_ab_test、 を使用して でテストを作成しますperVariantOnlineEvaluationConfig。トラフィックの送信、結果のポーリング、テストの停止など、boto3 の完全な例については、「A/B テストの作成」ステップから始めて、ターゲットベースのルーティングで A/B テストを実行する」を参照してください。

トラブルシューティング

A/B テストでは、トラフィックの送信後に結果は表示されません

  • ゲートウェイトレースが有効になっていることを確認します (ステップ 4: AgentCore ゲートウェイトレースを有効にする) — これがないと、集約パイプラインはセッションをバリアントに属性付けできません。

  • 各オンライン評価設定の がエンドポイントの serviceNamesと一致しservice.name、その にエンドポイントのイベントロググループlogGroupNamesが含まれていることを確認します。オンライン評価aws/spansは自動的に読み込まれるため、一覧表示しませんが、イベントロググループ (メッセージコンテンツ) を一覧表示する必要があります。

  • 結果は、設定された でセッションがアイドル状態になった後sessionTimeoutMinutes、次のスコアリングサイクルから約 15 分以内に表示されます。