Skip to main content

Modular RAG

Modular RAG는 RAG 시스템을 독립적인 모듈로 분리하고, 이를 LEGO 블록처럼 조합하여 다양한 RAG 파이프라인을 구성하는 프레임워크입니다. Naive RAG와 Advanced RAG를 포함한 모든 RAG 아키텍처를 모듈 조합의 관점에서 통합적으로 설명합니다.

핵심 아이디어

기존 RAG 아키텍처들은 각각 고유한 구조를 제안하지만, 분해해 보면 공통된 모듈의 조합으로 표현할 수 있습니다. Modular RAG는 이 관점에서 6개의 핵심 모듈을 정의하고, 이들의 조합 방식(플로우 패턴)을 체계화합니다.

6개 핵심 모듈

모듈역할주요 연산자
Indexing문서 분할, 임베딩, 인덱스 저장Chunk, Embed, Index
Pre-Retrieval쿼리 변환, 확장, 분해Rewrite, HyDE, Decompose
Retrieval벡터/키워드/하이브리드 검색Similarity Search, BM25, Hybrid
Post-Retrieval재순위화, 압축, 필터링Rerank, Compress, Filter
Generation프롬프트 구성, LLM 생성Prompt Template, LLM Call
Orchestration플로우 제어, 라우팅, 판단Route, Judge, Loop Control
Indexing 모듈: 문서를 처리 가능한 단위로 변환합니다.
  • Chunk: 문서를 고정 크기 또는 의미 단위로 분할
  • Embed: 청크를 벡터로 변환 (OpenAI, BGE, E5 등)
  • Index: 벡터 데이터베이스에 저장 (Chroma, Qdrant, Milvus 등)
Pre-Retrieval 모듈: 검색 품질을 높이기 위해 쿼리를 가공합니다.
  • Rewrite: 쿼리를 검색에 적합한 형태로 변환
  • HyDE: 가상 답변을 생성하여 검색 쿼리로 사용
  • Decompose: 복잡한 질문을 하위 질문으로 분해
Retrieval 모듈: 실제 검색을 수행합니다.
  • Similarity Search: 벡터 코사인 유사도 기반 검색
  • BM25: 전통적인 키워드 기반 검색
  • Hybrid: 벡터 검색과 키워드 검색을 결합
Post-Retrieval 모듈: 검색 결과를 정제합니다.
  • Rerank: Cross-encoder로 관련도 순서 재정렬
  • Compress: 불필요한 내용 제거, 핵심 정보 추출
  • Filter: 관련성 임계값 이하 문서 제거
Generation 모듈: 최종 답변을 생성합니다.
  • Prompt Template: 컨텍스트와 질문을 프롬프트로 구성
  • LLM Call: 프롬프트를 LLM에 전달하여 답변 생성
Orchestration 모듈: 전체 플로우를 제어합니다.
  • Route: 쿼리 특성에 따라 경로 결정
  • Judge: 중간 결과 품질 평가 및 판정
  • Loop Control: 반복 종료 조건 관리

플로우 패턴

모듈 간 연결 방식을 정의하는 패턴입니다.
아래 4가지 패턴(Linear, Conditional, Branching, Loop)은 Gao et al. (2024) 원 논문에서 주로 강조하는 핵심 패턴입니다. Tuning 패턴은 추론 구조가 아닌 학습 단계의 최적화로, 실무 확장 관점에서 함께 다룹니다.

1. Linear (선형)

가장 기본적인 순차 처리입니다. Naive RAG가 이 패턴에 해당합니다.

2. Conditional (조건부)

평가 결과에 따라 경로를 선택합니다. CRAG가 이 패턴을 사용합니다.

3. Branching (분기)

하나의 입력에 대해 여러 경로로 분기하여 병렬 처리합니다. 다중 검색 소스를 사용하는 경우입니다.

4. Loop (루프)

생성 결과가 기준을 충족할 때까지 반복합니다. Self-RAG가 이 패턴을 사용합니다.

5. Tuning (튜닝) — 실무 확장 관점

Tuning은 위 4가지 추론 패턴과 성격이 다릅니다. 추론 시의 데이터 흐름이 아니라, 학습 단계에서 모듈 자체를 개선하는 접근입니다. 원 논문에서는 간접적으로 언급되지만, 실무에서 RAG 성능을 높이는 핵심 전략이므로 함께 다룹니다.
검색기(Retriever)나 생성기(Generator)를 파인튜닝하여 RAG 성능을 향상시킵니다.
  • Retriever FT: 도메인 데이터로 임베딩 모델을 파인튜닝하여 검색 정확도 향상
  • Generator FT: 검색 결과를 효과적으로 활용하도록 LLM을 파인튜닝 (Self-RAG의 Reflection Token 학습 등)
  • Dual FT: 검색기와 생성기를 동시에 최적화하여 전체 파이프라인 성능 향상

LangGraph에서의 모듈 구성

LangGraph의 StateGraph는 Modular RAG의 모듈을 노드로, 플로우 패턴을 엣지로 직접 대응할 수 있습니다.
from typing import TypedDict, List, Literal
from langchain_core.documents import Document
from langgraph.graph import StateGraph, START, END

class GraphState(TypedDict):
    question: str
    query_type: str
    documents: List[Document]
    generation: str

def route_query(state: GraphState) -> Literal["vector_search", "keyword_search", "direct_answer"]:
    """쿼리 유형에 따라 적절한 모듈로 라우팅합니다."""
    query_type = state.get("query_type", "vector")
    if query_type == "simple":
        return "direct_answer"
    elif query_type == "keyword":
        return "keyword_search"
    else:
        return "vector_search"

# 그래프 구성
workflow = StateGraph(GraphState)

workflow.add_node("classify", classify_query)
workflow.add_node("vector_search", vector_search)
workflow.add_node("keyword_search", keyword_search)
workflow.add_node("direct_answer", direct_answer)
workflow.add_node("generate", generate)

workflow.add_edge(START, "classify")
workflow.add_conditional_edges("classify", route_query, {
    "vector_search": "vector_search",
    "keyword_search": "keyword_search",
    "direct_answer": "direct_answer",
})
workflow.add_edge("vector_search", "generate")
workflow.add_edge("keyword_search", "generate")
workflow.add_edge("direct_answer", END)
workflow.add_edge("generate", END)

app = workflow.compile()

기존 아키텍처와의 관계

Modular RAG 관점에서 각 RAG 아키텍처를 모듈 조합으로 표현할 수 있습니다.
아키텍처사용 모듈플로우 패턴
Naive RAGRetrieval + GenerationLinear
Advanced RAGPre-Retrieval + Retrieval + Post-Retrieval + GenerationLinear
Self-RAGRetrieval + Generation + Orchestration(자기 평가)Loop
CRAGRetrieval + Post-Retrieval(평가) + GenerationConditional
Adaptive RAGOrchestration(라우팅) + Retrieval + GenerationConditional + Loop
Agentic RAGOrchestration(에이전트) + 모든 모듈Conditional + Loop
Modular RAG는 특정 구현이 아니라 RAG 시스템을 이해하고 설계하는 프레임워크입니다. 이후의 Self-RAG, CRAG, Adaptive RAG, Agentic RAG 문서에서 각 아키텍처의 구체적인 구현을 확인할 수 있습니다.

참고 논문

논문링크
Modular RAG: Transforming RAG Systems into LEGO-like Reconfigurable Frameworks (Gao et al., 2024)arXiv 2407.21059
Retrieval-Augmented Generation for Large Language Models: A Survey (Gao et al., 2023)arXiv 2312.10997