

# 대상 기반 라우팅을 사용하여 A/B 테스트 실행
<a name="ab-testing-target-based"></a>

테스트 중인 변경 사항에 코드 변경, 프레임워크 업그레이드 또는 완전히 다른 에이전트 구현이 포함된 경우 대상 기반 라우팅 패턴을 사용합니다. 대상 기반 라우팅은 동일한 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 테스트 실행을](ab-testing-3p-agents.md) 참조하세요.

A/B 테스트 패턴에 대한 자세한 비교는 [패턴 선택을 참조하세요](ab-testing.md#ab-testing-pattern-comparison).

## 1단계: 프로젝트 생성
<a name="target-based-create-project"></a>

AgentCore CLI를 사용하여 프로젝트를 생성합니다.

```
agentcore create --name ABTestTargetBased --no-agent
cd ABTestTargetBased
```

## 2단계: 런타임 추가
<a name="target-based-add-runtime"></a>

에이전트 런타임을 추가합니다. 이 런타임의 두 가지 버전, 즉 제어를 위한 버전과 처리를 위한 버전을 배포한 다음 명명된 엔드포인트를 생성하여 각 버전을 별칭으로 지정합니다.

```
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단계: 제어 및 처리 버전 배포
<a name="target-based-agent-code"></a>

`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단계: 온라인 평가 구성 생성
<a name="target-based-online-eval"></a>

각 엔드포인트에는 고유한 로그 그룹(로그 그룹 이름은 엔드포인트 이름으로 끝남)이 있으므로 변형당 하나의 온라인 평가 구성이 필요합니다.

```
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 테스트를 생성할 때 둘 다 필요합니다.

평가자 옵션 및 구성에 대한 자세한 내용은 [온라인 평가 생성을](create-online-evaluations.md) 참조하세요.

## 5단계: 게이트웨이 및 대상 생성
<a name="target-based-create-gateway"></a>

대상 기반 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 name="target-based-create-test"></a>

를 사용하여 A/B 테스트를 시작합니다`agentcore run ab-test`. 각 변형은 생성한 게이트웨이 대상 중 하나를 참조하며 자체 온라인 평가 구성이 있습니다. 이 명령은 이미 배포된 게이트웨이에 대해 서비스에서 직접 테스트를 시작합니다.

**Example**  

```
agentcore run ab-test \
  --mode target-based \
  --name customerSupportTargetTest \
  --gateway csGateway \
  --runtime csAgent \
  --control-target customer-support-control \
  --treatment-target customer-support-treatment \
  --control-online-eval controlEvalTb \
  --treatment-online-eval treatmentEvalTb \
  --control-weight 80 \
  --treatment-weight 20
```
명령이 반환되는 즉시 테스트가 실행 중입니다. `--disable-on-create`를 전달하여 중지된 파일을 생성합니다. `--gateway` 플래그는 필수이며 5단계에서 배포한 게이트웨이를 참조해야 합니다. 게이트웨이당 한 번에 하나의 테스트만 실행 중일 수 있습니다. 명령은에서 `id` 필드`--json`로도 사용할 수 있는 테스트의 작업 ID를 인쇄합니다. 아래 수명 주기 명령에는이 ID가 필요합니다.

```
import boto3
import uuid

REGION = "us-west-2"
ACCOUNT_ID = "123456789012"

# Runtime ARNs from Step 2 deployment output
CONTROL_RUNTIME_ARN = f"arn:aws:bedrock-agentcore:{REGION}:{ACCOUNT_ID}:runtime/ABTestTargetBased_CustomerSupportControl-abc123"
TREATMENT_RUNTIME_ARN = f"arn:aws:bedrock-agentcore:{REGION}:{ACCOUNT_ID}:runtime/ABTestTargetBased_CustomerSupportTreatment-def456"

# Online evaluation config ARNs from Step 3
CONTROL_EVAL_ARN = f"arn:aws:bedrock-agentcore:{REGION}:{ACCOUNT_ID}:online-evaluation-config/controlEvalTb-abc123"
TREATMENT_EVAL_ARN = f"arn:aws:bedrock-agentcore:{REGION}:{ACCOUNT_ID}:online-evaluation-config/treatmentEvalTb-def456"

# IAM roles
GATEWAY_ROLE_ARN = f"arn:aws:iam::{ACCOUNT_ID}:role/AgentCoreGatewayRole"
AB_TEST_ROLE_ARN = f"arn:aws:iam::{ACCOUNT_ID}:role/ABTestRole"

cp_client = boto3.client("bedrock-agentcore-control", region_name=REGION)
dp_client = boto3.client("bedrock-agentcore", region_name=REGION)

# 1. Create an AgentCore Gateway
gateway_response = cp_client.create_gateway(
    name="customerSupportTargetTest-gw",
    roleArn=GATEWAY_ROLE_ARN,
    authorizerType="AWS_IAM",
    clientToken=str(uuid.uuid4()),
)
gateway_id = gateway_response["gatewayId"]
gateway_arn = gateway_response["gatewayArn"]
print(f"Created AgentCore Gateway: {gateway_id}")

# 2. Add control runtime as an AgentCore Gateway target
cp_client.create_gateway_target(
    gatewayIdentifier=gateway_id,
    name="customer-support-control",
    targetConfiguration={
        "http": {
            "agentcoreRuntime": {
                "arn": CONTROL_RUNTIME_ARN,
                "qualifier": "DEFAULT"
            }
        }
    },
    clientToken=str(uuid.uuid4()),
)
print("Added target: customer-support-control")

# 3. Add treatment runtime as an AgentCore Gateway target
cp_client.create_gateway_target(
    gatewayIdentifier=gateway_id,
    name="customer-support-treatment",
    targetConfiguration={
        "http": {
            "agentcoreRuntime": {
                "arn": TREATMENT_RUNTIME_ARN,
                "qualifier": "DEFAULT"
            }
        }
    },
    clientToken=str(uuid.uuid4()),
)
print("Added target: customer-support-treatment")

# 4. Create the A/B test
response = dp_client.create_ab_test(
    name="customerSupportTargetTest",
    gatewayArn=gateway_arn,
    roleArn=AB_TEST_ROLE_ARN,
    evaluationConfig={
        "perVariantOnlineEvaluationConfig": [
            {"name": "C", "onlineEvaluationConfigArn": CONTROL_EVAL_ARN},
            {"name": "T1", "onlineEvaluationConfigArn": TREATMENT_EVAL_ARN}
        ]
    },
    gatewayFilter={
        "targetPaths": ["/customer-support-control/*"]
    },
    variants=[
        {
            "name": "C",
            "weight": 80,
            "variantConfiguration": {
                "target": {"name": "customer-support-control"}
            }
        },
        {
            "name": "T1",
            "weight": 20,
            "variantConfiguration": {
                "target": {"name": "customer-support-treatment"}
            }
        }
    ],
    enableOnCreate=True,
    clientToken=str(uuid.uuid4()),
)

ab_test_id = response["abTestId"]
print(f"Created A/B test: {ab_test_id}")
print(f"Status: {response['status']}")
print(f"Execution status: {response['executionStatus']}")
```

## 7단계: AgentCore 게이트웨이를 통해 트래픽 전송
<a name="target-based-send-traffic"></a>

A/B 테스트를 실행한 후 AgentCore Gateway HTTP 엔드포인트를 통해 트래픽을 전송합니다. AgentCore Gateway는 런타임 세션 ID를 기반으로 변형(제어 또는 처리)에 각 요청을 할당합니다.

### 변형 할당 작동 방식
<a name="_how_variant_assignment_works"></a>

AgentCore Gateway는 `X-Amzn-Bedrock-AgentCore-Runtime-Session-Id` 헤더를 사용하여 트래픽을 라우팅할 대상을 결정합니다. 이 헤더는 **선택 사항**입니다. 제공하지 않으면 런타임이 세션 ID를 자동으로 생성합니다. 그런 다음 AgentCore Gateway는 세션 ID(제공했는지 또는 런타임에서 생성했는지 여부)를 사용하여 구성된 트래픽 가중치를 기반으로 변형에 요청을 할당합니다.

세션 할당은 **고정됩니다**. 세션 ID가 변형에 할당되면 동일한 세션 ID를 가진 모든 후속 요청이 동일한 대상으로 라우팅됩니다. 이렇게 하면 트래픽 분할에 따라 변형 간에 새 세션을 분산하면서 세션 내에서 일관된 경험을 보장할 수 있습니다.

### 테스트를 위한 트래픽 생성
<a name="_generate_traffic_for_testing"></a>

다음 스크립트를 로 저장하여 `<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 name="target-based-get-results"></a>

A/B 테스트를 폴링하여 샘플 크기가 증가함에 따라 결과를 모니터링합니다. 폴링은 통계적 유효성에 영향을 주지 않습니다.

**Example**  
현재 결과 가져오기(6단계의 작업 ID`<ab-test-id>`로 대체):  

```
agentcore view ab-test <ab-test-id>
```
결과를 JSON으로 가져오기:  

```
agentcore view ab-test <ab-test-id> --json
```
결과가 통계적 유의성에 도달할 때까지 폴링:  

```
import boto3
import time

client = boto3.client("bedrock-agentcore", region_name="us-west-2")

ab_test_id = "customerSupportTargetTest-Ab1Cd2Ef3G"

while True:
    response = client.get_ab_test(abTestId=ab_test_id)

    status = response["status"]
    exec_status = response["executionStatus"]
    print(f"Status: {status}, Execution: {exec_status}")

    results = response.get("results")
    if results:
        print(f"Analysis timestamp: {results.get('analysisTimestamp')}")
        for metric in results["evaluatorMetrics"]:
            evaluator = metric["evaluatorArn"]
            control = metric["controlStats"]
            print(f"\nEvaluator: {evaluator}")
            print(f"  Control: mean={control['mean']:.3f}, n={control['sampleSize']}")

            for variant in metric["variantResults"]:
                print(f"  {variant['variantName']}: mean={variant['mean']:.3f}, "
                      f"n={variant['sampleSize']}, "
                      f"pValue={variant.get('pValue', 'N/A')}, "
                      f"significant={variant['isSignificant']}")

                if variant["isSignificant"]:
                    print(f"  >>> Statistically significant! "
                          f"Change: {variant.get('percentChange', 0):.1f}%")

        # Check if any evaluator has reached significance
        all_significant = all(
            variant["isSignificant"]
            for metric in results["evaluatorMetrics"]
            for variant in metric["variantResults"]
        )
        if all_significant:
            print("\nAll evaluators have reached statistical significance.")
            break

    time.sleep(300)  # Poll every 5 minutes
```

**참고**  
결과가 표시되는 데 걸리는 시간은 주로 온라인 평가 구성에 구성된 세션 제한 시간에 따라 달라집니다. 제한 시간 내에 새 요청이 도착하지 않으면 세션이 완료된 것으로 간주됩니다. 세션이 종료된 후 결과는 일반적으로 15분 이내에 나타납니다. 더 많은 세션이 완료되면 결과가 누적됩니다. 샘플 크기에 따라 통계적 유의성이 향상됩니다.
+  **p-값 < 0.05 및 양`percentChange`수:** 처리가 컨트롤보다 훨씬 더 좋습니다. 처리 배포를 고려합니다.
+  **p-값 < 0.05 및 음`percentChange`수:** 처리가 상당히 더 나빠졌습니다. 컨트롤을 유지합니다.
+  **p-값 >= 0.05:** 차이를 결론지을 증거가 충분하지 않습니다. 샘플을 계속 수집하거나 처리 트래픽을 늘립니다.
+  **모든 평가자 확인:** 처리는 다른 지표를 회귀하는 동안 한 지표를 개선할 수 있습니다. 결정하기 전에 모든 평가자 결과를 검토합니다.

## 9단계: 결과 확인 및 A/B 테스트 중지
<a name="target-based-confirm-stop"></a>

A/B 테스트가 통계적 유의성에 도달하면 결과를 검토하고 실험을 중지합니다.

1.  **중요도를 확인합니다.** 대상 평가자가 처리 변형`percentChange`에 `isSignificant: true` 대해 및 긍정이 있는지 확인합니다(또는 처리가 회귀된 경우 제어가 승자인지 확인).

1.  **A/B 테스트를 중지합니다.** `agentcore stop ab-test -i <ab-test-id>`를 실행합니다. 트래픽 라우팅이 즉시 종료되고 모든 요청이 기본 대상으로 돌아갑니다. [보기, 일시 중지, 재개 및 중지를](ab-testing-manage.md#manage-ab-test-start-stop) 참조하세요.

## 10단계: 당첨자 배포
<a name="target-based-deploy-winner"></a>

A/B 테스트를 중지한 후 모든 트래픽을 대상 변형으로 라우팅합니다.

```
agentcore promote ab-test -i <ab-test-id>
agentcore deploy
```

 `promote`는 A/B 테스트를 중지하고(아직 실행 중인 경우), 처리 버전을 가리키도록 제어 엔드포인트를 업데이트하고(예: 버전 1`control`에서 버전 2로 업데이트), 처리 엔드포인트를 제거합니다. 를 실행`agentcore deploy`하여 변경 사항을 적용합니다.

또는 다음 중 하나를 수행하여 당첨자를 수동으로 배포할 수 있습니다.
+  **옵션 A:** [AgentCore Gateway 라우팅 규칙을](gateway-rules.md) 사용하여 두 대상의 트래픽을 성공 대상으로 전달합니다.
+  **옵션 B:** AgentCore 게이트웨이에서 손실된 대상을 제거하고 모든 트래픽을 당첨자에게 라우팅합니다.
+  **옵션 C:** 낙찰 엔드포인트를 가리키도록 손실 대상을 업데이트합니다.

당첨자를 배포한 후:
+  **A/B 테스트를 삭제**하여 리소스를 정리합니다. [A/B 테스트 삭제를](ab-testing-manage.md#manage-ab-test-remove) 참조하세요.
+  **새 기준을 모니터링합니다.** 온라인 평가는 성공 구성에 대한 세션 점수를 계속 매깁니다. 회귀를 감시합니다.
+  **다음 반복을 시작합니다.** 우승 구성의 새로운 트레이스는 다음 권장 사항 주기의 토대를 제공합니다. [작동 방식을 참조하세요](optimization-how-it-works.md).

## 결과 이해
<a name="target-based-results-shape"></a>

`GetABTest`를 호출하면 집계 파이프라인이 충분한 세션을 처리하면 응답에 `results` 객체가 포함됩니다. 결과에는 변형별로 분류된 평가자당 지표가 포함됩니다.

### 결과 구조
<a name="_results_structure"></a>

```
{
  "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
          }
        ]
      }
    ]
  }
}
```

### 필드 참조
<a name="_field_reference"></a>


| 필드 | 설명 | 
| --- | --- | 
|  `analysisTimestamp`  | 서비스가 통계를 마지막으로 계산한 시간입니다. | 
|  `evaluatorMetrics`  | 온라인 평가 구성에서 평가자당 하나의 항목입니다. | 
|  `controlStats.mean`  | 모든 컨트롤 세션의 평균 평가자 점수입니다. | 
|  `controlStats.sampleSize`  | 컨트롤 변형에 대해 점수가 매겨진 세션 수입니다. | 
|  `variantResults[].mean`  | 모든 치료 세션의 평균 평가자 점수입니다. | 
|  `variantResults[].sampleSize`  | 처리 변형에 대해 점수가 매겨진 세션 수입니다. | 
|  `variantResults[].absoluteChange`  | 치료 평균과 제어 평균 간의 차이입니다. | 
|  `variantResults[].percentChange`  | 컨트롤과 비교한 백분율 개선(긍정) 또는 회귀(부정). | 
|  `variantResults[].pValue`  | 확률 관찰된 차이는 확률로 인한 것입니다. 0.05 미만은 통계적 유의성을 나타냅니다. | 
|  `variantResults[].confidenceInterval`  | 절대 변화(`lower` 및 `upper` 경계)에 대한 95% 신뢰 구간. | 
|  `variantResults[].isSignificant`  |  `true` p-값이 < 0.05이고 샘플 크기가 충분한 경우. | 

## 문제 해결
<a name="target-based-troubleshooting"></a>

### A/B 테스트는 트래픽을 전송한 후 결과를 표시하지 않습니다.
<a name="target-based-no-results"></a>

결과는 즉시 표시되지 않습니다. 소요 시간은 온라인 평가 구성에 구성된 세션 제한 시간에 따라 달라집니다. 세션은 제한 시간 내에 새 요청이 도착하지 않은 후에만 완료된 것으로 간주됩니다. 세션이 종료된 후 약 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`과 일치하는지 확인합니다.