RAG2026-5일24차시 · Retriever Node 분리4 / 18← 이전목차다음 →MetaContents

24차시. Retriever Node 분리

1. 왜 검색을 가장 먼저 독립시킬까?

출처: 원본 PDF 24차시_RetrieverNode분리.pdf 3쪽 · 쪽 그림 3쪽

3부에서 모듈을 나누는 순서에도 이유가 있습니다. 검색이 첫 번째인 이유가 있습니다.

📊 12차시에서 배운 것을 기억하세요
"검색된 조각 안에 정답이 있는가?"
· 있는데 틀렸다 → 생성 문제
· 없다 → 검색 문제
그리고 실무 경험상
RAG 문제의 70% 이상이 검색 단계에서 시작됩니다.
가장 자주 손보는 곳을 가장 먼저 독립시킵니다.

1-1) 19차시 노드의 부족한 점

출력
■ 19차시에서 만든 것
def retrieve_node(state):
    query = state.get("query") or state["question"]
    k     = state.get("top_k", config.TOP_K)
    pairs = _store.similarity_search_with_relevance_scores(query, k=k)
    docs = []
    for d, s in pairs:
        if s >= config.MIN_SCORE:
            docs.append(d)
    scores = [round(s, 3) for _, s in pairs]
    return {"documents": docs, "scores": scores,
            "retrieval_ok": len(docs) > 0, "log": [...]}

⚠️ 나쁘지 않지만 아쉬운 점
① 검색 방식을 바꿀 수 없습니다
similarity만 씁니다. MMR로 전환이 불가능합니다
② 재검색 시 전략을 바꿀 수 없습니다
같은 k로 다시 찾으면 같은 결과가 나옵니다
③ 실패 사유를 구분하지 않습니다
"결과 0건"과 "점수 미달"은 처방이 다른데 똑같이 처리합니다
④ 예외 처리가 없습니다
인덱스 오류가 나면 그래프 전체가 중단됩니다
오늘 이 네 가지를 보완합니다.

← 이전 절24차시 · 이번 차시에서 배우는 것다음 절 →24차시 · 2. 좋은 Retriever Node의 4가지 설계 원칙