그래프 DB 없이 GraphRAG 구현하기

벡터 스토어 메타데이터를 엣지로 활용하는 langchain-graph-retriever 접근법

기존 GraphRAG는 Neo4j 같은 별도 그래프 데이터베이스가 필요해 구축 비용이 높았다. langchain-graph-retriever는 이미 사용 중인 벡터 스토어의 메타데이터를 엣지로 활용하여 그래프 DB 없이 GraphRAG를 구현하는 방식을 제안한다. 이 파일은 그 핵심 아이디어와 기존 방식과의 차이를 설명한다.

AI
RAG
GraphRAG
저자

Kwangmin Kim

공개

2026년 03월 08일

1 그래프 DB 없이 GraphRAG 구현하기

1.1 기존 GraphRAG의 구조와 문제

전통적인 GraphRAG (Microsoft 방식 등)는 다음 두 개의 시스템을 동시에 운영해야 한다.

[문서] ──→ [LLM으로 엔티티/관계 추출] ──→ [그래프 DB (Neo4j 등)] ──→ [Cypher 쿼리]
                                                    +
[문서] ──→ [임베딩] ──→ [벡터 DB (Chroma 등)] ──→ [코사인 유사도 검색]

두 시스템을 모두 구축해야 하는 부담이 크다.

실무에서 발생하는 문제들:

문제 내용
인프라 비용 Neo4j 설치·운영·백업 추가 필요
데이터 동기화 벡터 DB와 그래프 DB가 항상 일치해야 함
온톨로지 설계 어떤 엔티티, 어떤 관계를 추출할지 도메인 전문가와 협의 필요
추출 정확도 LLM이 엔티티/관계를 잘못 추출하면 전체 그래프가 오염됨

1.2 langchain-graph-retriever의 핵심 아이디어

“관계 정보는 이미 메타데이터에 있다”

대부분의 문서는 저장할 때 이미 관계 정보를 담은 메타데이터를 가지고 있다.

{
  "id": "alpaca",
  "text": "알파카는 남미 원산의 가축화된 포유류로 부드러운 털로 유명하다.",
  "metadata": {
    "type": "mammal",
    "origin": "south america",      여기! 관계 정보
    "habitat": "grassland",         여기! 관계 정보
    "keywords": ["wool", "domesticated"]   여기! 관계 정보
  }
}

같은 origin을 가진 동물들은 “같은 지역 출신”으로 연결할 수 있다. 이 메타데이터가 곧 엣지(Edge)다.

[alpaca]  ←──origin: "south america"──→  [capybara]
[alpaca]  ←──origin: "south america"──→  [llama]
[alpaca]  ←──habitat: "grassland"──→     [bison]

별도 그래프 DB 없이, 기존 벡터 스토어만으로 이 관계를 표현하고 탐색할 수 있다.

1.3 두 방식 비교

[기존 KG 기반 GraphRAG]                [메타데이터 기반 GraphRAG]
────────────────────────               ──────────────────────────
벡터 DB     → 의미적 검색               벡터 DB    → 의미적 검색 + 그래프 탐색
그래프 DB   → 구조적 탐색
             (Neo4j 등 별도)

장점:  관계를 명시적으로 정의            장점:  인프라 추가 불필요
       복잡한 온톨로지 표현 가능                기존 시스템에 바로 적용
       양방향/다단계 관계 풍부                  메타데이터만 잘 설계하면 됨

단점:  인프라 구축 비용 높음             단점:  메타데이터에 정의된 관계만 탐색 가능
       동기화 유지 어려움                       Neo4j 수준의 복잡한 쿼리 불가
       온톨로지 설계 전문성 필요                 메타데이터 설계가 핵심 병목

1.4 langchain-graph-retriever 동작 원리

사용자 질의: "카피바라 주변에서 볼 수 있는 포유류는?"

Step 1: 벡터 유사도 검색
  질의 임베딩 → 벡터 DB 검색 → [capybara] 발견 (depth=0)

Step 2: 메타데이터 엣지 추출
  capybara.metadata["origin"] = "south america"
  capybara.metadata["habitat"] = "wetland"
  → MetadataEdge("origin", "south america") 생성
  → MetadataEdge("habitat", "wetland") 생성

Step 3: 엣지로 인접 노드 탐색
  벡터 DB에서 origin="south america"인 문서 검색
  → [alpaca], [llama], [jaguar] 발견 (depth=1)

Step 4: 반복 탐색 (max_depth까지)
  alpaca의 메타데이터로 추가 엣지 생성 → 다음 레이어 탐색

Step 5: 전체 결과 반환
  [capybara, alpaca, llama, jaguar, ...] + 관계 정보

1.5 패키지 구조

langchain-graph-retriever는 3개 패키지로 구성된다.

graph-retriever/              ← 순수 Python 탐색 엔진 (LangChain 의존성 없음)
  graph_retriever/
    types.py                  ← Node 클래스
    traversal.py              ← 핵심 traverse() 함수
    edges/                    ← MetadataEdge, IdEdge
    strategies/               ← Eager, MMR, Scored

