GraphRAG 实战指南:从概念到精通

Cosolar 14 阅读 RAG与向量数据库

一份上千页的行业研报、一个企业的全部内部文档、一整套历史播客脚本摆在你面前。普通的检索增强生成(RAG)往往只能回答"某一段里写了什么",却答不出"这些材料整体在讲什么主题"“A 事件和 B 事件之间是什么因果链”“如果移除组件 X,哪些部分会受影响”。GraphRAG 正是为补上这块短板而生——它把检索的载体从"扁平的文本块"升级为"结构化的知识图谱",让大模型能够跨越文档边界完成综合推理。

本文是一份面向实战的 GraphRAG 学习路线图:从传统 RAG 的局限讲起,逐层拆解 GraphRAG 的索引流水线、社区检测、双级检索等核心机制,深入微软 GraphRAG 与 LightRAG 两大主流实现的原理与代码,最后给出选型决策、工程落地与评测方法。文章中的 Prompt 模板、代码示例与配置参数均来自真实开源项目,可直接复用到你自己的场景。

一、先理解局限:传统 RAG 卡在哪里

1.1 向量检索的工作方式

传统 RAG(也叫 Baseline RAG 或 Naive RAG)的核心流程非常直接:把外部文档切成文本块(chunk),用嵌入模型把每个块编码成向量存入向量库;用户提问时,把问题也编码成向量,做相似度检索,取最相关的若干个文本块拼进提示词,交给大语言模型生成答案。

diagram
这套流程对"找文档、答细节"很有效,成本也低。它的检索本质是单跳(single-hop)的局部匹配——问题和答案基本落在同一段文字里。一旦问题需要跨文档、跨主题的推理,传统 RAG 就开始失灵。

1.2 三类典型短板

传统 RAG 的局限可以归纳为三类场景:

  • 全局综合类问题。例如"这批材料整体涉及哪些主题"“各部分之间有什么关联”。向量检索只能返回零散片段,无法给出整体视角。
  • 多跳推理类问题。例如"A 导致了 B,B 又引发了 C,那么 A 的最终影响是什么"。答案分散在不同文档里,需要沿着关系链一步步推演,而向量相似度无法表达这种"图上的路径"。
  • 关系/依赖类问题。例如"如果移除组件 X,哪些部分会受影响"。这本质上是一次图遍历,而传统 RAG 根本没有"关系"这种数据结构。

学术界对 RAG 与 GraphRAG 的边界做过系统性评估(论文《RAG vs. GraphRAG: A Systematic Evaluation and Key Insights》,arXiv:2502.11371):RAG 在单跳、细粒度的事实查询上表现更好,而 GraphRAG 在多跳、推理密集型问题上更有效;在摘要任务上,RAG 能抓住细节,GraphRAG 则能生成更多样、更多维的总结。二者是互补关系,而不是谁取代谁。

用一个具体例子感受差异。用户问"电动汽车的兴起如何影响城市空气质量和公共交通基础设施?“——传统 RAG 可能分别召回"电动汽车”“空气污染”"公共交通"三篇文档,却无法把它们编织成"电动汽车改善空气质量,进而影响公交规划"这样的因果叙述。GraphRAG 通过显式建模实体间关系,让模型能够跨越文档边界完成这种综合。

图:RAG 与 GraphRAG 全景对比——数据结构、检索单元、推理能力与成本差异一览。

二、GraphRAG 的核心思想

2.1 从"文本块"到"知识图谱"

GraphRAG 最大的转变,是把检索的载体从"扁平的文本块集合"换成"结构化的知识图谱"。

在索引阶段,GraphRAG 用大语言模型从原始文本中抽取实体(节点)关系(边),构建出一张能反映文档间内在联系的知识图。实体可以是人名、地名、组织、事件、概念等;关系则是它们之间的连接,比如"诊断"“导致”“依赖于”“属于”。

这张图让系统拥有了传统 RAG 所缺失的两种能力:

  • 关系感知:不再是孤立片段,而是有显式连接的网络,支持沿关系遍历。
  • 全局结构:图的整体拓扑本身就蕴含了主题分布信息,可以用来发现"哪些实体聚成一个主题群"。

2.2 与传统 RAG 的本质区别

维度 传统 RAG GraphRAG
数据结构 扁平文本块 + 向量 知识图谱(节点+边)+ 向量
检索单元 文本块 实体、关系、子图、社区摘要
推理能力 单跳相似匹配 多跳关系遍历
关系表达 不显式表示 显式、有类型的边
全局综合 弱(只能拼片段) 强(社区摘要 + 层次结构)
可溯源性 指向文本块 指向实体/关系/声明,结构化溯源
构建成本 低(一次嵌入) 高(LLM 抽取 + 摘要,约为 3-5 倍)
增量更新 易(追加向量) 难(微软实现不支持,LightRAG 等已解决)

