当前位置: 首页 > news >正文

Graph RAG 图检索增强:用知识图谱提升回答质量

Graph RAG 图检索增强:用知识图谱提升回答质量

一、问题背景:传统 RAG 为什么不够用了

检索增强生成(RAG)已经成为大模型落地的事实标配。给 LLM 外挂一个向量数据库,把相关文档片段塞进 prompt,模型就能回答得有理有据。这个范式在过去一年里被无数产品验证过——客服机器人、企业知识库、法律文书助手,几乎每一个"严肃"的 LLM 应用背后都有一个 RAG 管道在运转。

但做久了你会发现,传统 RAG 有一个始终绕不过去的天花板:它只擅长"单跳"问题

什么叫单跳问题?就是那种"查一次文档就能直接回答"的问题。比如:

“公司去年的营收是多少?”
“Transformer 论文发表于哪一年?”

这些问题只需要检索到一个准确的文档片段,LLM 就能直接提取答案。效果很不错。

但真实世界的提问往往没这么简单。考虑下面这种:

“请梳理 Transformer、BERT 和 GPT 三个模型之间的继承和演进关系,并说明各自最关键的技术贡献。”

这就是**多跳推理(Multi-hop Reasoning)**问题——答案不在某一段文档里,而是需要从多个文档片段中抽取实体、建立关联,再进行推理组合。

传统 RAG 处理多跳问题的策略通常是:把前面检索到的内容作为上下文,再次生成查询词进行二次检索。但这里的核心缺陷是——检索是基于语义相似度(向量余弦距离)的,而不是基于实体关系结构的。你搜"Transformer 的改进",向量模型会把所有提到 Transformer 的文档都拉回来,但它不知道"BERT 是 Transformer 的改进"这个关系本身才是问题的关键。

更具体地说,传统 RAG 有三个硬伤:

  1. 信息碎片化:一堆 top-k 文档片段被平铺进 prompt,没有图结构,实体之间的关系被碾成"相关度分数"
  2. 语义漂移:多轮检索时,查询语义在每一次 embedding 变换中逐渐偏离原始意图
  3. 全局缺失:你永远只看得到 top-k,看不到"文档 A 提到了张三,文档 B 提到了张三的公司,文档 C 提到了这家公司的竞争对手"这样的全局图景

这些问题的本质在于:向量检索擅长"相似性匹配",但真实推理需要"结构性关联"。解决这个矛盾,就是 Graph RAG 要做的事。

微软在 2024 年 2 月提出的 Graph RAG 正是在这个背景下诞生的。它的核心思想一言以蔽之:用知识图谱为 LLM 构建一个结构化的"全局记忆",让检索不再只是找相似的文本,而是遍历有逻辑关系的信息节点。从 2024 年 7 月开源graphragPython 库至今(2026 年),Graph RAG 已经演进了多个版本,被 Databricks、Neo4j 等主流平台集成,成为处理复杂知识密集型问答的成熟范式。

二、核心原理:从向量检索到图检索

2.1 传统 RAG vs Graph RAG 的架构差异

先看一张对比图(用文字描述):

传统 RAG 管道: 用户问题 → Embedding → 向量相似度检索 Top-K → 拼接 Prompt → LLM 生成 Graph RAG 管道: 离线阶段: 全量文档 → LLM 实体/关系抽取 → 知识图谱构建 → 社区发现(Leiden) 在线阶段: 用户问题 → 实体匹配 → 图遍历检索(子图提取)→ 结构化上下文 → LLM 生成

核心差异点一目了然:传统 RAG 的检索单元是"文档片段",Graph RAG 的检索单元是"实体及其关系构成的子图"。

2.2 离线阶段:知识图谱构建

这是 Graph RAG 最重的部分,也是整条链路的"基建"。分三步走:

第一步:实体与关系抽取。用 LLM 对全部文档进行结构化抽取。不是简单的 NER,而是要求 LLM 输出三元组(主体实体, 关系谓词, 客体实体)加上实体的描述文本。微软 Graph RAG 的默认抽取 prompt 要求 LLM 以 JSON 格式输出:

{"entities":[{"name":"Transformer","type":"模型架构","description":"2017年Vaswani等提出的基于自注意力机制的序列模型"},{"name":"BERT","type":"模型架构","description":"2018年Google提出的双向编码器预训练模型"}],"relationships":[{"source":"BERT","target":"Transformer","description":"BERT 基于 Transformer 的 Encoder 部分,将双向自注意力引入预训练"}]}

