"RAG 핵심 학습 (14/26) — 평가셋과 RAGAS / DeepEval"
RAG는 "답이 그럴듯한가"보다 "근거를 제대로 찾고 그 근거 안에서 답했는가"를 측정해야 한다.
retriever, hybrid, reranker를 붙이면 체감상 좋아진다. 문제는 체감은 재현되지 않는다는 점이다. RAG는 LLM 자체의 유창성이 평가를 속이기 쉽기 때문에, 별도의 평가셋과 평가 메트릭이 없으면 개선인지 착시인지 구분하기 어렵다. 이번 글은 golden dataset을 어떻게 만들고, RAGAS와 DeepEval이 각각 무엇을 재는지, 그리고 사람이 직접 보는 평가와 자동 평가를 어떻게 섞어야 하는지를 다룬다.
0. Prerequisites
- 13편 reranker
- 12편 hybrid search
- 7편 메타데이터와 출처 관리
1. 학습 목표
- RAG 평가셋이 왜 필요한지 설명한다.
- faithfulness, context precision/recall, answer correctness를 구분한다.
- RAGAS와 DeepEval의 역할 차이를 안다.
- 자동 평가와 사람 평가를 어떻게 조합할지 이해한다.
2. 핵심 요약
RAG 평가는 "좋은 답"만 보면 안 되고, 근거 회수, 근거 사용, 최종 답 정확도를 분리해서 봐야 한다. 이를 위해 질문, 정답, 기대 근거 문서가 들어 있는 golden dataset이 필요하다. RAGAS는 faithfulness, answer relevancy, context precision/recall 같은 RAG 전용 메트릭을 자동화하는 데 강하고, DeepEval은 테스트 스위트와 실험 반복에 강하다. 다만 자동 평가는 완전한 진실 판정기가 아니므로, 핵심 도메인에서는 사람 검토 샘플을 반드시 섞어야 한다.
3. 직관 — 왜 "답변이 자연스럽다"는 평가로는 부족한가
질문: "외부 공유 예외는 누가 승인하는가?"
답변 A: "일반적으로 부서장과 보안 책임자 승인이 필요합니다."
답변 B: "정책 5.2절에 따라 부서장과 보안 책임자의 승인이 필요합니다."
둘 다 그럴듯해 보인다. 그러나 문서에 실제로 5.2절이 없다면 B는 더 위험한 답이다. RAG에서는 그럴듯함이 아니라 근거에 묶여 있는지를 봐야 한다. 이때 faithfulness가 등장한다.
4. 정의 — 무엇을 평가하는가
| 항목 | 의미 |
|---|---|
| Golden Dataset | 질문, 기대 답변, 기대 근거 문서가 있는 검증용 데이터셋 |
| Faithfulness | 답변이 제공된 context 안에서만 말하는가 |
| Context Precision | 가져온 context 중 실제로 쓸모 있는 비율 |
| Context Recall | 필요한 근거를 context가 얼마나 놓치지 않았는가 |
| Answer Correctness | 최종 답이 사실상 맞는가 |
| Answer Relevancy | 질문 의도에 맞는 답을 했는가 |
5. 평가 구조 — Retrieval과 Generation을 분리해서 본다
RAG 평가는 크게 세 층으로 쪼갠다.
- Retrieval 품질: 답에 필요한 문서를 top-K 안에 가져왔는가
- Grounding 품질: 답이 실제 context를 근거로 했는가
- Answer 품질: 사용자 질문에 맞고 사실적으로 맞는가
이 분리를 하지 않으면 문제가 retrieval인지, prompt인지, generation인지 원인을 모른다.
6. 원리 워크스루 — 평가셋을 만드는 최소 절차
6.1 Golden dataset 스키마
{
"question": "외부 공유 예외는 누가 승인하는가?",
"reference_answer": "부서장과 보안 책임자의 승인이 필요하다.",
"reference_context_ids": ["policy_5_2", "exception_flow_2"],
"metadata": {
"domain": "security",
"difficulty": "medium"
}
}
6.2 RAGAS 실행 개념
from ragas import evaluate
result = evaluate(
dataset=eval_dataset,
metrics=[
"faithfulness",
"answer_relevancy",
"context_precision",
"context_recall",
],
)
6.3 사람이 직접 봐야 하는 샘플
- 법률, 보안, 의료처럼 작은 hallucination도 치명적인 질문
- source authority가 섞인 질문
- 한국어 표현이 미묘한 질문
자동 평가는 빠르지만, 경계 사례에서는 사람이 "이 답변은 실제 조직 규칙을 벗어났는가"를 확인해야 한다.
자기 설명: retrieval metric과 faithfulness metric을 왜 분리해야 하는지 한 문장으로 답해 보라.
7. 변형과 사례
7.1 사람이 만든 질문셋
무엇이 바뀌는가
도메인 전문가가 질문, 정답, 근거를 직접 만든다.
왜 등장했는가
운영에서 정말 중요한 질문은 자동 생성보다 사람이 더 잘 알기 때문이다.
무엇이 가능해졌는가
현업 리스크가 높은 질문을 집중적으로 검증할 수 있다.
한계와 다음 단계
비용이 크고 규모가 작다. 그래서 자동 생성 질문과 혼합한다.
7.2 LLM-assisted eval set
문서에서 질문 후보를 자동 생성한 뒤 사람이 필터링하는 방식이다. 빠르게 커버리지를 넓힐 수 있지만, 생성 질문이 실제 사용자 질문 분포와 어긋나기 쉽다.
7.3 Shadow traffic 기반 평가
실제 사용자 질의를 익명화해 평가셋으로 축적하는 방식이다. 운영 현실을 잘 반영하지만 개인정보, 라벨링 비용, 정답 정의 문제가 따른다.
8. 한계와 실패 양상
8.1 자동 메트릭은 완전한 진실이 아니다
RAGAS나 LLM judge는 편향과 흔들림이 있다. 점수 차이가 작을 때는 실질적 개선인지 불분명할 수 있다.
8.2 평가셋이 운영 질의를 대표하지 않을 수 있다
FAQ 질문만 가득한 평가셋으로는 긴 비교 질의, 시점 의존 질의, 다단계 절차 질의를 검증할 수 없다.
8.3 한 메트릭만 최적화하면 왜곡된다
context recall만 높이면 과다 회수로 precision이 무너질 수 있다. answer correctness만 보면 근거 없는 유창한 답이 숨어든다.
8.4 다음 단계 — 숫자를 어떻게 읽을 것인가
이제 평가셋이 생겼다면, 다음은 어떤 숫자를 볼지 결정해야 한다. 15편에서는 Recall@K, MRR, NDCG, Hit Rate를 비교한다.
8.5 입문자가 자주 빠지는 함정 5선
| # | 함정 | 증상 | 빠른 점검 |
|---|---|---|---|
| 1 | 정답만 보고 근거 문서 라벨 없음 | 원인 분석 불가 | reference_context_ids 추가 |
| 2 | 자동 메트릭만 절대시 | 경계 사례 누락 | 사람 평가 샘플 혼합 |
| 3 | 쉬운 질문만 모음 | 실제 운영 성능 과대평가 | 난이도 분포 기록 |
| 4 | retrieval/generation 분리 안 함 | 병목 위치 불명 | 단계별 점수 분리 |
| 5 | 데이터셋 버전 관리 없음 | 비교 불가능 | eval set version 고정 |
9. 정리된 결론 — 보지 않고 답해 보라
Q1. RAG 평가셋의 핵심 구성 요소는?
정답 질문, 기대 답변, 기대 근거 문서다.
왜 retrieval과 generation 품질을 함께 검증하려면 둘 다 필요하다.
Q2. Faithfulness는 무엇을 재는가?
정답 답변이 제공된 context 안에서만 말하는지를 잰다.
왜 RAG의 핵심은 근거 기반 답변이기 때문이다.
Q3. 자동 평가만으로 부족한 이유는?
정답 경계 사례와 도메인 리스크를 완전히 판정하지 못하기 때문이다.
왜 LLM judge와 휴리스틱 메트릭도 편향과 불안정을 가진다.
Q4. retrieval metric과 answer metric을 분리해야 하는 이유는?
정답 문제가 문서 회수인지 답변 생성인지 병목을 알아내기 위해서다.
왜 같은 낮은 최종 점수도 원인이 전혀 다를 수 있기 때문이다.
Cheat Sheet — 이 편의 식·정의 1페이지
정의 - Golden Dataset: 질문 + 정답 + 근거 문서 - Faithfulness: context 바깥으로 나가지 않는 정도 - Context Precision/Recall: 근거 회수의 정확도와 포괄성
최소 코드
result = evaluate(
dataset=eval_dataset,
metrics=["faithfulness", "context_precision", "context_recall"]
)
언제 무엇을 | 상황 | 집중 지표 | |---|---| | hallucination 위험 큼 | faithfulness | | 검색 누락 의심 | context recall | | 너무 많은 노이즈 | context precision | | 최종 답변 품질 | answer correctness |
참고 자료
1차 자료
- Es, S. et al. RAGAS: Automated Evaluation of Retrieval Augmented Generation. 2023.
- DeepEval documentation.
공식 docs
- RAGAS docs
- DeepEval docs
- Phoenix evaluation docs
보조 자료
- 사용자 노트 12장 평가셋
다음 편으로 이어지는 흐름
평가셋은 "무엇을 검증할지"를 정한다. 다음 15편에서는 그 평가셋 위에서 Recall@K, MRR, NDCG, Hit Rate 같은 검색 지표를 어떻게 읽는지를 다룬다.
댓글
댓글 쓰기