티스토리 뷰
GraphRAG 시리즈 Part 3: 쿼리 모드 완벽 가이드 - Global, Local, DRIFT
pak2251 2026. 1. 6. 13:38
작성일: 2026년 1월 5일
카테고리: AI, RAG, Knowledge Graph, LLM
키워드: GraphRAG, Global Search, Local Search, DRIFT Search, Query Processing
요약
GraphRAG는 질문의 특성에 따라 다양한 쿼리 모드를 제공한다. Global Search는 전체 데이터셋의 테마 파악에, Local Search는 특정 엔티티 탐색에, DRIFT Search는 두 방식의 장점을 결합한다. 이 글에서는 각 쿼리 모드의 동작 원리, 적합한 사용 시나리오, 그리고 성능 특성을 분석한다.
쿼리 모드 개요
GraphRAG는 네 가지 쿼리 모드를 제공한다:
flowchart TB
Q[사용자 질문]
Q --> G[Global Search]
Q --> L[Local Search]
Q --> D[DRIFT Search]
Q --> B[Basic Search]
G --> GD[전역적 테마 분석]
L --> LD[특정 엔티티 탐색]
D --> DD[하이브리드 탐색]
B --> BD[벡터 유사도 검색]
style Q stroke:#2563eb,stroke-width:3px
style G stroke:#dc2626,stroke-width:2px
style L stroke:#16a34a,stroke-width:2px
style D stroke:#9333ea,stroke-width:2px
style B stroke:#4b5563,stroke-width:2px
| 모드 | 용도 | 특징 |
|---|---|---|
| Global Search | 전체 데이터셋 분석 | 커뮤니티 요약 기반 |
| Local Search | 특정 엔티티 탐색 | 그래프 이웃 탐색 |
| DRIFT Search | 복합 질문 | Global + Local 통합 |
| Basic Search | 단순 정보 검색 | 기존 RAG 방식 |
Global Search: 숲을 보는 눈
Global Search는 "이 데이터셋의 주요 테마는 무엇인가?"와 같은 전역적 질문에 답한다. 개별 나무가 아닌 숲 전체를 조망하는 방식이다.
동작 원리: Map-Reduce 패턴
Global Search는 Map-Reduce 패턴을 사용한다. 분할 정복(divide and conquer)과 같은 원리다.
flowchart TB
subgraph Map["Map 단계"]
Q[질문]
C1[커뮤니티 1]
C2[커뮤니티 2]
C3[커뮤니티 3]
CN[커뮤니티 N]
P1[부분 응답 1]
P2[부분 응답 2]
P3[부분 응답 3]
PN[부분 응답 N]
Q --> C1
Q --> C2
Q --> C3
Q --> CN
C1 --> P1
C2 --> P2
C3 --> P3
CN --> PN
end
subgraph Reduce["Reduce 단계"]
P1 --> R[통합 요약]
P2 --> R
P3 --> R
PN --> R
R --> F[최종 답변]
end
style Q stroke:#2563eb,stroke-width:3px
style R stroke:#ea580c,stroke-width:2px
style F stroke:#16a34a,stroke-width:3px
Map 단계
- 사전 생성된 커뮤니티 요약을 가져온다
- 각 커뮤니티 요약에 대해 질문과 관련된 부분 응답 생성
- 관련 없는 커뮤니티는 빈 응답 반환
# Map 단계 (개념적 코드)
def map_phase(query: str, community_summaries: list) -> list:
partial_responses = []
for summary in community_summaries:
prompt = f"""
커뮤니티 요약: {summary.text}
질문: {query}
이 커뮤니티가 질문과 관련이 있다면 답변을 제공하세요.
관련 없다면 "관련 없음"을 반환하세요.
"""
response = llm.generate(prompt)
if response != "관련 없음":
partial_responses.append(response)
return partial_responses
Reduce 단계
- 모든 부분 응답을 수집
- LLM이 부분 응답들을 종합하여 최종 답변 생성
- 중복 제거 및 일관성 확보
# Reduce 단계 (개념적 코드)
def reduce_phase(query: str, partial_responses: list) -> str:
combined = "\n\n".join(partial_responses)
prompt = f"""
다음은 여러 커뮤니티에서 수집한 부분 응답입니다:
{combined}
원래 질문: {query}
모든 부분 응답을 종합하여 포괄적인 최종 답변을 작성하세요.
중복을 제거하고 일관된 서술로 정리하세요.
"""
return llm.generate(prompt)
커뮤니티 레벨 선택
Global Search는 커뮤니티 레벨을 선택할 수 있다:
| 레벨 | 커뮤니티 수 | 세부 수준 | 비용 |
|---|---|---|---|
| Level 0 | 적음 | 높은 추상화 | 낮음 |
| Level 1 | 중간 | 중간 세부 | 중간 |
| Level 2+ | 많음 | 상세 | 높음 |
# 설정 예시
query:
global_search:
community_level: 1 # 사용할 커뮤니티 레벨
max_tokens: 8000 # 최대 컨텍스트 토큰
Global Search 적합 질문
- "이 문서들의 주요 테마는 무엇인가?"
- "데이터셋에서 반복되는 패턴은?"
- "전체적인 트렌드를 요약해달라"
- "가장 영향력 있는 인물/조직은?"
Local Search: 나무를 자세히 보다
Local Search는 특정 엔티티에 대한 상세 정보를 탐색한다. 특정 인물이나 조직에 대해 깊이 파고드는 방식이다.
동작 원리
Local Search는 질문에서 핵심 엔티티를 식별하고, 해당 엔티티의 이웃(neighbor) 정보를 수집한다.
flowchart TB
Q[질문: 김철수와 삼성전자의 관계는?]
subgraph EntitySearch["엔티티 탐색"]
E1[김철수]
E2[삼성전자]
end
subgraph Neighbors["이웃 정보 수집"]
N1[CEO 관계]
N2[신제품 발표]
N3[관련 뉴스]
N4[동료 임원]
end
subgraph Context["컨텍스트 구성"]
C1[엔티티 설명]
C2[관계 정보]
C3[원본 텍스트]
end
Q --> E1
Q --> E2
E1 --> N1
E1 --> N2
E2 --> N3
E2 --> N4
N1 --> C1
N2 --> C2
N3 --> C3
N4 --> C3
C1 --> R[최종 답변]
C2 --> R
C3 --> R
style Q stroke:#2563eb,stroke-width:3px
style E1 stroke:#16a34a,stroke-width:2px
style E2 stroke:#16a34a,stroke-width:2px
style R stroke:#dc2626,stroke-width:3px
탐색 과정
- 엔티티 식별: 질문에서 핵심 엔티티 추출
- 이웃 탐색: 지식 그래프에서 연결된 엔티티/관계 수집
- 텍스트 검색: 관련 원본 TextUnit 검색
- 컨텍스트 구성: 엔티티 설명 + 관계 + 원본 텍스트
- 답변 생성: LLM이 구성된 컨텍스트로 답변
# Local Search (개념적 코드)
def local_search(query: str, knowledge_graph: Graph) -> str:
# 1. 질문에서 엔티티 식별
entities = extract_entities(query)
# 2. 그래프에서 관련 노드 찾기
matched_nodes = []
for entity in entities:
nodes = knowledge_graph.search_nodes(entity)
matched_nodes.extend(nodes)
# 3. 이웃 정보 수집
context_items = []
for node in matched_nodes:
# 노드 설명
context_items.append(node.description)
# 연결된 관계
for edge in node.edges:
context_items.append(edge.description)
# 관련 원본 텍스트
for source_id in node.source_ids:
text_unit = get_text_unit(source_id)
context_items.append(text_unit.text)
# 4. 답변 생성
context = "\n".join(context_items)
prompt = f"Context: {context}\nQuestion: {query}"
return llm.generate(prompt)
컨텍스트 우선순위
Local Search는 컨텍스트 윈도우가 제한되므로, 정보에 우선순위를 부여한다:
| 우선순위 | 정보 유형 | 이유 |
|---|---|---|
| 1 | 핵심 엔티티 설명 | 질문의 주체 |
| 2 | 직접 관계 | 가장 관련성 높음 |
| 3 | 1-hop 이웃 | 확장된 컨텍스트 |
| 4 | 원본 텍스트 청크 | 상세 정보 |
| 5 | 2-hop 이웃 | 배경 정보 |
Local Search 적합 질문
- "김철수는 누구인가?"
- "삼성전자와 NVIDIA의 관계는?"
- "갤럭시 뉴로의 특징을 설명해달라"
- "이 인물이 어떤 프로젝트에 참여했는가?"
DRIFT Search: 최상의 균형
DRIFT(Dynamic Reasoning and Inference with Flexible Traversal) Search는 Global과 Local의 장점을 결합한 하이브리드 방식이다.
동작 원리
DRIFT는 먼저 커뮤니티 정보로 방향을 잡고, 그 다음 로컬 탐색으로 상세 정보를 수집한다.
flowchart TB
Q[질문]
subgraph Phase1["1단계: 방향 설정"]
CS[커뮤니티 요약 검색]
RC[관련 커뮤니티 선택]
end
subgraph Phase2["2단계: 상세 탐색"]
EI[엔티티 식별]
NT[이웃 탐색]
TU[TextUnit 검색]
end
subgraph Phase3["3단계: 통합"]
CM[커뮤니티 맥락]
LC[로컬 컨텍스트]
FG[최종 답변 생성]
end
Q --> CS
CS --> RC
RC --> EI
EI --> NT
NT --> TU
RC --> CM
TU --> LC
CM --> FG
LC --> FG
style Q stroke:#2563eb,stroke-width:3px
style FG stroke:#16a34a,stroke-width:3px
DRIFT의 3단계 프로세스
1단계: 커뮤니티 기반 방향 설정
- 질문과 관련된 커뮤니티 요약 검색
- 탐색 범위를 좁히는 "북극성" 역할
2단계: 로컬 심층 탐색
- 선택된 커뮤니티 내에서 엔티티 탐색
- 관련 관계와 원본 텍스트 수집
3단계: 컨텍스트 통합
- 커뮤니티 수준의 맥락 + 로컬 상세 정보
- 포괄적이면서도 구체적인 답변 생성
DRIFT vs 다른 모드
flowchart LR
subgraph Global["Global Search"]
G1[넓은 범위]
G2[추상적]
G3[테마 중심]
end
subgraph Local["Local Search"]
L1[좁은 범위]
L2[구체적]
L3[엔티티 중심]
end
subgraph DRIFT["DRIFT Search"]
D1[적응적 범위]
D2[균형잡힌 추상화]
D3[맥락 + 상세]
end
Global -.-> DRIFT
Local -.-> DRIFT
style G1 stroke:#dc2626,stroke-width:2px
style G2 stroke:#dc2626,stroke-width:2px
style G3 stroke:#dc2626,stroke-width:2px
style L1 stroke:#16a34a,stroke-width:2px
style L2 stroke:#16a34a,stroke-width:2px
style L3 stroke:#16a34a,stroke-width:2px
style D1 stroke:#9333ea,stroke-width:2px
style D2 stroke:#9333ea,stroke-width:2px
style D3 stroke:#9333ea,stroke-width:2px
DRIFT Search 적합 질문
- "반도체 산업에서 삼성의 위치는?"
- "AI 칩 시장의 경쟁 구도를 설명해달라"
- "이 회사가 전체 산업에 미친 영향은?"
- 맥락이 필요하면서도 특정 대상에 초점을 맞춘 질문
Basic Search: 기존 RAG 방식
Basic Search는 기존 RAG와 동일한 벡터 유사도 검색을 사용한다. GraphRAG의 그래프 구조를 활용하지 않는다.
사용 시나리오
- 단순 정보 검색 (바늘 찾기)
- GraphRAG 인덱싱이 완료되지 않은 경우
- 비용 절감이 필요한 경우
쿼리 모드 선택 가이드
flowchart TB
Q[질문 유형?]
Q -->|전체 요약| GS[Global Search]
Q -->|특정 엔티티| LS[Local Search]
Q -->|맥락+상세| DS[DRIFT Search]
Q -->|단순 검색| BS[Basic Search]
GS --> GE["테마, 트렌드, 패턴"]
LS --> LE["인물, 조직, 상세 정보"]
DS --> DE["영향력, 관계, 맥락"]
BS --> BE["단순 사실 확인"]
style Q stroke:#2563eb,stroke-width:3px
style GS stroke:#dc2626,stroke-width:2px
style LS stroke:#16a34a,stroke-width:2px
style DS stroke:#9333ea,stroke-width:2px
style BS stroke:#4b5563,stroke-width:2px
의사결정 표
| 질문 특성 | 추천 모드 | 이유 |
|---|---|---|
| "주요 테마/패턴은?" | Global | 전체 조망 필요 |
| "X는 누구/무엇인가?" | Local | 특정 엔티티 상세 |
| "X와 Y의 관계는?" | Local/DRIFT | 관계 탐색 |
| "X가 전체에 미친 영향은?" | DRIFT | 맥락 + 상세 |
| "X에 대한 사실은?" | Basic | 단순 검색 |
성능 비교
응답 품질
| 모드 | 포괄성 | 상세도 | 정확성 |
|---|---|---|---|
| Global | 높음 | 낮음 | 중간 |
| Local | 낮음 | 높음 | 높음 |
| DRIFT | 중간-높음 | 중간-높음 | 높음 |
| Basic | 낮음 | 중간 | 높음 |
비용 및 지연 시간
| 모드 | LLM 호출 | 지연 시간 | 비용 |
|---|---|---|---|
| Global | 많음 (Map-Reduce) | 높음 | 높음 |
| Local | 1-2회 | 낮음 | 낮음 |
| DRIFT | 2-3회 | 중간 | 중간 |
| Basic | 1회 | 매우 낮음 | 낮음 |
쿼리 설정 예시
# settings.yaml
query:
# Global Search 설정
global_search:
community_level: 1
max_tokens: 8000
map_max_tokens: 1000
reduce_max_tokens: 2000
# Local Search 설정
local_search:
max_tokens: 8000
text_unit_count: 20
entity_count: 10
relationship_count: 20
community_count: 10
# DRIFT Search 설정
drift_search:
max_tokens: 8000
k: 10 # 초기 커뮤니티 수
n: 5 # 확장 단계 수
다음 편 예고
이번 글에서는 GraphRAG의 네 가지 쿼리 모드를 상세히 분석했다.
Part 4: GraphRAG 실전 설치 및 설정 가이드에서는 다음 내용을 다룬다:
- Python 환경에서 GraphRAG 설치
- 설정 파일 작성 및 최적화
- 인덱싱 실행 및 모니터링
- 비용 관리 전략
참고 자료
공식 문서
논문
Microsoft Research
GraphRAG 시리즈 네비게이션
| 순서 | 제목 |
|---|---|
| 이전 | Part 2: 인덱싱 파이프라인과 지식 그래프 구축 |
| 현재 | Part 3: 쿼리 모드 완벽 가이드 |
| 다음 | Part 4: 실전 설치 및 설정 가이드 |
'실제 경험과 인사이트를 AI와 함께 정리한 글' 카테고리의 다른 글
| GraphRAG 시리즈 Part 5: 고급 기능과 최적화 전략 (0) | 2026.01.06 |
|---|---|
| GraphRAG 시리즈 Part 4: 실전 설치 및 설정 가이드 (0) | 2026.01.06 |
| GraphRAG 시리즈 Part 2: 인덱싱 파이프라인과 지식 그래프 구축 (0) | 2026.01.06 |
| GraphRAG 시리즈 Part 1: 기존 RAG의 한계와 GraphRAG의 탄생 (0) | 2026.01.06 |
| Envoy Gateway 확장성: External Processing, WASM, Lua (1) | 2026.01.02 |
- Total
- Today
- Yesterday
- Claude Opus 4.5
- react
- Rag
- AI
- authentication
- api gateway
- backend
- AGENTS.md
- LLM
- GPT-5.1
- AI agent
- CLAUDE.md
- claude code
- frontend
- imprun.dev
- EnvironmentAgnostic
- Tailwind CSS
- troubleshooting
- authorization
- Developer Tools
- knowledge graph
- Kubernetes
- Next.js
- architecture
- SHACL
- Tax Analysis
- security
- Development Tools
- Go
- Ontology
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
