GraphRAG 图增强检索
微软 GraphRAG 架构深度解析 -- 知识图谱驱动的检索增强生成
为什么需要 GraphRAG
传统 RAG(Retrieval-Augmented Generation)通过将文档切分为片段并向量化,在用户查询时检索最相关的片段送入 LLM 生成回答。这种范式在简单问答场景下效果良好,但在面对复杂知识需求时暴露出明显的局限性。
无法处理多跳关系(Multi-hop Reasoning):当一个问题需要跨多个文档、多步推理才能回答时,例如"某公司 CEO 参与投资了哪些 AI 创业公司?",传统 RAG 的向量检索只能找到与"CEO"或"投资"单一片段相关的文本,无法跨越多个文档实体进行链式推理。
难以回答全局性问题(Global Query):像"本报告的主要趋势是什么?"或"文档集中各利益相关方的关系如何?"这类需要整体概览的问题,片段级检索只能返回局部信息,缺乏全局视角的整合能力。
缺乏实体间关系理解:传统 RAG 将文本视为独立片段,无法识别和利用片段中实体之间的显式或隐式关系,例如"阿里巴巴投资了月之暗面"与"月之暗面推出了 Kimi"之间的因果-隶属关系。
GraphRAG 正是为了解决这些问题而生,它通过引入知识图谱结构,显式建模实体及其关系,在检索阶段同时利用语义相似性和图结构拓扑信息,从而显著提升复杂推理和全局理解能力。
知识图谱基础
知识图谱(Knowledge Graph)是一种以图结构组织知识的数据模型,其核心概念包括:
实体(Entity):现实世界中的对象或概念,如"阿里巴巴"、"Kimi"、"GPT-4"。每个实体通常带有唯一的标识符和类型标签。
关系(Relation):实体之间的语义连接,如"投资"、"创始人"、"隶属于"。关系通常是有向的,并带有类型标注。
三元组(Triplet):知识图谱的基本单元,形式为 (头实体, 关系, 尾实体),例如 (阿里巴巴, 投资, 月之暗面)。多个三元组相互连接,构成网络结构。
知识图谱的主流表示模型有两种:
- RDF(Resource Description Framework):W3C 标准,以
<subject, predicate, object>三元组表示,强调语义网的互操作性。查询语言为 SPARQL。 - Property Graph:广泛用于图数据库(如 Neo4j),允许节点和边携带属性键值对,表达能力更强。查询语言为 Cypher 或 Gremlin。
在 GraphRAG 中,知识图谱的构建粒度决定了检索质量。粗粒度图谱适合全局概览,细粒度图谱支撑精确推理。
微软 GraphRAG 架构
微软于 2024 年提出的 GraphRAG 系统化地将知识图谱引入 RAG 流程,其架构可划分为四个关键阶段。
源文档到实体/关系抽取(LLM 驱动)
输入文档集合首先由 LLM 进行处理。系统设计了一套精心构造的 Prompt,引导 LLM 从文本中识别并提取出实体与关系。每次处理一个文档块,输出结构化的三元组列表,同时为每个实体生成简短的文本描述。这一步是图谱构建的起点,抽取质量直接影响下游效果。
社区检测与摘要(Leiden 算法)
构建好的知识图谱经过社区检测算法(Leiden 算法)划分成多个层次化的社区。Leiden 算法是一种改进的 Louvain 算法,能够高效发现图中的紧密连接子图,并保证社区内部连接紧密、社区之间连接稀疏。对每个检测到的社区,系统再次利用 LLM 生成社区级别的文本摘要,描述该社区中实体群的整体主题与关键信息。这些社区摘要为全局查询提供了素材。
局部查询(Local Search)
当用户提出局部性、面向特定实体的问题时,系统采用双重检索策略:
- 向量检索:将用户查询与实体描述、文本片段的向量表示进行相似度匹配,召回最相关的候选实体和片段。
- 关系遍历:从召回的实体出发,沿图中的关系边进行广度优先遍历(BFS),收集邻接实体及其关系路径。
将上述两部分信息拼接为上下文窗口,送入 LLM 生成最终回答。这种"语义匹配 + 图结构扩展"的混合策略,使模型能够感知查询实体周边的完整知识拓扑。
全局查询(Global Search)
对于需要整体理解的问题,局部检索难以胜任。全局查询策略直接利用社区检测阶段生成的社区摘要:将所有社区摘要拼接(或先进行 Map-Reduce 降维),作为上下文整体输入 LLM。这使得模型能够在全局范围内综合分散在各社区中的信息,回答诸如"整体趋势"、"核心矛盾"等宏观问题。
图谱构建流程
知识图谱的构建是 GraphRAG 的基础环节,通常包含以下几种技术路径。
NLP 信息抽取
传统方法依赖预训练的 NLP 模型进行结构化信息提取:
- 命名实体识别(NER):识别文本中的人名、地名、机构名、时间等实体类型。常用模型包括 Stanford NER、Spacy 等。
- 关系抽取(RE):检测已识别实体之间的语义关系。可采用模式匹配、远程监督或基于预训练模型(如 BERT)的微调方法。
NLP 方法速度快、成本低,但在处理复杂语义关系时精度有限,且难以覆盖开放域关系类型。
LLM 驱动抽取
借助 GPT-4、Claude 等大语言模型的理解能力,直接从自然语言文本中端到端提取三元组。给定一段文本,通过 Prompt 引导 LLM 输出结构化 JSON 格式的三元组列表。相比传统 NLP 方法,LLM 驱动的抽取能够:
- 理解隐式关系和上下文依赖
- 识别开放域的关系类型,不受预定义 Schema 限制
- 为实体和关系生成丰富的文本描述
代价是更高的 API 调用成本和延迟。
实体消歧与融合
不同文档或同一文档的不同位置可能以不同方式引用同一个实体(如"阿里巴巴"vs"阿里"vs"Alibaba"),需要进行实体对齐与融合。常用的方法包括基于规则(字符串相似度)、基于向量(嵌入相似度)以及基于图结构(同一社区内实体更可能指向同一真实世界对象)。融合后的实体获得统一 ID,消除冗余,保证图谱的连贯性。
传统 RAG vs GraphRAG 对比
| 对比维度 | 传统 RAG | GraphRAG |
|---|---|---|
| 多跳推理 | 弱,需多次检索且无法保证路径连贯 | 强,关系遍历天然支持多跳路径 |
| 全局理解 | 差,片段检索只能提供局部信息 | 好,社区摘要提供全局概览 |
| 关系推理 | 不支持,文本片段间无关系建模 | 原生支持,显式建模实体关系 |
| 构建成本 | 低,仅需 Embedding + 向量库 | 较高,需 LLM 抽取 + 图谱构建 |
| 检索时延 | 低,近似最近邻搜索(毫秒级) | 中等,需结合向量和图遍历 |
| 可解释性 | 中等,返回相关片段 | 好,可展示实体-关系路径 |
| 扩展性 | 好,支持增量索引 | 较好,需维护图谱一致性 |
| 冷启动难度 | 低,文档即可索引 | 较高,需设计抽取 Schema |
该表格清晰地展示了两者的优缺点:GraphRAG 在推理和理解能力上显著领先,但以更高的构建成本和复杂性为代价。实际应用中可根据场景选择混合方案。
实践工具
Neo4j 图数据库
Neo4j 是目前最成熟的 Property Graph 数据库,使用 Cypher 查询语言。在 GraphRAG 场景中,Neo4j 负责存储和查询构建好的知识图谱。Cypher 的模式匹配语法非常适合表达多跳关系查询,例如:
MATCH (company:Entity {name: '阿里'})-[:投资]->(startup:Entity)
RETURN startup.name, startup.descriptionNeo4j 支持向量索引插件,可实现知识图谱上的向量-图混合检索。
NetworkX 图分析
NetworkX 是 Python 生态中最常用的图分析库,适合在数据探索和原型验证阶段使用。它提供了丰富的图算法,包括社区检测(Girvan-Newman、Louvain)、中心性分析(PageRank、Betweenness)、最短路径等。在 GraphRAG 流程中,NetworkX 常用于:
- 图谱构建后的连通性分析
- 构图质量评估
- 社区发现的可视化
GraphRAG 代码示例
以下示例基于 lightrag 开源框架,展示如何构建 GraphRAG 索引并进行查询:
import os
from lightrag import LightRAG, QueryParam
# 初始化 LightRAG,指定工作目录和语言模型配置
rag = LightRAG(
working_dir="./graphrag_index",
llm_model_func=... # 配置 LLM 客户端(如 OpenAI / 本地模型)
)
# 步骤一:插入文本并自动构建知识图谱
rag.insert("""
阿里巴巴集团通过其旗下阿里云部门推出了通义千问大模型。
与此同时,阿里参与了月之暗面公司的多轮融资,后者的核心产品是 Kimi 智能助手。
月之暗面的创始人曾效力于阿里巴巴达摩院。
""")
rag.insert("""
字节跳动旗下火山引擎发布了豆包大模型,面向企业客户提供 API 服务。
字节还在 AI 领域投资了多家初创公司,包括光年之外和 MiniMax。
""")
# 步骤二:局部查询 -- 指定实体相关的问题
response_local = rag.query(
"月之暗面与阿里巴巴之间有什么关系?",
param=QueryParam(mode="local")
)
print(response_local)
# 步骤三:全局查询 -- 需要整体概括的问题
response_global = rag.query(
"简述中国 AI 领域的投资格局。",
param=QueryParam(mode="global")
)
print(response_global)在上述流程中,lightrag 在插入文本时自动完成实体抽取、关系抽取、图谱构建与社区检测。查询时,local 模式执行实体向量检索加关系遍历,global 模式使用社区摘要回答,开发者无需手动管理图数据库的底层操作。
总结
GraphRAG 通过将知识图谱的结构化表达能力引入检索增强生成流程,突破了传统 RAG 在多跳推理、全局理解和关系感知方面的瓶颈。微软提出的架构方案 -- LLM 驱动的实体关系抽取、Leiden 社区检测、局部与全局双通道查询 -- 已被多家开源项目验证和实践。随着图数据库、向量检索和 LLM 技术的持续融合,GraphRAG 有望成为下一代知识密集型应用的基础架构。