RAG2026-5일36차시 · 평가 실습12 / 18← 이전목차다음 →MetaContents

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%"를 곧이곧대로 믿지 않도록
경고를 자동으로 표시합니다.
정직한 리포트가 신뢰받는 리포트입니다.

← 이전 절36차시 · 8. 실습 ⑤ — 트레이드오프 확인다음 절 →36차시 · 10. 자주 겪는 문제