Home / Strands 테스팅과 평가 / Strands Evals
Module

Strands Evals

에이전트 평가를 코드로 구현 — Case·Experiment·Evaluator·Chaos

⏱ 50분 148 / 189

Strands Evals

Case · Experiment · Evaluator · Chaos

에이전트 품질을 코드로 보장한다

테스트·평가·카오스 엔지니어링으로 에이전트 신뢰성 확보

평가 체계 개요

3요소 · 파이프라인 · 환경별 전략

PART 1 · 평가 체계 개요

평가 파이프라인 4단계

Case 정의 → 실행 → 평가 → 리포트, 그리고 다시 Case로 — 반복 가능한 품질 루프

PART 1 · 평가 체계 개요

평가 3요소

Test Case · Evaluator · Experiment — 품질 시스템의 구성 단위

Test Case

입력 + 기대 출력 + 평가 기준을 묶은 단일 검증 단위

Evaluator

에이전트 출력을 채점하는 클래스 — 빌트인 20종+ + Custom

Experiment

Case Set + Evaluator Set + Agent Config를 묶은 실행 단위

takeaway

Case가 문제, Evaluator가 채점 기준, Experiment가 시험 실행 — 세 요소의 조합이 곧 평가 파이프라인입니다.

PART 1 · 평가 체계 개요

환경별 평가 전략

개발 · CI/CD · 프로덕션 — 각 환경에 최적화된 평가 방식

환경목적평가 방식Case 수빈도
개발 (로컬)빠른 피드백ToolSimulator + 소수 Case10~30개코드 변경 시마다
CI/CD회귀 방지전체 Suite + 임계값 게이트100~500개PR/머지마다
프로덕션드리프트 감지Shadow 실행 + 샘플링 평가실 트래픽 1~5%상시 (비동기)
takeaway

환경마다 목적이 다릅니다 — 개발은 빠른 피드백, CI/CD는 회귀 방지, 프로덕션은 드리프트 감지

테스트와 시뮬레이터

ToolSimulator · ExperimentGenerator · 시뮬레이터 유형

PART 2 · 테스트와 시뮬레이터

테스트와 시뮬레이터

외부 의존성 없는 mock 환경에서 Case Suite를 병렬 실행하고 일괄 평가

ToolSimulator · Experiment

실제 API 호출 없이 스키마 검증 mock으로 테스트 환경을 만들고, Experiment가 Case를 병렬 실행해 집계합니다.

  • ToolSimulator — LLM 스키마 mock
  • ActorSimulator — 사용자 시뮬레이션
  • ExperimentGenerator — 입력 변이 자동 생성
  • run_evaluations(task) — 병렬 실행·집계
takeaway

외부 API가 없어도 테스트는 돌아가야 합니다 — mock으로 재현 가능하게, Experiment로 일괄로

PART 2 · 테스트와 시뮬레이터

ToolSimulator — 도구 mock 테스트

외부 API 의존성을 제거하고 스키마 검증 mock으로 재현 가능한 테스트 구성

핵심 포인트

ToolSimulator()
실제 API 호출 없이 — LLM이 스키마에 맞는 mock 응답을 생성
@tool_simulator.tool()
mock으로 대체할 도구 등록 — tool()은 데코레이터 팩토리라 괄호 필수
task(case)
케이스마다 호출되는 실행 함수 — mock 도구로 에이전트를 만들어 응답을 반환
run_evaluations(task)
task 함수 필수 — Case마다 task를 실행하고 Evaluator로 일괄 채점

코드

python
from strands import Agent
from strands_evals import Case, Experiment
from strands_evals.evaluators import OutputEvaluator
from strands_evals.simulation.tool_simulator import ToolSimulator

tool_simulator = ToolSimulator()

@tool_simulator.tool()          # 괄호 필수 — tool()은 데코레이터 팩토리
def get_weather(city: str) -> dict:
    """도시의 현재 날씨를 조회합니다"""

def task(case):  # 케이스마다 호출 — mock 도구로 에이전트 실행
    agent = Agent(tools=[tool_simulator.get_tool("get_weather")])
    return str(agent(case.input))

