RAG 知识图谱增强演进: GraphRAG 与 LightRAG 全解析

0 阅读15分钟

介绍 RAG 知识图谱增强演进的 GraphRAG 和 LightRAG 两大核心技术。适合已经了解 RAG 技术及其流程的同学。

一、RAG 技术的演进脉络

RAG(Retrieval-Augmented Generation,检索增强生成)自 2021 年由 Lewis 等人提出以来,已经经历了多次范式迭代。

1.1 五代 RAG 范式一览

timeline
    title RAG 技术演进时间线
    2021 : Naive RAG — 基本范式确立
    2023 : Advanced RAG — 精细化优化
    2023-2024 : Modular RAG — 模块化解耦
    2024.04 : GraphRAG — 知识图谱融合
    2024.10 : LightRAG — 轻量化改良
    2024 下半年 : Agentic RAG — 自主决策

上图展示了 RAG 的五代演进,下面逐一解释。 (其实后续还有其他的演进,但我们暂时只讲到这里)

1.2 Naive RAG

Naive RAG(朴素 RAG)是最基础的形态,遵循经典的 "Retrieve-Read" 框架:

flowchart LR
    A[用户提问] --> B[向量化查询]
    B --> C[向量数据库检索 Top-K]
    C --> D[拼接上下文]
    D --> E[LLM 生成答案]

流程极简:文档切块 → 向量化 → 存入向量库 → 查询时按语义相似度检索 → 喂给大模型

这套方案就像你拿着关键词去图书馆的索引卡片柜里翻,找到几张看起来相关的卡片就拿给教授去写答案。简单、有效,但问题也很明显。

核心局限:检索只看"语义相似度",不理解实体之间的关系,也无法做全局归纳。

1.3 Advanced RAG:精细化的改良

Advanced RAG 在 Naive RAG 的基础上,引入了检索前优化检索后精炼

  • 检索前:查询改写(Query Rewriting)、查询扩展(Query Expansion)、HyDE(假设性文档嵌入)
  • 检索后:重排序(Reranker,如 Cross-Encoder)、上下文压缩、结果去重

业界主流做法是使用 Cohere RerankerBGE-Reranker 做精排,先由向量数据库粗召回 Top-50,再由 Reranker 精排到 Top-5。

1.4 Modular RAG:乐高式组装

Modular RAG 把 RAG 系统拆成独立模块(检索器、生成器、精炼器、路由器等),开发者可以像搭乐高一样按需组合。

LangChainLlamaIndex 是目前最主流的 Modular RAG 开发框架。

1.5 GraphRAG 与 LightRAG:图结构加持

这就是本文的主角。GraphRAG 引入知识图谱,LightRAG 在此基础上做轻量化改良。它们标志着 RAG 从"找相似文本"到"理解实体关系"的范式跃迁。

1.6 Agentic RAG:决策检索

Agentic RAG 是当前最前沿的范式,它在 RAG 流程中引入了 Agent 机制,让系统能够自主决策:判断要不要检索、检索结果够不够好、要不要换一种方式重新检索。

flowchart TD
    A[用户提问] --> B{Agent 决策}
    B -->|需要检索| C[检索]
    B -->|可直接回答| D[生成答案]
    C --> E{结果质量评估}
    E -->|不够好| F[改写查询]
    F --> C
    E -->|足够好| D

目前市面上的 Agentic RAG 实践多基于 LangGraph 做流程编排,用 ReActReflexion 模式让 Agent 具备自我反思和修正能力。这是一个值得关注的趋势,但本文不展开。

二、传统 RAG 分析不出谁是谁爹儿

痛点一:多跳推理——跨文档的"顺藤摸瓜"做不了

什么是多跳推理? 简单说,就是回答一个问题需要经过两步以上的推理链:A → B → C,信息分散在多个文档里。

场景举例:假设你在一个企业管理系统中问:

"我们公司有哪些项目,依赖了由'曹魏科技'开发的开源组件?"

这个问题需要三步推理:

  1. 找到"曹魏科技"开发了哪些开源组件(项目文档)
  2. 找到哪些项目使用了这些组件(依赖配置文件)
  3. 做交集

传统 RAG 怎么做?它把问题向量化,去向量库里找 Top-K 个最相似的文本块。但没有任何一个文本块同时包含"曹魏科技"和"项目依赖"这两层信息。它只能给你一堆零散的片段,却无法把"组件→项目"这条链路串起来

flowchart LR
    subgraph 传统RAG的检索结果
        A1["曹魏科技开发了xxx框架"]
        A2["项目A使用了xxx框架"]
        A3["项目B使用了yyy库"]
    end
    subgraph 缺失的关联
        B1["❌ 无法建立组件与项目的关联"]
    end
    A1 --> B1
    A2 --> B1

