Skip to main content

MemoRAG

MemoRAG는 경량 메모리 모델(Memory Model)이 전체 데이터베이스에 대한 글로벌 이해를 형성하고, 이를 기반으로 초안 답변을 생성한 뒤, 그 초안에서 검색 단서(retrieval clue)를 추출하여 더 정확한 검색을 수행하는 이중 시스템 RAG 아키텍처입니다. 최종 답변은 강력한 생성 모델(Generation Model)이 검색된 문서를 기반으로 생성합니다.

핵심 아이디어

기존 RAG는 사용자 질문을 그대로 검색 쿼리로 사용합니다. 그러나 질문이 모호하거나 추상적일 때(“이 데이터셋의 핵심 인사이트는?”), 질문 자체로는 적절한 문서를 검색하기 어렵습니다. MemoRAG는 메모리 모델이 전체 코퍼스를 “읽은” 상태에서 초안을 생성하고, 이 초안에서 구체적인 검색 단서를 추출하여 검색 품질을 향상시킵니다.
시스템모델역할
Memory Model경량 모델 (light LM)전체 코퍼스에 대한 글로벌 이해 형성, 초안 답변 생성
Generation Model강력한 모델 (strong LM)검색된 문서를 기반으로 정확한 최종 답변 생성
Memory Model은 전체 코퍼스의 텍스트를 요약/압축한 형태의 “글로벌 메모리”를 내부적으로 보유합니다. 원 논문에서는 긴 컨텍스트를 처리할 수 있는 경량 모델을 사용하여, 전체 데이터베이스의 내용을 하나의 모델에 기억시킵니다.이 모델은 정확한 답변을 생성하는 것이 목적이 아니라, 대략적인 방향성을 제시하는 역할을 합니다. 초안의 정확도가 낮더라도 검색 단서를 추출하는 데는 충분합니다.

동작 방식

1

초안 생성 (Memory Model)

경량 메모리 모델이 전체 코퍼스에 대한 글로벌 이해를 바탕으로 대략적인 초안 답변을 생성합니다. 이 초안은 정확하지 않을 수 있지만, 답변의 방향성과 관련 키워드를 포함합니다.
2

검색 단서 추출

초안에서 구체적인 검색 쿼리(retrieval clue)를 추출합니다. 원래 질문보다 초안에서 추출한 검색 단서가 더 구체적이고 타겟팅된 검색을 가능하게 합니다.
3

문서 검색

추출된 검색 단서를 사용하여 벡터 데이터베이스에서 관련 문서를 검색합니다.
4

최종 답변 생성 (Generation Model)

강력한 생성 모델이 원래 질문과 검색된 문서를 기반으로 정확한 최종 답변을 생성합니다.

Memory Model vs Generation Model

항목Memory ModelGeneration Model
모델 크기경량 (소형)대형 (강력)
입력질문 + 글로벌 메모리질문 + 검색된 문서
출력대략적인 초안 답변정확한 최종 답변
목적검색 방향 제시정밀한 답변 생성
정확도 요구낮음 (방향성만 필요)높음 (최종 결과)
호출 비용낮음높음

LangGraph 구현

상태 정의

from typing import TypedDict, List
from langchain_core.documents import Document

class MemoRAGState(TypedDict):
    question: str
    memory_draft: str
    retrieval_clues: List[str]
    documents: List[Document]
    answer: str

노드 함수

from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# Memory Model: 경량 모델 (글로벌 메모리 역할)
memory_llm = init_chat_model("gpt-4o-mini", temperature=0.3)

# Generation Model: 강력한 모델
generation_llm = init_chat_model("gpt-4o", temperature=0)

def generate_memory_draft(state: MemoRAGState) -> MemoRAGState:
    """Memory Model이 글로벌 지식을 기반으로 초안 답변을 생성합니다."""
    question = state["question"]

    prompt = ChatPromptTemplate.from_messages([
        ("system", (
            "당신은 전체 문서 데이터베이스를 읽은 메모리 모델입니다.\n"
            "질문에 대해 기억하는 내용을 바탕으로 대략적인 답변 초안을 작성하세요.\n"
            "정확하지 않더라도 관련된 키워드, 개념, 방향성을 최대한 포함하세요.\n"
            "이 초안은 정확한 문서를 검색하기 위한 단서로 활용됩니다."
        )),
        ("human", "{question}"),
    ])

    chain = prompt | memory_llm | StrOutputParser()
    draft = chain.invoke({"question": question})
    return {"memory_draft": draft}

그래프 구성

from langgraph.graph import StateGraph, START, END

workflow = StateGraph(MemoRAGState)

# 노드 추가
workflow.add_node("generate_memory_draft", generate_memory_draft)
workflow.add_node("extract_clues", extract_clues)
workflow.add_node("retrieve", retrieve)
workflow.add_node("generate_final", generate_final)

# 엣지 연결
workflow.add_edge(START, "generate_memory_draft")
workflow.add_edge("generate_memory_draft", "extract_clues")
workflow.add_edge("extract_clues", "retrieve")
workflow.add_edge("retrieve", "generate_final")
workflow.add_edge("generate_final", END)

# 컴파일 및 실행
app = workflow.compile()
result = app.invoke({"question": "이 데이터셋에서 가장 중요한 발견은 무엇인가?"})
print(result["answer"])
Memory Model의 글로벌 메모리는 전체 코퍼스 내용의 압축된 표현입니다. 원 논문에서는 긴 컨텍스트를 지원하는 경량 모델에 전체 텍스트를 입력하지만, 위 예제에서는 시스템 프롬프트로 글로벌 메모리 역할을 근사합니다. 실제 구현에서는 코퍼스 요약이나 메모리 임베딩을 활용하세요.

적용 시나리오

“이 프로젝트의 핵심 교훈은?” 같은 추상적 질문은 직접 검색하기 어렵습니다. Memory Model이 대략적인 답변 방향을 제시하고, 여기서 추출한 구체적 키워드로 관련 문서를 정확하게 검색합니다.
수천 개의 문서가 있는 대규모 데이터베이스에서 Memory Model이 전체 맥락을 파악한 상태로 검색 방향을 안내합니다. 사용자가 어떤 문서가 있는지 모르더라도 효과적으로 검색할 수 있습니다.
구조화되지 않은 다양한 유형의 문서(보고서, 이메일, 메모 등)에서 정보를 통합해야 할 때, Memory Model이 전체 데이터베이스의 맥락을 이해한 상태에서 검색 전략을 수립합니다.

Standard RAG와의 비교

항목Standard RAGMemoRAG
검색 쿼리사용자 질문 그대로Memory Model 초안에서 추출한 단서
글로벌 이해없음Memory Model이 전체 코퍼스 이해
모호한 질문검색 품질 저하초안 기반 검색 단서로 보완
모델 구조단일 모델Memory Model + Generation Model
검색 정확도질문 의존적초안 기반 단서로 향상
비용LLM 1회 호출LLM 2회 + 단서 추출
MemoRAG는 질문이 명확할 때는 Standard RAG와 유사한 성능을 보이지만, 질문이 모호하거나 전체 맥락 이해가 필요한 경우에 특히 강점을 발휘합니다. 질문 유형에 따라 MemoRAG를 선택적으로 적용하는 것이 비용 효율적입니다.

참고 논문

논문학회링크
MemoRAG: Moving towards Next-Gen RAG Via Memory-Inspired Knowledge Discovery (Qian et al., 2024)-arXiv 2409.05591