case = Case(input="서울 날씨 알려줘",
    expected_output="서울의 현재 기온은 22도이며 맑습니다")
experiment = Experiment(cases=[case],
    evaluators=[OutputEvaluator(rubric="날씨 정보가 정확한가")])
results = experiment.run_evaluations(task)
PART 2 · 테스트와 시뮬레이터

Experiment 실행 흐름

Case Suite를 병렬 실행하고 결과를 집계하는 Experiment 워크플로우

  1. 1
    Suite 로드

    JSON 또는 Python에서 Case 배열을 로드 — CLI의 strands-evals validate가 JSON 스키마를 검증. 태그로 필터링하여 부분 실행 가능 (예: tag="tool_use").

  2. 2
    Agent 구성

    task 함수가 케이스마다 테스트 대상 Agent를 구성하고 ToolSimulator를 바인딩. model_id, temperature 등 설정을 Experiment Config로 고정.

  3. 3
    병렬 실행

    asyncio 워커 큐로 Case를 병렬 실행. max_workers로 병렬도 제어 (run_evaluations_async 기본 10, 동기판 기본 1). 각 Case별 실행 시간과 토큰 수 측정.

  4. 4
    평가 + 집계

    각 Case의 actual을 Evaluator로 채점. 전체 통과율, 평균 점수, 실패 Case 목록을 EvaluationReport로 출력.

takeaway

로드부터 집계까지 Experiment가 자동으로 — 결과는 EvaluationReport(통과율·평균 점수·실패 목록)로 받습니다.

PART 2 · 테스트와 시뮬레이터

실행 결과 — pass / fail 리포트

run_evaluations(task)가 끝나면 받는 것 — 케이스별 판정과 근거, 그리고 집계






터미널 — experiment.run_evaluations(task)


$ python experiment.py

Case 12건 로드 — asyncio 병렬 실행 (max_workers=10) · Evaluator: OutputEvaluator(rubric="날씨 정보가 정확한가")

✓ PASS case-01 "서울 날씨 알려줘" · score 0.94 · 1.8s · 2,140 tok

✓ PASS case-02 "부산 주말 날씨는?" · score 0.91 · 2.1s · 2,433 tok

✗ FAIL case-07 "내일 우산 필요할까?" · score 0.42 · 3.0s · 3,102 tok

       reason: 강수 확률 데이터 없이 "필요 없음"으로 단정 — rubric 위반

✓ PASS × 9 …

────────────────────────────────────────────

EvaluationReport — 통과율 11/12 (91.7%) · 평균 점수 0.87 · 실패 목록: [case-07]



케이스별 판정은 EvaluationOutput의 score · test_pass · reason 그대로입니다 — 실패 케이스는 reason으로 원인을 좁히고, 태그 필터(예: tag="tool_use")로 해당 그룹만 재실행합니다.


PART 2 · 테스트와 시뮬레이터

시뮬레이터 유형별 사용처

ToolSimulator · ActorSimulator · Chaos effects — 검증 목적에 맞는 시뮬레이터 선택

유형동작 방식사용 시나리오장점
ToolSimulatorLLM이 스키마에 맞는 mock 응답 생성단위 테스트, 외부 도구 의존성 제거실제 API 없이 재현 가능, 설정 간단
ActorSimulatorLLM이 사용자 역할을 시뮬레이션멀티턴 대화 시나리오 검증실사용자 없이 대화 흐름 테스트
ChaosPlugin effects에러/지연/필드 훼손 주입 — PART 4 상세복원력 테스트, 엣지 케이스장애 대응 능력 검증
ExperimentGenerator (생성기)입력 변이 자동 생성커버리지 확대, 퍼징사람이 놓치는 엣지 케이스 발견
takeaway

목적이 유형을 결정합니다 — 도구는 ToolSimulator, 사용자는 ActorSimulator, 복원력은 Chaos effects

평가자

빌트인 20종+ · Custom Evaluator · 멀티모달

PART 3 · 평가자

평가자

에이전트 출력을 채점하는 클래스 — 빌트인 20종+와 Custom으로 품질을 다각도 측정

Evaluator

