AI 평가 시리즈 (06): DeepEval 실전 활용 — 엔터프라이즈 에이전트 평가 스위트
요약
DeepEval을 활용하여 엔터프라이즈 에이전트의 품질을 테스트하고 평가하는 방법을 다룹니다. RAGAS와 달리 테스트 케이스 중심의 패러다임을 통해 CI/CD 환경에서 배포 가능 여부를 판단하는 데 유용합니다.
핵심 포인트
- DeepEval은 테스트 케이스 우선 방식으로 CI 품질 게이트 구축에 적합함
- RAGAS가 배치 평가에 강점이 있다면, DeepEval은 개별 커밋의 배포 여부 결정에 유용함
- DeepEvalBaseLLM을 상속받아 커스텀 LLM(예: glm-4-flash)을 판사 모델로 연결 가능
- AnswerRelevancy, Faithfulness, ToolCorrectness 등 다양한 지표 제공
DeepEval과 RAGAS는 서로 다른 문제를 해결합니다
4번째 기사에서는 RAGAS를 사용하여 RAG 시스템을 배치 평가(batch-evaluate)하고 4개의 지표 점수를 생성했습니다. 이 기사에서는 동일한 에이전트(Agent)에 대해 완전히 다른 패러다임인 DeepEval을 사용합니다.
RAGAS 패러다임: 배치 평가(batch evaluation), DataFrame 입력, 지표별 평균 출력. 품질 트렌드를 분석하고 시스템 버전을 비교하는 데 유용합니다.
DeepEval 패러다임: 테스트 케이스 우선(test-case-first), 각 케이스마다 명시적인 Pass/Fail 판정, 네이티브 pytest 통합. CI 품질 게이트(quality gates)에 유용하며 — 각 머지(merge) 전에 명확한 진행/중단(go/no-go) 결정을 내려줍니다.
RAGAS는 "이번 주 시스템 품질은 어떠했는가?"에 답합니다. DeepEval은 "이 커밋(commit)이 프로덕션에 배포될 수 있는가?"에 답합니다. 질문이 다르므로 도구도 다릅니다.
커스텀 LLM 연결하기
DeepEval은 판사 LLM(Judge LLM)으로 OpenAI를 기본값으로 사용합니다. glm-4-flash를 사용하려면 DeepEvalBaseLLM을 상속받아야 합니다:
from deepeval.models.base_model import DeepEvalBaseLLM
class GlmFlashEval(DeepEvalBaseLLM):
...
각 지표를 인스턴스화할 때 judge_llm을 전달합니다:
AnswerRelevancyMetric(threshold=0.7, model=judge_llm)
FaithfulnessMetric(threshold=0.7, model=judge_llm)
ToolCorrectnessMetric(model=judge_llm)
테스트 케이스 구축하기
DeepEval의 작업 단위는 LLMTestCase입니다. 각 케이스는 다음을 포함합니다:
from deepeval.test_case import LLMTestCase, ToolCall
case = LLMTestCase(
...
tools_called와 expected_tools에는 단순 문자열이 아닌 ToolCall 객체가 필요합니다.
결과
원본 결과 (5개 테스트 케이스)
Question AnsRel Faith ToolOK
────────────────────────────────────── ─────── ────── ───────
What's your refund policy? 1.00 ✓ 0.50 ✗ ✗
...
세 가지 지표 읽기
AnswerRelevancy (평균 0.767, 60% 통과)
Q2 ("ORD-001 주문이 발송되었나요?")는 0.33점을 기록했습니다. 에이전트가 get_order_status를 건너뛰고 "주문과 관련하여..."와 같은 모호한 답변을 내놓았습니다. 낮은 Answer Relevancy(답변 관련성)는 LLM 생성 품질의 문제가 아니라, 도구 호출(tool triggering) 실패의 결과입니다.
Faithfulness (평균 0.600, 40% 통과)
Q1은 0.50점을 기록했습니다: 에이전트가 도구를 호출하지 않고 자체 지식으로 답변했으며, 일부 세부 정보는 FAQ 데이터베이스의 내용과 달랐습니다.
Q4는 0.00점을 기록했는데, 이는 극단적인 사례입니다: 에이전트는 "WeChat Pay, Alipay, 은행 카드 등을 지원합니다..."라고 답변했지만, retrieval_context는 "No context retrieved"(도구가 호출되지 않음)였습니다. 이 프레임워크는 컨텍스트가 비어 있을 때 답변을 완전히 지원하지 않는 것으로 간주합니다.
이 0.0점은 평가의 함정을 노출합니다. 에이전트가 도구 호출을 건너뛰고 직접 답변할 경우, 컨텍스트가 비게 되어 Faithfulness 점수가 0점이 됩니다. 설령 사실적 내용이 정확하더라도 말입니다. Faithfulness는 "답변이 컨텍스트를 벗어나는지"를 측정하지만, 이는 컨텍스트가 존재할 때만 의미가 있습니다.
ToolCorrectness (평균 0.200, 20% 통과)
사용자가 금액과 일수를 직접 제공하여 calculate_refund가 트리거된 마지막 사례만이 통과했습니다. 나머지 4개 사례에서는 에이전트가 예상되는 도구를 호출하지 않았습니다. ToolCorrectness는 DeepEval의 RAGAS 대비 가장 독특한 장점입니다: 이는 도구 호출 시퀀스가 무엇이 예상되었는지와 일치하는지 여부를 직접 평가합니다.
CI 통합
DeepEval의 강점은 네이티브 pytest 통합입니다. CI 환경에서:
# tests/test_agent_quality.py
import pytest
from deepeval import assert_test
...
# .github/workflows/eval.yml
name: Agent Quality Gate
on: [pull_request]
...
임계값 가이드라인:
- 초기 개발 단계: 0.5 (느슨한 게이트, 반복을 막지 않도록)
- 안정화 단계: 0.7 (표준 요구 사항)
- 핵심 경로: 0.85 (의료, 금융, 고위험군)
RAGAS 대 DeepEval: 완전 비교
Dimension RAGAS DeepEval
────────────────────────────────────────────────────────────────-
Paradigm Metric-first (batch) Test-case-first (pytest)
...
둘 다 사용하세요, 하나만 쓰지 마세요. 이들은 상호 보완적입니다:
- 커밋 시마다 (Per commit): 5~10개의 핵심 케이스에 대해 DeepEval 실행 (빠른 게이트 역할)
- 매주 (Weekly): 100개 이상의 샘플에 대해 RAGAS 실행 (트렌드 분석)
- 릴리스 전 (Before release): 둘 다 사용 — RAGAS는 전반적인 트렌드 그림을 제공하고, DeepEval은 이진 판정 (binary verdict)을 제공합니다.
요약 (Summary)
- ToolCorrectness 20%: 5개 케이스 중 4개에서 에이전트가 도구(tools)를 호출하지 않고 답변했습니다 — ToolCorrectness 실패; 이는 Article 05의 도구 이름 정확도 73%와 일치합니다. 두 프레임워크가 서로 다른 각도에서 동일한 문제를 드러내고 있습니다.
- Faithfulness = 0의 함정: 에이전트가 도구를 건너뛰고 직접 답변할 경우, retrieval_context가 비어 있게 되어 답변이 사실적으로 정확하더라도 Faithfulness 점수가 0점이 됩니다; Faithfulness는 컨텍스트(context)가 실제로 존재할 때만 의미가 있습니다.
- 트렌드 분석을 위한 RAGAS, 게이트를 위한 DeepEval: 서로 다른 패러다임이며, 경쟁 관계가 아닌 함께 사용할 때 가장 효과적입니다.
참고 문헌 (References)
실제 엔터프라이즈급 워크플로우에서 검증된 AI 에이전트와 기술을 큐레이션하여 제공하는 마켓플레이스 PrimeSkills를 확인해보세요. 거품 없이, 실제로 작동하는 것들만 모았습니다.
저의 홈페이지에서 더 유용한 지식과 흥미로운 제품들을 찾아보세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기