图检索增强生成 Graph RAG

Graph RAG

基于知识图谱结构组织检索单元的 RAG 变体,通过实体-关系三元组建模文档间关联,支持多跳推理与全局事实一致性。

详细解释

Graph RAG(Graph Retrieval-Augmented Generation) 一句话定义:不再把文档切成独立 chunk 直接向量检索,而是先从所有文档中抽取出(实体, 关系, 实体)三元组构建知识图谱,再把用户问题转成「图谱上的游走+子图检索」,最后把子图结构 + 原始 chunk 一起送给 LLM 生成答案。普通向量 RAG 容易患上「chunk 孤岛症」——A 文档说「张三是 B 公司 CTO」,B 文档说「B 公司 2024 年营收 10 亿」,两个 chunk 向量不相似,搜「张三所在公司去年营收多少」很可能两段都搜不全;Graph RAG 因为先建立了张三→任职→B 公司→营收→10 亿的连接,两步推理直接命中。

微软 2024 年提出的 GraphRAG(首字母大写 = 微软具体实现,小写 = 泛指技术范式)是当前最主流的工程化蓝本:它不要求你提前有 Neo4j,而是先让 LLM 对每个 chunk 做「实体-关系抽取」,自动在内存里建图,再做「社区发现」(Leiden 算法把紧密相连的实体聚类成社区),最后每个社区让 LLM 生成一段「社区摘要」。用户提问时:先选和问题最相关的若干社区 → 把社区摘要 + 社区里所有三元组 + 原始 chunk 一起塞进上下文。实测在「跨 10 篇以上文档的全局聚合类问题」上,Graph RAG 的答案完整度比普通向量 RAG 高 30% 至 60%,缺点是离线建图阶段要花 5 至 10 倍 token 成本。

唯元智创 API 网关内置了「一键 Graph RAG 流水线」:给一个 S3 桶或飞书知识库地址,自动做抽取→建图→社区发现→摘要,召回阶段自动根据问题复杂度在「普通向量召回」和「图谱+向量混合召回」之间切换,复杂问题自动走 Graph,简单单文档问答走普通 RAG 降本。

三种 Graph RAG 工程形态对比

形态图从哪来适合场景延迟成本倍数
① 轻量共现图不用 LLM 抽三元组,chunk 间「共同实体 ≥2 个」就连边,图 = 实体-chunk 二部图1000 篇文档以内的中小知识库和普通 RAG 几乎一样建图成本 +20%,查询 +0%
② 微软 GraphRAG 式社区摘要图LLM 抽三元组 → Leiden 社区发现 → LLM 写社区摘要千至十万篇文档级,全局聚合类问题多比普通 RAG 慢 30% 至 50%建图 +5 至 10 倍 token
③ 显式企业知识图谱(Neo4j/Nebula)已有成熟图谱资产,RAG 检索阶段做 SPARQL/Cypher + 向量混合召回金融/医疗/制造已有主数据图谱的企业查询时多次跳查询慢 2 至 3 倍图谱维护是长期成本,RAG 本身 +0%

Graph RAG 相对普通向量 RAG 的两个真·优势和一个误区

两个真实优势:(1) 多跳/跨文档问题天然解决——「给我列出 2024 年所有和 A 公司合作过的、总部在上海的、员工人数超过 500 人的供应商」,普通向量 RAG 要在 10 个 chunk 里拼齐信息,漏一个条件答案就错;Graph RAG 在图上一条路径跑到底。(2) 可溯源性极强——每个答案里的事实都能指向具体的(实体, 关系, 实体)三元组,三元组再指向是从哪篇文档哪个位置抽出来的,审计链完整,B 端合规场景刚需。

一个常见误区:别以为「有了图就不需要向量检索了」。Graph RAG 在「开放式描述类问题」(如「帮我总结一下今年客户反馈里关于产品体验的主要抱怨点」)上召回质量反而比纯向量差——因为描述类问题里没有清晰实体,图谱匹配不上。生产环境正确姿势永远是「混合召回」:向量召回 Top-K、图谱召回子图、关键词 BM25 召回 Top-K,三路 Rerank 合并,三路都没命中的判定为无答案。

常见问题

LLM 抽取三元组时抽取错了(张三→任职→A 公司,但真实是 B 公司),Graph RAG 不就比普通 RAG 错得更离谱?
抽取错误是 Graph RAG 最大的单点故障源,必须做「三元组置信度 + 双抽取交叉验证」两道防线。工程上标准做法:(1)同一个 chunk 让两个不同的 LLM(如 GPT-4o-mini + Claude 3.5 Haiku)独立抽三元组,取交集入库,单边抽取的标「置信度=低」,召回时只在候选不足时才取;(2)每条三元组必须挂「source_doc_id + source_span」字段——证明这句话在原文哪句话里确实出现过,没有原文支撑的三元组直接丢弃;(3)每月跑一次「图谱一致性校验」:比如检测到「张三→任职→A 公司」和「张三→任职→B 公司」同时存在且时间重叠,标红告警让人工修。按这套做下来,三元组准确率通常能从 82% 左右提升到 97% 以上,错三元组导致的错误答案比例降到 1% 以内。
10 万篇以上文档的超大规模知识库,Graph RAG 建图太慢,有什么降本加速方案?
超大规模下用「分层建图 + 抽样抽取」策略,通常能把建图 token 成本降到微软原版的 15% 左右,质量只降 3% 至 5%。具体三层:(1)最顶层(领域层):只对每个文档的摘要/元数据(标题、标签、目录结构)抽三元组,建立「文档-主题-作者-时间」的高层图,这一层抽一次几千个三元组就够;(2)中间层(主题社区层):对 10 万篇文档先用 embedding 做 K-means 聚类成 200 至 500 个主题簇,每个簇只抽 20 篇最靠近簇心的代表性文档做 LLM 三元组抽取,代表整个簇;(3)底层(证据层):完全不做 LLM 抽取,只用轻量共现图(共同实体就连边)。查询时:先在顶层定位到正确主题簇 → 中间层该簇的代表三元组全取 → 底层在该簇范围内做向量召回,全量文档不再做 LLM 抽。
Graph RAG 和传统知识图谱问答(KBQA)是什么关系?
核心区别:KBQA 的图是「人工/结构化清洗过的金标准图」,查询是「把自然语言转成 SPARQL/Cypher 在图上精确查」;Graph RAG 的图是「LLM 自动从非结构化文档里抽的、脏的、带噪声的近似图」,查询是「检索 + LLM 生成,允许查不全用生成补」。KBQA 优点是精准(对就是对,错就是错),缺点是图的覆盖率极低——任何图里没录入的实体/关系直接查不出来,图的建设维护成本百万起;Graph RAG 牺牲了 5% 至 10% 的精确率,换来了「任何一堆 PDF/Word 扔进去就能用」的覆盖力,建设成本从百万降到几万量级。企业通常两者并存:核心主数据(客户、产品、订单)走 KBQA 精确查,非结构化文档(合同、客服记录、会议纪要)走 Graph RAG 模糊查,两个结果拼起来给最终答案。