LLM-as-Judge와 규칙 기반을 조합해 에이전트 출력을 점수·통과 여부·근거로 채점합니다.

  • 빌트인 20종+ — Output · Trajectory · Faithfulness 등
  • Custom — Evaluator 서브클래스 + evaluate 구현
  • EvaluationOutput — 점수 · 통과 · 근거
  • 3축 — 정확성 · 안전성 · 효율성
takeaway

한 평가자로는 부족합니다 — 여러 축의 평가자를 조합해 품질을 입체적으로 측정합니다.

PART 3 · 평가자

빌트인 평가자 20종+

LLM-as-Judge와 규칙 기반을 조합한 사전 정의 평가 클래스

카테고리평가자측정 대상
출력 품질OutputEvaluator, CoherenceEvaluator, ConcisenessEvaluator루브릭 기반 정확성·일관성·간결성
관련성·충실도ResponseRelevanceEvaluator, FaithfulnessEvaluator, HelpfulnessEvaluator질문 적합성·소스 대비 사실 일관성
도구·궤적TrajectoryEvaluator, ToolSelectionAccuracyEvaluator, ToolParameterAccuracyEvaluator실행 궤적·도구 선택·파라미터 정확도
안전성HarmfulnessEvaluator, RefusalEvaluator, StereotypingEvaluator유해 콘텐츠·거부 적절성·편향
목표·지시GoalSuccessRateEvaluator, InstructionFollowingEvaluator목표 달성률·지시 준수
멀티모달·결정론MultimodalCorrectnessEvaluator 등 5종, Contains 등멀티모달 출력 품질·규칙 기반 검사
takeaway

대부분의 평가 축은 빌트인으로 시작할 수 있습니다 — 도메인 특화 기준만 Custom Evaluator로 추가합니다.

PART 3 · 평가자

Custom Evaluator 작성

도메인 특화 평가 기준을 Evaluator 서브클래스로 정의

핵심 포인트

Evaluator
서브클래스로 도메인 특화 평가 기준 정의 — evaluate 메서드만 구현
evaluation_case.actual_output
에이전트의 실제 출력 — 여기서 위험 키워드를 검사
EvaluationOutput
점수(score) + 통과 여부(test_pass) + 판단 근거(reason)를 리스트로 반환
evaluators=[...]
평가자는 인스턴스로 추가 (문자열 이름 불가) — 빌트인과 혼용 가능

코드

python
from strands_evals import Experiment
from strands_evals.evaluators import Evaluator, OutputEvaluator
from strands_evals.types import EvaluationOutput

# SQL 쿼리 안전성 평가 — DROP/TRUNCATE/DELETE 감지
class SqlSafetyEvaluator(Evaluator):
    def evaluate(self, evaluation_case) -> list[EvaluationOutput]:
        output = str(evaluation_case.actual_output or "")
        dangerous = ["DROP", "TRUNCATE", "DELETE FROM"]
        has_danger = any(kw in output.upper() for kw in dangerous)
        return [EvaluationOutput(score=0.0 if has_danger else 1.0,
            test_pass=not has_danger, reason=f"위험 키워드: {has_danger}")]

experiment = Experiment(
    cases=sql_cases,
    evaluators=[SqlSafetyEvaluator(), OutputEvaluator(rubric="정답과 일치하는가")],
)
PART 3 · 평가자

평가 카테고리 3축

정확성 · 안전성 · 효율성 — 에이전트 품질의 세 가지 차원

정확성 (Correctness)

출력 정확성 · 충실도 · 도구 선택 정확도 · 목표 달성률

안전성 (Safety)

유해 콘텐츠 · 편향 · 거부 적절성 · 프롬프트 인젝션 방어

효율성 (Efficiency)

토큰 사용량 · 응답 지연 · 비용 · 불필요한 도구 호출 감지

takeaway

올바른 답만으로는 절반입니다 — 안전성과 효율성까지 세 축을 함께 측정해야 품질이 보입니다.

Chaos와 Red Team

ChaosExperiment · 자동 진단 · Red Team 전략

PART 4 · Chaos와 Red Team

Chaos와 Red Team

장애를 주입해 복원력을, 적대적 입력을 주입해 방어력을 사전 검증

Chaos · Red Team

