36차시. 평가 실습
9. 실습 ⑥ — 리포트 자동 생성
출처: 원본 PDF 36차시_평가실습.pdf 18~19쪽 · 쪽 그림 18쪽 19쪽
📝 eval/report.py
import json, time
from collections import defaultdict
def make_report(rows, metrics, version="v1", out="docs/eval_report.md"):
ts = time.strftime("%Y-%m-%d %H:%M")
n = len(rows)
lines = [
f"# RAG 평가 리포트",
f"- 일시: {ts}",
f"- 데이터셋: {version} ({n}문항, Dev Set)",
f"- 시스템: 32차시 고도화 Modular RAG",
"",
"## 1. 종합 지표",
"",
"| 지표 | 결과 | 목표 | 달성 |",
"|---|---|---|---|",
]
TARGETS = {"Correctness": (metrics["correctness"]*100, 90, "%"),
"Faithfulness": (metrics["faithfulness"], 0.95, ""),
"Abstention": (metrics["abstention"]*100, 95, "%")}
for name, (val, target, unit) in TARGETS.items():
ok = "✅" if val >= target else "
❌"
lines.append(f"| {name} | {val:.1f}{unit} | "
f"{target}{unit} | {ok} |")
# 난이도별
for key in ("difficulty", "type"):
groups = defaultdict(list)
for r in rows:
groups[r[key]].append(r)
lines += ["", f"## {key}별 정답률", "",
"| 구분 | 정답/전체 | 비율 |", "|---|---|---|"]
for name, items in groups.items():
hit = sum(i["correct"] for i in items)
warn = " ⚠표본부족" if len(items) < 5 else ""
lines.append(f"| {name} | {hit}/{len(items)} | "
f"{hit/len(items)*100:.1f}%{warn} |")
# 실패 목록
lines += ["", "## 실패 사례", ""]
for r in rows:
if not r["correct"]:
lines.append(f"- **{r['id']}** ({r['type']}/"
f"{r['difficulty']}) — {r['reason']}")
open(out, "w", encoding="utf-8").write("\n".join(lines))
print(f"✓ {out} 생성 완료")💡 표본 부족 경고를 자동으로 붙입니다
warn = " ⚠표본부족" if len(items) < 5 else ""
리포트를 읽는 사람이
"conditional 67%"를 곧이곧대로 믿지 않도록
경고를 자동으로 표시합니다.
정직한 리포트가 신뢰받는 리포트입니다.