본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 2장: 에이전트 행동 테스트 프레임워크
2026년 3월 2일·AI / ML·

2장: 에이전트 행동 테스트 프레임워크

Scenario, Agentest, Inspect AI, Braintrust 등 주요 에이전트 테스트 프레임워크를 비교하고, 프로젝트 특성에 맞는 선택 기준과 환경 설정 방법을 안내합니다.

17분560자11개 섹션
testingaievaluationquality-assurance
공유
agent-testing2 / 10
12345678910
이전1장: AI 에이전트 테스트의 필요성과 과제다음3장: 도구 호출 검증

학습 목표

  • 주요 에이전트 테스트 프레임워크 4종의 아키텍처와 특성을 비교합니다.
  • Anthropic의 에이전트 평가 가이드에서 제시하는 모범 사례를 이해합니다.
  • 프로젝트 특성에 따른 프레임워크 선택 기준을 수립합니다.
  • Scenario 프레임워크로 첫 번째 에이전트 테스트를 작성합니다.

프레임워크 선택이 중요한 이유

에이전트 테스트 프레임워크는 단순한 유틸리티가 아닙니다. 테스트의 패러다임 자체를 결정합니다. 어떤 프레임워크를 선택하느냐에 따라 테스트 작성 방식, 평가 기준, CI/CD 통합 전략이 달라집니다.

2026년 현재, 에이전트 테스트 프레임워크는 크게 두 가지 방향으로 발전하고 있습니다.

  1. 프레임워크 무관(Agnostic) 도구: 어떤 에이전트 프레임워크와도 통합 가능
  2. 플랫폼 내장 도구: 특정 에이전트 프레임워크에 최적화된 평가 기능

이번 장에서는 프레임워크 무관 도구 4종을 중심으로 살펴보겠습니다.

Scenario (LangWatch)

Scenario는 LangWatch에서 개발한 에이전트 행동 테스트 프레임워크입니다. 가장 큰 특징은 에이전트 프레임워크에 무관하게 동작한다는 점입니다. LangGraph, CrewAI, Pydantic AI, 또는 직접 구현한 에이전트 모두 테스트할 수 있습니다.

핵심 개념

Scenario의 테스트 구조는 세 가지 핵심 요소로 구성됩니다.

  • Agent Adapter: 테스트 대상 에이전트를 Scenario에 연결하는 어댑터
  • Scenario Definition: 테스트 시나리오(목표, 제약 조건, 기대 결과)를 정의
  • Judge: LLM 기반 평가자가 에이전트 행동을 판정

설치와 기본 설정

terminal
bash
pip install scenario-testing
test_basic_scenario.py
python
from scenario import Scenario, ScenarioAgent, ScenarioResult
import pytest
 
class MyAgentAdapter(ScenarioAgent):
    """테스트 대상 에이전트를 Scenario에 연결하는 어댑터"""
 
    async def call(self, message: str) -> str:
        # 실제 에이전트 호출 로직
        response = await my_agent.invoke(message)
        return response.content
 
@pytest.mark.asyncio
async def test_weather_query():
    agent = MyAgentAdapter()
 
    result: ScenarioResult = await Scenario(
        name="날씨 조회",
        description="사용자가 서울 날씨를 물으면 정확한 정보를 제공해야 합니다",
        agent=agent,
        success_criteria=[
            "에이전트가 weather_api 도구를 호출했는가",
            "응답에 기온 정보가 포함되어 있는가",
            "응답이 한국어로 작성되었는가",
        ],
    ).run()
 
    assert result.success is True

도구 호출 검증 API

Scenario의 가장 강력한 기능 중 하나는 has_tool_call API입니다. 에이전트가 올바른 도구를 올바른 파라미터로 호출했는지 검증할 수 있습니다.