这里有一个工程上的关键权衡:抽取粒度。文档太多时全量 LLM 抽取成本极高(token 消耗 = 文档总字数的 2-3 倍)。实际落地时需要做两件事:

  • 先用轻量 NER 模型(如 spaCy + 自定义 pattern)做初筛,只对高信息密度段落用 LLM 抽取
  • 设置chunk_size为 300-800 tokens(而不是 RAG 常见的 512-1024),小块抽取更精确

第二步:知识图谱存储。三元组导入图数据库。Neo4j 是最主流的选择(支持 Cypher 查询 + 原生图算法),也可以用 NetworkX(小规模实验)或 NebulaGraph(分布式场景)。图中的节点是实体,边是关系,每个节点和边都携带 LLM 生成的文本描述作为属性。

第三步:社区发现。这是 Graph RAG 区别于普通"知识图谱+RAG"的关键创新。用Leiden 算法对构建好的图做层次聚类,将关联紧密的实体分到同一个社区,再对每个社区生成一份"社区摘要"(Community Summary)——用 LLM 把该社区内所有实体和关系整合成一段自然语言描述。

为什么要做社区发现?因为当用户问一个高层次问题时,我们需要的不是某个实体的一跳邻居,而是一整个"话题社区"的全局视角。比如问"自注意力机制的发展历程",最好的检索结果应该是包含 Transformer、BERT、GPT、ViT 等实体的那个社区摘要——它已经帮你把踩在"A 后来发展成 B,B 又启发了 C"这条链上的关键信息整合在一起了。

2.3 在线阶段:图遍历检索

用户提问后,Graph RAG 的检索不再是做向量相似度计算,而是做图遍历

  1. 实体匹配:从用户问题中抽取关键实体,在图数据库中精确匹配(也可以用向量近似匹配处理拼写变体)
  2. 子图提取:以匹配到的实体为起点,沿着边做 1-3 跳遍历,提取包含邻居实体和关系的子图
  3. 社区召回:找到这些实体所属的社区,把对应的社区摘要加入候选
  4. 上下文排序与截断:根据与问题的相关性对所有候选上下文排序,截取 top-k(但这里的"上下文"是结构化的实体-关系网络,不是无结构的文本片段)

最终喂给 LLM 的 prompt 长这样:

# 相关知识图谱上下文 ## 社区摘要 [社区 1 的自然语言描述] ## 相关实体 - Transformer: 基于自注意力机制的序列到序列模型架构... - BERT: 基于 Transformer Encoder 的双向预训练模型... - GPT: 基于 Transformer Decoder 的自回归语言模型... ## 实体间关系 - BERT → 基于 → Transformer - GPT → 基于 → Transformer - BERT → 启发了 → RoBERTa ... 请基于以上结构化知识回答用户问题:[用户问题]

你会发现,这里给 LLM 的不是"一堆文档片段",而是"一张知识地图"。LLM 不再需要从零散的文本中自己推断关系——关系已经显式地摆在它面前。这就是 Graph RAG 在多跳推理上大幅优于传统 RAG 的根本原因。

三、实战代码:用 LangChain + Neo4j 搭建 Graph RAG

下面从零搭建一个可运行的 Graph RAG demo。我们以"AI 模型演进史"为文档集,构建知识图谱并进行图检索问答。

3.1 环境准备

# requirements.txt# langchain>=0.3.0# langchain-openai>=0.2.0# neo4j>=5.20.0# langchain-neo4j>=0.1.0# networkx>=3.2# python-dotenv>=1.0.0importosfromtypingimportList,Dict,Tuplefromlangchain_openaiimportChatOpenAI,OpenAIEmbeddingsfromlangchain_neo4jimportNeo4jGraph,GraphCypherQAChainfromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain_community.graphs.graph_documentimportGraphDocument,Node,Relationshipfromlangchain_core.documentsimportDocumentimportnetworkxasnxfromdotenvimportload_dotenv load_dotenv()# 初始化 LLM 和 Embedding 模型llm=ChatOpenAI(model="gpt-4o",temperature=0.1)embeddings=OpenAIEmbeddings(model="text-embedding-3-small")# 连接 Neo4j(需要先启动 Neo4j 容器或本地服务)graph=Neo4jGraph(url="bolt://localhost:7687",username="neo4j",password=os.getenv("NEO4J_PASSWORD","password"))

