@haram

EvalView 입문: AI 에이전트의 무한 루프 버그와 API 요금 폭탄을 잡는 'pytest식' 테스트 가이드
밤새 켜놓은 AI 에이전트 때문에 아침에 일어나자마자 API 요금 폭탄 고지서를 받는 상상, 해보셨나요? 에이전트 개발을 시작한 분들이 가장 무서워하는 악몽 중 하나가 바로 이 무한 루프입니다.
겉으로는 멀쩡하게 작동하는 것처럼 보이면서 속으로는 완전히 엉뚱한 거짓말을 늘어놓는 '침묵하는 버그'는 기존의 코드 테스트 방식으로는 잡아내기가 정말 어렵습니다. 이런 문제를 시원하게 해결하고 에이전트를 안전하게 검증할 수 있도록 도와주는 오픈소스 도구, 에발뷰(EvalView)를 소개합니다.
왜 일반적인 유닛 테스트로는 AI 에이전트를 잡을 수 없을까?
기존 소프트웨어 개발에서 쓰던 유닛 테스트는 답이 명확히 정해져 있습니다. 입력값이 같으면 출력값도 항상 똑같이 나와야 하죠. 원인과 결과가 수학 공식처럼 딱 맞아떨어지는 정직한 세계입니다.
하지만 거대언어모델을 기반으로 움직이는 AI 에이전트는 다릅니다. 에이전트는 매번 다르게 생각하고 스스로 판단하는 성격을 가집니다. 똑같은 질문을 던져도 그때그때 다른 경로를 선택해 답변을 내놓고, 심지어 모델이 예고 없이 업데이트되는 것만으로도 잘 되던 도구 호출이 단번에 꼬여버리기도 합니다.
가짜 데이터를 만들어 가상의 응답을 제공하는 모킹 기법도 에이전트 앞에서는 힘을 쓰지 못합니다. 모킹 데이터로 테스트하면 결국 에이전트의 실제 해결 능력을 보는 것이 아니라, 개발자가 미리 짜놓은 뻔한 시나리오만 검증하는 꼴이 되기 때문입니다. 실전에서 발생할 수 있는 돌발 행동은 전혀 잡아낼 수 없습니다.
그래서 우리에게는 최종 답변 하나만 확인하는 기존 방식보다 더 정교한 검증이 필요합니다. 에이전트가 어떤 도구를 어떤 순서로 불러서 일을 해결했는지, 혹시 중간에 길을 잃고 엉뚱한 도구 호출을 무한히 반복하며 API 요금을 낭비하고 있지는 않은지 같은 '실행 경로' 자체를 꼼꼼하게 들여다봐야 합니다.
EvalView 핵심 개념: YAML 파일 하나로 에이전트의 예산과 행동 가이드라인 잡기
에이전트 테스트를 위해 거창한 테스트 프레임워크나 복잡한 코드를 처음부터 작성할 필요는 없습니다. EvalView는 우리가 흔히 쓰는 설정 파일 포맷인 YAML 파일 하나만으로도 아주 훌륭한 테스트 기준을 만들어 줍니다.
예를 들어 사용자의 주문 번호를 조회하는 에이전트를 테스트하고 싶다면, 아래와 같이 직관적인 설정 파일을 만들어 검증할 수 있습니다.
name: order_lookup_test
input:
query: "주문 번호 12345의 배송 상태는 어때?"
expected:
tools:
- get_order_status
thresholds:
max_cost: 0.10위 파일의 설정은 직관적입니다. 에이전트가 특정 질문을 받았을 때 반드시 get_order_status라는 도구를 호출해야 하고, 한 번 실행할 때 드는 API 비용은 10센트를 넘지 않아야 한다는 가이드라인을 정의한 것입니다. 만약 에이전트가 도구를 호출하지 않고 마음대로 답변을 꾸며내거나, 무한 루프에 빠져 예산을 넘기면 즉시 테스트 실패 경고를 띄웁니다.
여기에 EvalView가 제공하는 가장 강력한 무기는 바로 '결정론적 재플레이' 기능입니다. 카세트테이프처럼 실제 도구 호출 결과와 실행 경로를 최초에 한 번만 기록해 두면, 다음 테스트부터는 저장된 기록을 그대로 활용해 재플레이합니다. 덕분에 불필요한 외부 API 호출 요금을 매번 지불하지 않고도 로직의 변화를 안전하고 빠르게 검증할 수 있습니다.
비슷한 에이전트 평가 도구로 많이 거론되는 랭체인 생태계의 에이전트이발스(AgentEvals)가 이미 쌓여 있는 실행 로그 데이터를 사후에 수집하고 분석하는 데 초점을 맞춘다면, EvalView는 개발자가 코드를 수정하는 로컬 환경에서 에이전트가 엉뚱한 경로로 탈선하지 않는지 즉각 검증하는 스냅숏 기반 테스트에 최적화되어 있습니다.
초보자를 위한 EvalView 3단계 퀵스타트
에이전트 테스트를 시작하는 방법은 아주 간단합니다. 딱 3단계만 기억하세요.
먼저 터미널에서 패키지를 설치한 다음, 에이전트가 실제로 작동하는 과정을 캡처하여 테스트 파일로 저장합니다. 마지막으로 이 파일을 실행하면 에이전트가 올바른 도구를 호출했는지, 그리고 설정한 비용을 넘지 않았는지 대시보드에서 한눈에 보여줍니다.
개발 프로세스에 테스트를 아예 자동화해 두고 싶다면, 파이썬 코드로 간편하게 테스트 게이트를 만들 수도 있습니다. 아래처럼 몇 줄의 코드만 추가하면 됩니다.
from evalview import EvalView, AgentTestGate
# 1. 예산과 필수 도구 제한 설정하기
gate = AgentTestGate(
name="delivery_test",
max_budget=0.50,
required_tools=["track_delivery"]
)
# 2. 에이전트 실행 경로 추적하기
with EvalView.capture() as run:
my_agent.run("배송 번호 12345 조회해줘")
# 3. 테스트 통과 여부 검증하기
assert gate.verify(run.trajectory)이렇게 몇 줄만 적어두면, 에이전트가 예상치 못한 무한 루프에 빠지거나 엉뚱한 도구를 실행해 비용을 낭비하는 사고를 코드가 알아서 막아줍니다. 수동으로 매번 테스트해 볼 필요가 없어지니 개발 속도도 훨씬 빨라집니다.
에이전트 개발, 이제 '운'에 맡기지 마세요
프롬프트를 조금 고치거나 모델을 업데이트할 때마다 '제발 오류 나지 마라' 하고 기도하듯 손으로 하나하나 테스트하던 시절은 이제 보내줄 때가 되었습니다. EvalView 같은 오픈소스 도구를 깃허브 액션과 같은 자동화 파이프라인에 연결해 두면, 코드를 수정할 때마다 에이전트의 작동 경로와 API 호출 비용을 자동으로 모니터링할 수 있습니다.
랑체인 생태계에서 실행 경로 평가를 돕는 AgentEvals가 강력하고 정교한 평가 기능을 제공한다면, EvalView는 초보자도 쉽게 다룰 수 있는 가볍고 직관적인 YAML 설정으로 빠르게 테스트를 구축해 줍니다. 안전하고 경제적인 AI 에이전트를 만들기 위해, 오늘부터 무작정 수동으로 테스트하는 대신 검증 도구를 하나씩 도입해 보는 건 어떨까요?