test_tool_calls.py
python
async def test_flight_booking_tools():
    result = await Scenario(
        name="항공편 예약",
        description="사용자가 항공편 예약을 요청하면 적절한 도구를 순서대로 호출해야 합니다",
        agent=agent,
    ).run()
 
    state = result.state
 
    # 도구 호출 여부 검증
    assert state.has_tool_call("search_flights")
    assert state.has_tool_call("book_flight")
 
    # 파라미터까지 검증
    assert state.has_tool_call(
        "search_flights",
        parameters={"departure": "ICN", "arrival": "NRT"}
    )
Tip

Scenario는 pytest와 자연스럽게 통합됩니다. 기존 Python 테스트 인프라(pytest fixtures, parametrize, markers 등)를 그대로 활용할 수 있어 학습 곡선이 낮습니다.

Agentest

Agentest는 Node.js/TypeScript 생태계를 위한 에이전트 테스트 프레임워크입니다. 두 가지 핵심 기능이 돋보입니다.

시뮬레이션 사용자 (Simulated User)

Agentest는 시뮬레이션 사용자를 내장하고 있습니다. 실제 사용자의 행동을 모방하는 LLM이 에이전트와 자동으로 대화하며, 멀티턴 시나리오를 검증합니다.

test_multi_turn.ts
typescript
import { AgentTest, SimulatedUser, LLMJudge } from "agentest";
 
const test = new AgentTest({
  agent: myAgent,
  simulatedUser: new SimulatedUser({
    persona: "기술에 익숙하지 않은 50대 사용자",
    goal: "인터넷 뱅킹으로 50만 원 송금하기",
    constraints: [
      "한 번에 이해하지 못하면 다시 질문한다",
      "전문 용어를 사용하지 않는다",
    ],
  }),
  judge: new LLMJudge({
    criteria: [
      "에이전트가 사용자 눈높이에 맞게 설명했는가",
      "송금 프로세스가 완료되었는가",
      "보안 확인 절차를 거쳤는가",
    ],
  }),
  maxTurns: 15,
});
 
const result = await test.run();
console.log(result.passed);   // true / false
console.log(result.score);    // 0.0 ~ 1.0
console.log(result.turnCount); // 실제 대화 턴 수

LLM-as-Judge 내장

Agentest의 LLMJudge는 평가 기준을 자연어로 정의할 수 있습니다. 복잡한 스코어링 함수를 직접 구현하지 않아도, LLM이 대화 전체를 분석하여 각 기준의 충족 여부를 판단합니다.

Inspect AI (UK AISI)

Inspect AI는 영국 AI 안전 연구소(UK AI Safety Institute)에서 개발한 에이전트 수준 평가 프레임워크입니다. 안전성과 보안 평가에 특화되어 있습니다.

아키텍처

Inspect AI의 차별점은 샌드박스(Sandbox) 환경입니다. 에이전트가 코드를 실행하거나 파일 시스템에 접근하는 작업을 안전한 격리 환경에서 수행할 수 있습니다. 이는 코드 생성 에이전트나 시스템 관리 에이전트를 테스트할 때 특히 중요합니다.

inspect_eval.py
python
from inspect_ai import Task, task, eval
from inspect_ai.dataset import Sample
from inspect_ai.scorer import model_graded_fact
from inspect_ai.solver import generate, use_tools
from inspect_ai.tool import bash, python
 
@task
def code_generation_eval():
    return Task(
        dataset=[
            Sample(
                input="피보나치 수열의 10번째 값을 계산하는 Python 함수를 작성하세요",
                target="55",
            ),
            Sample(
                input="주어진 리스트에서 중복을 제거하는 함수를 작성하세요",
                target="중복이 제거된 리스트를 반환",
            ),
        ],
        solver=[use_tools([python()]), generate()],
        scorer=model_graded_fact(),
        sandbox="docker",  # Docker 컨테이너에서 코드 실행
    )
Warning

Inspect AI의 샌드박스 기능은 Docker가 필요합니다. CI 환경에서 Docker-in-Docker 설정이 필요할 수 있으므로, 인프라 요구사항을 사전에 확인하세요.

Braintrust

Braintrust는 실용적인 멀티스텝 에이전트 평가 플랫폼입니다. 실험 추적, 데이터셋 관리, 점수 비교가 하나의 플랫폼에 통합되어 있어 팀 단위 운영에 적합합니다.