2.3 一个完整的 GraphRAG 系统长什么样

一个完整的 GraphRAG 系统通常包含三个阶段:图谱构建 → 索引组织 → 检索生成。下面用流程图展示整体脉络,后续章节逐段拆解。

diagram
微软 GraphRAG 的索引流水线把这一过程细化为 6 个阶段(官方文档的 Indexing Pipeline):

  1. Phase 1 — 文本单元组装(Compose text units):把文档切成适合 LLM 处理的文本块(TextUnit)。
  2. Phase 2 — 文档处理(Document processing):建立文档与文本单元的双向链接,产出 Documents 表。
  3. Phase 3 — 图抽取(Graph extraction):实体与关系抽取、实体/关系摘要、声明(Claim/Covariate)抽取,产出 Graph 表。
  4. Phase 4 — 图增强(Graph augmentation):用 Leiden 层次聚类发现图的社区结构,产出 Communities 表。
  5. Phase 5 — 社区摘要(Community summarization):自底向上为每个社区生成报告,产出 Community reports 表。
  6. Phase 6 — 文本嵌入(Text embeddings):对文本单元、实体描述、社区报告分别做向量化,供查询时做相似度匹配。

这套知识模型(GraphRAG Knowledge Model)是对底层存储技术(图数据库、向量库、关系库)的抽象,为查询层提供统一接口。理解了这 6 个阶段,就理解了 GraphRAG 的全貌——接下来的章节逐一深入。

三、知识图谱构建详解

图谱构建是整个系统的地基,质量直接决定检索与生成的上限。很多实践者把 GraphRAG 的调优重心放在查询阶段,但真正拉开差距的往往在构建阶段。

3.1 文本分块(TextUnit)

把原始文档切成适合 LLM 处理的小块是第一步。块的大小直接决定后续抽取的质量与成本:

  • 块太小:上下文被割裂,实体关系被切断,同一个实体的完整描述可能散落在多个块里,导致抽取出的关系碎片化。
  • 块太大:超出 LLM 的上下文窗口或降低抽取精度,且每个块都要调用一次 LLM,成本上升。

微软 GraphRAG 默认的 CHUNK_SIZE 为 1200 字符、CHUNK_OVERLAP 为 200 字符。但具体数值应该根据语料类型调整:技术文档往往句子长、依赖密集,可以适当增大;新闻短句多,可以减小。关键原则是:让一个 TextUnit 尽量自包含——能在自身内部讲清一个完整的"实体—关系—实体"三元组。

3.2 实体与关系抽取

这是 GraphRAG 成本的大头,也是质量的关键。抽取用 LLM 阅读每个 TextUnit,识别其中的实体和实体间关系。微软 GraphRAG 的抽取还有两个进阶设计:

  • Gleaning(多轮补抽):首轮抽取后,LLM 可能遗漏部分实体关系。Gleaning 机制会让 LLM 再次阅读文本,“找出上一轮遗漏的实体和关系”,直到补全或达到最大轮数(MAX_GLEANINGS,默认 1-2 轮)。这能显著提升抽取召回率,代价是额外 LLM 调用。
  • 声明(Claim/Covariate)抽取:除实体关系外,还抽取"带来源的事实陈述"(谁、对谁、做了什么、何时、何处、如何、为什么),用于支撑答案溯源。声明与实体关联,查询时可回引原文。

3.3 图增强(Graph Augmentation)

从不同文本块中抽取出的实体常有重复(同一实体在不同段落出现),需要做去重与合并;关系则需做权重累加——同一条关系出现得越多,说明越重要,权重越高。这一步提升图谱质量,也减小图规模、降低后续运算开销。

实体消解(Entity Resolution) 是这里最棘手的问题:"Apple"在一篇文档指公司、在另一篇指水果;“李雷"和"Li Lei"是同一人还是两个人。简单的做法是归一化字符串(去空格、统一大小写),高级的做法是用 LLM 辅助判断同名实体是否指向同一对象,甚至借助外部知识库做实体链接(Entity Linking)。消解做不好,图里会出现大量"幽灵节点”,把多跳路径打断。

3.4 社区检测与层次化摘要

这是 GraphRAG 区别于"朴素图检索"的关键创新,值得单独用一章讲透——见第五章。这里先记住结论:如果只是把实体和关系存进图数据库、查询时做图遍历,面对百万级节点时遍历会非常慢,而且无法回答全局性问题。GraphRAG 的做法是用社区检测算法把大图切成若干个"主题簇",再为每个簇预生成摘要,把查询时的推理负担转移到构建时。

四、实体与关系抽取实战:Prompt 模板与调优

抽取 Prompt 是 GraphRAG 最值得复用的资产。下面给出微软 GraphRAG 官方 extract_graph.py 中真实使用的抽取提示词结构(经简化),你可以直接复制到自己的实现中。