根本原因:传统 RAG 的检索是"扁平"的,它只看语义相似度,没有任何机制去理解"A 使用了 B,B 由 C 开发"这种链式关系

痛点二:全局性问题——"只见树木,不见树林"

什么是全局性问题? 答案不在某个文本块里,而是需要你通读所有文档、归纳总结才能得出。

场景举例:你丢给 RAG 系统一整本《三国演义》,问它:

"这本书主要描写了几大势力之间的哪些核心冲突?"

这个问题的答案分散在 120 回里。没有任何一个文本块会直接写"本书主要描写了三大冲突"。传统 RAG 的 Top-K 检索只能给你几段看起来相关的文字,但根本拼不出全局图景。

微软在 GraphRAG 论文中将这类问题称为 Query-Focused Summarization(查询聚焦摘要),它本质上不是一个"检索"任务,而是一个"全局归纳"任务。传统 RAG 的 Top-K 机制,天生就无法处理。

痛点三:语义断裂

传统 RAG 第一步就是把文档切块。这个看似无害的操作,其实暗藏三大隐患:

隐患说明示例
语义截断完整论述被拦腰斩断一段"赵云长坂坡七进七出,救出阿斗"的描述被切成两块
关系丢失实体间的因果/逻辑关系断裂"赤壁之战中,周瑜采用火攻"与"火攻依赖东南风"被分到不同块
检索噪声语义相近但无关的块被误召回问"蜀国的人才策略",却召回了一堆关于"蜀锦贸易"的块

这三个痛点的共同根源是:传统 RAG 做的是"找相似文本",但企业真正需要的是"理解实体关系"。向量检索在"找长得像的句子"上很强,但它不理解"这两个实体是什么关系""这条信息和那条信息有没有因果链"。

三、知识图谱:GraphRAG 的地基

在深入 GraphRAG 之前,你需要先理解"知识图谱"这个核心概念。

3.1 什么是知识图谱?

知识图谱(Knowledge Graph) 是一种用图结构来表示关系的方式。图中的节点(Node) 代表实体(人、地点、组织、概念等),边(Edge) 代表实体之间的关系。

以《三国演义》为例,一段文字"诸葛亮辅佐刘备建立蜀汉,刘备与孙权结盟对抗曹操",在知识图谱中表示为:

graph LR
    Z["诸葛亮"] -->|辅佐| L["刘备"]
    L -->|建立| S["蜀汉"]
    L -->|结盟| Q["孙权"]
    Z -->|对抗| C["曹操"]
    Q -->|对抗| C

知识图谱把"一段话"变成了一张"关系网",这正是 GraphRAG 能做"多跳推理"的基础。

3.2 核心概念

概念说明《三国演义》示例
实体(Entity/Node)图中的节点,代表一个"东西"诸葛亮、蜀汉、赤壁
关系(Relationship/Edge)连接两个实体的边,代表一种联系诸葛亮--辅佐→刘备
属性(Property)实体或关系的附加信息诸葛亮.字=孔明
三元组(Triple)知识图谱的最小知识单元(诸葛亮,辅佐,刘备)
社区(Community)图中关系紧密的一组节点的集合蜀汉集团、曹魏集团

3.3 为什么以前不把知识图谱用于 RAG?

知识图谱的概念并不新鲜——2012 年 Google 就提出了 Knowledge Graph。但以前构建知识图谱太贵了:靠人工标注,超级昂贵;靠传统 NLP 模型,效果一般。实体抽取、关系抽取、消歧、对齐……每一步都是技术壁垒。

大模型改变了一切。你写一个 Prompt,LLM 就能从文本里把实体、关系、属性都抽出来,效果还不错。这让"从文档自动构建知识图谱"从"需要专门团队做半年"降到了"写个 Pipeline 跑几个小时"。GraphRAG 能在 2024 年火起来,根本原因不是思路新,而是 LLM 让这个思路变得可实现了

四、GraphRAG 完整工作原理

4.1 基本原理

GraphRAG 就是用 LLM 把文档"读成一张知识图谱",然后基于这张图谱做检索和回答。

它由微软研究院于 2024 年 4 月提出,论文名为《From Local to Global: A Graph RAG Approach to Query-Focused Summarization》,也是市面上的主流做法。

4.2 整体架构

flowchart TB
    subgraph 索引阶段["索引阶段(离线)"]
        I1[文档切块] --> I2[实体与关系提取]
        I2 --> I3[实体/关系摘要合成]
        I3 --> I4[社区检测 Leiden]
        I4 --> I5[社区摘要生成]
    end
    
    subgraph 查询阶段["查询阶段(在线)"]
        Q1[用户提问] --> Q2{查询类型}
        Q2 -->|具体实体问题| Q3[Local Search]
        Q2 -->|全局宏观问题| Q4[Global Search]
        Q3 --> Q5[LLM 生成答案]
        Q4 --> Q5
    end
    
    I5 -.->|知识图谱+社区摘要| Q2