3.2 文档处理与实体/关系抽取

# 模拟文档集——关于 AI 模型演进documents=[Document(page_content="Transformer 由 Vaswani 等人在 2017 年提出,引入了自注意力(Self-Attention)机制,取代了传统的 RNN 和 CNN 架构。"),Document(page_content="BERT 由 Google 在 2018 年发布,基于 Transformer 的 Encoder 部分,通过掩码语言模型(MLM)进行双向预训练。"),Document(page_content="GPT-1 由 OpenAI 在 2018 年发布,基于 Transformer 的 Decoder 部分,采用自回归语言建模方式进行预训练。"),Document(page_content="GPT-3 于 2020 年发布,参数量达到 175B,展示了强大的上下文学习(In-Context Learning)能力。"),Document(page_content="GPT-4 于 2023 年发布,是多模态模型,支持文本和图像输入,在多项基准测试中达到人类水平。"),Document(page_content="LLaMA 由 Meta 在 2023 年开源,证明小模型在足够多的数据上训练也能达到大模型的效果。Chinchilla 缩放定律是其理论基础。"),Document(page_content="Chinchilla 缩放定律由 DeepMind 在 2022 年提出,指出最优训练应当等比例扩展模型参数量和训练数据量。"),]# 文本分块text_splitter=RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50)chunks=text_splitter.split_documents(documents)print(f"共{len(chunks)}个文本块"
http://www.rkmt.cn/news/1440789.html

相关文章:

  • 凯撒易食对凯撒旅业业绩贡献有多大? - 品牌2026
  • 为轮椅用户设计的纯机械可拆卸防虫门:铰链改造与人体工学实践
  • Supermemory:为 AI 赋予记忆能力,三大基准测试均排名第一!
  • AI能识别骗子,但为什么骗子也越来越像AI?
  • AI艺术平台Atriv与Flare Network联手:如何实现跨链NFT的简易创作与交易
  • 手把手教你走全国陪诊师报名流程,5 步搞定不迷路 - 品牌排行榜单
  • 基于ESP8266的超级马里奥音乐播放器:从PCB设计到固件烧录全流程
  • 从传感器到执行器:用Arduino打造智能感应小夜灯全流程解析
  • 基于Arduino与超声波传感器的互动机器人头部制作全解析
  • 2026年6月电磁流量计厂家十大品牌盘点——哪一家更适配市政污水及工业污水的计量? - 康宝莱智慧水务
  • 嵌入式C++实现维吉尼亚密码:从算法原理到Raspberry Pi Pico实战
  • 智慧树自动刷课终极指南:三步实现高效学习自动化
  • FigmaCN终极汉化指南:3分钟让Figma界面全面中文化
  • 基于树莓派Zero 2W的智能花盆:从传感器到情绪显示的物联网实践
  • 基于Arduino与PID算法的温控加热垫:从闭环控制到硬件实现
  • 海康摄像头RTSP流密码含加号、@、#等特殊字符怎么办?Python urllib.quote_plus一键解决
  • Sora 2编码参数到底怎么设?92%用户错配的QP初始值、VBV缓冲上限与motion_estimation精度三重陷阱揭晓
  • HexEdit深度解析:专业级十六进制编辑器的实战指南
  • 基于ESP8266与L298N的智能门锁DIY:从硬件连接到App控制全解析
  • 电脑黑屏蓝屏?15分钟硬件级RAM重置全攻略
  • 3步掌握魔兽争霸3终极优化:告别闪退卡顿,畅享经典对战
  • UVa 359 Sex Assignments And Breeding Experiments
  • KMS_VL_ALL_AIO:3分钟永久激活Windows与Office的终极方案
  • Translumo终极指南:Windows平台实时屏幕翻译神器快速上手
  • 给电子小白的51单片机开箱指南:从认识STC89C52到用Keil5点亮第一个LED
  • Arduino智能避障机器人:从传感器到电机驱动的嵌入式实践
  • K8s Deployment 扩容 10 个实战案例(项目教学法)【20260601】002篇
  • 别再被libpython3.7m.so.1.0找不到搞懵了!Ubuntu/Debian系统下5分钟修复指南
  • 流程业务AI赋能:从自动化到智能化的五步实践与避坑指南
  • 如何快速找出Windows热键冲突:专业工具的3分钟解决方案