Skip to main content

HippoRAG

HippoRAG는 인간 뇌의 해마(hippocampus) 기억 인덱싱 이론에서 영감을 받은 RAG 아키텍처입니다. LLM으로 문서에서 지식 트리플(주어-관계-목적어)을 추출하여 지식 그래프를 구축하고, Personalized PageRank(PPR)를 활용하여 검색하는 방식으로 기존 RAG보다 다단계 추론과 지식 통합에 뛰어납니다.

핵심 아이디어

HippoRAG는 뇌의 장기 기억 시스템을 세 가지 구성 요소에 대응시킵니다.
뇌 구조HippoRAG 대응역할
대뇌 신피질 (Neocortex)LLM지식 처리 및 답변 생성
해마 (Hippocampus)Knowledge Graph지식 트리플 저장 및 인덱싱
해마방회 (Parahippocampal)PPR 알고리즘연관 기억 검색
해마 기억 인덱싱 이론에 따르면, 해마는 기억의 내용 자체를 저장하는 것이 아니라 대뇌 신피질에 분산된 기억 조각들의 인덱스(색인)를 관리합니다.새로운 정보가 들어오면 해마는 기존 기억과의 연결(패턴 분리/패턴 완성)을 통해 관련 기억을 활성화합니다. HippoRAG는 이 과정을 지식 그래프의 엔티티 연결과 PPR 전파로 모사합니다.

동작 방식

HippoRAG는 오프라인 인덱싱과 온라인 검색의 두 단계로 동작합니다.

오프라인 인덱싱 vs 온라인 검색

  1. 트리플 추출: LLM이 각 문서에서 (주어, 관계, 목적어) 형태의 지식 트리플을 추출합니다
  2. 그래프 구축: 추출된 트리플의 엔티티를 노드로, 관계를 엣지로 연결하여 Knowledge Graph를 구축합니다
  3. 패시지 연결: 각 트리플이 추출된 원본 패시지를 해당 노드에 연결합니다
이 과정은 문서가 추가될 때 한 번 수행되며, 검색 시에는 구축된 그래프를 재활용합니다.

LangGraph 구현

아래 구현에서는 Knowledge Graph를 딕셔너리 기반의 간소화된 구조로 시뮬레이션합니다. 실제 HippoRAG 구현에서는 Neo4j 등의 그래프 DB와 정교한 PPR 알고리즘을 사용합니다.

상태 정의

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

class HippoState(TypedDict):
    question: str
    query_entities: List[str]
    kg_results: List[dict]
    documents: List[Document]
    answer: str

지식 그래프 시뮬레이션

# 사전 구축된 Knowledge Graph (예시)
KNOWLEDGE_GRAPH = {
    "entities": {
        "트랜스포머": {"passages": ["passage_1", "passage_2"]},
        "셀프 어텐션": {"passages": ["passage_1", "passage_3"]},
        "BERT": {"passages": ["passage_4", "passage_5"]},
        "GPT": {"passages": ["passage_5", "passage_6"]},
        "사전학습": {"passages": ["passage_4", "passage_6"]},
    },
    "triples": [
        ("트랜스포머", "핵심 메커니즘", "셀프 어텐션"),
        ("BERT", "기반 아키텍처", "트랜스포머"),
        ("GPT", "기반 아키텍처", "트랜스포머"),
        ("BERT", "학습 방식", "사전학습"),
        ("GPT", "학습 방식", "사전학습"),
    ],
}

PASSAGES = {
    "passage_1": "트랜스포머는 셀프 어텐션 메커니즘을 기반으로 한 딥러닝 아키텍처입니다.",
    "passage_2": "트랜스포머는 인코더-디코더 구조를 사용하며 병렬 처리에 유리합니다.",
    "passage_3": "셀프 어텐션은 시퀀스 내 모든 위치 간의 관계를 동시에 계산합니다.",
    "passage_4": "BERT는 양방향 사전학습을 통해 문맥을 이해하는 언어 모델입니다.",
    "passage_5": "BERT와 GPT는 모두 트랜스포머 아키텍처를 기반으로 합니다.",
    "passage_6": "GPT는 자기회귀 사전학습으로 텍스트를 생성하는 언어 모델입니다.",
}

노드 함수

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

llm = init_chat_model("gpt-4o-mini", temperature=0)

def extract_query_entities(state: HippoState) -> HippoState:
    """질문에서 핵심 Named Entity를 추출합니다."""
    question = state["question"]

    prompt = ChatPromptTemplate.from_messages([
        ("system", (
            "질문에서 핵심 Named Entity(인물, 기술, 개념, 조직 등)를 추출하세요.\n"
            "쉼표로 구분하여 출력하세요.\n"
            "예: 트랜스포머, 셀프 어텐션, BERT"
        )),
        ("human", "{question}"),
    ])

    chain = prompt | llm | StrOutputParser()
    result = chain.invoke({"question": question})
    entities = [e.strip() for e in result.split(",") if e.strip()]

    return {"query_entities": entities}

그래프 구성

from langgraph.graph import StateGraph, START, END

workflow = StateGraph(HippoState)

# 노드 추가
workflow.add_node("extract_query_entities", extract_query_entities)
workflow.add_node("retrieve_from_kg", retrieve_from_kg)
workflow.add_node("retrieve_passages", retrieve_passages)
workflow.add_node("generate", generate)

# 엣지 연결
workflow.add_edge(START, "extract_query_entities")
workflow.add_edge("extract_query_entities", "retrieve_from_kg")
workflow.add_edge("retrieve_from_kg", "retrieve_passages")
workflow.add_edge("retrieve_passages", "generate")
workflow.add_edge("generate", END)

# 컴파일 및 실행
app = workflow.compile()
result = app.invoke({"question": "트랜스포머와 BERT의 관계는?"})
print(result["answer"])
실제 PPR 알고리즘은 그래프 전체에 대해 확률 전파를 수행하며, 위 예제의 이웃 탐색보다 훨씬 정교합니다. 대규모 Knowledge Graph에서는 NetworkX의 pagerank_scipy나 전용 그래프 DB의 PPR 구현을 사용하세요.

기존 Graph RAG와의 비교

항목Graph RAG (Microsoft)HippoRAG
그래프 구조엔티티 + 커뮤니티 계층엔티티 + 지식 트리플
검색 알고리즘커뮤니티 요약 / 서브그래프 탐색Personalized PageRank
요약 생성커뮤니티 단위 요약 필요요약 불필요 (트리플만 저장)
영감그래프 이론해마 기억 인덱싱 이론
전역 질문Global Search (map-reduce)PPR 전파 범위로 커버
인덱싱 비용높음 (추출 + 커뮤니티 탐지 + 요약)중간 (추출 + 그래프 구축)
멀티홉 추론서브그래프 탐색으로 가능PPR 전파로 자연스럽게 지원

참고 논문

논문학회링크
HippoRAG: Neurobiologically Inspired Long-Term Memory for Large Language Models (Gutierrez et al., 2024)NeurIPS 2024arXiv 2405.14831