4.3 索引阶段:5 步把文档变成知识图谱

我们以《三国演义》为例,走一遍完整的索引流程。

第 1 步:文档切块(Text Chunking)

和传统 RAG 一样,先把整本书切成小块(默认约 1200 token/块,块间有 100 token 重叠)。

切块策略的选择很重要。目前市面上的最佳实践包括:

  • 固定大小切块:最简单,适合通用场景
  • 语义切块:按语义相似度变化切分,保持语义完整
  • 递归切块:按段落→章节等层级递归分割,LangChain 的 RecursiveCharacterTextSplitter 是最常用的实现
  • 文档结构切块:按 Markdown 标题层级切分,适合结构化文档

第 2 步:实体与关系提取(Entity & Relationship Extraction)

这是 GraphRAG 的第一个核心步骤。每个文本块都会单独发给 LLM,让它从中抽出实体和关系。

GraphRAG 使用一个专门的 Prompt,大致逻辑(极度简化版)如下:

你是一个实体关系抽取助手。请从下面的文本中:
1. 识别所有实体(entity_name, entity_type, entity_description)
2. 识别所有关系(source, target, description, strength 1-10)

文本:{input_text}

LLM 读完"诸葛亮在隆中为刘备规划了三分天下的战略"这段文字,输出:

{"entities": [
  {"name": "诸葛亮", "type": "人物", "description": "号卧龙,蜀汉军师"},
  {"name": "刘备", "type": "人物", "description": "蜀汉建立者"},
  {"name": "隆中对", "type": "事件", "description": "三分天下的战略规划"}
], "relationships": [
  {"source": "诸葛亮", "target": "刘备", "desc": "在隆中为刘备规划战略", "strength": 9},
  {"source": "隆中对", "target": "诸葛亮", "desc": "由诸葛亮提出", "strength": 10}
]}

实体抽取的质量直接决定图谱质量。目前业界主流做法有三种:

  1. 纯 LLM 抽取(GraphRAG 默认方式):灵活但成本高,同实体的多次抽取可能不一致
  2. NER 模型 + LLM 校验:先用 spaCy/Diago 等工具做基础 NER,再用 LLM 做关系补充和校验,成本更低
  3. 领域词典 + LLM:对于金融、医疗等垂直领域,先建立实体词典做约束,再让 LLM 在约束范围内抽取,精度更高

第 3 步:实体/关系摘要合成(Summarization)

同一个实体(如"诸葛亮")会在几十上百个文本块里被反复抽取,每次的描述不同:"号卧龙""蜀汉军师""刘备的谋主"……

GraphRAG 会把同一个实体在所有文本块里的描述汇总,让 LLM 合成一段更完整的实体描述。关系也做同样处理。

这一步的目的是让每个节点拥有一段"综合描述",后续检索时这段描述会被向量化,用于语义匹配。

第 4 步:社区检测(Community Detection)

这一步是 GraphRAG 最大的创新之一。它使用 Leiden 算法(一种层次化社区检测算法),把整张知识图谱划分成多层级的"社区"。

graph TD
    subgraph Level0["Level 0 — 最粗粒度"]
        C1["蜀汉势力"]
        C2["曹魏势力"]
        C3["东吴势力"]
    end
    
    subgraph Level1["Level 1 — 中等粒度"]
        C1_1["刘关张核心"]
        C1_2["诸葛亮集团"]
        C1_3["五虎上将"]
        C2_1["曹氏核心"]
        C2_2["司马氏集团"]
        C3_1["孙氏宗族"]
        C3_2["周瑜鲁肃体系"]
    end
    
    C1 --> C1_1
    C1 --> C1_2
    C1 --> C1_3
    C2 --> C2_1
    C2 --> C2_2
    C3 --> C3_1
    C3 --> C3_2

什么是社区? 你可以理解为图里那些"互相抱团、关系特别密切"的一群节点。 在《三国演义》里,刘关张就是一个小社区,曹操集团是一个社区,东吴又是一个社区。社区内部关系紧密,社区之间连接稀疏。

Leiden 算法比常见的 Louvain 算法更稳定,它能生成层次化的社区结构——从粗到细,多层嵌套。这个层次化结构是 GraphRAG 处理"不同粒度全局问题"的基础。

第 5 步:社区摘要生成(Community Reports)

