引言:为什么传统RAG不够用?

传统向量RAG在处理"全局性"问题时表现糟糕。比如你问"2026年AI芯片市场的主要竞争格局是什么?",基于文档块的向量检索只能返回零散片段,无法构建全局视图。Microsoft Research在2024年提出的GraphRAG正是为解决这一痛点而生,到2026年,这套方法已经成熟并衍生出多种变体。

GraphRAG的核心思想:先从文档中抽取实体和关系构建知识图谱,再用社区检测算法将图谱分层聚类,最后基于社区摘要进行全局检索。

GraphRAG架构总览

┌─────────────────────────────────────────────┐
│              GraphRAG Pipeline               │
├─────────────────────────────────────────────┤
│  1. Document Chunking (文档分块)             │
│  2. Entity Extraction (实体抽取)             │
│  3. Relationship Building (关系构建)          │
│  4. Community Detection (社区检测)           │
│  5. Community Summarization (社区摘要)        │
│  6. Query-focused Summarization (查询摘要)    │
└─────────────────────────────────────────────┘

两种检索模式

模式适用场景原理延迟
Local Search具体实体相关问题从匹配节点出发,遍历相邻实体和关系低 (200-500ms)
Global Search全局性、摘要性问题遍历所有社区摘要,Map-Reduce式汇总高 (2-5s)

环境搭建与代码实践

安装GraphRAG

pip install graphrag==0.6.0

初始化项目

# 创建工作目录
mkdir my_graphrag_project && cd my_graphrag_project

# 初始化配置
python -m graphrag.init --root .

初始化后会生成以下结构:

my_graphrag_project/
├── settings.yaml          # 核心配置文件
├── prompts/               # 提示词模板
│   ├── entity_extraction.txt
│   ├── community_report.txt
│   └── summarize_descriptions.txt
└── input/                 # 待处理文档

关键配置解析

settings.yaml 是GraphRAG的核心,2026年版本的关键参数:

encoding_model: cl100k_base
skip_workflows: []

llm:
  api_key: ${GRAPHRAG_API_KEY}
  type: openai_chat
  model: gpt-4o-mini
  max_tokens: 4000
  temperature: 0
  concurrent_requests: 25  # 并发数,影响索引速度

embeddings:
  llm:
    api_key: ${GRAPHRAG_API_KEY}
    type: openai_embedding
    model: text-embedding-3-large
    dimensions: 3072

chunks:
  size: 1200
  overlap: 100
  group_by_column: id

entity_extraction:
  max_gleanings: 1
  entity_types: [organization, person, geo, event, technology]

community_reports:
  max_length: 2000
  prompt: "prompts/community_report.txt"

索引构建

# 将文档放入 input/ 目录后执行
python -m graphrag.index --root .

索引过程会经历以下步骤:

  1. 文本分块:将文档切分为1200 token的块
  2. 实体抽取:用LLM从每块中抽取实体和关系
  3. 图构建:合并实体和关系,构建知识图谱
  4. 社区检测:运行Leiden算法进行层次聚类
  5. 社区报告:为每个社区生成摘要报告

查询实践

from graphrag.query.structured_search.local_search.mixed_context import (
    LocalSearchMixedContext,
)
from graphrag.query.structured_search.local_search.search import LocalSearch
from graphrag.query.llm.oai.chat_openai import ChatOpenAI

# 初始化LLM
llm = ChatOpenAI(
    api_key="your-api-key",
    model_name="gpt-4o-mini",
)

# 构建本地搜索上下文
context_builder = LocalSearchMixedContext(
    community_reports=community_reports,
    entities=entities,
    relationships=relationships,
    text_units=text_units,
    description_embedding_store=description_embedding_store,
)

# 执行查询
local_search = LocalSearch(
    llm=llm,
    context_builder=context_builder,
    token_encoder=tiktoken.get_encoding("cl100k_base"),
)

result = await local_search.asearch(
    "NVIDIA在AI芯片市场的主要竞争对手有哪些?"
)
print(result.response)
from graphrag.query.structured_search.global_search.search import GlobalSearch

global_search = GlobalSearch(
    llm=llm,
    context_builder=context_builder,
    token_encoder=tiktoken.get_encoding("cl100k_base"),
    max_data_tokens=12000,
    map_llm_max_tokens=1000,
    reduce_llm_max_tokens=2000,
)

result = await global_search.asearch(
    "2026年AI芯片市场的整体竞争格局如何?"
)
print(result.response)

性能优化实践

1. 降低索引成本

GraphRAG索引阶段会大量调用LLM,成本是主要痛点。2026年的优化方案:

# 使用更便宜的模型做实体抽取
entity_extraction_model: "gpt-4o-mini"  # 而非gpt-4o

# 减少gleanings次数
max_gleanings: 1  # 默认值,大多数场景足够

# 增大chunk size减少块数
chunks:
  size: 2400  # 从1200提升到2400
  overlap: 200

实测数据(处理1000页技术文档):

配置API调用次数成本(USD)索引时间
默认(GPT-4o, chunk=1200)~8,500$4235min
优化(GPT-4o-mini, chunk=2400)~4,200$3.818min
极致(GPT-4o-mini, chunk=3000, gleanings=0)~2,800$2.112min

2. 增量更新

2026版GraphRAG支持增量索引,无需全量重建:

# 仅处理新增/修改的文档
python -m graphrag.index --root . --method update

3. 自定义实体类型

针对特定领域,自定义实体类型可大幅提升检索质量:

entity_extraction:
  entity_types:
    - company        # 公司
    - product        # 产品
    - technology     # 技术
    - person         # 人物
    - regulation     # 法规
    - patent         # 专利

GraphRAG vs 传统RAG:实测对比

维度Vector RAGGraphRAG LocalGraphRAG Global
具体事实问答⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
全局摘要问答⭐⭐⭐⭐⭐⭐⭐⭐
多跳推理⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
索引成本
查询延迟100-300ms200-500ms2-5s
可解释性

常见问题与解决方案

Q1: 索引后查询效果不好?

检查实体抽取质量。抽取100个样本人工评估,如果准确率低于70%,需要调整entity_extraction的prompt或更换更强的模型。

Q2: 社区摘要太泛?

调整社区检测的resolution参数。值越大社区越小越聚焦,值越小社区越大越宽泛:

cluster_graph:
  max_cluster_size: 10
  use_lcc: false
  resolution: 1.5  # 默认1.0,增大获得更细粒度社区

Q3: 索引时间太长?

启用并发请求并使用支持高并发的API endpoint:

llm:
  concurrent_requests: 50  # 从默认25提升
  requests_per_minute: 500

总结

GraphRAG在2026年已经成为处理复杂知识问答的主流方案。它的优势在于:

  1. 全局视角:通过社区摘要回答宏观问题
  2. 多跳推理:知识图谱天然支持关联发现
  3. 可解释性:实体-关系-社区的层级结构清晰可追溯

代价是更高的索引成本和查询延迟。建议在传统RAG无法满足的"全局性问题"场景中使用GraphRAG,在简单事实问答场景仍使用向量RAG,两者互补而非替代。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。