핵심 특징

  • 실험(Experiment) 단위 관리: 프롬프트 변경, 모델 교체 등 각 변경사항을 실험으로 추적
  • 데이터셋 버전 관리: 평가 데이터셋의 변경 이력을 추적
  • A/B 비교: 두 실험의 점수를 나란히 비교
  • 온라인 평가: 프로덕션 트래픽을 실시간으로 스코어링
braintrust_eval.py
python
import braintrust
 
experiment = braintrust.init(project="customer-support-agent")
 
for test_case in dataset:
    with experiment.start_span(name="agent_run") as span:
        result = await agent.run(test_case.input)
 
        span.log(
            input=test_case.input,
            output=result,
            expected=test_case.expected,
            scores={
                "relevance": evaluate_relevance(result, test_case),
                "completeness": evaluate_completeness(result, test_case),
                "tool_accuracy": evaluate_tool_usage(result, test_case),
            },
        )
 
experiment.summarize()

Anthropic 에이전트 평가 가이드

Anthropic이 발표한 "Demystifying evals for AI agents" 가이드는 프레임워크보다 평가 설계 원칙에 초점을 맞춥니다. 주요 권고사항을 요약하면 다음과 같습니다.

  1. 결정론적 검증부터 시작하라: 도구 호출 이름, 파라미터 같은 구조적 요소는 정확히 검증 가능합니다.
  2. 평가 차원을 분리하라: 하나의 종합 점수 대신 충실성, 관련성, 일관성 등을 개별적으로 측정합니다.
  3. 다회 실행으로 변동성을 흡수하라: 최소 3회 이상 실행한 평균값을 사용합니다.
  4. 회귀 테스트로 졸업시켜라: 안정적으로 통과하는 평가는 회귀 테스트로 전환합니다.
  5. 프로덕션 모니터링을 평가와 연결하라: 오프라인 평가와 온라인 모니터링을 일관된 메트릭으로 연결합니다.

프레임워크 비교와 선택 기준

기준ScenarioAgentestInspect AIBraintrust
언어PythonTypeScriptPythonPython/TS
에이전트 무관성높음중간높음높음
도구 호출 검증강력함기본기본기본
시뮬레이션 사용자외부 연동내장외부 연동외부 연동
샌드박싱없음없음Docker없음
실험 추적LangWatch없음내장 로그강력함
CI/CD 통합pytestJest/VitestCLIAPI
안전성 평가기본기본강력함기본
팀 협업LangWatch UI없음없음대시보드

선택 가이드

다음 질문에 답하면 적합한 프레임워크를 찾을 수 있습니다.

  • Python 에이전트 + 도구 호출 검증이 핵심인가? -> Scenario
  • TypeScript 에이전트 + 멀티턴 대화 테스트가 필요한가? -> Agentest
  • 코드 실행 에이전트 + 보안/안전성이 중요한가? -> Inspect AI
  • 팀 운영 + 실험 추적 + A/B 비교가 필요한가? -> Braintrust
Info

하나의 프레임워크만 선택할 필요는 없습니다. 단위 테스트는 Scenario로, E2E 안전성 평가는 Inspect AI로, 실험 추적은 Braintrust로 조합하는 것도 좋은 전략입니다.

실습: Scenario로 첫 테스트 작성하기

간단한 Q&A 에이전트를 대상으로 Scenario 테스트를 작성해 보겠습니다.

conftest.py
python
import pytest
from scenario import ScenarioAgent
 
class QAAgentAdapter(ScenarioAgent):
    def __init__(self):
        self.agent = create_qa_agent()  # 실제 에이전트 생성
 
    async def call(self, message: str) -> str:
        response = await self.agent.arun(message)
        return response
 
@pytest.fixture
def qa_agent():
    return QAAgentAdapter()
test_qa_scenarios.py
python
import pytest
from scenario import Scenario
 