社区划分完后,GraphRAG 为每一个社区单独生成一份摘要报告。这一步也靠 LLM:把社区内的所有实体、关系喂给它,让它写一份总结。

社区报告的内容通常包括:

  • 社区讨论的核心主题
  • 最重要的实体和关系
  • 关键发现与洞察
  • 在整个数据集中的影响力评分

这些社区报告就是 GraphRAG 回答全局性问题的核心资产。你可以把它们理解成图书馆里每个主题区前面贴的"本主题概览海报"。

4.4 查询阶段:Local Search 与 Global Search

索引简历完后,GraphRAG 提供了三种查询模式

Local Search(本地搜索)

适用:关于某个具体实体的问题,如"诸葛亮的北伐策略有哪些?"

flowchart LR
    A[用户提问] --> B[向量化查询<br>定位入口实体]
    B --> C["从入口实体出发<br>沿边扩展到邻居"]
    C --> D[收集相关实体+关系<br>+原始文本块+社区报告]
    D --> E[组装上下文]
    E --> F[LLM 生成答案]

Local Search 的核心是"从一个点扩散到它的邻居",非常适合"围绕某个具体对象"的问题。延迟通常在几秒钟,勉强可用。

Global Search(全局搜索)

适用:全局性、宏观性问题,如"三国时期的整体格局是怎样的?"

flowchart TD
    A[用户提问] --> B[Map 阶段]
    B --> B1["社区报告 Batch 1 → LLM → 中间答案 1"]
    B --> B2["社区报告 Batch 2 → LLM → 中间答案 2"]
    B --> B3["社区报告 Batch N → LLM → 中间答案 N"]
    B1 --> C[Reduce 阶段]
    B2 --> C
    B3 --> C
    C --> D["汇总所有中间答案<br>按重要性评分排序"]
    D --> E["LLM 合并成最终答案"]

Global Search 采用 Map-Reduce 策略:先把问题发给各个社区的摘要,让 LLM 为每个社区生成一个中间答案(附带重要性评分),然后把所有中间答案汇总,合并成一个最终回答。

这个策略的本质是:把全局性问题拆成多个社区内部的子问题并行解答,最后再汇总。就像你问班长"咱们班这学期整体学习情况怎么样",班长会先找每个小组长要一份总结,再汇总给你看。

但 Global Search 特别费钱也特别慢——一次查询可能涉及几百上千个社区,每个都要调 LLM,端到端延迟经常在 10 秒到 1 分钟之间。C 端实时交互根本不能用。

DRIFT Search(混合搜索)

GraphRAG 后来推出的第三种模式,兼具 Local 和 Global 的特点:先用向量搜索建立宽泛起点,再利用社区信息拆解出后续查询,动态在图谱上游走。在计算效率和答案质量之间找到了一个不错的平衡点

DRIFT Search 的实现通常基于 LlamaIndex + Neo4j 的组合,HyDE 生成假设性答案改善查询向量表示,再通过社区搜索获取宏观上下文,最后做局部搜索深挖细节。这是目前社区比较推荐的高级查询模式。

五、GraphRAG 的落地难点:为什么很多人试了又退回来

GraphRAG 虽然强大,但它是一个"昂贵的妥协"。很多团队兴冲冲地上了 GraphRAG,试了几个月之后默默退回传统 RAG。以下四大难点就是原因。

难点一:索引成本——烧钱一样的 Token 消耗

语料规模GraphRAG 索引成本(GPT-4o)传统 RAG 索引成本索引时间
100 页(约 10 万 token)~$5几美分10-30 分钟
1000 页(约 100 万 token)~$50几美分1-3 小时
10000 页(约 1000 万 token)~$500几美分5-15 小时

传统 RAG 的索引成本几乎可以忽略(过一下 Embedding 模型,每百万 token 几毛钱),而 GraphRAG 的每个步骤几乎都在调 LLM:实体抽取、摘要合成、社区报告……等于把所有原文通过 LLM 反复读了好几遍,token 消耗轻松是原文的 10-50 倍。

成本优化实践

  • 使用更便宜的模型做实体抽取(如 GPT-4o-mini、Qwen2.5-7B),只在社区摘要时用强模型
  • 微软推出的 LazyGraphRAG 在索引阶段只用轻量 NLP 技术,推迟 LLM 使用到查询阶段,成本只有原版的 0.1%
  • FastGraphRAG 用 NLP 替代部分 LLM 调用,1000 篇文档的成本可从 $27+ 降到 $3 左右

难点二:实体消歧

什么叫实体消歧? 就是识别出不同名字的实体是否指同一个东西。

看这些例子:

  • "曹操""孟德""魏武帝"——同一个人
  • "蜀""蜀汉""季汉"——同一个政权
  • "江东""东吴""吴"——同一个势力

