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를 채웁니다.
이 검증을 안 했다면
시스템이 맞게 답해도 계속 오답 처리돼
평가 결과가 왜곡됐을 겁니다.