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건"과 "점수 미달"은 처방이 다른데 똑같이 처리합니다
④ 예외 처리가 없습니다
인덱스 오류가 나면 그래프 전체가 중단됩니다
오늘 이 네 가지를 보완합니다.