4.1 官方抽取提示词结构

-Goal-
Given a text document that is potentially relevant to this activity and a list of
entity types, identify all entities of those types from the text and all
relationships among the identified entities.

-Steps-
1. Identify all entities. For each identified entity, extract:
   - entity_name: Name of the entity, capitalized
   - entity_type: One of the following types: [{entity_types}]
   - entity_description: Comprehensive description of the entity's attributes
     and activities

   Format each entity as:
   ("entity"<|><entity_name><|><entity_type><|><entity_description>)

2. From the entities identified in step 1, identify all pairs of
   (source_entity, target_entity) that are *clearly related* to each other.
   For each pair, extract:
   - source_entity / target_entity: names as identified in step 1
   - relationship_description: explanation of why they are related
   - relationship_strength: a numeric score (1-10) indicating strength

   Format each relationship as:
   ("relationship"<|><source_entity><|><target_entity><|>
    <relationship_description><|><relationship_strength>)

3. Return output as a single list. Use **##** as the list delimiter.
4. When finished, output <|COMPLETE|>

这个提示词有三个值得学习的工程细节:

  1. 受控格式:用 <|> 分隔字段、## 分隔条目、<|COMPLETE|> 标记结束——这比让 LLM 输出 JSON 更抗解析错误,也便于流式解析。
  2. 关系强度数值化relationship_strength(1-10)让图谱保留权重信息,后续社区检测和子图检索都能利用。
  3. Few-shot 示例:官方提示词内置 3 个完整示例(组织/人物/地理类型),显著提升抽取稳定性。

4.2 实体类型(Ontology)设计

entity_types 参数决定了抽取的范围。过宽(如"所有类型")会导致图爆炸且噪声多;过窄会漏掉关键实体。经验做法:

  • 起步用 5-8 个宽类型:PERSON, ORGANIZATION, LOCATION, EVENT, CONCEPT, TECHNOLOGY, PRODUCT, DATE
  • 技术文档场景可定制为 COMPONENT, MODULE, API, SERVICE, DATABASE, PROTOCOL, TEAM, PERSON
  • 领域专家参与设计本体,把关系类型约束在 10-20 个内,并做归一化(见 4.3)。

4.3 关系类型归一化

开放抽取会产生大量语义重叠的关系类型:“uses”“utilized_by”“depends_on”“requires”"needs"都表达依赖。不做归一化会让图碎片化、打断多跳查询。解决办法是预定义清晰的本体、约束关系类型集合,在抽取提示词中明确写出允许的关系类型清单,例如:

Relationship types (use ONLY these, normalize synonyms):
- DEPENDS_ON: 依赖关系(uses/requires/needs 归一化为 DEPENDS_ON)
- CONTAINS: 组成关系(includes/has_part 归一化为 CONTAINS)
- INTERACTS_WITH: 交互关系
- CAUSES: 因果关系(leads_to/results_in 归一化为 CAUSES)
- RELATED_TO: 弱关联(无法归入上述类型时的兜底)

归一化可以在两个层面做:Prompt 约束(让 LLM 输出前先归一化)和后处理映射(用规则或 LLM 把抽取结果映射到标准类型)。

五、社区检测与层次化摘要

5.1 为什么需要社区检测

假设图谱有 100 万节点、500 万条边。查询"这批材料整体讲了什么主题"时,不可能遍历所有节点;查询"实体 X 与哪些主题相关"时,也想避免全局扫描。社区检测把图切分成"主题簇",让检索先定位到相关簇,把搜索空间从百万节点压缩到几千节点。

5.2 Leiden 算法与层次结构

微软 GraphRAG 使用 Leiden 层次聚类(实现基于 graspologic 库)。Leiden 是 Louvain 的改进版,能保证划分的连通性,且更稳定。它对图递归聚类,形成多层级结构:

  • Level 0:单个实体(最细粒度)
  • Level 1:局部社区,如"认证子系统"“数据库层”
  • Level 2:区域社区,如"后端服务"“前端组件”
  • Level 3:全局社区,如"整个系统架构"

控制参数主要有三个:

参数 作用 调优方向
max_cluster_size 社区最大规模,超过则继续细分 技术文档可设更小值获得更细粒度
resolution 聚类分辨率,越大社区越细 新闻可偏大,技术文档可偏小
use_lcc 是否只保留最大连通分量 语料混杂时可关闭以保留孤立子图

Leiden 是通用聚类算法,针对特定领域(代码依赖、生物网络等)可能存在更优的划分方式,这也是学术界的开放问题。

5.3 社区摘要(Community Report)生成

每个社区会被 LLM 生成一段社区报告,描述该簇代表什么主题、包含哪些关键实体与关系。这相当于为图预先建好了一份"主题目录"。生成流程是自底向上的:

diagram
每一级报告总结该社区的主题、关键实体、关键关系与重要声明。高层报告是低层报告的聚合,因此越往上,视角越全局、粒度越粗

这种层次结构带来一个独特能力——可缩放视角:回答"整体讲什么主题"用高层社区报告(Map-Reduce 汇总),回答"某个具体实体怎么样"下钻到底层子图。既快又全。

5.4 社区报告的生成成本

社区摘要生成是 GraphRAG 构建成本的重要组成部分。一个社区报告约消耗 5000 tokens,如果语料产生了 1399 个社区,仅社区报告就需要约 1399 × 5000 ≈ 700 万 tokens。这也是 LightRAG 等轻量方案放弃社区摘要、改用双级键值检索的原因之一——详见第七章。

六、微软 GraphRAG:工业级参考实现

2024 年 4 月,微软研究院发布了 GraphRAG 的开源实现(github.com/microsoft/graphrag),这是首个由大型研究实验室提供的、有公开基准和真实部署经验的生产级参考架构。理解它的设计,就理解了整个 GraphRAG 生态的坐标系。

6.1 四种查询模式

微软 GraphRAG 的查询层提供四种模式,覆盖从全局到局部的完整粒度(新版查询包支持):

模式 工作方式 适用场景
Global Search 遍历所有社区摘要,Map-Reduce 汇总 "这批文档的主要主题是什么"等全局综合
Local Search 从具体实体出发,沿邻居与关联概念展开 "实体 X 与哪些部分相关"等局部推理
DRIFT Search 实体扇出 + 社区信息增强,结合全局上下文 需要同时考虑局部与全局的复杂问题
Basic Search 纯向量 Top-K 检索,等同基线 RAG 简单事实查询、作为对照

Global Search 的 Map-Reduce 流程值得细说:

  1. Map:把各社区摘要并行喂给 LLM,每个社区生成一个中间答案,同时让 LLM 给答案打 0-100 的"有用性评分"。
  2. 过滤:评分为 0 的答案直接丢弃。
  3. Reduce:把剩余中间答案按评分降序排列,逐个塞进新的上下文窗口,直到 token 上限,最后让 LLM 基于这份"精选摘要"生成最终答案。

这套流程让全局查询不再受单次上下文窗口限制,可以综合任意规模的语料——代价是慢和贵(后面评测章节会给具体数字)。

Local Search 则针对具体实体:先从实体库定位查询相关的实体(向量相似度 + 实体描述匹配),再从该实体出发扇出到直接邻居、关联边、相关声明与原文片段,组装成结构化上下文交给 LLM。

6.2 配置参数速览

微软 GraphRAG 通过 settings.yaml 配置。几个关键参数:

# 文本分块
chunk:
  size: 1200          # 块大小(字符)
  overlap: 200        # 块重叠

# 实体关系抽取
extract_graph:
  max_gleanings: 2    # 多轮补抽次数
  strategy:           # 提示词模板、模型配置等

# 社区检测
cluster_graph:
  max_cluster_size: 10
  use_lcc: true
  seed: 0xDEADBEEF    # 随机种子,保证可复现

# 查询
global_search:
  map_max_tokens: 2000
  reduce_max_tokens: 2000
  join_descriptions: true

可复现性seed 让社区检测结果可复现,这对调优和回归测试很重要。版本升级:官方建议在小版本升级之间运行 graphrag init --root [path] --force 刷新配置,大版本升级则用迁移笔记本避免重建索引——注意这会覆盖配置和提示词,务必先备份。

6.3 实测表现与代价

微软在多个语料上测试过 GraphRAG:

  • 播客转录稿(多话题对话):复杂问题正确率比基线 RAG 高 38%,尤其擅长需要跨集综合的问题。
  • 新闻文章(事件驱动):在时序推理(“X 之后发生了什么”)上表现出色,社区检测天然按事件线索聚类。
  • 技术文档(层次化、依赖密集):多跳查询答案质量提升 52%,依赖关系类问题对基线 RAG 几乎不可能。

代价同样明确。图构建需要大量 LLM 调用(实体抽取、关系抽取、社区摘要),单次查询的提示词也更大,整体成本约为基线 RAG 的 3-5 倍。更极端的对比来自学术评测:在摘要类任务上,基于社区的全局检索(GGraphRAG)单查询耗时可达基线 RAG 的 57 倍、token 消耗 210 倍(约 9 分钟、30 万 tokens/查询),这对生产场景几乎不可接受——这也催生了后续大量成本优化工作(如 CheapRAG 先做向量相似度筛选再只对相关社区调 LLM)。

6.4 局限与教训

