RAG2026-5일35차시 · 평가 데이터셋 구축9 / 18← 이전목차다음 →MetaContents

35차시. 평가 데이터셋 구축

6. 실습 ③ — 데이터셋 검증

출처: 원본 PDF 35차시_평가데이터셋구축.pdf 13~14쪽 · 쪽 그림 13쪽 14쪽

만든 데이터셋 자체를 점검합니다. 여기가 틀리면 모든 평가가 무의미합니다.

📝 src/validate_dataset.py

출력
import json
from collections import Counter
from indexer import get_store
data = json.load(open("data/eval_set.json", encoding="utf-8"))
store = get_store()
print(f"총 {len(data)}문항\n")
# ── ① 구성 확인 ──
print("■ 유형 분포")
for k, v in Counter(d["type"] for d in data).most_common():
    print(f"   {k:<10} {v:>3}개 ({v/len(data)*100:.0f}%)")
print("\n■ 난이도 분포")
for k, v in Counter(d["difficulty"] for d in data).most_common():
    print(f"   {k:<10} {v:>3}개 ({v/len(data)*100:.0f}%)")
ans = sum(d["answerable"] for d in data)
print(f"\n■ 답변 가능 {ans}개 / 부재 {len(data)-ans}개 "
      f"(부재 비율 {(len(data)-ans)/len(data)*100:.0f}%)")
# ── ② 필드 누락 검사 ──
REQUIRED = ["id", "question", "type", "difficulty",
            "answerable", "gold_answer", "gold_pages", "keywords"]
print("\n■ 필드 검사")
for d in data:
    # 필수 필드 중 빠진 것만 골라 담기
    missing = []
    for f in REQUIRED:
        if f not in d:
            missing.append(f)
    if missing:
        print(f"   ⚠ {d.get('id','?')}: {missing} 누락")
# ── ③ 중복 질문 검사 ──
# 2번 이상 나온 질문만 골라 담기
dup = []
for q, c in Counter(d["question"] for d in data).items():
    if c > 1:
        dup.append(q)
if dup:
    print(f"\n⚠ 중복 질문: {dup}")
# ── ④ 부재 질문 재검증 (중요!) ──
print("\n■ 부재 질문 검증 (정말 없는지 확인)")
for d in data:
    if d["answerable"]:
        continue
    pairs = store.similarity_search_with_relevance_scores(
        d["question"], k=3)
    best = max((s for _, s in pairs), default=0)
    if best > 0.6:
        print(f"   ⚠ {d['id']} 점수 {best:.2f} — "
              f"실제로 답이 있을 수 있습니다")
        print(f"      {pairs[0][0].page_content[:60]}...")

실행 결과 예시
─────────────────────────────────────────────
─────────
총 50문항

■ 유형 분포
   fact        15개 (30%)
   variant     10개 (20%)
   compound     8개 (16%)
   absent       8개 (16%)
   conditional  5개 (10%)
   out_of_scope 4개 (8%)

■ 난이도 분포
   easy        20개 (40%)
   medium      20개 (40%)
   hard        10개 (20%)

■ 답변 가능 38개 / 부재 12개 (부재 비율 24%)

■ 필드 검사
   (누락 없음)

■ 부재 질문 검증 (정말 없는지 확인)
   ⚠ Q037 점수 0.71 — 실제로 답이 있을 수 있습니다
      회사 대표 김민수 (인) 2026년 1월 1일...

🎯 Q037이 걸렸습니다
"대표이사 이름은?"을 부재 질문으로 넣었는데
문서 서명란에 실제로 이름이 있었습니다.
조치 — 이 질문을 answerable: true로 바꾸고
gold_answer와 gold_pages를 채웁니다.
이 검증을 안 했다면
시스템이 맞게 답해도 계속 오답 처리돼
평가 결과가 왜곡됐을 겁니다.

← 이전 절35차시 · 5. 라벨링의 어려운 지점다음 절 →35차시 · 7. 데이터 누출 방지