langchain-graph-retriever/    ← LangChain 통합 레이어
  langchain_graph_retriever/
    graph_retriever.py        ← GraphRetriever (LangChain Retriever)
    adapters/                 ← Chroma, PGVector, AstraDB 등 연결
    transformers/             ← ShreddingTransformer, GLiNER, KeyBERT 등

graph-rag-example-helpers/    ← 예제용 데이터셋 유틸리티
  graph_rag_example_helpers/
    datasets/                 ← animals, wikimultihop 데이터셋

1.6 언제 이 방식이 적합한가

적합한 경우:

  • 이미 벡터 스토어를 사용 중이고, 추가 인프라 없이 그래프 탐색을 원할 때
  • 문서에 구조화된 메타데이터(카테고리, 태그, 원산지, 연도 등)가 이미 있을 때
  • 1~3 depth 수준의 관계 탐색이 필요할 때
  • 프로토타이핑 단계에서 빠르게 GraphRAG를 검증하고 싶을 때

한계 (KG 방식이 더 적합한 경우):

  • 복잡한 온톨로지와 다양한 관계 타입이 필요할 때
  • 관계 자체에 속성이 있어야 할 때 (예: “2020년부터 근무”)
  • Cypher 같은 그래프 쿼리 언어로 복잡한 패턴 매칭이 필요할 때

1.7 이 라이브러리는 GraphRAG의 어느 수준인가

langchain-graph-retriever는 잘 설계된 라이브러리지만, “GraphRAG의 전부”는 아니다. 스펙트럼에서의 위치를 정직하게 짚고 넘어갈 필요가 있다.

1.7.1 본질을 한 줄로 표현하면

“메타데이터 필터링 벡터 검색 + BFS 확장”

그래프 DB도 없고, LLM 엔티티 추출도 없고, 명시적 지식 그래프 구축도 없다. 관계 정보가 이미 메타데이터에 있어야만 동작한다.

1.7.2 학술/산업 GraphRAG와의 격차

기능 이 라이브러리 Microsoft GraphRAG Neo4j GraphRAG
그래프 DB ❌ 없음 ✅ 내부 구축 ✅ Neo4j
LLM으로 엔티티/관계 추출 ❌ 없음 ✅ 핵심 기능
커뮤니티 감지 (전체 그래프) ❌ 없음 ✅ Leiden 알고리즘
계층적 요약 (Global/Local) ❌ 없음 부분
관계 자체에 속성 부여 ❌ 불가 ✅ Cypher
복잡한 그래프 쿼리 ❌ 불가
전체 그래프 알고리즘 ❌ 불가 ✅ PageRank 등

1.7.3 핵심 한계 3가지

1. 메타데이터 없으면 무용지물

# 이런 문서는 그래프 탐색 불가 → 일반 Vector RAG와 동일
doc.metadata = {"source": "some_pdf"}

2. 관계 타입이 단순함

# 할 수 있는 것: "같은 값을 가진 문서끼리 연결"
edges=[("origin", "origin")]

# 할 수 없는 것
# (A) -[근무함, since=2020]-> (B)  ← 관계 자체에 의미/속성 불가

3. BFS의 방향 없는 확장

depth=3 탐색 시 관련 없는 문서가 대량 포함될 수 있음
→ 정교한 경로 선택 없이 모든 방향으로 확산

1.7.4 GraphRAG 스펙트럼에서의 위치

일반 Vector RAG
    │
    ▼  ← 이 라이브러리
메타데이터 기반 그래프 탐색 RAG
    │
    ▼
Microsoft GraphRAG (LLM 엔티티 추출 + 커뮤니티 요약)
    │
    ▼
Neo4j 기반 Full GraphRAG (완전한 그래프 DB + Cypher)
    │
    ▼
PathRAG / GFM-RAG (최신 연구)

1.7.5 그럼에도 이 라이브러리를 공부하는 이유

이 라이브러리가 나쁜 것이 아니라, 목적에 맞는 실용적 선택이다.

  • 구축 비용: Neo4j + LLM 추출 없이 벡터 스토어만으로 즉시 적용
  • 기존 시스템 통합: 이미 메타데이터가 있는 데이터에 바로 적용
  • GraphRAG 핵심 개념 학습: 노드, 엣지, 탐색 전략의 실제 작동 방식 이해
  • LazyGraphRAG: 커뮤니티 기반 클레임 추출은 실제로 정교한 기법

이 시리즈는 이 라이브러리를 통해 GraphRAG의 기초 개념을 익히고, 이후 Microsoft GraphRAG 같은 풀 스택 접근으로 확장하기 위한 발판으로 삼는다.

1.8 정리

항목 내용
핵심 아이디어 벡터 스토어 메타데이터 = 그래프 엣지
추가 인프라 불필요
핵심 설계 결정 어떤 메타데이터 필드를 엣지로 사용할 것인가
탐색 방식 벡터 유사도 → 시작 노드 → 메타데이터로 인접 노드 → 반복
지원 Vector Store Chroma, AstraDB, Cassandra, OpenSearch, PGVector, In-memory
실제 수준 메타데이터 BFS 확장 (Full GraphRAG와는 다름)

다음 파일에서는 실제 설치와 첫 번째 GraphRAG 실행을 해본다.

Subscribe

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