RAG2026-5일13차시 · 프롬프트 최적화10 / 18← 이전목차다음 →MetaContents

13차시. 프롬프트 최적화

7. 실습 ④ — 개선 효과 측정

출처: 원본 PDF 13차시_프롬프트최적화.pdf 14~15쪽 · 쪽 그림 14쪽 15쪽

12차시에서 만든 질문 20개로 프롬프트 개선 전후를 비교합니다.

📝 src/eval_prompt.py

출력
from retriever import search, build_context
from prompts import PROMPTS
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# 12차시 과제에서 만든 질문 세트를 여기에
TESTS = [
    {"q": "환불은 며칠 이내인가요?",  "keys": ["7일", "일주일"]},
    {"q": "교환 기간은?",             "keys": ["30일"]},
    {"q": "대표이사 이름은?",         "keys": ["확인할 수 없"]},
    # ... 20개까지
]
def evaluate(version):
    chain = PROMPTS[version] | llm | StrOutputParser()
    hit, fails = 0, []
    for t in TESTS:
        docs = search(t["q"])
        ctx  = build_context(docs) if docs else "(자료 없음)"
        ans  = chain.invoke({"context": ctx, "question": t["q"]})
        # 정답 키워드 중 하나라도 들어있으면 정답
        ok = False
        for key in t["keys"]:
            if key in ans:
                ok = True
                break
        if ok:
            hit += 1
        else:
            fails.append(t["q"])
    rate = hit / len(TESTS) * 100
    print(f"[{version}] 정답 {hit}/{len(TESTS)} = {rate:.0f}%")
    if fails:
        print("   실패:", ", ".join(fails[:5]))
    return rate
print("■ 프롬프트 버전별 정답률")
for v in ("v1", "v2", "v3"):
    evaluate(v)

실행 결과 예시
────────────────────────────────────────
■ 프롬프트 버전별 정답률
[v1] 정답 12/20 = 60%
   실패: 대표이사 이름은?, 작년 매출은?, ...
[v2] 정답 14/20 = 70%
   실패: 환불 방법과 수수료는?, 배송비와 반품비는?, ...
[v3] 정답 17/20 = 85%
   실패: 반품하고 싶은데 언제까지?, ...

📊 결과 해석
V1 → V2 (+10%p)
환각이 줄어 "없는 내용" 질문을 통과했습니다
V2 → V3 (+15%p)
과잉 거부가 사라져 복합 질문을 통과했습니다
V3의 남은 실패
"반품 언제까지?" → 이건 검색 실패입니다
→ 프롬프트로는 못 고칩니다. 30차시에서 다룹니다
프롬프트로 고칠 수 있는 한계가 여기까지입니다.

← 이전 절13차시 · 6. 실습 ③ — 출처 인용 검증하기다음 절 →13차시 · 8. 자주 겪는 문제