27차시. 기본 Modular RAG 구현
5. 실습 ② — ask 함수와 실행 추적
출처: 원본 PDF 27차시_기본ModularRAG구현.pdf 11~12쪽 · 쪽 그림 11쪽 12쪽
📝 graph.py에 추가
def ask(question: str, verbose: bool = False) -> dict:
final = app.invoke(init_state(question),
{"recursion_limit": 25})
if verbose:
print(f"\nQ: {question}")
for line in final.get("log", []):
print(f" · {line}")
return {
"answer": final["answer"],
"sources": [{"file": d.metadata.get("filename"),
"page": d.metadata.get("page_no")}
for d in final.get("documents", [])],
"grade": final.get("grade", ""),
"reason": final.get("reason", ""),
"retries": final.get("retries", 0),
"verified": final.get("grade") == "pass",
"log": final.get("log", []),
"ok": True,
}
if __name__ == "__main__":
print(app.get_graph().draw_ascii())
for q in ["환불은 며칠 이내에 신청해야 하나요?",
"대표이사가 누구인가요?"]:
r = ask(q, verbose=True)
print(f" A: {r['answer'][:70]}")
print(f" 판정={r['grade']} 재시도={r['retries']}회 "
f"검증통과={r['verified']}")
실행 결과
─────────────────────────────────────────────
─────────
Q: 환불은 며칠 이내에 신청해야 하나요?
· 검색(similarity,k=5): 3/5건 통과 최고=0.73
· 생성: 68자, 인용 2건 정상
· 검증(LLM): g=True r=True -> pass
A: 환불은 상품 수령 후 7일 이내에 신청하실 수 있습니다[1]...
판정=pass 재시도=0회 검증통과=True
Q: 대표이사가 누구인가요?
· 검색(similarity,k=5): 0/5건 통과 최고=0.284
· fallback 실행
A: '대표이사가 누구인가요?'에 대한 내용을 제공된 자료에서...
판정=giveup 재시도=0회 검증통과=False🎯 verified 필드를 추가한 이유
사용자 화면에서 이렇게 쓸 수 있습니다.
검증 통과 → 그냥 답변 표시
검증 미통과 → "⚠ 이 답변은 검증되지 않았습니다" 표시
불확실성을 사용자에게 알리는 것도
신뢰할 수 있는 시스템의 조건입니다.