LLM 做实体抽取时天然不一致,同一个"曹操"在不同文档里可能被抽成三个节点。后果极其严重

flowchart TD
    A["实体消歧失败"] --> B["图谱被近重复节点塞满"]
    A --> C["关系碎片化<br>查'曹操的谋士'只能返回1/3的结果"]
    A --> D["错误指数级放大<br>下游社区检测+摘要全错"]

业界有一句很扎心的话:"实体碎片化的知识图谱,比没有知识图谱更糟糕,因为它制造了一种虚假的完整感。"

主流消歧策略(多层叠加):

策略原理优缺点
字符串编辑距离处理拼写差异简单但只处理表层
向量相似度处理语义相似能发现"曹操"和"孟德"语义接近
LLM 判别合并让 LLM 判断是否同一实体精度最高但成本高
人工兜底人工审核合并最可靠但无法规模化

难点三:查询延迟——Global Search 的慢性子

查询模式端到端延迟LLM 调用次数
传统 RAG1-2 秒1 次
Local Search3-5 秒几次
Global Search10 秒 - 1 分钟几百上千次

微软后来推出了动态社区选择优化,从根节点逐层下钻,只展开相关社区,把平均参与计算的社区数从 1500 降到约 470。但再优化,Global Search 也还是比向量检索慢一个数量级。

难点四:增量更新——牵一发而动全身

这是 GraphRAG 最要命的难点。传统 RAG 里新增一份文档,切片→向量化→upsert,完事。GraphRAG 里?

flowchart TD
    A[新文档进来] --> B["抽取新实体和关系"]
    B --> C{"新实体是否与已有实体重合?"}
    C -->|是| D["消歧合并<br>(又是消歧问题)"]
    C -->|否| E["添加新节点"]
    D --> F["图结构改变"]
    E --> F
    F --> G["原有社区划分可能过时"]
    G --> H["社区摘要需要重建"]
    H --> I["向量索引需要同步更新"]
    
    style G fill:#ffcccc
    style H fill:#ffcccc
    style I fill:#ffcccc

一份新文档进来,可能触发:实体消歧 → 图结构变化 → 社区重划 → 摘要重建 → 向量索引更新——一串级联效应。很多团队的实际做法就是"定期全量重建",但这又把成本问题放大了。

有研究数据佐证:在需要时间敏感的查询上,GraphRAG 的准确率比传统 RAG 低了 16.6%,根本原因就是图谱更新成本太高,很多团队的图谱都是"过期的"。

六、GraphRAG 增量更新的应对策略

针对增量更新这个最痛的难点,业界有几种主流思路:

flowchart TD
    A[增量更新策略] --> B["定期全量重建"]
    A --> C["增量索引"]
    A --> D["混合策略<br>小增量+周期性全量"]
    A --> E["时间分区"]
    A --> F["延迟合并+最终一致性"]
策略原理适用场景代价
定期全量重建每天或每周重新跑一遍索引文档更新少、数据量小、实时性要求低
增量索引只处理新增文档,判断受影响社区并重做中等更新频率精度有损失,社区划分不全局最优
混合策略日常增量 + 每月全量校准大多数生产环境需维护两套流程
时间分区按时间段分开建图数据有明显时间属性(新闻、财报)跨时间段查询需要联邦策略
延迟合并索引时不做消歧,查询时或异步合并对一致性要求不高查询结果可能漏召回

目前生产环境最常见的是"混合策略"——日常有新文档就跑增量索引,每隔一段时间做一次全量重建,把累积漂移的精度拉回来。

七、LightRAG:GraphRAG 的高性价比改良版

7.1 LightRAG 是什么?

LightRAG 由香港大学(HKU)数据智能实验室于 2024 年 10 月发布,核心论文《LightRAG: Simple and Fast Retrieval-Augmented Generation》被 EMNLP 2025 接收。名字里两个词——Simple(简洁)Fast(快)——就是它的设计哲学。

LightRAG 的定位很明确:在保留"图结构带来的关系理解能力"的前提下,把成本、速度、增量这三件事做到极致。它不追求"大而全",而是在关键场景做精准取舍。

7.2 三个核心创新

创新一:图增强的文本索引(Graph-Enhanced Text Indexing)

LightRAG 也用 LLM 从文档里抽实体和关系,但它做得更轻——不做社区检测,不做社区摘要。只保留实体节点 + 关系边这个最核心的图结构。

步骤GraphRAGLightRAG
实体抽取
关系抽取
实体/关系摘要✅ 每次 LLM 合成✅ 但更轻量(直接 merge)
社区检测(Leiden)
社区摘要

