GraphRAG是什么?
GraphRAG(Graph Retrieval-Augmented Generation)是一种结合了知识图谱(Knowledge Graph)与检索增强生成(RAG)的技术,旨在提升大语言模型(LLM)在复杂问答、知识推理等任务中的准确性和可解释性。
优势和挑战
传统RAG的局限
- 碎片化检索:传统RAG(如基于向量相似度检索)可能返回孤立、片段化的文本,难以捕捉实体间的深层关系。
- 缺乏全局上下文:无法整合跨文档的复杂关联(如“某公司的CEO的配偶创办的基金会”这类多跳问题)。
GraphRAG优势
- 多跳推理:直接通过图路径回答复杂关联问题。
- 可解释性:答案可追溯至图谱中的具体节点和边。
- 动态更新:新增知识时只需更新图谱,无需重新训练模型。
GraphRAG挑战
- 图谱质量:错误的三元组会导致级联误差。
- 稀疏场景:冷门实体的关系可能缺失。
- 计算成本:大规模图查询的实时性优化。
核心思想
- 知识图谱作为记忆库:将结构化知识(实体、关系、属性)存储在图数据库中(如Neo4j),而非非结构化文本。
- 图感知检索:通过图查询(如Cypher、SPARQL)或图神经网络(GNN)显式挖掘实体间的多跳路径,提供逻辑连贯的上下文。
- 生成增强:LLM基于图谱检索到的子图(包含实体、关系、文本描述)生成答案,兼具事实性与推理能力。
工作流程示例
问题:“爱因斯坦获得诺贝尔奖的研究领域与哪些技术发明有关联?”
1、图谱构建:从文献中提取实体(爱因斯坦、诺贝尔奖、光电效应、激光技术)及关系(爱因斯坦-研究->光电效应、光电效应-应用->激光技术)。
2、图检索:定位“爱因斯坦→诺贝尔奖→光电效应→激光技术”的路径。
3、生成答案:LLM结合子图和原始文本描述,生成:“爱因斯坦因光电效应获诺贝尔奖,该理论后来成为激光技术的基础。”
技术实现
- 图谱构建:用NLP工具(如spaCy、UIMA)抽取实体关系,或结合LLM自动构建(如通过GPT-4生成三元组)。
- 检索策略:混合图检索(路径查找)与向量检索(文本语义匹配)。
- 生成模型:微调LLM以理解图谱输入(如将子图序列化为文本或特殊标记)。
FAQ
底层数据频繁更新适合使用GraphRAG吗?
底层数据频繁更新时,GraphRAG 可以用,但必须把“图模式”做成:
- 只保留缓慢变化的骨架(实体、长期关系);
- 把高频波动的字段(价格、库存、状态、点击数)迁出图,做成外部时间序列表/KV 存储;
- 查询时图查骨架 + 外表补数值,两者一起送进 LLM。
否则,每一次高频更新都会触发:
- 图数据库的锁/事务风暴 → 写入吞吐掉一个量级;
- 子图版本爆炸 → 历史快照把磁盘吃光;
- 向量/文本索引频繁重建 → CPU 被拖死;
- LLM 上下文里混入过期值 → 答案前后矛盾。
把“变”与“不变”拆开
| 数据特征 | 举例 | 在图里? | 存储形态 | 更新频率 |
|---|---|---|---|---|
| 静态骨架 | 公司、产品、人、品牌、地理、法规条款 | ✅ 主图(冷图) | 图数据库(Neo4j/TigerGraph) | 天/周级 |
| 准静态关系 | 股权结构、隶属、上下游、合作、位于、属于 | ✅ 主图 | 同上 | 天/周级 |
| 快速属性 | 股价、库存、PV、UV、评分、物流状态 | ❌ 迁出 | KV/RDB/时序库(Redis、Postgres、Influx) | 秒/分钟级 |
| 临时事件 | 订单、支付、传感器读数、日志 | ❌ 迁出 | 事件流(Kafka)+ 物化视图 | 毫秒级 |
查询链路:图给上下文,外表给实时值
===>用户问题:
“X 公司当前股价是多少?它的最大股东 Y 上周减持后,还持有多少比例?”
===>检索&召回步骤:
1、图查询(只读,毫秒级)
MATCH (c:Company{name:'X'})<-[h:HOLD]-(y:Shareholder{name:'Y'})
RETURN h.ratio as last_ratio, h.lastUpdate as ratio_ts
→ 拿到“最近一次记录的持股比例 12 %,上周三更新”。
2、外部 KV 查(Redis)
GET x_stock_price → 18.42 USD
3、Prompt 拼装
已知:
- X 公司实时股价 18.42 USD(来源:交易所,更新时间 14:30:05)。
- 根据知识图谱,Y 最近一次披露的持股比例为 12%,披露日 2025-09-17。
请回答用户问题……
4、LLM 生成答案
关键点
- 图只承担“关系定位”和“缓慢属性”,不背实时值的锅;
- 实时值在最后一秒才捞,保证新鲜;
- 若监管要求“必须用最新披露比例”,则把“披露事件”也当事件流,图里存“指针”,外表存“最新值”,查询时二次确认。
什么时候不该用GraphRAG?
- 业务全是单点属性查询(如“当前汇率”“此刻温度”),无多跳关系 → 直接 KV+RAG 足够;
- 更新频率高到毫秒级,且每次更新都要立即体现在答案(如高频交易策略定价)→ 图骨架也来不及,LLM 直接调实时 API;
- 图谱规模 <10 万节点,关系简单 → 传统 RAG+向量召回更轻。
GraphRAG 不怕“数据变”,就怕“把变得太快的数据塞进图”。
把图当“稳定骨架”,把快变数据当“外挂血条”,就能在频繁更新的场景里既享受图谱的多跳推理,又不被实时写入拖垮。