RAG2026-5일33차시 · Modular RAG 최적화7 / 19← 이전목차다음 →MetaContents

33차시. Modular RAG 최적화

4. 최적화 ② — 검증 호출 줄이기

출처: 원본 PDF 33차시_ModularRAG최적화.pdf 9~10쪽 · 쪽 그림 9쪽 10쪽

verify가 36회 호출됐습니다. 규칙 필터를 강화하면 줄일 수 있습니다.

4-1) 임베딩 기반 사전 검증

💡 LLM 없이 근거 충실성 추정하기
답변과 근거의 임베딩 유사도를 재봅니다.
· 유사도가 아주 높다 (0.85+) → 근거를 거의 그대로 씀
→ 환각 가능성 낮음 → LLM 검증 생략
· 유사도가 아주 낮다 (0.4-) → 근거와 동떨어짐
→ 명백한 문제 → LLM 없이 retry
· 중간 (0.4~0.85) → 애매함 → LLM 심판에 보냄
임베딩은 LLM 대비 1/100 비용입니다.

출력
import numpy as np
from langchain_openai import OpenAIEmbeddings
_emb = OpenAIEmbeddings(model=config.EMBED_MODEL)
def _semantic_check(answer, docs):
    ctx = " ".join(d.page_content for d in docs)
    a = np.array(_emb.embed_query(answer[:500]))
    c = np.array(_emb.embed_query(ctx[:500]))
    # 코사인 유사도 = 내적 ÷ (길이 × 길이)
    dot_product = np.dot(a, c)
    length1 = np.linalg.norm(a)
    length2 = np.linalg.norm(c)
    return float(dot_product / (length1 * length2))
def verifier_node(state) -> dict:
    # ── 1단계: 규칙 (기존) ──
    ...
    # ── 1.5단계: 임베딩 사전 검증 (신규) ──
    sim = _semantic_check(state["answer"], state["documents"])
    if sim >= 0.85:
        return {"grade": "pass", "reason": f"의미 유사도 높음({sim:.2f})",
                "log": [f"검증: 임베딩 통과 {sim:.2f}"]}
    if sim < 0.40:
        return {"grade": "retry", "reason": f"근거와 동떨어짐({sim:.2f})",
                "log": [f"검증: 임베딩 실패 {sim:.2f}"]}

    # ── 2단계: LLM 심판 (애매한 경우만) ──
    ...

■ 효과
verify LLM 호출  36회 → 14회 (61% 감소)
전체 시간        94.7s → 71.3s

⚠️ 임계값은 반드시 실측하세요
0.85와 0.40은 예시입니다.
문서와 모델에 따라 분포가 다릅니다.
측정 방법
· LLM이 pass 판정한 답변 20개의 유사도 분포
· LLM이 retry 판정한 답변 20개의 유사도 분포
· 두 분포가 안 겹치는 구간을 임계값으로
9차시·24차시에서 한 것과 같은 방식입니다.

← 이전 절33차시 · 3. 최적화 ① — 모델 티어링다음 절 →33차시 · 5. 최적화 ③ — Re-ranking