@pytest.mark.asyncio
async def test_factual_accuracy(qa_agent):
    """사실 기반 질문에 정확하게 답변하는지 검증"""
    result = await Scenario(
        name="사실 정확성 검증",
        description="대한민국의 수도를 물으면 정확하게 답변해야 합니다",
        agent=qa_agent,
        success_criteria=[
            "응답에 '서울'이 포함되어 있는가",
            "추가적인 잘못된 정보가 없는가",
        ],
    ).run()
    assert result.success is True
 
@pytest.mark.asyncio
async def test_out_of_scope_handling(qa_agent):
    """범위 밖 질문에 적절히 대응하는지 검증"""
    result = await Scenario(
        name="범위 밖 질문 처리",
        description="에이전트의 전문 분야가 아닌 질문을 받으면 정중하게 거절해야 합니다",
        agent=qa_agent,
        success_criteria=[
            "모르는 내용을 지어내지 않는가",
            "답변할 수 없음을 명확히 밝혔는가",
            "관련 리소스를 안내했는가",
        ],
    ).run()
    assert result.success is True
terminal
bash
# 테스트 실행
pytest test_qa_scenarios.py -v --tb=short

정리

이번 장에서는 4개의 주요 에이전트 테스트 프레임워크를 비교하고, 선택 기준을 정리했습니다.

  • Scenario는 Python 환경에서 도구 호출 검증에 강점이 있는 프레임워크 무관 도구입니다.
  • Agentest는 TypeScript 생태계에서 시뮬레이션 사용자와 LLM-as-Judge를 내장한 도구입니다.
  • Inspect AI는 안전성과 보안 평가에 특화되며, Docker 기반 샌드박싱을 지원합니다.
  • Braintrust는 실험 추적과 팀 협업에 강점이 있는 실용적 평가 플랫폼입니다.
  • Anthropic의 평가 가이드는 결정론적 검증부터 시작하여 단계적으로 확장하는 전략을 권고합니다.

다음 장 미리보기

3장에서는 에이전트 테스트의 기초 계층인 도구 호출 검증을 깊이 다룹니다. 도구 이름, 파라미터, 출력의 3단계 검증 전략과 모킹 기법, 도구 체인 순서 검증, 불필요한 호출 감지까지 실제 코드와 함께 실습합니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#testing#ai#evaluation#quality-assurance

관련 글

AI / ML

3장: 도구 호출 검증

에이전트의 도구 호출 정확성을 이름, 파라미터, 출력의 3단계로 검증하는 방법과 모킹 전략, 도구 체인 순서 검증, 불필요한 호출 감지 기법을 다룹니다.

2026년 3월 4일·18분
AI / ML

1장: AI 에이전트 테스트의 필요성과 과제

결정론적 소프트웨어와 비결정적 AI 에이전트의 근본적 차이를 짚고, 전통적 QA 방법론의 한계와 에이전트 전용 3단계 테스트 모델을 소개합니다.

2026년 2월 28일·17분
AI / ML

4장: 엔드투엔드 시나리오 테스트

사용자 시뮬레이션 기반 멀티턴 대화 테스트, 워크플로우 완료 검증, 반복 호출 및 모순적 계획 감지 등 E2E 시나리오 테스트의 전체 방법론을 다룹니다.

2026년 3월 6일·18분
이전 글1장: AI 에이전트 테스트의 필요성과 과제
다음 글3장: 도구 호출 검증

댓글

목차

약 17분 남음
  • 학습 목표
  • 프레임워크 선택이 중요한 이유
  • Scenario (LangWatch)
    • 핵심 개념
    • 설치와 기본 설정
    • 도구 호출 검증 API
  • Agentest
    • 시뮬레이션 사용자 (Simulated User)
    • LLM-as-Judge 내장
  • Inspect AI (UK AISI)
    • 아키텍처
  • Braintrust
    • 핵심 특징
  • Anthropic 에이전트 평가 가이드
  • 프레임워크 비교와 선택 기준
    • 선택 가이드
  • 실습: Scenario로 첫 테스트 작성하기
  • 정리
  • 다음 장 미리보기