仅省掉社区检测和社区摘要这两步,就省了 80% 以上的 LLM 调用量。这是 LightRAG 成本能降到 GraphRAG 的 1% 甚至更低的根本原因。

创新二:双层检索范式(Dual-Level Retrieval)

这是 LightRAG 最亮的设计。不做社区摘要了,那全局性问题怎么答? LightRAG 的答案是:不在索引阶段预计算全局视图,而是在查询时按需检索

具体做法是把查询拆成两层关键词:

  • 低层关键词(Low-level Keywords):具体的实体和术语——关注"细节"
  • 高层关键词(High-level Keywords):抽象的主题和概念——关注"宏观"
flowchart LR
    A["用户提问:<br>三国时期各势力的外交策略<br>如何影响整体格局?"] --> B["LLM 抽取双层关键词"]
    B --> C["低层关键词:<br>联盟、和亲、降服、割地"]
    B --> D["高层关键词:<br>外交策略、势力格局、<br>三国关系"]
    
    C --> E["Low-level 检索<br>→ 搜索实体节点<br>→ 扩展到一跳邻居"]
    D --> F["High-level 检索<br>→ 搜索关系边<br>→ 聚合涉及实体"]
    
    E --> G["上下文组装"]
    F --> G
    G --> H["LLM 生成答案"]

一个找"点",一个找"线",两种信息合起来组装上下文,最后让 LLM 生成答案。

这种双层检索的好处:不用预先生成一大堆社区摘要,每次查询只调用一次 LLM 做关键词抽取,然后几次向量检索就能搞定。相比 GraphRAG 的 Map-Reduce 式全局查询,LightRAG 的查询成本和延迟都降了一个数量级

创新三:增量更新算法

LightRAG 的增量更新,本质上就是**"追加"两个字**:

flowchart LR
    A[新文档进来] --> B[切块+抽实体关系]
    B --> C{"同名实体?"}
    C -->|是| D["合并描述到已有节点"]
    C -->|否| E["添加新节点"]
    D --> F["向量化+追加到向量库"]
    E --> F
    
    style A fill:#e6f3ff
    style F fill:#e6ffe6

因为根本没有"社区"这一层,自然也就没有"社区失效"这种问题。增量索引的流程变得跟传统 RAG 一样轻——新文档来了,抽实体关系、合并去重、向量化,完事。

7.3 索引阶段:只有 3 步

步骤做什么与 GraphRAG 的区别
1. 文档切块按固定 token 数切块(默认 1200 token,100 token 重叠)一样
2. 实体和关系提取LLM 抽取实体+关系,每条关系额外生成"关系关键词"多了一个"关系关键词"
3. 键值对生成+去重为每个实体/关系生成 Key-Value 对,同名实体合并替代了 GraphRAG 的摘要合成+社区检测+社区摘要

"关系关键词" 是 LightRAG 的一个小巧思。比如"诸葛亮辅佐刘备建立蜀汉"这条关系,关键词可能是"辅佐、建国、君臣"。这些关键词就是后面"高层检索"去命中相关关系的钥匙。

键值对设计也很聪明:Key 是便于检索匹配的短语(实体名/关系关键词),Value 是详细描述。查询时用关键词快速匹配 Key,命中后直接取 Value 作上下文,省掉了复杂的嵌入匹配和 chunk 遍历

7.4 查询阶段:四种模式灵活切换

模式检索方式适用场景
Naive纯向量检索文本块(= 传统 RAG)简单事实问答
Local只用 Low-level 检索(找具体实体)"赵云的战绩有哪些?"
Global只用 High-level 检索(找关系主题)"三国时期的核心矛盾是什么?"
HybridLow-level + High-level 同时用复杂综合问题,默认推荐

7.5 成本对比:LightRAG 有多便宜?

指标GraphRAGLightRAG
索引 100 万 token 成本~$20-50~$0.15
单次查询 Token 消耗~13,000~100-1,000
单次查询 API 调用几百次几次
单次查询延迟10 秒-1 分钟1-3 秒
增量一次更新可能触发社区重建几乎零额外成本

Token 消耗降低 99%——这是 LightRAG 论文里最吸引人的一行数字,也是落到钱包上的实实在在的差距。

7.6 LightRAG 的代价是什么?

天下没有免费的午餐。LightRAG 主要牺牲了全局深度洞察

GraphRAG 的社区摘要虽然贵,但它提供的是一种经过 LLM 加工的、具有层次抽象的全局知识视图。对于那种需要深度宏观归纳的问题(比如"这本小说整体想表达什么人生哲理?"),GraphRAG 的社区摘要能提供更好的全局洞察。

LightRAG 的双层检索本质还是**基于查询去"现场拼凑"全局视角,对极其复杂的全局归纳问题,深度可能不如 GraphRAG。