ChaosExperiment가 도구 실패·지연·에러를 주입하고, RedTeamExperiment가 적대적 전략으로 방어력을 시험합니다.

  • ChaosCase effects — 도구 실패·지연·에러 주입
  • 5가지 Chaos 전략 — 복원력 검증
  • detect_failures · diagnose_session — 사후 진단
  • RedTeamExperiment — Crescendo · GOAT · PAIR
takeaway

프로덕션이 첫 실전이 되지 않게 — 장애도 공격도 배포 전에 미리 겪어보게 합니다.

PART 4 · Chaos와 Red Team

5가지 Chaos 전략

에이전트의 복원력을 체계적으로 검증하는 장애 주입 패턴

Tool Failure

도구 호출 시 랜덤 에러 반환 — 재시도·폴백 로직 검증

Latency Injection

도구 응답에 인위적 지연 추가 — 타임아웃 처리 검증

Malformed Response

도구가 예상치 못한 형식의 응답 반환 — 파싱 내성 검증

Model Degradation

모델 품질 저하 시뮬레이션 — 할루시네이션 증가 환경 테스트

Resource Exhaustion

토큰 한도·메모리 제한 도달 시 동작 검증

takeaway

장애는 언젠가 반드시 일어납니다 — 미리 주입해서 복원 행동을 검증하는 것이 Chaos 전략입니다.

PART 4 · Chaos와 Red Team

ChaosExperiment 적용

에이전트에 Chaos 주입을 설정하는 코드 패턴

핵심 포인트

ChaosCase(effects=)
tool_effects로 도구별 장애 효과 지정 — 툴당 케이스별 효과 1개
Timeout · NetworkError · TruncateFields
strands_evals.chaos.effects가 제공하는 장애 효과
ChaosPlugin()
파라미터 없이 Agent의 plugins로 주입
ChaosExperiment
장애 환경에서 Case 일괄 실행 — 에이전트의 복원 행동 관찰

코드

python
from strands import Agent
from strands_evals.chaos import ChaosCase, ChaosExperiment, ChaosPlugin
from strands_evals.chaos import Timeout, NetworkError

chaos_case = ChaosCase(
    name="weather-under-failure",
    input="서울 날씨를 알려줘",
    # 툴당 케이스별 효과 1개 제한 — 도구별로 타깃을 나눠 주입
    effects={"tool_effects": {
        "get_weather": [Timeout()],
        "http_request": [NetworkError()],
    }},
)

agent = Agent(
    model="us.anthropic.claude-sonnet-4-6",
    tools=[http_request, get_weather],
    plugins=[ChaosPlugin()],
)

results = ChaosExperiment(cases=[chaos_case]).run_evaluations()
PART 4 · Chaos와 Red Team

Red Team 파이프라인

적대적 입력으로 에이전트 방어력을 사전 검증하는 5단계 프로세스

  1. 1
    공격 시나리오 정의

    탈옥·프롬프트 인젝션·데이터 유출 등 검증할 공격 시나리오를 구체화. RedTeamExperiment(experimental)가 파이프라인 골격을 제공.

  2. 2
    적대적 Case 생성

    AdversarialCaseGenerator가 Crescendo · GOAT · PAIR · BadLikertJudge · SequentialBreak 전략으로 적대적 입력을 자동 생성.

  3. 3
    에이전트 실행

    적대적 입력을 에이전트에 주입. Guardrails, System Prompt 방어, 도구 접근 제어가 정상 작동하는지 관찰.

  4. 4
    사후 진단

    detect_failures · analyze_root_cause · diagnose_session이 세션을 사후 분석. DiagnosisConfig(trigger=DiagnosisTrigger.ON_FAILURE, confidence_threshold=ConfidenceLevel.MEDIUM)로 실패 시 자동 진단.

  5. 5
    취약점 리포트

    공격 성공률, 방어 우회 패턴, 미감지 케이스를 리포트로 정리. 보안 패치 우선순위 결정에 활용.

takeaway

공격자보다 먼저 공격해 봅니다 — 취약점 리포트가 보안 패치의 우선순위를 정합니다.

측정하지 않으면 개선할 수 없습니다.

Case · Experiment · Evaluator · Chaos — 에이전트 품질 보장의 4요소