纯向量 RAG 容易"答得顺但溯源难",尤其涉及实体关系时容易幻觉。本文讲用轻量知识图谱增强 RAG,让答案可溯源。
一、纯向量的短板
向量检索擅长语义匹配,但不擅长"实体间关系"推理。问"某头部厂商和哪家云厂商合作过",向量块可能各自孤立,拼不出关系。
二、KG+RAG 链路
flowchart LR
A[文档] --> B[实体/关系抽取]
B --> C[知识图谱]
A --> D[向量库]
C & D --> E[混合检索]
E --> F[带溯源的生成]
三、示意实体抽取
示意:从文档抽取实体关系(通用实现)
def extract_triples(text: str) -> list:
# llm_extract 返回 (主语, 关系, 宾语) 三元组
return llm_extract(text, schema=["产品", "能力", "适用行业", "合作"])
抽取后写入图库(如 Neo4j)或内存图结构,供混合检索调用。
四、工程实践要点
- 图谱不必全量:先抽高频实体与关键关系,覆盖核心域即可。
- 混合检索:向量负责语义召回,图谱负责关系跳转,二者结果融合重排。
- 溯源:生成时附上命中三元组/块来源,便于核验。
五、常见误区
- 一上来就建全量知识图谱,成本失控。
- 抽出的三元组不校验,错误关系污染图谱。
- 图谱与向量各跑各的,没做融合重排。
六、FAQ
Q1:KG+RAG 一定要图数据库吗?
A:不一定。小规模可用内存图或 JSON 结构;规模大、关系复杂再上 Neo4j 等图库。
Q2:抽取的三元组怎么保证质量?
A:抽取后做一致性校验(实体对齐、关系合法),关键域人工抽检,再回流修正。
Q3:和纯向量比,效果提升在哪?
A:关系类、多跳类问询的准确率与可溯源性强;纯语义匹配问题提升有限。
Q4:图谱多久更新一次?
A:随文档版本更新触发增量抽取,避免全量重建。
Q5:适合什么内容?
A:实体多、关系密的文档(产品手册、行业报告、FAQ)收益最大。