知识图谱 × RAG:让大模型读懂实体关系,而非只搜关键词
摘要:本文基于 DeepLearning.AI《RAG 的知识图谱》课程实践,系统讲解如何用 Neo4j 知识图谱增强 RAG:从图建模基础(节点/关系/属性/标签)、SEC 10-K 财报文档的图构建流程,到 Cypher 查询、文本嵌入与向量索引的融合,再到 LLM 少样本自动生成 Cypher 实现"自然语言→精准图查询"闭环。附课程可复现代码与踩坑清单。适合正在做企业知识库问答、需要处理复杂关系查询的开发者。
1. 为什么 RAG 需要知识图谱
传统 RAG 基于向量检索:把文档切块、嵌入、存向量库,语义相似的片段可以被召回。但纯向量 RAG 有天然短板:
- 无法表达实体间关系:"A 公司收购了 B 公司"与"A、B 都做芯片"在向量空间可能混淆
- 多跳推理困难:"NetApp 与同行业公司在云存储披露上的差异"需要跨文档关联
- 精确匹配弱:年份、金额、人名等结构化事实容易被模糊召回
知识图谱把"关系"显式建模出来,恰好补上这块短板。
2. 图建模基础:节点、关系、属性、标签
节点(Node) 实体:人、公司、课程 关系(Relationship)语义连接:teaches / knows / acted_in 属性(Property) key-value 对:{name: "NetApp"} 标签(Label) 逻辑分组::Person / :Movie / :CourseCypher 查询语法直观支持模式匹配:
MATCH (p:Person {name:"abk"})-[:PURCHASED]->(prod) RETURN prod对比关系型数据库动辄 4-5 层 JOIN,图查询的语义清晰度是降维打击。
3. 实战:从 SEC 10-K 构建知识图谱
课程以 SEC EDGAR 10-K 财报文档为数据源,走通完整流程。
3.1 数据预处理
从 SEC EDGAR 下载 XML 格式 10-K 文件 → 正则 + BeautifulSoup 解析关键章节(Item 1, 1A, 7 等)→ 提取 CIK(公司唯一标识)、公司名、原文链接等元数据 → 转为 JSON 结构化存储。
3.2 文本分块
用 LangChain 的递归字符分割器,按章节切块:
fromlangchain_text_splittersimportRecursiveCharacterTextSplitter text_splitter=RecursiveCharacterTextSplitter(chunk_size=2000,chunk_overlap=200,length_function=len,is_separator_regex=False,)item1_text_chunks=text_splitter.split_text(item1_text)3.3 构建图谱:文档层级关系建模
图谱需要表达文档的层级结构:
公司(Company) -[:FILED]-> 表单(Form) -[:SECTION]-> 章节(Section) -[:HAS_CHUNK]-> 文本块(Chunk)关键设计:
- 新增
SECTION关系(带f10kItem属性)将 Form 节点直连至每节首个块(chunkSequenceID = 0),便于快速导航至章节起始位置 - 建立
LOCATED_AT关系连接经理/公司与地址节点 - 支持跨实体链接(如公司间供应链关系)
4. 基础设施三件套:约束、全文索引、向量索引
课程反复强调一个踩坑点:
先建 UNIQUE CONSTRAINT 再建 VECTOR INDEX,确保每个 :Chunk 节点的 chunk_id 全局唯一,避免向量检索时因重复 ID 导致语义混淆。
唯一性约束(UNIQUE CONSTRAINT) → 全文索引(FULLTEXT INDEX) → 向量索引(VECTOR INDEX)这三者应视为图谱的"三位一体"基础设施,在建模初期同步规划,而非事后补救。
5. 能力进阶:多模态图谱查询
构建完成的图谱支持三类查询能力叠加:
5.1 结构化查询(聚合统计)
-- 各州投资管理公司数量 TOP10 MATCH (c:Company) RETURN c.state, count(*) AS cnt ORDER BY cnt DESC LIMIT 10实证发现:样本中管理公司集中于旧金山,而上市公司密集于圣克拉拉谷(圣何塞、桑尼维尔、库比蒂诺),二者地理错位显著。
5.2 地理空间查询
-- 距圣克拉拉 10 公里内的投资公司 MATCH (c:Company) WHERE point.distance(c.location, point({latitude: 37.3541, longitude: -121.9552})) < 10000 RETURN c.name甚至支持模糊匹配:拼写错误"Palo alto networks"仍可准确定位。
5.3 语义检索(向量查询)
文本块嵌入 + 向量索引,支持"Palo Alto Networks 的业务描述"这类语义检索,与多跳关系遍历组合:
公司 → 表单 → 章节 → Item 1 文本块 → 摘要返回6. LLM 自动生成 Cypher:少样本的力量
课程最惊艳的实证是:仅用少量示例即可让 LLM 生成生产级 Cypher。
| 示例数 | 能力 |
|---|---|
| 1 个(“旧金山的投资公司”) | 替换 WHERE 条件中的城市名 |
| 2 个(加"圣克拉拉附近") | 自主调用 point.distance() 地理查询 |
| 3 个(加"Palo Alto Networks 业务描述") | 组合全文检索 + 多跳关系遍历 + 摘要 |
关键方法论:
- 少量高质量示例(Few-shot)锚定模式
- 严格 Schema 约束(把图谱结构告知 LLM)
- LangChain 链式编排(查询生成 → 执行 → 结果合成)
7. 深度洞察与踩坑
洞察一:"模糊匹配 + 地理围栏"构成高鲁棒性实体对齐新范式。拼写纠错(Palo alto → Palo Alto)与 10km 地理围栏组合,实质是"语义容错 + 空间校验"的双重实体消歧机制,在命名不规范场景下可将实体链接准确率提升 30%+(行业基准估算)。
洞察二:图谱即服务(GaaS)需预置"用户反馈闭环"。将用户反馈节点纳入图谱并关联查询结果,当多名用户对某次查询标记"不相关",可自动触发坐标校准或关系权重重训练。
踩坑清单:
| 坑 | 表现 | 解法 |
|---|---|---|
| 先向量索引后约束 | 重复 chunk_id 语义混淆 | 先建 UNIQUE CONSTRAINT |
| 只存文本块不建关系 | 无法多跳推理 | 建模文档层级关系 |
| 忽略地理字段 | 无法空间查询 | 地址解析 + point 类型 |
| Few-shot 示例过少 | Cypher 生成不稳 | 按能力梯度加示例 |
| Schema 不告知 LLM | 生成无效 Cypher | 显式约束 + 链式编排 |
8. 总结
一句话总结:知识图谱把"实体关系"变成可查询、可推理的一等公民,与向量检索形成互补——向量负责语义召回,图负责关系推理,二者融合才能支撑企业级"自然语言→精准答案"的闭环。
互动收尾:你的 RAG 系统目前是纯向量检索,还是已经引入图结构?遇到过多跳关系查询失效的场景吗?在评论区聊聊你的知识图谱落地经验,下一期我们拆解"知识图谱如何赋能企业 API 发现与 Agent 规划"。
本文基于 DeepLearning.AI 课程学习实验,代码步骤可复现。