来自真实部署的经验总结了几个关键点:

  • 实体歧义难解。"Apple"在一篇文档指公司、在另一篇指水果,抽取阶段若链接错误会产生错误图结构,导致荒谬的查询结果。
  • 关系类型漂移。开放抽取会产生大量语义重叠的关系类型,不做归一化会让图碎片化、打断多跳查询(见 4.3 节的归一化方案)。
  • 抽取质量是天花板。建立在噪声抽取上的图,查询结果也会是噪声的。应在图构建前投入精力做高质量实体与关系抽取。
  • 增量更新缺失。微软实现原生不支持增量更新,知识频繁变化时只能定期全量重建,成本高。这正是 LightRAG 等后起项目着力解决的痛点。

四条架构经验值得记下:层次结构不可少(扁平图撑不住百万节点);混合检索优于单一方法;LLM 生成的摘要虽贵但查询时便宜、值得预计算;抽取质量决定一切。

七、LightRAG:轻量高效的图增强检索

如果说微软 GraphRAG 是"重量但全面"的参考实现,那么由香港大学团队推出的 LightRAG(论文《LightRAG: Simple and Fast Retrieval-Augmented Generation》,开源仓库 github.com/HKUDS/LightRAG)则瞄准"轻量、快速、易适配"。它在保留图增强检索优势的同时,显著降低了构建与查询成本,并原生支持增量更新。

7.1 设计要解决的三个挑战

LightRAG 把问题拆成三个目标:

  • 全面的信息检索:能捕捉跨文档、跨实体间相互依赖的完整上下文。
  • 高效的检索:在图结构上快速响应,应对高查询量。
  • 快速适应新数据:新文档来了不必重建整个索引。

围绕这三个目标,LightRAG 提出"图增强文本索引 + 双级检索范式"的整体架构。

7.2 索引流程

LightRAG 的图增强文本索引包含三个步骤:

diagram

  1. 实体与关系抽取 R(·):把文档切成块,用 LLM 识别实体(节点)和关系(边)。例如从"心脏科医生评估症状以识别潜在心脏问题"中抽出"心脏科医生""心脏病"两个实体,以及"诊断"这条关系。
  2. LLM Profiling 生成键值对 P(·):为每个实体节点和关系边生成一个 (K, V) 键值对。键是词或短语,用于高效检索;值是一段文本摘要,汇总相关片段用于生成。实体以名称作为唯一键;关系则可由 LLM 派生出多个键,包含相连实体的全局主题。
  3. 去重优化 D(·):识别并合并不同文本块中相同的实体与关系,减小图规模、降低运算开销。

这套键值结构带来的好处是:检索不再依赖不够准确的嵌入匹配,也不用像微软 GraphRAG 那样做代价高昂的社区摘要,而是基于结构化的键值做快速精确检索。

7.3 双级检索范式

这是 LightRAG 最核心的设计。它把检索分成两个层级:

  • 低级检索(Low-Level):聚焦具体实体及其属性、直接关系。面向细节型问题,目标是精确提取某个节点或边的具体信息。例如"某公司某产品"“某人物履历”。
  • 高级检索(High-Level):面向更宽泛的主题和概念。在多个相关实体和关系间聚合信息,给出高层次的总结与洞察。例如"行业趋势"“某领域整体格局”。

通过把图结构与向量表示结合,LightRAG 既能走图的关系扩展,又能借向量快速定位,兼顾全面性与效率。

7.4 五种查询模式

LightRAG 在代码中提供几种查询模式(QueryParam.mode),适配不同类型的问题:

