Microsoft GraphRAG 방식 구현

Global Search & Local Search: 계층적 커뮤니티 요약 기반 GraphRAG

Microsoft Research(2024)의 GraphRAG 논문에서 제안한 Global Search와 Local Search를 Neo4j로 구현한다. Global Search는 전체 커뮤니티 요약을 활용하고, Local Search는 특정 엔티티 주변의 그래프를 탐색하여 상세한 답변을 생성한다.

AI
RAG
GraphRAG
Neo4j
저자

Kwangmin Kim

공개

2026년 03월 08일

1 Microsoft GraphRAG 방식 구현

1.1 Microsoft GraphRAG 개요

Microsoft Research가 2024년 4월 발표한 GraphRAG는 두 가지 검색 모드를 제시한다.

Global Search  ── "AI 업계의 전체적인 동향은?"
  → 커뮤니티 요약을 활용한 포괄적 답변
  → 전체 그래프의 거시적 패턴 파악에 적합

Local Search   ── "일론 머스크의 주요 업적은?"
  → 특정 엔티티 주변 그래프를 탐색한 상세 답변
  → 특정 엔티티에 대한 미시적 정보에 적합

1.2 사전 요구사항

이 파일은 이전 파일들이 완료된 상태를 가정한다.

필요한 사전 작업:
  ✅ 03: LLMGraphTransformer로 KG 구축 완료
  ✅ 04: 벡터 인덱스 생성 완료
  ✅ 06: Louvain 커뮤니티 감지 완료 (louvain_community 속성)
  ✅ 07: PageRank 계산 완료 (pagerank 속성)
  ✅ 06: 커뮤니티 요약 생성 완료 (Community 노드 + summary 속성)

1.5 Global vs Local Search 라우팅

질문 유형에 따라 자동으로 검색 모드를 선택한다.

ROUTER_PROMPT = PromptTemplate.from_template("""
다음 질문이 어떤 검색 방식에 적합한지 판단하세요.

"global": 전체적인 패턴, 요약, 트렌드, 업계 동향 등 광범위한 질문
"local": 특정 인물, 회사, 사건 등에 대한 구체적인 질문

질문: {question}

"global" 또는 "local" 중 하나만 출력:
""")

def route_and_search(question: str) -> str:
    """질문 유형에 따라 Global 또는 Local Search 실행."""

    route = llm.invoke(
        ROUTER_PROMPT.format(question=question)
    ).content.strip().lower()

    print(f"라우팅 결정: {route}")

    if route == "global":
        return global_search(question)
    else:
        return local_search(question)

# 테스트
questions = [
    "AI 업계의 주요 기업과 트렌드는?",        # → global
    "Tesla의 창립자와 설립 연도는?",           # → local
    "전기차 시장의 경쟁 구도는?",             # → global
    "일론 머스크가 설립한 회사 목록은?",       # → local
]

for q in questions:
    print(f"\n질문: {q}")
    print(f"답변: {route_and_search(q)[:200]}...")

1.6 전체 파이프라인 통합

from langchain_core.runnables import RunnableLambda

def microsoft_graphrag_pipeline(question: str) -> str:
    """Microsoft GraphRAG 완전 파이프라인."""

    # 라우팅
    route = llm.invoke(
        ROUTER_PROMPT.format(question=question)
    ).content.strip().lower()

    if "global" in route:
        return global_search(question, top_k_communities=10)
    else:
        return local_search(question, k=5)

# 사용
result = microsoft_graphrag_pipeline(
    "AI 분야에서 가장 영향력 있는 인물과 그들의 주요 업적은?"
)
print(result)

1.7 정리

Microsoft GraphRAG 두 가지 모드:

Global Search (거시적):
  커뮤니티 요약 → LLM 종합 답변
  적합: "업계 동향", "전체 패턴", "요약" 질문

Local Search (미시적):
  벡터 검색 → 엔티티 발견 → Cypher 2~3 hop 탐색 → LLM 상세 답변
  적합: "특정 인물/회사/사건" 질문

라우팅:
  LLM이 질문 분석 → global or local 결정 → 해당 검색 실행

사전 준비:
  KG 구축 (03) → 커뮤니티 감지 (06) → 커뮤니티 요약 생성 (06) → 검색

다음 파일에서는 자연어를 Cypher로 변환하는 Text2Cypher QA 시스템을 구현한다.

Subscribe

Enjoy this blog? Get notified of new posts by email: