GraphRAG:知识图谱增强检索
GraphRAG:知识图谱增强检索
学习目标
读完本章后,你将能够:
- 理解 GraphRAG 相比传统向量检索的差异与互补性
- 掌握知识图谱构建的三阶段流程(NER → 关系抽取 → 实体消歧)
- 设计图谱检索与向量检索的融合策略
- 分析 GraphRAG 的适用场景与局限
前置知识
- RAG 全链路可视化管线 — 检索基础流程
- 模板化文本切分策略 — 文本切分基础
1. 为什么 RAG 需要知识图谱
传统向量检索的局限:
- 语义匹配但不精确:向量检索找到”语义相似”的文本,但无法精确回答”谁做了什么”、“A 与 B 的关系是什么”这类结构化问题
- 缺乏全局关联:每个 chunk 独立检索,无法跨越文档发现实体间的关联
- 不支持多跳推理:向量检索只能做一次相似度匹配,无法回答”A 的合作伙伴的竞争对手是谁”这类多跳问题
GraphRAG 将知识图谱的结构化知识与向量检索的语义能力结合:
2. 图谱构建三阶段
2.1 实体识别(NER)
从文本中识别出命名实体:
| 实体类型 | 示例 |
|---|---|
| PERSON | 张三、John Smith |
| ORGANIZATION | 阿里巴巴、Google |
| LOCATION | 北京、California |
| PRODUCT | iPhone、GPT-4 |
| EVENT | 2024 奥运会 |
| DATE | 2024 年、Q3 |
实现方式:
- LLM 辅助:用 LLM 从 chunk 中提取实体列表,灵活但成本高
- 传统 NER 模型:spaCy、BERT-NER 等,速度快但需要标注数据
2.2 关系抽取
在识别实体的同时,提取实体之间的关系:
文本:"张三于 2023 年加入阿里巴巴,担任技术总监。"
提取结果:(张三, JOIN_ORGANIZATION, 阿里巴巴, 2023)(张三, TITLE, 技术总监)关系类型可以是预定义的(如 Schema.org),也可以由 LLM 从上下文中动态推断。
2.3 实体消歧(实体对齐)
同一实体在不同文本中可能有不同表述:
"张三" = "张先生" = "三哥" = "Zhang San""阿里巴巴" = "Alibaba" = "阿里" = "淘宝母公司"实体消歧通过 LLM 辅助判断两个实体描述是否指向同一对象:
Prompt 示例:请判断以下两个实体描述是否指向同一个真实实体:实体 A: "张三,技术总监"实体 B: "张先生,阿里技术总监"
返回: {"same_entity": true, "confidence": 0.9}轻量模式 vs 通用模式:
| 模式 | 特点 | 适用场景 |
|---|---|---|
| 轻量(Light) | 基于文本相似度 + 规则匹配,不使用 LLM | 大规模数据集、成本敏感 |
| 通用(General) | 使用 LLM 辅助判断,准确率更高 | 高质量要求、中小规模 |
3. 图谱检索
图谱检索与向量检索并行执行:
3.1 图谱查询策略
| 查询类型 | 示例 | 图谱操作 |
|---|---|---|
| 实体查询 | ”张三是谁?“ | 按实体名称查找节点,返回属性 |
| 关系查询 | ”张三在哪工作?“ | 从实体节点出发遍历关系边 |
| 多跳查询 | ”张三的公司的竞争对手有哪些?“ | 多步遍历关系图 |
| 子图查询 | ”阿里巴巴的组织架构” | 返回与实体相关的所有节点和关系 |
3.2 结果融合
图谱检索和向量检索的结果融合策略:
- 图谱结果优先:如果图谱查询返回了精确匹配的结构化信息,将其放在结果列表最前面
- 向量结果补充:向量检索提供更丰富的上下文文本
- 统一格式化:将所有结果(图谱的结构化三元组 + 向量检索的文本 chunk)统一为 LLM 可读的格式
4. 阶段标记器(Phase Markers)
在图谱构建过程中,使用阶段标记器追踪进度:
| 阶段 | 标记 | 说明 |
|---|---|---|
| 1 | PHASE_NER | 实体识别完成 |
| 2 | PHASE_RELATION | 关系抽取完成 |
| 3 | PHASE_RESOLUTION | 实体消歧完成 |
| 4 | PHASE_GRAPH | 图谱构建完成 |
这使得图谱构建过程可观测、可中断、可恢复。
5. 问题与规避
| 陷阱 | 对策 |
|---|---|
| 实体识别准确率低 | 结合 LLM + 传统 NER 模型,互相校验 |
| 图谱规模爆炸 | 过滤低置信度关系,限制单实体最大关系数 |
| 实体消歧误判 | 设置较高置信度阈值(如 0.85),低于阈值的标记为待审核 |
| 图谱检索为空 | 回退到纯向量检索,图谱作为增强而非替代 |
| 图谱更新延迟 | 增量构建:新文档只处理新增实体,不影响已有图谱 |
6. 设计取舍
GraphRAG vs 纯向量 RAG
| 维度 | GraphRAG | 纯向量 RAG |
|---|---|---|
| 精确查询 | 高(结构化查询) | 中(语义近似匹配) |
| 多跳推理 | 支持 | 不支持 |
| 构建成本 | 高(NER + 关系 + 消歧) | 低(仅 Embedding) |
| 维护成本 | 高(图谱需要持续更新) | 低 |
| 适用场景 | 实体关系密集的查询 | 通用语义检索 |
推荐:当查询经常涉及实体关系(“谁”、“什么关系”、“关联”)时,引入 GraphRAG 作为向量检索的增强层。不需要完全替代向量检索,两者互补效果最好。
轻量 vs 通用图谱构建
已在第 2.3 节对比。简而言之:轻量模式适合快速启动,通用模式适合高质量要求。
参考来源
- Microsoft GraphRAG 论文:https://arxiv.org/abs/2404.16130
- Microsoft GraphRAG 项目:https://github.com/microsoft/graphrag
补充:轻量级实体链接在记忆系统中的应用
完整的 GraphRAG 流程(NER → 关系抽取 → 实体消歧 → 图谱构建 → 图查询)适用于文档级知识图谱构建。在 AI 记忆系统中,实体链接通常采用更轻量的方案:
轻量级实体链接 vs 完整 GraphRAG
| 维度 | 完整 GraphRAG | 轻量级实体链接(Mem0 方案) |
|---|---|---|
| 实体提取 | LLM + NER 模型 | spaCy NER 模型 |
| 关系类型 | 多种关系边(works_for、located_in 等) | 仅实体-记忆关联(linked_memory_ids) |
| 存储 | 专用图数据库(Neo4j) | 向量存储(实体也 Embedding 后存入) |
| 检索 | Cypher 查询 + 多跳遍历 | 向量相似度搜索(top_k=1,阈值 ≥ 0.95) |
| 用途 | 复杂多跳推理 | 检索阶段的实体提升(entity boost) |
轻量级实体链接的核心设计
- 实体-记忆多对多关联:每条记忆通过
linked_memory_ids关联到多个实体;每个实体也关联到多个记忆 ID - 向量化实体搜索:实体也通过 Embedding 转为向量,在 Entity Store 中进行相似度搜索,而非精确字符串匹配
- Spread-Attenuation 衰减:一个实体关联的记忆越多,单条记忆获得的提升权重越小,防止”大众实体”过度影响检索
- 全局去重:同一批次提取的多个记忆中,相同实体只提取一次,共享 Embedding
适用场景
轻量级实体链接适合对话级记忆系统——实体密度低、关系简单、查询以语义检索为主。完整 GraphRAG 适合文档级知识库——实体密集、关系复杂、需要多跳推理。