Skip to main content

LightRAG

LightRAG는 그래프 기반 텍스트 인덱싱을 활용하여 Low-level(엔티티 쌍)과 High-level(주제/테마) 두 수준의 검색을 동시에 수행하는 경량 RAG 아키텍처입니다. 두 수준의 검색 결과를 병합하여 구체적인 사실과 전체적인 맥락을 모두 포함하는 포괄적인 답변을 생성합니다.

핵심 아이디어

기존 RAG는 하나의 검색 수준만을 사용합니다. 벡터 검색은 세부 사실에 강하지만 전체 주제 파악에 약하고, Graph RAG의 커뮤니티 요약은 전체 맥락에 강하지만 구체적 사실에 약합니다. LightRAG는 이 두 수준을 동시에 활용합니다.
특정 엔티티 쌍과 그 관계를 검색합니다.
  • 검색 대상: 두 엔티티 간의 구체적인 관계
  • 적합한 질문: “A와 B의 관계는?”, “X가 Y에 미친 영향은?”
  • 그래프에서 특정 엣지와 연결된 원본 텍스트를 반환

동작 방식

Low-level과 High-level 검색은 독립적으로 수행되므로 병렬 실행이 가능하며, 결과를 병합하여 다층적인 컨텍스트를 구성합니다.

Dual-level 검색 비교

항목Low-levelHigh-level
검색 대상엔티티 쌍 (노드-엣지-노드)주제 키워드 / 테마 클러스터
검색 방식그래프 엣지 탐색 + 벡터 유사도키워드 매칭 + 주제 클러스터 탐색
반환 내용엔티티 관계 설명 + 원본 텍스트주제 요약 + 관련 텍스트
적합한 질문구체적 사실, 관계 질문요약, 트렌드, 전체 맥락 질문
세부 정확도높음보통
맥락 커버리지보통높음

LangGraph 구현

상태 정의

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

class LightRAGState(TypedDict):
    question: str
    low_level_results: List[Document]
    high_level_results: List[Document]
    merged_context: str
    answer: str

그래프 인덱스 시뮬레이션

# Low-level: 엔티티 쌍과 관계 (그래프 엣지)
ENTITY_PAIRS = {
    ("RAG", "LLM"): {
        "relation": "검색 결과를 활용하여 생성을 보강",
        "source": "RAG는 LLM의 생성 능력을 검색된 외부 지식으로 보강하는 프레임워크입니다.",
    },
    ("벡터 검색", "임베딩"): {
        "relation": "임베딩 벡터 간 유사도로 검색 수행",
        "source": "벡터 검색은 텍스트를 임베딩 벡터로 변환한 뒤 코사인 유사도로 관련 문서를 찾습니다.",
    },
    ("Graph RAG", "지식 그래프"): {
        "relation": "지식 그래프 구조를 검색에 활용",
        "source": "Graph RAG는 문서에서 추출한 지식 그래프의 구조적 정보를 검색에 활용합니다.",
    },
    ("LightRAG", "Graph RAG"): {
        "relation": "경량화 및 듀얼 레벨 검색으로 확장",
        "source": "LightRAG는 Graph RAG의 복잡한 인덱싱을 경량화하고 듀얼 레벨 검색을 도입했습니다.",
    },
}

# High-level: 주제/테마 클러스터
TOPIC_CLUSTERS = {
    "RAG 아키텍처": [
        "RAG는 검색과 생성을 결합하여 LLM의 한계를 보완하는 핵심 아키텍처입니다.",
        "다양한 RAG 변형이 등장하며 검색 품질과 생성 정확도를 높이는 방향으로 발전하고 있습니다.",
    ],
    "그래프 기반 검색": [
        "그래프 구조를 활용한 검색은 엔티티 간 관계를 명시적으로 활용하여 멀티홉 추론에 유리합니다.",
        "Graph RAG, HippoRAG, LightRAG 등이 그래프 기반 검색의 대표적인 아키텍처입니다.",
    ],
    "벡터 검색 기술": [
        "벡터 검색은 텍스트 임베딩과 유사도 계산을 통해 의미적으로 유사한 문서를 검색합니다.",
        "Dense retrieval과 Sparse retrieval을 결합한 하이브리드 검색이 점점 보편화되고 있습니다.",
    ],
}

노드 함수

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 low_level_retrieve(state: LightRAGState) -> LightRAGState:
    """엔티티 쌍 기반으로 구체적인 관계를 검색합니다."""
    question = state["question"]

    # 질문에서 엔티티 추출
    prompt = ChatPromptTemplate.from_messages([
        ("system", (
            "질문에서 핵심 엔티티를 추출하세요. 쉼표로 구분하여 출력하세요."
        )),
        ("human", "{question}"),
    ])

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

    # 엔티티 쌍 매칭
    matched_docs = []
    for (e1, e2), info in ENTITY_PAIRS.items():
        if any(ent in e1 or ent in e2 for ent in entities):
            content = f"[{e1}{info['relation']}{e2}]\n{info['source']}"
            matched_docs.append(
                Document(page_content=content, metadata={"type": "low_level"})
            )

    return {"low_level_results": matched_docs}

그래프 구성

from langgraph.graph import StateGraph, START, END

workflow = StateGraph(LightRAGState)

# 노드 추가
workflow.add_node("low_level_retrieve", low_level_retrieve)
workflow.add_node("high_level_retrieve", high_level_retrieve)
workflow.add_node("merge_results", merge_results)
workflow.add_node("generate", generate)

# 엣지 연결: Low-level과 High-level을 병렬 실행 후 병합
workflow.add_edge(START, "low_level_retrieve")
workflow.add_edge(START, "high_level_retrieve")
workflow.add_edge("low_level_retrieve", "merge_results")
workflow.add_edge("high_level_retrieve", "merge_results")
workflow.add_edge("merge_results", "generate")
workflow.add_edge("generate", END)

# 컴파일 및 실행
app = workflow.compile()
result = app.invoke({"question": "Graph RAG와 LightRAG의 차이점은?"})
print(result["answer"])
위 그래프에서 low_level_retrievehigh_level_retrieve는 START에서 동시에 분기되어 병렬로 실행됩니다. 두 노드가 모두 완료된 후 merge_results가 실행됩니다.

GraphRAG vs LightRAG 비교

항목GraphRAG (Microsoft)LightRAG
검색 수준Global / Local (택일)Low-level + High-level (동시)
인덱싱엔티티 추출 + 커뮤니티 탐지 + 요약엔티티 쌍 추출 + 키워드 인덱싱
커뮤니티 요약필수 (map-reduce)불필요
인덱싱 비용높음낮음 (경량)
업데이트그래프 재구축 필요증분 업데이트 가능
세부 사실 검색Local Search로 지원Low-level로 지원
전역 맥락 검색Global Search로 지원High-level로 지원
검색 결과 통합별도 수행자동 병합
LightRAG의 듀얼 레벨 검색은 두 경로의 결과를 병합하므로, 컨텍스트 길이가 단일 검색 대비 증가합니다. LLM의 컨텍스트 윈도우 제한에 주의하고, 필요 시 각 수준의 검색 결과 수(Top-K)를 조절하세요.

참고 논문

논문학회링크
LightRAG: Simple and Fast Retrieval-Augmented Generation (Guo et al., 2024)-arXiv 2410.05779