此外,LightRAG 目前的增量处理对时效性冲突并不敏感。比如 Day 1 抽到了"黄忠是蜀汉五虎将之首",Day 2 又抽到"关羽是蜀汉五虎将之首",LightRAG 会把两条关系同时保留,不会自动判定哪条更新。如果你的业务需要处理这种时效性冲突,得自己在上层加逻辑。

两者的权衡其实很清楚:如果你追求极致的全局深度洞察,而且预算管够,GraphRAG 是你的选择;反过来,如果你更在意成本可控、增量友好、实时性好,愿意在全局洞察深度上打个折扣,那 LightRAG 就更合适。

八、GraphRAG 与 LightRAG 全维度对比

8.1 设计哲学上的根本分歧

flowchart LR
    subgraph GraphRAG哲学
        A1["📖 预计算全局视角"] --> A2["索引阶段就把全局结构<br>'嚼碎了'准备好"]
        A2 --> A3["查询时直接拿现成摘要用<br>查得快但维护贵"]
    end
    
    subgraph LightRAG哲学
        B1["🔍 按需检索,延迟聚合"] --> B2["索引阶段只做核心抽取<br>不做全局预计算"]
        B2 --> B3["查询时临时拼凑视角<br>查得灵活但深度略浅"]
    end

打个比方:GraphRAG 像一个很勤快的图书管理员,在你进图书馆之前已经把每个主题区都写好了概览海报;LightRAG 像一个聪明的助手,你告诉他你想了解什么,他现场帮你把相关的书和书之间的关系梳理出来。前者查得快但维护贵,后者查得灵活但深度略浅。

8.2 索引阶段对比

步骤GraphRAGLightRAG差异说明
文档切块✅ 固定 token 数✅ 固定 token 数一样
LLM 抽实体关系✅ 每块调 LLM✅ 每块调 LLMLightRAG 多抽"关系关键词"
实体/关系摘要✅ 每个实体/关系调 LLM 合成综合描述✅ 但更轻量(同名实体直接 merge 描述)LightRAG 省掉大量 LLM 调用
社区检测(Leiden)✅ 必须步骤完全没有最大差异点
社区摘要✅ 每个社区调 LLM 生成报告完全没有最大差异点
实体消歧多层策略(字符串+向量+LLM)朴素名称匹配,同名合并GraphRAG 精度更高但成本更高

8.3 查询阶段对比

flowchart TB
    subgraph GraphRAG查询
        direction TB
        GA[用户提问] --> GB{查询类型}
        GB -->|具体实体| GC["Local Search<br>向量定位入口实体<br>→ 图遍历扩展<br>→ 组装上下文"]
        GB -->|全局宏观| GD["Global Search<br>Map-Reduce 遍历所有社区<br>→ 每个社区生成中间答案<br>→ 汇总成最终答案"]
        GC --> GE[LLM 生成答案]
        GD --> GE
    end
    
    subgraph LightRAG查询
        direction TB
        LA[用户提问] --> LB["一次 LLM 调用<br>抽取双层关键词"]
        LB --> LC["Low-level 检索<br>→ 搜索实体节点<br>→ 扩展一跳邻居"]
        LB --> LD["High-level 检索<br>→ 搜索关系边<br>→ 聚合涉及实体"]
        LC --> LE["上下文组装"]
        LD --> LE
        LE --> LF[LLM 生成答案]
    end

最大差别:GraphRAG 的 Global Search 要遍历几百上千个社区,而 LightRAG 的 Hybrid 只做两路并行的向量检索。这就是为什么 LightRAG 的查询延迟能低一个数量级。

8.4 增量更新对比

场景GraphRAGLightRAG
新增一份文档可能触发社区重划、摘要重建、向量更新(级联复杂)抽实体关系 + 名称合并 + 向量追加
删除一份文档同样触发级联影响删除对应节点和边即可
大批量更新通常需要定期全量重建直接增量,不用重建
时效性冲突处理依赖复杂的版本化和重建策略目前能力较弱,同时保留冲突信息

8.5 成本与性能对比

指标GraphRAG(微软)LightRAG(港大)
发布时间2024 年 4 月2024 年 10 月
索引 100 万 token 成本~$20-50~$0.15
单次查询延迟10 秒-1 分钟(Global)1-3 秒(Hybrid)
Token 消耗降低基准减少 99%
深度全局洞察(社区摘要)一般(临场组装)
实体消歧精度(多层策略)低(朴素名称匹配)
工程复杂度
开源协议MITMIT
GitHub Stars20k+10k+(增长飞快)

8.6 精度表现

很多人会问:LightRAG 这么便宜,精度是不是不行?并不是

