04.3 - Graph RAG
定位: 利用知识图谱增强 RAG 的结构化检索能力——当"语义相似"不够用时,用"实体关系"做精确推理 面试高频度: ⭐⭐⭐⭐ 考查方式: Graph RAG 原理、与向量检索的对比、实体关系提取、Microsoft GraphRAG
一、这是什么?为什么需要它?
是什么
Graph RAG 是将知识图谱(Knowledge Graph)与 RAG 结合的架构。在传统向量语义检索之外,增加基于实体和关系的结构化检索能力。
传统 RAG(向量检索):
查询 -> "苹果公司CEO是谁" -> 语义匹配文档 -> 可能找到包含"Tim Cook"的文档
Graph RAG(图谱检索):
查询 -> "苹果公司CEO是谁" -> 知识图谱的精确查询 -> 实体:苹果公司 -> 关系:CEO -> 实体:Tim Cook为什么需要 Graph RAG?
向量检索的局限:只能做"语义相似",无法做"关系推理"
"公司的最高决策机构是什么?" + "目前的成员有哪些?"
向量检索:只能分别找"决策机构"和"成员"的文档
但无法连接:决策机构 <-> 成员 <-> 现任
Graph RAG:董事会 -> (包含) -> 成员 -> (现任) -> [张三, 李四, ...]
适合 Graph RAG 的查询类型:
多跳问题:(A -> B -> C)
关系比较:(A 和 B 的关系是什么?)
聚合分析:(去年有多少...?)
路径查询:(A 如何连接到 E?)二、原理拆解
2.1 Graph RAG 核心流程
+------------------------------------------------------------------+
| Graph RAG 核心流程 |
| |
| 1. 离线知识图谱构建 |
| 文档 -> 实体提取 -> 关系提取 -> 图谱存储 (Neo4j/ArangoDB) |
| |
| 2. 在线查询处理 |
| 用户查询 -> 查询理解 -> 实体链接 -> 图谱查询 -> 结果融合 -> 生成 |
| |
| 3. 混合检索(推荐) |
| 同时使用向量检索 + 图谱检索 |
| 向量检索:语义模糊匹配 |
| 图谱检索:精确关系推理 |
| 融合结果 -> LLM 生成 |
+------------------------------------------------------------------+2.2 Microsoft GraphRAG 架构
Microsoft GraphRAG 是目前最系统的 Graph RAG 实现:
+------------------------------------------------------------------+
| Microsoft GraphRAG 架构 |
| |
| 1. 文档预处理(实体提取) |
| 原始文档 -> LLM 提取实体和关系 -> 实体共现图构建 |
| |
| 2. 社区检测与摘要 |
| Leiden 算法 -> 社区发现 |
| 每个社区 -> LLM 生成社区摘要 |
| |
| 3. 查询处理 |
| 上层:全局搜索(社区摘要) |
| 下层:局部搜索(特定实体+邻居) |
| |
| 4. 结果融合 |
| 全局结果 + 局部结果 -> 综合生成 |
+------------------------------------------------------------------+GraphRAG vs 基础 RAG 对比:
基础 RAG:直接基于文档块向量检索
- 只能做语义相似度匹配
- 无法理解实体间的关系
- 无法做多跳推理
Naive Graph RAG:实体提取 + 关系存储
- 需要查询中明确指定实体
- 图谱更新成本高
- 关系稀疏时效果不好
Microsoft GraphRAG:社区 + 摘要 + 全局/局部搜索
- 自动构建大规模知识图谱
- 社区摘要覆盖宏观知识
- 对复杂全局问题效果好
- 但:构建成本高(大量 LLM 调用)2.3 向量 vs 图谱检索对比
| 维度 | 向量检索 | 图谱检索 | Graph RAG 混合 |
|---|---|---|---|
| 查询类型 | 语义相似 | 精确关系 | 两者兼顾 |
| 多跳推理 | 差 | 强 | 强 |
| 实体关系 | 无 | 精确 | 精确 |
| 语义模糊匹配 | 强 | 差 | 强 |
| 构建成本 | 低 | 高 | 高 |
| 更新成本 | 低 | 高 | 高 |
| 适用查询 | "关于X的内容" | "X和Y的关系" | 复杂综合查询 |
三、图解全景
Graph RAG 的混合检索架构
+------------------------------------------------------------------+
| Graph RAG 混合检索架构 |
| |
| 用户查询:"苹果公司和微软公司在AI领域的竞争关系" |
| |
| +---------------------------+ |
| | 查询理解模块 | |
| | 实体识别: [苹果公司, 微软] | |
| | 关系识别: [竞争, AI领域] | |
| +------+--------------------+ |
| | |
| +-----+-----+ |
| | | |
| v v |
| +--------+ +--------+ |
| |向量检索 | |图谱检索 | |
| |语义匹配 | |关系查询 | |
| |关于苹果 | |苹果 --[竞争]--> 微软 |
| |的文档 | | | |
| +--------+ +--------+ |
| | | |
| +-----+-----+ |
| | |
| v |
| +------------------+ |
| | 结果融合 & 生成 | |
| | 文档信息 + 关系图 | |
| +------------------+ |
+------------------------------------------------------------------+四、实战验证
4.1 简易 Graph RAG 实现
python
# 简易 Graph RAG:用 LLM 提取实体+关系,用图查询增强检索
from langchain_openai import ChatOpenAI
import json
class SimpleGraphRAG:
def __init__(self, vectorstore, llm):
self.vectorstore = vectorstore
self.llm = llm
self.graph = {} # 简易图存储
def extract_entities(self, query):
"""从查询中提取实体和关系"""
prompt = f"""
从以下查询中提取实体和关系:
查询:{query}
输出 JSON:{{"entities": ["entity1", ...], "relations": ["relation1", ...]}}
"""
response = self.llm.invoke(prompt)
return json.loads(response.content)
def build_subgraph(self, entities):
"""根据实体构建子图查询"""
relations = []
for entity in entities:
# 向量检索包含该实体的文档
docs = self.vectorstore.similarity_search(
f"{entity} 关系 关联", k=5
)
for doc in docs:
relations.append(doc.page_content)
return relations
def invoke(self, query):
entities = self.extract_entities(query)
# 并行:向量检索 + 图检索
vector_docs = self.vectorstore.similarity_search(query, k=3)
graph_info = self.build_subgraph(entities["entities"])
# 融合
context = "\n".join(
[d.page_content for d in vector_docs] + graph_info
)
response = self.llm.invoke(
f"基于以下信息回答问题:\n{context}\n\n问题:{query}"
)
return response五、面试视角
| 问题 | 答案要点 |
|---|---|
| Graph RAG 解决了向量检索的什么局限? | 向量检索只能做"语义相似",无法做"关系推理"。Graph RAG 通过实体-关系-实体结构,能回答多跳推理问题(如"A的B是什么?B的C是什么?") |
| Graph RAG 的主要代价是什么? | 知识图谱构建成本极高。实体提取、关系提取、社区检测都需要大量 LLM 调用。更新时也需要重新处理。成本通常是向量检索的 10-100 倍 |
| Microsoft GraphRAG 的核心创新? | 1) 社区检测 + 摘要(Leiden 算法分层社区,每个社区生成摘要);2) 全局搜索(基于社区摘要回答宏观问题);3) 局部搜索(基于实体邻接图回答具体问题) |
| 什么场景应该选择 Graph RAG? | 需要多跳推理、关系密集型、实体之间连接复杂。不适合:简单文档问答(向量检索更高效)、实时更新场景(图谱更新慢) |
| Graph RAG 和向量检索可以结合吗? | 可以,实际上推荐结合。向量检索做语义初筛,图谱检索做精确关系推理。两者互补,融合效果最好 |
📚 相关链接
- **RAPTOR与分层检索** — 另一种结构化增强方案
- **检索与重排序** — 混合检索的基础
- **LlamaIndex实践指南** — LlamaIndex 的 Knowledge Graph 支持
- <- 返回 **进阶RAG索引**