Home / Strands 테스팅과 평가 / Strands 테스트
Note

Strands 테스트

Contains, Trajectory, CI/CD 게이트, ToolSimulator

⏱ 40분 150 / 189

에이전트 테스트

Contains, Trajectory, CI/CD 게이트, ToolSimulator

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

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

테스트와 시뮬레이터

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

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

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