대상 기반 라우팅을 사용하여 A/B 테스트 실행
테스트 중인 변경 사항에 코드 변경, 프레임워크 업그레이드 또는 완전히 다른 에이전트 구현이 포함된 경우 대상 기반 라우팅 패턴을 사용합니다. 대상 기반 라우팅은 동일한 AgentCore 런타임(명명된 엔드포인트)의 여러 버전 간에 또는 완전히 다른 AgentCore 런타임 간에 트래픽을 라우팅합니다. AgentCore Gateway는 각 엔드포인트를 별도의 대상으로 등록하고 A/B 테스트의 트래픽 가중치에 따라 각 세션을 한 엔드포인트 또는 다른 엔드포인트로 라우팅합니다.
대상 기반 A/B 테스트를 위한 키 구성:
-
변형 구성: AgentCore Gateway 대상 이름
variantConfiguration.target사용 -
평가 구성:
perVariantOnlineEvaluationConfig(각 엔드포인트에는 자체 로그 그룹이 있으므로 변형당 하나의 온라인 평가 구성) -
게이트웨이 필터: A/B 테스트가 가로채는 AgentCore Gateway 경로의
gatewayFilter.targetPaths범위 지정
이 연습에서는 Claude Sonnet(컨트롤)과 Claude Opus(트리트먼트)를 사용하는 두 가지 버전의 고객 지원 에이전트를 배포합니다. 하나는 각 버전에 대해 명명된 엔드포인트를 생성하고, A/B 테스트를 생성하고, 트래픽을 전송하고, 결과를 검토하고, 우승자를 배포합니다.
참고
이 연습은 AgentCore 런타임에서 호스팅되는 에이전트를 위한 것입니다. 에이전트가 AgentCore 런타임(예: AWS Lambda에서 타사 또는 자체 호스팅 에이전트) 외부에서 실행되는 경우 AgentCore 외부에서 호스팅되는 에이전트에 대한 A/B 테스트 실행을 참조하세요.
A/B 테스트 패턴에 대한 자세한 비교는 패턴 선택을 참조하세요.
1단계: 프로젝트 생성
AgentCore CLI를 사용하여 프로젝트를 생성합니다.
agentcore create --name ABTestTargetBased --no-agent cd ABTestTargetBased
2단계: 런타임 추가
에이전트 런타임을 추가합니다. 이 런타임의 두 가지 버전, 즉 제어를 위한 버전과 처리를 위한 버전을 배포한 다음 명명된 엔드포인트를 생성하여 각 버전을 별칭으로 지정합니다.
agentcore add agent \ --name csAgent \ --language Python \ --framework Strands \ --model-provider Bedrock \ --memory none \ --build CodeZip
프로젝트 구조:
ABTestTargetBased/
├── agentcore/
│ ├── agentcore.json
│ ├── aws-targets.json
│ └── cdk/
└── app/
└── csAgent/
├── main.py
└── pyproject.toml
3단계: 제어 및 처리 버전 배포
app/csAgent/main.py를 제어 버전으로 바꿉니다(Claude Sonnet 사용).
"""Customer support agent — control variant.""" from strands import Agent, tool from strands.models.bedrock import BedrockModel from bedrock_agentcore.runtime import BedrockAgentCoreApp app = BedrockAgentCoreApp() MODEL_ID = "global.anthropic.claude-sonnet-4-5-20250929-v1:0" SYSTEM_PROMPT = "You are a helpful customer support assistant for Acme Store." @tool def lookup_order(order_id: str) -> str: """Look up an order by ID.""" orders = { "ORD-1001": {"status": "delivered", "item": "Blue T-Shirt", "total": "$29.99"}, "ORD-1002": {"status": "in_transit", "item": "Running Shoes", "est_delivery": "2026-04-05"}, "ORD-1003": {"status": "delayed", "item": "Wireless Headphones", "days_late": 5}, } return str(orders.get(order_id, {"error": f"Order {order_id} not found"})) @tool def initiate_return(order_id: str, reason: str) -> str: """Initiate a return for an order.""" return f"Return initiated for {order_id}. Reason: {reason}. Return label sent to customer email." @tool def apply_discount(order_id: str, discount_percent: int, reason: str) -> str: """Apply a discount to an order.""" return f"Applied {discount_percent}% discount to {order_id}. Reason: {reason}." agent = Agent( model=BedrockModel(model_id=MODEL_ID), tools=[lookup_order, initiate_return, apply_discount], system_prompt=SYSTEM_PROMPT, ) @app.entrypoint def invoke(payload, context): result = agent(payload.get("prompt", "Hello")) return {"response": result.message["content"][0]["text"]} if __name__ == "__main__": app.run()
app/csAgent/pyproject.toml 종속성 업데이트:
dependencies = [ "aws-opentelemetry-distro", "bedrock-agentcore >= 1.8.0", "boto3", "botocore[crt] >= 1.35.0", "strands-agents[otel] >= 1.13.0", "opentelemetry-distro", "opentelemetry-instrumentation", ]
제어 버전을 배포합니다(버전 1 생성).
agentcore deploy
이제 처리 변형에 다른 모델을 사용하고 배포main.py하도록 업데이트합니다(이렇게 하면 버전 2가 생성됨).
MODEL_ID = "global.anthropic.claude-opus-4-6-v1"
agentcore deploy
각 버전에 대해 명명된 엔드포인트를 생성하고 배포합니다.
agentcore add runtime-endpoint \ --runtime csAgent \ --endpoint control \ --version 1 \ --description "Control variant — Claude Sonnet" agentcore add runtime-endpoint \ --runtime csAgent \ --endpoint treatment \ --version 2 \ --description "Treatment variant — Claude Opus" agentcore deploy
이제 다음을 수행할 수 있습니다.
-
런타임 엔드포인트
control- Claude Sonnet을 사용하여 버전 1을 제공합니다. -
런타임 엔드포인트
treatment- Claude Opus를 사용하여 버전 2를 제공합니다.
런타임이 작동하는지 확인합니다.
agentcore invoke --runtime csAgent --prompt "What is the status of order ORD-1003?"
이제 다음을 수행할 수 있습니다.
-
런타임 엔드포인트
control- Claude Sonnet을 사용하여 버전 1을 제공합니다. -
런타임 엔드포인트
treatment- Claude Opus를 사용하여 버전 2를 제공합니다.
4단계: 온라인 평가 구성 생성
각 엔드포인트에는 고유한 로그 그룹(로그 그룹 이름은 엔드포인트 이름으로 끝남)이 있으므로 변형당 하나의 온라인 평가 구성이 필요합니다.
agentcore add online-eval \ --name controlEvalTb \ --runtime csAgent \ --endpoint control \ --evaluator "Builtin.Helpfulness" \ --sampling-rate 100.0 \ --enable-on-create agentcore add online-eval \ --name treatmentEvalTb \ --runtime csAgent \ --endpoint treatment \ --evaluator "Builtin.Helpfulness" \ --sampling-rate 100.0 \ --enable-on-create agentcore deploy
각 배포 후 온라인 평가 구성 ARN을 기록해 둡니다. A/B 테스트를 생성할 때 둘 다 필요합니다.
평가자 옵션 및 구성에 대한 자세한 내용은 온라인 평가 생성을 참조하세요.
5단계: 게이트웨이 및 대상 생성
대상 기반 A/B 테스트는 AgentCore 게이트웨이를 통해 트래픽을 라우팅하므로 테스트를 시작하기 전에 게이트웨이와 해당 두 대상이 이미 배포되어 있어야 합니다. 게이트웨이를 추가하고 각 런타임 엔드포인트를 http-runtime 대상으로 등록한 다음 배포합니다.
agentcore add gateway --name csGateway agentcore add gateway-target \ --name customer-support-control \ --gateway csGateway \ --type http-runtime \ --runtime csAgent \ --runtime-endpoint control agentcore add gateway-target \ --name customer-support-treatment \ --gateway csGateway \ --type http-runtime \ --runtime csAgent \ --runtime-endpoint treatment agentcore deploy
6단계: A/B 테스트 생성
를 사용하여 A/B 테스트를 시작합니다agentcore run ab-test. 각 변형은 생성한 게이트웨이 대상 중 하나를 참조하며 자체 온라인 평가 구성이 있습니다. 이 명령은 이미 배포된 게이트웨이에 대해 서비스에서 직접 테스트를 시작합니다.
예
7단계: AgentCore 게이트웨이를 통해 트래픽 전송
A/B 테스트를 실행한 후 AgentCore Gateway HTTP 엔드포인트를 통해 트래픽을 전송합니다. AgentCore Gateway는 런타임 세션 ID를 기반으로 변형(제어 또는 처리)에 각 요청을 할당합니다.
변형 할당 작동 방식
AgentCore Gateway는 X-Amzn-Bedrock-AgentCore-Runtime-Session-Id 헤더를 사용하여 트래픽을 라우팅할 대상을 결정합니다. 이 헤더는 선택 사항입니다. 제공하지 않으면 런타임이 세션 ID를 자동으로 생성합니다. 그런 다음 AgentCore Gateway는 세션 ID(제공했는지 또는 런타임에서 생성했는지 여부)를 사용하여 구성된 트래픽 가중치를 기반으로 변형에 요청을 할당합니다.
세션 할당은 고정됩니다. 세션 ID가 변형에 할당되면 동일한 세션 ID를 가진 모든 후속 요청이 동일한 대상으로 라우팅됩니다. 이렇게 하면 트래픽 분할에 따라 변형 간에 새 세션을 분산하면서 세션 내에서 일관된 경험을 보장할 수 있습니다.
테스트를 위한 트래픽 생성
다음 스크립트를 로 저장하여 <gateway-id> 및 <target-name>를 배포 출력의 값으로 loadgen.sh바꿉니다. 에서 전체 호출 URL을 복사할 수도 있습니다agentcore view ab-test <ab-test-id>.
#!/bin/bash export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key) export AWS_SESSION_TOKEN=$(aws configure get aws_session_token) GATEWAY_URL="https://<gateway-id>.gateway.bedrock-agentcore.us-west-2.amazonaws.com/<target-name>/invocations" PROMPTS=( "What is the status of order ORD-1003?" "I want to return order ORD-1001, it doesn't fit." "My order ORD-1003 is late. Can I get a discount?" "Where is my order ORD-1002?" "I need help with a return for order ORD-1001. The color is wrong." "Can you check on order ORD-1003? I've been waiting forever." "I'd like to cancel order ORD-1002 if it hasn't shipped yet." "Order ORD-1003 is delayed again. This is unacceptable." "What's your return policy for order ORD-1001?" "My headphones order ORD-1003 still hasn't arrived. What can you do?" ) for i in $(seq 1 30); do PROMPT="${PROMPTS[$(( (i - 1) % ${#PROMPTS[@]} ))]}" echo "=== Request $i: $PROMPT ===" curl -s --aws-sigv4 "aws:amz:us-west-2:bedrock-agentcore" \ --user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \ -H "x-amz-security-token: $AWS_SESSION_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id: $(uuidgen)" \ -d "{\"prompt\": \"$PROMPT\"}" \ -X POST \ "$GATEWAY_URL" echo "" sleep 2 done
스크립트를 실행합니다.
bash loadgen.sh
8단계: 결과 가져오기
A/B 테스트를 폴링하여 샘플 크기가 증가함에 따라 결과를 모니터링합니다. 폴링은 통계적 유효성에 영향을 주지 않습니다.
예
참고
결과가 표시되는 데 걸리는 시간은 주로 온라인 평가 구성에 구성된 세션 제한 시간에 따라 달라집니다. 제한 시간 내에 새 요청이 도착하지 않으면 세션이 완료된 것으로 간주됩니다. 세션이 종료된 후 결과는 일반적으로 15분 이내에 나타납니다. 더 많은 세션이 완료되면 결과가 누적됩니다. 샘플 크기에 따라 통계적 유의성이 향상됩니다.
결과 해석
-
p-값 < 0.05 및 양
percentChange수: 처리가 컨트롤보다 훨씬 더 좋습니다. 처리 배포를 고려합니다. -
p-값 < 0.05 및 음
percentChange수: 처리가 상당히 더 나빠졌습니다. 컨트롤을 유지합니다. -
p-값 >= 0.05: 차이를 결론지을 증거가 충분하지 않습니다. 샘플을 계속 수집하거나 처리 트래픽을 늘립니다.
-
모든 평가자 확인: 처리는 다른 지표를 회귀하는 동안 한 지표를 개선할 수 있습니다. 결정하기 전에 모든 평가자 결과를 검토합니다.
9단계: 결과 확인 및 A/B 테스트 중지
A/B 테스트가 통계적 유의성에 도달하면 결과를 검토하고 실험을 중지합니다.
-
중요도를 확인합니다. 대상 평가자가 처리 변형
percentChange에isSignificant: true대해 및 긍정이 있는지 확인합니다(또는 처리가 회귀된 경우 제어가 승자인지 확인). -
A/B 테스트를 중지합니다.
agentcore stop ab-test -i <ab-test-id>를 실행합니다. 트래픽 라우팅이 즉시 종료되고 모든 요청이 기본 대상으로 돌아갑니다. 보기, 일시 중지, 재개 및 중지를 참조하세요.
10단계: 당첨자 배포
A/B 테스트를 중지한 후 모든 트래픽을 대상 변형으로 라우팅합니다.
agentcore promote ab-test -i <ab-test-id> agentcore deploy
promote는 A/B 테스트를 중지하고(아직 실행 중인 경우), 처리 버전을 가리키도록 제어 엔드포인트를 업데이트하고(예: 버전 1control에서 버전 2로 업데이트), 처리 엔드포인트를 제거합니다. 를 실행agentcore deploy하여 변경 사항을 적용합니다.
또는 다음 중 하나를 수행하여 당첨자를 수동으로 배포할 수 있습니다.
-
옵션 A: AgentCore Gateway 라우팅 규칙을 사용하여 두 대상의 트래픽을 성공 대상으로 전달합니다.
-
옵션 B: AgentCore 게이트웨이에서 손실된 대상을 제거하고 모든 트래픽을 당첨자에게 라우팅합니다.
-
옵션 C: 낙찰 엔드포인트를 가리키도록 손실 대상을 업데이트합니다.
다음 단계
당첨자를 배포한 후:
-
A/B 테스트를 삭제하여 리소스를 정리합니다. A/B 테스트 삭제를 참조하세요.
-
새 기준을 모니터링합니다. 온라인 평가는 성공 구성에 대한 세션 점수를 계속 매깁니다. 회귀를 감시합니다.
-
다음 반복을 시작합니다. 우승 구성의 새로운 트레이스는 다음 권장 사항 주기의 토대를 제공합니다. 작동 방식을 참조하세요.
결과 이해
GetABTest를 호출하면 집계 파이프라인이 충분한 세션을 처리하면 응답에 results 객체가 포함됩니다. 결과에는 변형별로 분류된 평가자당 지표가 포함됩니다.
결과 구조
{ "results": { "analysisTimestamp": "2026-04-30T18:45:00Z", "evaluatorMetrics": [ { "evaluatorArn": "arn:aws:bedrock-agentcore:us-west-2:123456789012:evaluator/Builtin.Helpfulness", "controlStats": { "variantName": "C", "sampleSize": 24, "mean": 0.72 }, "variantResults": [ { "variantName": "T1", "sampleSize": 6, "mean": 0.85, "absoluteChange": 0.13, "percentChange": 18.1, "pValue": 0.032, "confidenceInterval": { "lower": 0.02, "upper": 0.24 }, "isSignificant": true } ] } ] } }
필드 참조
| 필드 | 설명 |
|---|---|
|
|
서비스가 통계를 마지막으로 계산한 시간입니다. |
|
|
온라인 평가 구성에서 평가자당 하나의 항목입니다. |
|
|
모든 컨트롤 세션의 평균 평가자 점수입니다. |
|
|
컨트롤 변형에 대해 점수가 매겨진 세션 수입니다. |
|
|
모든 치료 세션의 평균 평가자 점수입니다. |
|
|
처리 변형에 대해 점수가 매겨진 세션 수입니다. |
|
|
치료 평균과 제어 평균 간의 차이입니다. |
|
|
컨트롤과 비교한 백분율 개선(긍정) 또는 회귀(부정). |
|
|
확률 관찰된 차이는 확률로 인한 것입니다. 0.05 미만은 통계적 유의성을 나타냅니다. |
|
|
절대 변화( |
|
|
|
문제 해결
A/B 테스트는 트래픽을 전송한 후 결과를 표시하지 않습니다.
결과는 즉시 표시되지 않습니다. 소요 시간은 온라인 평가 구성에 구성된 세션 제한 시간에 따라 달라집니다. 세션은 제한 시간 내에 새 요청이 도착하지 않은 후에만 완료된 것으로 간주됩니다. 세션이 종료된 후 약 15분 이내에 결과가 나올 것으로 예상합니다.
이 기간 이후에도 결과가 나타나지 않는 경우:
-
온라인 평가 로그 그룹을 확인합니다. 온라인 평가 구성은 런타임 에이전트의 출력 로그 그룹을 가리켜야 합니다. 온라인 평가 구성이 다른 로그 그룹(또는 런타임에서 범위를 수신하지 않는 그룹)을 참조하는 경우 세션은 채점되지 않으며 A/B 테스트는 결과를 생성하지 않습니다.
-
로그 그룹 이름을 확인합니다. 대상 기반 라우팅의 경우 각 엔드포인트에는 고유한 로그 그룹이 있습니다(로그 그룹 이름은 엔드포인트 이름으로 끝남). 각 온라인 평가 구성이 올바른 엔드포인트의 로그 그룹을 참조하는지 확인합니다.
-
런타임이 스팬을 내보내고 있는지 확인합니다. CloudWatch Logs에서 예상 로그 그룹을 확인합니다. 각 스팬에서 찾고 있는 주요 속성:
-
aws.agentcore.gateway.routing_experiment_arn -
aws.agentcore.gateway.routing_experiment_variant_name(값:C또는T1) -
session.id
-
-
CLI 생성 구성과 수동 구성을 확인합니다.
agentcore add online-eval --runtime <name>를 사용한 경우 CLI는 올바른 로그 그룹을 자동으로 구성합니다. API를 통해 온라인 평가 구성을 수동으로 생성한 경우 AgentCore Online Eval Config가 런타임의 스팬 로그 그룹dataSourceConfig.cloudWatchLogs.logGroupNames과 일치하는지 확인합니다.