Strands Evals
에이전트 평가를 코드로 구현 — Case·Experiment·Evaluator·Chaos
Strands Evals
Case · Experiment · Evaluator · Chaos
에이전트 품질을 코드로 보장한다
테스트·평가·카오스 엔지니어링으로 에이전트 신뢰성 확보
평가 체계 개요
3요소 · 파이프라인 · 환경별 전략
평가 파이프라인 4단계
Case 정의 → 실행 → 평가 → 리포트, 그리고 다시 Case로 — 반복 가능한 품질 루프
평가 3요소
Test Case · Evaluator · Experiment — 품질 시스템의 구성 단위
Test Case
입력 + 기대 출력 + 평가 기준을 묶은 단일 검증 단위
Evaluator
에이전트 출력을 채점하는 클래스 — 빌트인 20종+ + Custom
Experiment
Case Set + Evaluator Set + Agent Config를 묶은 실행 단위
Case가 문제, Evaluator가 채점 기준, Experiment가 시험 실행 — 세 요소의 조합이 곧 평가 파이프라인입니다.
환경별 평가 전략
개발 · CI/CD · 프로덕션 — 각 환경에 최적화된 평가 방식
| 환경 | 목적 | 평가 방식 | Case 수 | 빈도 |
|---|---|---|---|---|
| 개발 (로컬) | 빠른 피드백 | ToolSimulator + 소수 Case | 10~30개 | 코드 변경 시마다 |
| CI/CD | 회귀 방지 | 전체 Suite + 임계값 게이트 | 100~500개 | PR/머지마다 |
| 프로덕션 | 드리프트 감지 | Shadow 실행 + 샘플링 평가 | 실 트래픽 1~5% | 상시 (비동기) |
환경마다 목적이 다릅니다 — 개발은 빠른 피드백, CI/CD는 회귀 방지, 프로덕션은 드리프트 감지
테스트와 시뮬레이터
ToolSimulator · ExperimentGenerator · 시뮬레이터 유형
테스트와 시뮬레이터
외부 의존성 없는 mock 환경에서 Case Suite를 병렬 실행하고 일괄 평가
ToolSimulator · Experiment
실제 API 호출 없이 스키마 검증 mock으로 테스트 환경을 만들고, Experiment가 Case를 병렬 실행해 집계합니다.
- ToolSimulator — LLM 스키마 mock
- ActorSimulator — 사용자 시뮬레이션
- ExperimentGenerator — 입력 변이 자동 생성
- run_evaluations(task) — 병렬 실행·집계
외부 API가 없어도 테스트는 돌아가야 합니다 — mock으로 재현 가능하게, Experiment로 일괄로
ToolSimulator — 도구 mock 테스트
외부 API 의존성을 제거하고 스키마 검증 mock으로 재현 가능한 테스트 구성
핵심 포인트
- ToolSimulator()
- 실제 API 호출 없이 — LLM이 스키마에 맞는 mock 응답을 생성
- @tool_simulator.tool()
- mock으로 대체할 도구 등록 — tool()은 데코레이터 팩토리라 괄호 필수
- task(case)
- 케이스마다 호출되는 실행 함수 — mock 도구로 에이전트를 만들어 응답을 반환
- run_evaluations(task)
- task 함수 필수 — Case마다 task를 실행하고 Evaluator로 일괄 채점
코드
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)
Experiment 실행 흐름
Case Suite를 병렬 실행하고 결과를 집계하는 Experiment 워크플로우
-
1
Suite 로드
JSON 또는 Python에서 Case 배열을 로드 — CLI의 strands-evals validate가 JSON 스키마를 검증. 태그로 필터링하여 부분 실행 가능 (예: tag="tool_use").
-
2
Agent 구성
task 함수가 케이스마다 테스트 대상 Agent를 구성하고 ToolSimulator를 바인딩. model_id, temperature 등 설정을 Experiment Config로 고정.
-
3
병렬 실행
asyncio 워커 큐로 Case를 병렬 실행. max_workers로 병렬도 제어 (run_evaluations_async 기본 10, 동기판 기본 1). 각 Case별 실행 시간과 토큰 수 측정.
-
4
평가 + 집계
각 Case의 actual을 Evaluator로 채점. 전체 통과율, 평균 점수, 실패 Case 목록을 EvaluationReport로 출력.
로드부터 집계까지 Experiment가 자동으로 — 결과는 EvaluationReport(통과율·평균 점수·실패 목록)로 받습니다.
실행 결과 — pass / fail 리포트
run_evaluations(task)가 끝나면 받는 것 — 케이스별 판정과 근거, 그리고 집계
터미널 — experiment.run_evaluations(task)
시뮬레이터 유형별 사용처
ToolSimulator · ActorSimulator · Chaos effects — 검증 목적에 맞는 시뮬레이터 선택
| 유형 | 동작 방식 | 사용 시나리오 | 장점 |
|---|---|---|---|
| ToolSimulator | LLM이 스키마에 맞는 mock 응답 생성 | 단위 테스트, 외부 도구 의존성 제거 | 실제 API 없이 재현 가능, 설정 간단 |
| ActorSimulator | LLM이 사용자 역할을 시뮬레이션 | 멀티턴 대화 시나리오 검증 | 실사용자 없이 대화 흐름 테스트 |
| ChaosPlugin effects | 에러/지연/필드 훼손 주입 — PART 4 상세 | 복원력 테스트, 엣지 케이스 | 장애 대응 능력 검증 |
| ExperimentGenerator (생성기) | 입력 변이 자동 생성 | 커버리지 확대, 퍼징 | 사람이 놓치는 엣지 케이스 발견 |
목적이 유형을 결정합니다 — 도구는 ToolSimulator, 사용자는 ActorSimulator, 복원력은 Chaos effects
평가자
빌트인 20종+ · Custom Evaluator · 멀티모달
평가자
에이전트 출력을 채점하는 클래스 — 빌트인 20종+와 Custom으로 품질을 다각도 측정
Evaluator
LLM-as-Judge와 규칙 기반을 조합해 에이전트 출력을 점수·통과 여부·근거로 채점합니다.
- 빌트인 20종+ — Output · Trajectory · Faithfulness 등
- Custom — Evaluator 서브클래스 + evaluate 구현
- EvaluationOutput — 점수 · 통과 · 근거
- 3축 — 정확성 · 안전성 · 효율성
한 평가자로는 부족합니다 — 여러 축의 평가자를 조합해 품질을 입체적으로 측정합니다.
빌트인 평가자 20종+
LLM-as-Judge와 규칙 기반을 조합한 사전 정의 평가 클래스
| 카테고리 | 평가자 | 측정 대상 |
|---|---|---|
| 출력 품질 | OutputEvaluator, CoherenceEvaluator, ConcisenessEvaluator | 루브릭 기반 정확성·일관성·간결성 |
| 관련성·충실도 | ResponseRelevanceEvaluator, FaithfulnessEvaluator, HelpfulnessEvaluator | 질문 적합성·소스 대비 사실 일관성 |
| 도구·궤적 | TrajectoryEvaluator, ToolSelectionAccuracyEvaluator, ToolParameterAccuracyEvaluator | 실행 궤적·도구 선택·파라미터 정확도 |
| 안전성 | HarmfulnessEvaluator, RefusalEvaluator, StereotypingEvaluator | 유해 콘텐츠·거부 적절성·편향 |
| 목표·지시 | GoalSuccessRateEvaluator, InstructionFollowingEvaluator | 목표 달성률·지시 준수 |
| 멀티모달·결정론 | MultimodalCorrectnessEvaluator 등 5종, Contains 등 | 멀티모달 출력 품질·규칙 기반 검사 |
대부분의 평가 축은 빌트인으로 시작할 수 있습니다 — 도메인 특화 기준만 Custom Evaluator로 추가합니다.
Custom Evaluator 작성
도메인 특화 평가 기준을 Evaluator 서브클래스로 정의
핵심 포인트
- Evaluator
- 서브클래스로 도메인 특화 평가 기준 정의 — evaluate 메서드만 구현
- evaluation_case.actual_output
- 에이전트의 실제 출력 — 여기서 위험 키워드를 검사
- EvaluationOutput
- 점수(score) + 통과 여부(test_pass) + 판단 근거(reason)를 리스트로 반환
- evaluators=[...]
- 평가자는 인스턴스로 추가 (문자열 이름 불가) — 빌트인과 혼용 가능
코드
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="정답과 일치하는가")],
)
평가 카테고리 3축
정확성 · 안전성 · 효율성 — 에이전트 품질의 세 가지 차원
정확성 (Correctness)
출력 정확성 · 충실도 · 도구 선택 정확도 · 목표 달성률
안전성 (Safety)
유해 콘텐츠 · 편향 · 거부 적절성 · 프롬프트 인젝션 방어
효율성 (Efficiency)
토큰 사용량 · 응답 지연 · 비용 · 불필요한 도구 호출 감지
올바른 답만으로는 절반입니다 — 안전성과 효율성까지 세 축을 함께 측정해야 품질이 보입니다.
Chaos와 Red Team
ChaosExperiment · 자동 진단 · Red Team 전략
Chaos와 Red Team
장애를 주입해 복원력을, 적대적 입력을 주입해 방어력을 사전 검증
Chaos · Red Team
ChaosExperiment가 도구 실패·지연·에러를 주입하고, RedTeamExperiment가 적대적 전략으로 방어력을 시험합니다.
- ChaosCase effects — 도구 실패·지연·에러 주입
- 5가지 Chaos 전략 — 복원력 검증
- detect_failures · diagnose_session — 사후 진단
- RedTeamExperiment — Crescendo · GOAT · PAIR
프로덕션이 첫 실전이 되지 않게 — 장애도 공격도 배포 전에 미리 겪어보게 합니다.
5가지 Chaos 전략
에이전트의 복원력을 체계적으로 검증하는 장애 주입 패턴
Tool Failure
도구 호출 시 랜덤 에러 반환 — 재시도·폴백 로직 검증
Latency Injection
도구 응답에 인위적 지연 추가 — 타임아웃 처리 검증
Malformed Response
도구가 예상치 못한 형식의 응답 반환 — 파싱 내성 검증
Model Degradation
모델 품질 저하 시뮬레이션 — 할루시네이션 증가 환경 테스트
Resource Exhaustion
토큰 한도·메모리 제한 도달 시 동작 검증
장애는 언젠가 반드시 일어납니다 — 미리 주입해서 복원 행동을 검증하는 것이 Chaos 전략입니다.
ChaosExperiment 적용
에이전트에 Chaos 주입을 설정하는 코드 패턴
핵심 포인트
- ChaosCase(effects=)
- tool_effects로 도구별 장애 효과 지정 — 툴당 케이스별 효과 1개
- Timeout · NetworkError · TruncateFields
- strands_evals.chaos.effects가 제공하는 장애 효과
- ChaosPlugin()
- 파라미터 없이 Agent의 plugins로 주입
- ChaosExperiment
- 장애 환경에서 Case 일괄 실행 — 에이전트의 복원 행동 관찰
코드
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()
Red Team 파이프라인
적대적 입력으로 에이전트 방어력을 사전 검증하는 5단계 프로세스
-
1
공격 시나리오 정의
탈옥·프롬프트 인젝션·데이터 유출 등 검증할 공격 시나리오를 구체화. RedTeamExperiment(experimental)가 파이프라인 골격을 제공.
-
2
적대적 Case 생성
AdversarialCaseGenerator가 Crescendo · GOAT · PAIR · BadLikertJudge · SequentialBreak 전략으로 적대적 입력을 자동 생성.
-
3
에이전트 실행
적대적 입력을 에이전트에 주입. Guardrails, System Prompt 방어, 도구 접근 제어가 정상 작동하는지 관찰.
-
4
사후 진단
detect_failures · analyze_root_cause · diagnose_session이 세션을 사후 분석. DiagnosisConfig(trigger=DiagnosisTrigger.ON_FAILURE, confidence_threshold=ConfidenceLevel.MEDIUM)로 실패 시 자동 진단.
-
5
취약점 리포트
공격 성공률, 방어 우회 패턴, 미감지 케이스를 리포트로 정리. 보안 패치 우선순위 결정에 활용.
공격자보다 먼저 공격해 봅니다 — 취약점 리포트가 보안 패치의 우선순위를 정합니다.
Case · Experiment · Evaluator · Chaos — 에이전트 품질 보장의 4요소