RAG2026-5일12차시 · RAG 품질 문제11 / 18← 이전목차다음 →MetaContents

12차시. RAG 품질 문제

8. 실습 ④ — 실패율 측정하기

출처: 원본 PDF 12차시_RAG디버깅.pdf 15쪽 · 쪽 그림 15쪽

개선을 측정하려면 지금의 기준선이 필요합니다.

📝 간단한 자동 채점

Python
TESTS = [
    {"q": "환불은 며칠 이내인가요?",     "keys": ["7일", "일주일"]},
    {"q": "교환은 며칠 이내인가요?",     "keys": ["30일"]},
    {"q": "고객센터 운영 시간은?",       "keys": ["09:00", "18:00", "평일"]},
    {"q": "대표이사 이름은?",            "keys": ["확인할 수 없"]},
    # ... 12차시 실패 사례를 포함해 20개까지 채우세요
]
def score():
    hit = 0
    fails = []
    for t in TESTS:
        pairs = store.similarity_search_with_relevance_scores(
            t["q"], k=3)
        docs = []
        for d, s in pairs:
            if s >= MIN_SCORE:
                docs.append(d)
        if not docs:
            ans = "자료에서 확인할 수 없습니다"
        else:
            prompt = ("아래 자료만 근거로 답하세요.\n"
                      "자료에 없으면 '자료에서 확인할 수 없습니다'.\n\n"
                      f"[자료]\n{build_context(docs)}\n\n[질문] {t['q']}")
            ans = llm.invoke(prompt).content
        # 정답 키워드 중 하나라도 답변에 들어있으면 정답
        ok = False
        for key in t["keys"]:
            if key in ans:
                ok = True
                break
        if ok:
            hit += 1
        else:
            fails.append((t["q"], ans[:60]))
    print(f"\n정답률: {hit}/{len(TESTS)} = {hit/len(TESTS)*100:.0f}%")
    print("\n■ 실패한 질문")
    for q, a in fails:
        print(f"  · {q}\n    → {a}...")
score()

실행 결과 예시 (코드를 읽고 만든 예상 화면입니다. 실제 실행 결과, 특히 모델의 답은 다를 수 있습니다)

출력
정답률: 3/4 = 75%

■ 실패한 질문
  · 교환은 며칠 이내인가요?
    → 상품 불량의 경우 30 일 이내에 교환이 가능합니다....

📊 이 숫자가 기준선입니다
예를 들어 지금 12/20 = 60%가 나왔다면,
13차시에서 프롬프트를 고친 뒤 다시 재서
16/20 = 80%가 나오면
"프롬프트 개선으로 20%p 향상"이라고
근거를 갖고 말할 수 있습니다.
측정하지 않으면 개선을 주장할 수 없습니다.

← 이전 절12차시 · 7. 실습 ③ — 실패 사례 목록 만들기다음 절 →12차시 · 9. 진단할 때 빠지기 쉬운 함정