RAG2026-5일27차시 · 기본 Modular RAG 구현8 / 18← 이전목차다음 →MetaContents

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 필드를 추가한 이유
사용자 화면에서 이렇게 쓸 수 있습니다.
검증 통과 → 그냥 답변 표시
검증 미통과 → "⚠ 이 답변은 검증되지 않았습니다" 표시
불확실성을 사용자에게 알리는 것도
신뢰할 수 있는 시스템의 조건입니다.

← 이전 절27차시 · 4. 실습 ① — 그래프 완성다음 절 →27차시 · 6. 실습 ③ — 루프가 도는 것 확인