模式 工作方式 适用场景
naive 纯向量检索,不查图,等同传统 RAG 基准对照、简单事实查询
local 用低级关键词匹配实体向量库,找到实体后遍历直接邻居与关联边 特定对象/概念的精确问答
global 用高级关键词匹配关系向量库,找跨文档的主题关系链 趋势分析、多文档概括
hybrid 融合 local + global 检索结果 需兼顾具体与全局的综合问题
mix 双层融合,进一步结合原始文本块 最全面的混合查询(新版默认推荐

选择上没有绝对答案:要查具体实体用 local,要查宏观趋势用 global,拿不准或问题综合性强用 hybrid/mix。新版 LightRAG 还支持 Reranker 重排序,能显著提升混合查询的效果。

7.5 增量更新与选择性删除

微软 GraphRAG 的一个痛点是知识变化时只能全量重建。LightRAG 用增量更新算法解决了这个问题。

新文档到来时,LightRAG 用与初始构建完全相同的索引步骤处理它,得到新图 (V', E'),再与原图取并集——节点集 V ∪ V'、边集 E ∪ E'。因为方法一致,新数据能无缝并入已有图结构,不破坏既有连接,也无需重处理整个外部数据库。

2025 年 8 月起,LightRAG 还加入了文档删除能力:删除文档时,利用索引阶段建立的 LLM 缓存快速重建受影响的实体与关系,保持查询性能。

对比一下增量更新的成本差距:在 1399 个社区的语料上,微软 GraphRAG 每次加入等量新数据都要重建全部社区报告(约 1399 × 2 × 5000 ≈ 1400 万 tokens),而 LightRAG 只需把新抽取的实体关系并入现有图,开销低一个数量级以上。

7.6 生态与工程能力

经过一年多迭代,LightRAG 已具备相当成熟的工程生态:

  • 存储后端丰富:支持 Neo4j、PostgreSQL(含 AGE 图扩展与 pgvector)、MongoDB、Redis、OpenSearch 等作为统一存储,PostgreSQL 可一站式管理图、向量与文档。
  • WebUI 可视化:提供网页界面,可插入文档、发起查询、可视化知识图谱。
  • 多 LLM 适配:支持 OpenAI、Azure、Ollama、HuggingFace、火山引擎、通义千问等多种 LLM 与嵌入模型,新版还支持按角色(EXTRACT、QUERY、KEYWORDS、VLM)分别配置不同 LLM。
  • 评估与追踪:集成 RAGAS 做检索评估,集成 Langfuse 做链路追踪,API 会同时返回检索到的上下文以支持上下文精度指标。
  • 多模态扩展:通过合并 RagAnything,集成 MinerU / Docling 做多模态文档解析与抽取,支持 PDF、图片、Office 文档、表格、公式等。
  • 多种分块策略:提供 Fix、Recursive、Vector、Paragraph 四种文本切分策略。
  • 成本控制:提供 Token Tracker 工具监控 LLM token 消耗,方便控制 API 成本。
  • 部署友好:提供 Docker 镜像、K8s Helm 部署、离线部署方案,以及 setup 向导。

7.7 上手实践

LightRAG 的安装和使用门槛很低。以下是快速上手步骤。

安装服务(推荐用 uv):

uv tool install "lightrag-hku[api]"
# 或用 pip
# pip install "lightrag-hku[api]"

配置环境:从仓库复制 env.example.env,填入 LLM 与嵌入模型的配置(API Key、模型名、基础地址等)。

用代码插入与查询

import asyncio
from lightrag import LightRAG, QueryParam
from lightrag.llm import openai_complete_if_cache, openai_embedding

WORKING_DIR = "./my_rag_data"

rag = LightRAG(
    working_dir=WORKING_DIR,
    llm_model_func=openai_complete_if_cache,
    embedding_func=openai_embedding,
)

# 插入文档
with open("book.txt") as f:
    rag.insert(f.read())

# 查询:选择合适的 mode
result = rag.query(
    "这本书的核心主题是什么,各章节如何关联?",
    param=QueryParam(mode="mix")
)
print(result)

启动 WebUI 服务

lightrag-server

启动后可在浏览器中可视化知识图谱、插入文档、发起不同模式的查询。

一个实用的调参思路:先用小语料跑通 naive 模式作为基线,再对比 local/global/hybrid 的效果;QueryParam 中的 top_k 控制 local 模式召回的实体数和 global 模式召回的关系数,默认 60,可按语料规模调整。新版推荐把 mode 设为 mix 并开启 Reranker,配合 RAGAS 脚本评估检索质量(lightrag/evaluation/README_EVALUATION_RAGAS.md)。

八、评测方法:别凭感觉选型

GraphRAG 的成本远高于传统 RAG,选型前必须用数据说话。这一章给出标准评测数据集、指标与实测结果,帮你建立"该不该上 GraphRAG"的判断基准。

8.1 标准评测数据集

数据集 任务类型 说明
Natural Questions (NQ) 单跳事实问答 维基百科语料,评估事实检索精度
HotPotQA 多跳问答 需要跨多篇文档推理,评估多跳能力
MultiHop-RAG 多跳问答(四类) Inference/Comparison/Temporal/Null 四类查询
NovelQA 21 类细粒度查询 评估"只读过一本书/文档集"后的理解能力
MultihopSum 多文档摘要 评估全局综合与摘要质量

评测指标:问答任务用 Precision / Recall / F1Accuracy;摘要任务用 Comprehensiveness / Diversity / Empowerment(LLM 打分)等维度。

8.2 实测对比:MultiHop-RAG

在 MultiHop-RAG 基准上,各方法的整体准确率(%)对比如下(LLM 为 Llama-3.1-8B-Instruct):

方法 Inference Comparison Temporal Overall
RAG(基线) 92.16 57.59 30.70 67.02
RAPTOR 91.91 55.26 45.28 68.78
KG-GraphRAG(仅三元组) 55.76 22.55 18.70 41.24
KG-GraphRAG(三元组+文本) 67.40 34.70 17.15 48.51
Community-GraphRAG(Local) 86.89 60.63 50.60 69.01
Community-GraphRAG(Global) 89.34 64.02 53.34 64.40
HippoRAG2 91.54 58.41 49.91 70.27

从这张表能读出几个重要结论:

  1. 纯图检索(KG-GraphRAG)并不直接更好——只靠三元组检索,整体准确率反而大幅下降(41.24),说明"图 + 文本"结合是必须的(48.51 仍低于基线)。GraphRAG 的价值不在"换成图",而在"图增强文本"
  2. Community-GraphRAG(Local)在综合表现上超过基线 RAG(69.01 vs 67.02),尤其在 Temporal(时序)查询上优势明显(50.60 vs 30.70)。
  3. HippoRAG2 这类低成本方法也能打(70.27),说明社区摘要不是唯一路径——轻量方案与重量方案各有生存空间。
  4. 单跳事实查询(NQ)上 RAG 依然占优,印证"RAG 与 GraphRAG 互补而非替代"。

8.3 成本对比

GraphRAG 的成本压力集中在两处:构建期(LLM 抽取 + 摘要)与查询期(提示词更大、可能多轮 LLM)。

  • 构建期:微软 GraphRAG 全流程成本约为基线 RAG 的 3-5 倍;社区摘要是大头(1399 个社区 ≈ 700 万 tokens)。
  • 查询期:Global Search 的 Map-Reduce 在摘要类任务上可达基线 RAG 的 57 倍耗时、210 倍 token(单查询约 9 分钟、30 万 tokens),生产不可接受,催生了 CheapRAG(先向量筛选社区再调 LLM)等优化。
  • LightRAG 通过放弃社区摘要 + 双级键值检索,把构建成本压到与基线 RAG 同一量级,查询成本显著低于微软实现。

8.4 评测的坑

学术评测有个常被忽视的坑:LLM-as-a-Judge 对候选答案的展示顺序敏感。同一组答案换个顺序,评分可能反转。评测摘要类问题时,要么固定顺序随机化多次取平均,要么用人工评测交叉验证,避免被"位置效应"误导。

九、其他值得关注的开源项目

GraphRAG 领域已形成多个各有侧重的开源项目,选型前值得全部扫一眼。

9.1 nano-graphrag:极简实现,适合学习

nano-graphrag 把 GraphRAG 的核心功能压缩在约 1100 行代码内,结构清晰,便于阅读源码理解原理。它支持增量更新和异步操作,对计算资源要求低,适合边缘计算场景或作为学习 GraphRAG 内部机制的入门教材。如果你想把 GraphRAG 的每个环节都看明白,从 nano-graphrag 读起是最高效的路径。

9.2 Fast GraphRAG:检索效率与成本优化

Fast GraphRAG 用基于 PageRank 的图探索替代社区摘要流程,并支持动态数据更新。它的设计目标是把索引成本压到比微软 GraphRAG 更低的水平,同时保持检索效率,适合对成本敏感、又需要图增强检索的场景。

9.3 RAGFlow:端到端 RAG 平台

RAGFlow 不是一个纯 GraphRAG 项目,而是一个强调"深度文档理解"的端到端 RAG 平台。它的特色在于可视化分片、模板化切分(能处理多栏 PDF 等复杂版式)、混合搜索,并集成了图增强检索能力(GraphRAG 与 RAPTOR 的写入流程已优化为手动批量构建)。它还提供 Agent + MCP 编排,适合需要"Agentic RAG"且文档格式复杂的团队作为一体化平台使用。

9.4 学术方向的前沿工作

学术圈还有多个从不同角度改进 GraphRAG 的工作,可作为进阶研究方向了解:

  • HippoRAG2:用 PPR(个性化 PageRank)在知识图谱上做多跳检索,成本远低于社区摘要方案,评测中综合表现第一梯队。
  • RAPTOR:递归聚类 + 摘要,把文本块组织成树状层次,是"无图版"的层次检索。
  • GRAG:引入软剪枝技术,减轻无关实体对检索子图的干扰。
  • StructRAG:按任务动态选择最优图结构(而不是固定一种)。
  • KAG:构建领域专家知识图谱,强调逻辑推理与知识融合。
  • CheapRAG:先用向量相似度筛选相关社区,再只对相关社区调用 LLM,显著降低 Global Search 成本。

十、选型与落地建议

10.1 何时该用 GraphRAG,何时不必

GraphRAG 不是银弹,引入前先判断问题类型:

  • 优先用传统 RAG:查询多为单跳事实检索、语料更新极频繁、对延迟和成本极度敏感。
  • 值得用 GraphRAG:需要跨文档综合、多跳推理、关系依赖分析、全局主题概括,且这些查询传统 RAG 基本答不出或答得差。

一个判断信号:如果你的用户经常问"整体上"“之间有什么关系”“影响是什么”"如果……会怎样"这类问题,就该考虑 GraphRAG。

10.2 开源产品横向对比

项目 定位 核心特点 增量更新 构建成本 适合人群
微软 GraphRAG 工业级参考实现 Leiden 社区检测、层次化摘要、Global/Local/DRIFT 查询 不原生支持 高(3-5 倍) 需要成熟参考架构、语料相对稳定的团队
LightRAG 轻量高效图检索 双级检索、键值索引、低成本、生态全 原生支持 + 文档删除 低(≈基线) 知识频繁更新、追求性价比的生产场景
nano-graphrag 极简学习用 约 1100 行代码、结构清晰 支持 想读懂原理的新手
Fast GraphRAG 成本优化 PageRank 图探索、动态更新 支持 成本敏感场景
RAGFlow 端到端平台 深度文档解析、可视化分片、Agent 编排 支持 文档格式复杂、需一体化平台
HippoRAG2 学术前沿 PPR 图检索、低成本多跳 研究阶段 关注最新方法的研究者

决策建议:学习原理读 nano-graphrag;知识高频变化的生产场景首选 LightRAG;语料稳定、要最强全局综合能力且预算充足,考虑微软 GraphRAG;需要一体化平台 + 复杂文档解析,用 RAGFlow。

10.3 落地时的工程要点

把 GraphRAG 落到生产,有几件事比选型更关键:

抽取质量决定上限。用能力允许范围内最好的模型做实体与关系抽取,必要时在领域样本上微调;在构建图之前先验证抽取质量(抽样人工检查实体准确率、关系语义正确率),否则再精巧的检索也救不回噪声图。

本体设计要前置。提前定义清晰的关系类型集合,在抽取阶段就做归一化,避免"uses/utilized_by/depends_on"这类语义重叠的类型各自为政、打断多跳查询。

社区检测需调参。Leiden 算法有 resolutionmax_cluster_size 等超参,技术文档可能需要比新闻更细的社区粒度,按领域调优并用固定 seed 保证可复现。

增量更新要做基建。即便选了支持增量的实现,也要为"新增实体和边而不全量重建"准备好运维流程(文档入库触发、冲突处理、删除重建),保证图的新鲜度与成本可控。

善用查询缓存。大量查询是重复的,缓存社区排序、子图检索甚至 LLM 答案能显著降低成本。

监控与回归。上线后持续采样查询质量,用 RAGAS 等工具评估检索上下文的相关性;定期对比新旧索引版本的答案质量,防止图谱退化。

十一、进阶方向

掌握 GraphRAG 基础后,以下几个方向值得继续深入:

  • 多模态 GraphRAG。LightRAG 合并 RagAnything、RAGFlow 支持视频解析,都指向"文本之外还能处理图片、表格、公式、视频"的多模态图检索,这是当前明显的发展趋势。
  • Agent 与 GraphRAG 结合。让 Agent 自主决定何时走向量检索、何时走图检索、做多跳规划,而非固定一种模式(RAGFlow 的 Agent + MCP 编排已走在这条路上)。
  • 查询路由(Query Routing)。按查询类型把问题路由到 RAG 或 GraphRAG(Selection 策略),或同时检索两种证据再融合(Integration 策略),评测显示两类混合策略都能稳定提升效果——这是性价比最高的"入门进阶"。
  • 更好的社区结构。Leiden 是通用聚类,针对特定领域是否有更优的划分方式仍是开放问题。
  • 矛盾信息的处理。真实语料常有冲突信息,而图默认假设一致性,如何表示和推理"分歧"是前沿课题。
  • 结构化查询生成。能否让 LLM 直接生成 Cypher 这类图查询语句,而非依赖检索子图再总结,这关系到查询效率的上限。
  • 成本敏感设计。借鉴 CheapRAG 的思路:先廉价筛选、再贵价推理,把 LLM 调用集中在真正需要的部分。

图:GraphRAG 实战要点总结——抽取质量、本体设计、社区调参、增量更新与评测基准五大落地要点。

结语

GraphRAG 已经从研究走向生产,微软的内部企业知识管理、各团队的自建系统都证明了可行性。它的复杂度确实高于传统 RAG,但这份复杂度换来的是传统 RAG 给不了的能力——跨文档综合、关系推理、可溯源的结构化答案。

回顾全文,最值得记住的五个要点:

  1. GraphRAG 不是"换掉 RAG",而是"用图增强 RAG"——纯图检索反而更差,图 + 文本结合才有价值。
  2. 抽取质量决定一切——本体的设计、实体消解、关系归一化,比任何检索技巧都重要。
  3. 构建成本是真实代价——社区摘要很贵,要按语料规模和预算决定是否值得。
  4. 轻量与重量各有生存空间——微软 GraphRAG、LightRAG、HippoRAG2 在评测中各有胜负,按场景选型而非追逐名气。
  5. 先评测后上线——用 MultiHop-RAG 等基准建立基线,用数据决定要不要投入。

如果你的场景需要跨文档综合与关系推理,投入知识图谱与 GraphRAG 是值得的;而你不必从零发明,LightRAG、nano-graphrag 等开源项目已经把路铺好,剩下的就是把架构适配到你的领域。