根据 LightRAG 论文和社区的多项基准测试,LightRAG 在四个主流数据集(Agriculture、Computer Science、Legal、Mix)上的四个评测维度(全面性、多样性、赋能性、整体)上,全部击败了 NaiveRAG、RQ-RAG、HyDE 甚至是微软的 GraphRAG。尤其是在百万 token 级的大规模语料上,LightRAG 的优势更明显;在"多样性"维度上更是大幅领先——这得益于双层检索带来的信息广度。

但也要客观看待:

  • 需要极深度全局归纳的场景下,GraphRAG 的社区摘要仍有优势
  • 实体消歧要求严格的场景下(金融合同、医疗诊断),GraphRAG 那套复杂消歧策略更靠谱
  • 根据 2025 年厦大和港理工提出的 GraphRAG-Bench 基准测试框架,GraphRAG 在复杂推理、上下文总结和创造性生成任务中表现优于传统 RAG,但在简单事实检索任务中,传统 RAG 的表现反而更好或相当

九、选型

9.1 选型决策树

flowchart TD
    A[开始选型] --> B{"你的问题类型是什么?"}
    B -->|简单事实问答| C["传统 RAG / LightRAG Naive 模式<br>✅ 成本低,速度快"]
    B -->|涉及跨文档关联推理| D{"数据更新频率?"}
    B -->|需要全局归纳总结| E{"预算是否充足?"}
    
    D -->|频繁更新| F["✅ LightRAG<br>增量友好,成本可控"]
    D -->|很少更新| G{"对精度要求?"}
    
    G -->|极高| H["✅ GraphRAG<br>深度推理,可解释性强"]
    G -->|够用就行| F
    
    E -->|充足| H
    E -->|紧张| F
    
    style C fill:#e6ffe6
    style F fill:#e6ffe6
    style H fill:#e6ffe6

9.2 数据规模与方案匹配

语料规模推荐方案
少于 10 万 token传统 RAG(没必要上图)
10 万 - 500 万 tokenLightRAG 最佳
500 万 - 5000 万 tokenLightRAG 或 GraphRAG,看业务侧重
大于 5000 万 tokenGraphRAG 更合适(规模越大,社区摘要的价值越大)

9.3 混合架构:两个都要,分而治之

还有一种越来越常见的做法——混合架构

flowchart LR
    A[用户提问] --> B[查询路由器]
    B -->|深度分析类| C["GraphRAG<br>(静态核心知识)"]
    B -->|实时查询类| D["LightRAG<br>(动态增量数据)"]
    B -->|简单事实类| E["传统 RAG<br>(FAQ 知识库)"]
    C --> F[答案聚合]
    D --> F
    E --> F
    F --> G[最终回答]

稳定的、历史性的核心知识(公司规章、法规库)用 GraphRAG 做深度分析;动态的、日常变化的增量数据(工单、新闻、产品更新)用 LightRAG 做实时响应;简单的 FAQ 用传统 RAG 就够了。查询时搭一个 Query Router,根据查询类型分流到对应系统。

这种混合架构能同时享受三者优势,代价是工程复杂度上升。但对于中大型企业来说,这可能是目前最务实的做法。

十、GraphRAG 家族的其他成员

除了微软原版 GraphRAG 和港大的 LightRAG,市面上还有不少值得关注的图增强 RAG 方案。了解它们,能帮你做出更好的技术选型。

10.1 家族全景

mindmap
  root((图增强 RAG 家族))
    微软系
      GraphRAG 原版
      LazyGraphRAG
    港大系
      LightRAG
    社区/学术
      FastGraphRAG
      HippoRAG / HippoRAG2
      KAG
      GraphReader
      MGraphRAG
      RAPTOR
    Agentic 方向
      Agentic RAG

10.2 重点方案速览

方案核心思路与 GraphRAG 的关系亮点
LazyGraphRAG(微软)索引阶段只用轻量 NLP,推迟 LLM 使用到查询阶段GraphRAG 的"懒惰版"成本只有原版的 0.1%
FastGraphRAG(社区)用 NLP 替代部分 LLM 调用,查询时用 PageRank 聚合全局信息GraphRAG 的"加速版"索引时间是 GraphRAG 的 1/10,查询时间是 LightRAG 的 1/100
HippoRAG(OSU)模拟海马体记忆机制,用个性化 PageRank 做检索独立方案,图更密集节点和边数量远超其他框架,适合超细粒度场景
KAG(蚂蚁/浙大)知识增强生成,融合知识图谱与逻辑推理独立方案,更偏推理在逻辑推理任务上有优势

2025 年 6 月 有两篇关于 GraphRAG 技术评测的论文,涉及 12 种 GraphRAG 技术的全面评测,网上有相关解析,做选型时可以考虑。