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차시에서 다룹니다
프롬프트로 고칠 수 있는 한계가 여기까지입니다.