【RAG系列】KG-RAG 用最简单的方式将知识图谱引入RAG

目录

前言

一、引入知识图谱的作用

二、引入知识图谱的挑战

三、KG-RAG的理论

query多跳有限性

知识局部密集性

四、KG-RAG的方法

向量入库

向量相似搜索

扩展子图

LLM Rerank

LLM response

五、效果比对

六、源码

总结


前言

本文介绍一种比较新颖的RAG范式,KG-RAG,将知识图谱融入到RAG范式中,提高知识召回率。KG-RAG基于query多跳有限性 和 知识局部密集性 两点思想,提出了一套在知识图谱上检索相关实体知识的流程,在回答上准确性上有着很不错的表现。


一、引入知识图谱的作用

RAG通过给LLM提供回答query所需的知识,改善LLM的幻觉、领域知识不足等问题,但仅仅靠RAG范式存在一定局限性,尤其在处理复杂的实体关系和多跳问题的时候,模型往往难以提供准确的回答。

将知识图谱引入RAG系统为解决上述问题提供了新的思路,通过引入KG,RAG在回答实体关系和多跳问题的时候能够更精确地定位相关知识。Direct LLM、RAG 和 GraphRAG对比:

问题:19世纪的艺术运动是如何影响20世纪现代艺术的发展的?

Direct LLM:19世纪的艺术运动通过鼓励对色彩、形式和题材的实验影响了20世纪的现代艺术。这些运动为抽象主义、表现主义和其他创新艺术开辟了道路。

RAG:

检索文本:

1.  像克劳德·莫奈这样的印象派艺术家引入了新技术,彻底改变了对光和颜色的描绘

2.  印象派的技法影响了后来的艺术运动。

3.  毕加索开创了立体主义,从根本上改变了视觉表现的方式

4.  立体主义出现在20世纪初,挑战了传统的艺术观点。

回答:

19世纪,像克劳德·莫宁这样的印象派艺术家引入了影响后来艺术运动的新技术。帕布洛·毕加索在20世纪初提出了立体派相对论。

GraphRAG:

检索三元组:

莫奈-引进-新技术

新技术-革命性的-光与色的描绘

印象派技法-影响-后期艺术运动

毕加索-先驱-立体主义

立体主义-出现于-20世纪初

回答:

莫奈引进的新技术彻底改变了对光和色彩的描绘。他的印象派技术影响了后来的艺术运动,包括毕加索的立体派,这一影响在20世纪初形成。这种影响帮助塑造了毕加索对碎片化视角的创新方法。

显然,在引入KG的实体知识后,LLM的回答更具体更具有逻辑性。Direct LLM和RAG的回答也算沾边,但是缺少详细的实体信息导致不够连贯,有点一知半解。

二、引入知识图谱的挑战

KG-RAG 还处于早期的探索阶段,最关键的问题是如何根据 query 有效检索到 KG 中的相关 entities 和 relationships。

比如,微软的 From Local to Global 使用大量的 LLM 访问将子图结构以汇总成社区摘要,但这一过程消耗大量的 LLM tokens,使这一方法昂贵且不切实际。HippoRAG 使用 Personalized PageRank 重新更新图节点的权重,以找到重要的 entities,但这种以 entity 为中心的方法很容易受到 NER 遗漏的影响,而忽略了上下文中的其它信息。IRCoT 使用多步LLM 请求来逐步推理得到最终的回答,但这种方法将 LLM 引入多跳查找过程,导致回答问题的时间过长,很难实际应用。

但实际上使用一个简单的 多路召回 然后 rerank 的 RAG 范式,就能够很好的处理复杂的多跳 KG-RAG 场景,这一过程仅仅用到向量存储和少量的 LLM 开销。

三、KG-RAG的理论

KG-RAG 因为以下两点而有效:query多跳有限性 和 知识局部密集性。

query多跳有限性

直觉上,用户的提问query不太可能涉及非常多的 entities 和 relationships,否则这个问题会很奇怪,例如:

正常的query:爱因斯坦获得诺贝尔奖的时间是哪一年?(2跳)

查询路径:

  • 找到节点“爱因斯坦”。

  • 跳转到与“爱因斯坦”相关的“诺贝尔奖”节点。

  • 返回奖项颁发的年份信息。

奇怪的query:相对论发现者获得诺贝尔奖年份与他们在一个以银行保密法和阿尔卑斯山壮丽风景而闻名的国家发明的专利数量之间有什么关系?(7跳)

显然,正常的query更符合用户的提问习惯,即用户想要知道的是与某个具体实体直接相关的单一事实。知识图谱在这种情况下只需要进行少量跳数的查询即可完成任务,因为所有相关信息都直接与爱因斯坦这个中心节点关联。这种查询在实际应用中非常普遍,例如查询名人背景信息、奖项历史、事件时间等。

知识局部密集性

知识图谱中存在着一些局部 dense 结构,对于有些 query,有一些“捷径”,可以从一个 entity 通过捷径快速连接到多跳之外的 entity:

Daniel 是 Alex 的舅舅 (Daniel-uncle_of-Alex) 这条路径就可以通过另外三条路径推导出来。

结合 query多跳有限性 和 知识局部密集性 可以得到如下结论:有限次的在知识图谱中的路由查找过程,往往只涉及到局部的知识图谱信息。因此 KG-RAG 的检索过程可以通过以下两步实现:

1. 找到路由起点,可以通过向量相似度查找来完成。涉及 query与entities 和 query与relationships 的相似度查找。

2. 从起点找到其他信息,这一步可以交给LLM完成,将以起点为中心的局部子图交给LLM,由LLM自己来挑选和推导实体的信息。输入局部子图是由于多跳有限性。

整个过程不需要复杂的 KG存储和 KG查询语句,只需要使用 vector database 和一次 LLM 的调用。vector retrieval + LLM rerank 是这个 pipeline 中最关键的部分,这也就解释了只用一个简单的两路召回,就可以达到远超基于图理论的方法(如 HippoRAG) 的表现。这也说明不需要复杂的图算法,只需要将图结构的逻辑关系存储在向量数据库里,用一个传统的架构就可以进行逻辑上的子图路由,而 LLM 强大的能力帮助做到了这一点。

四、KG-RAG的方法

假设已经得到了一组 corpus 的三元组信息,它包含一系列的 entities 和 relationships 信息。这些信息可以表示一个知识图谱的信息。

总的来说,将 entities, relationships 信息分别进行向量化,并存储在向量存储里。当进行 query 查询时,会先把相关的 entities 和 relationships 检索出来。通过这些 entities 和 relationships,在图结构上进行有限的拓展。将这些 relationships 与 query 组装进 prompt 内,使用 LLM 的能力对这些 relationships 进行 reranking。最后得到 topK 个重要的 relationships,在他们的 metadata 信息内获得与他们相关的 passages,作为最终的 retrieved passages。

向量入库

准备两个向量存储 collections,一个是 entity collection,另一个是 relationship collection。将一系列的 unique entities 信息和 relationships 信息,使用 embedding 模型转换成向量存储在向量存储中。对于 entities 信息,直接将他们的字符描述转换成 embedding。对于 relationships 的原始数据形式,它的结构是一个三元组:

(Subject, Predicate, Object)

我们启发性地直接将它们合并成一个句子

"Subject Predicate Object"

比如:

(Alex, child of, Brian) -> "Alex child of Brian"

(Cole, married to, Brian) -> "Cole married to Bria"

然后直接将这个句子转换成 embedding,存储在向量数据库里。虽然这样做可能存在少量的语法问题,但这不影响句子含义的表达,也不影响它在向量空间中的分布。当然,同样鼓励在前期抽取三元组的时候,直接使用 LLM 生成简短的句子描述。

向量相似搜索

  • 对于输入的 Query,遵循常见的 GraphRAG 中的范式(如HippoRAG,MS GraphRAG),提取 query 中的 entities,对于每个 query entity,转换成 embedding,分别对 entity collection 进行 vector similarity search。然后将所有 query entities搜索得到的结果进行合并。

  • 对于 relationship 的向量搜索,直接将 query string,转换成 embedding,对 relationship collection 进行 vector similarity search。

扩展子图

分别以搜索到的 entities 和 relationships 为知识图谱里的起始点,往外扩大一定范围,然后将两个扩展子集的 relationships 进行合并。具体来说:

entities扩充:对于起始entities,往外扩大一定的跳数后取它们邻接的relationships。

relationship扩充:往外扩大一定的跳数得到扩展的relationships。

将两者的relationships合并,得到最终的relationships集合。

基于多跳有限性,仅需要扩大较小的度数(如1,2等)就能涵盖大部分可能有助回答的 relationships。这一步扩展的度数的概念和回答问题总共需要的跳度的概念不同。比如,如果回答一个 query 问题涉及两个相差 n 跳的 entities,那么实际上往往只需要扩展 ⌈n / 2⌉ 度就可以,因为这两个 entities 是被向量相似召回后的两个起始端点。如图,向量召回到了两个红色的 entities,只需要从它们开始相向扩展 2 度就能覆盖到 4 度的跳数,这足以回答涉及到这两个 entities 的 4 跳问题。

LLM Rerank

这一步中,使用 LLM 强大的语义理解能力对 relationships 候选集的进行筛选和排序。具体来说,使用 one-shot Chain-of-Thought prompt,将 query 和 relationships 候选集放入 prompt 里,要求 LLM 从中选择出可能对回答这个 query 有帮助的 relationships,并写下思考过程。规定 LLM 的返回为 json 格式,以便于解析。具体的 prompt 参考如下:

输入:

I will provide you with a list of relationship descriptions. Your task is to select 3 relationships 

that may be useful to answer the given question. Please return a JSON object containing 

your thought process and a list of the selected relationships in order of their relevance.

**Question:**
When was the mother of the leader of the Third Crusade born?

**Relationship descriptions:**
[1] Eleanor was born in 1122.
[2] Eleanor married King Louis VII of France.
[3] Eleanor was the Duchess of Aquitaine.
[4] Eleanor participated in the Second Crusade.
[5] Eleanor had eight children.
[6] Eleanor was married to Henry II of England.
[7] Eleanor was the mother of Richard the Lionheart.
[8] Richard the Lionheart was the King of England.
[9] Henry II was the father of Richard the Lionheart.
[10] Henry II was the King of England.
[11] Richard the Lionheart led the Third Crusade.

LLM response:

{

         "thought_process": "To answer the question about the birth of the mother of the leader of the Third Crusade, I first need to identify who led the Third Crusade and then determine who his mother was. After identifying his mother, I can look for the relationship that mentions her birth.",
         "useful_relationships": [
                      "[11] Richard the Lionheart led the Third Crusade",
                      "[7] Eleanor was the mother of Richard the Lionheart",
                      "[1] Eleanor was born in 1122"
          ]
}

这个 prompt 是一个展示的参考,实际上把 relationships 中的三元组转成一个通顺的短句是一个棘手的问题。但是完全可以用上文提到的启发性的方法把三元组直接拼在一起。如:

(Eleanor, born in, 1122) 可以直接转成 Eleanor born in 1122

这种方式有时会带来一定的语法问题,但它是最快最直接的方式,也不会对 LLM 带来误解。

LLM response

在上面的例子中,实际上可以在 LLM rerank 这个阶段直接返回最终的回答,比如在 One shot output prompt 的 json 字段里加上比如 “final answer”的字段。但是这一步的 prompt 里只有 relationships 的信息,不一定所有问题都可以在这个阶段返回最终答案,所以其它具体的信息需要从原始的 passsage 里获得。

LLM 返回精确排序的 relationships后,只需要取出之前存储的 relationship 信息,从中获取相应的 metadata中对应的 passage ids。这些 passages 信息就是最终被 retrieved 到的 passages。后续生成回答的过程和 naive RAG 一样,将它们放入 prompt 的 context 中让 LLM 给出最后的回答。

五、效果比对

使用与 HippoRAG 中一致的 dense embedding,facebook/contriever,作为 embedding 模型,可以看到在三个 multi-hop 的数据集上结果比较上,KG-RAG大幅超过 naive RAG 和 HippoRAG 的结果。所有的方法使用相同的 embedding 模型设置。使用 Recall@2 作为衡量指标,

Recall(召回率) = 检索到的相关文档总数/数据存储中相关文档总数

六、源码

https://milvus.io/docs/graph_rag_with_milvus.md


总结

回顾KG-RAG的方法,把 entities 和 relationships 转成向量并进行搜索就是在寻找子图的起点,它像是破解刑侦案件中的现场发现的“线索”。而后面扩展子图和 LLM rerank 的过程像是具体通过这些“线索”进行分析的过程,LLM 拥有“上帝视角”,可以在一众的候选 relationships 中,聪明地选择对破案有用的 relationships。这两个阶段回归本质也就是对应朴素的 vector retrieval + LLM reranking 范式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/909699.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.《双指针篇》---⑥和为S的两个数字(中等但简单)(牛客)

题目传送门 方法一:暴力解法。双循环 方法二:双指针(推荐) 1.定义一个顺序表,定义左右双指针 2.while循环。判断array[left] array[right] 的值。 3.若等于则将这两个值加入数组。并break 4.若大于则right-- 5.若小于…

【学术论文投稿】Python网络爬虫全攻略:从零到一,打造你的数据收集利器

【IEEE出版 | 中国石油大学(华东)主办】第六届信息与计算机前沿技术国际学术会议(ICFTIC 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看:https://ais.cn/u/nuyAF3 目录 引言 什么是网络爬虫? Python网络爬虫的…

LWIP通信协议UDP发送、接收源码解析

1.UDP发送函数比较简短,带操作系统和裸机一样。以下是udp_sendto源码解析; 2.LWIP源码UDP接收数据 2.1.UDP带操作系统接收数据,以下是源码解析; 2.2.UDP裸机接收数据,以下是源码解析

3^100的位数判断

3^100的位数判断 问题来源 字节面试&#xff0c;面试官提问&#xff1a;口算估计3^100的位数&#xff0c;或是给出位数估计范围。 解决方案 方法一&#xff1a; 该方法纯口算&#xff0c;可得一个较为准确的一个范围 2 100 < 3 100 < 4 100 2^{100}<3^{100}<…

Vue2进阶之Vue3高级用法

Vue3高级用法 响应式Vue2&#xff1a;Object.definePropertyObject.definePropertythis.$set设置响应式 Vue3&#xff1a;Proxy composition APIVue2 option API和Vue3 compositionAPIreactive和shallowReactivereadonly效果toRefs效果 生命周期main.jsindex.htmlLifeCycle.vue…

大微DW421专为电子雾化器设计的大功率MEMS硅麦咪头芯片

在电子雾化器领域&#xff0c;一款高性能、高稳定性的咪头是实现优质用户体验的关键。大微DW421功率咪头&#xff0c;广泛应用在电子雾化类设备的21W大功率集成硅麦咪头芯片&#xff0c;集成了最新的MEMS硅基膜微机电系统技术&#xff0c;赋予了咪头更高的灵敏度和稳定性&#…

机器人零位、工作空间、坐标系及其变换,以UR5e机器人为例

机器人中的主要坐标系 在机器人中&#xff0c;常用的坐标系包括&#xff1a; 基坐标系&#xff08;Base Frame&#xff09;&#xff1a;固定在机器人基座上的坐标系&#xff0c;用于描述机器人的整体位置和方向&#xff0c;是其他所有坐标系的参考点。 连杆坐标系&#xff08…

「Mac畅玩鸿蒙与硬件24」UI互动应用篇1 - 灯光控制小项目

本篇将带领你实现一个互动性十足的灯光控制小项目&#xff0c;用户可以通过点击按钮来控制灯光的开关。该项目将涉及状态管理、动态图片加载以及按钮交互&#xff0c;是学习鸿蒙应用开发的重要基础。 关键词 UI互动应用状态管理动态图片加载用户交互 一、功能说明 在这个灯光…

vue+websocket实现即时聊天平台

目录 1 什么是websocket 2 实现步骤 2.1 导入依赖 2.2 编写代码 1 什么是websocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它主要用于在客户端和服务器之间建立持久的连接&#xff0c;允许实时数据交换。WebSocket 的设计目的是为了提高 Web 应用程序的…

本地跟单软件,精准跟随、实时同步 轻松实现自动跟单 MT4免费EA

指标名称&#xff1a;本地跟单软件 版本&#xff1a;MT4 ver. 2.01&#xff08;EA&#xff09; 我们经常在一些论坛或网站上看到一些朋友提供的观摩账户吧&#xff0c;可以看到别人的账户情况&#xff0c;遇到有实力的交易者&#xff0c;很是羡慕啊。 如果我们自己的账户可以…

基于stm32的智能电子称(开源)

功能演示 基于stm32的智能电子称 简介 这是最近别人让我帮他做的一个毕业设计&#xff0c;总体来说非常简单&#xff0c;半天都不需要就可以实现&#xff0c;我做完之后&#xff0c;打算开源在这里让大家进行学习&#xff0c;我们先看一下他的任务书吧: 主要内容与基本要求&am…

写过的试卷怎么打印出新的?

当您有一份已经完成的试卷&#xff0c;但又需要重新打印一份全新的试卷时&#xff0c;这似乎是一个令人头疼的问题。不用担心&#xff0c;这里为您介绍一种简便的方法——利用“扫描”或“试卷还原”的软件&#xff0c;通过拍照的方式&#xff0c;将试卷上的答案清除&#xff0…

【51单片机】串口通信原理 + 使用

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接…

动态规划 —— dp 问题-打家劫舍II

1.打家劫舍II 题目链接&#xff1a; 213. 打家劫舍 II - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/house-robber-ii/ 2. 题目解析 通过分类讨论&#xff0c;将环形问题转换为两个线性的“打家劫舍|” 当偷第一个位置的时候&#xff0c;rob1在&#…

开车去内蒙古旅游要做什么准备?

一、车辆选择与准备 车辆类型&#xff1a; 尽量选择越野车或SUV&#xff0c;这类车辆底盘高、通过性好&#xff0c;适合草原、沙漠等复杂地形。车辆检查&#xff1a; 出发前全面检查车辆&#xff0c;包括轮胎、刹车系统、发动机等&#xff0c;确保车辆状态良好。冬季出行需特别…

【题解】—— LeetCode一周小结44

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结43 28.冗余连接 II 题目链接&#xff1a;685. 冗余连接 II 在…

视频Qoe测量学习笔记(一)

目录 流媒体协议详解 RTSP&#xff1a;实时流式协议 RTCP&#xff1a;实时运输控制协议 RTP&#xff1a;实时运输协议 H.264 流媒体协议详解 RTSP&#xff1a;实时流式协议 由IETF MMusic小组开发&#xff0c;已成为互联网建议标准[RFC 2326]。RTSP本身并不传送数据&…

使用Spring Validation实现数据校验详解

目录 前言1. Spring Validation概述2. 配置Spring Validation2.1 引入依赖2.2 启用全局校验 3. 使用注解进行参数校验3.1 基本校验注解3.2 使用Pattern进行正则校验3.3 综合示例 4. 在控制器层应用校验4.1 方法参数校验4.2 自定义错误处理 5. 高级应用&#xff1a;自定义校验注…

解决阿里云三个月证书过期 免费SSL证书部署教程

相信有上线过自己的网站、小程序经验的同学深有体会&#xff0c;给服务加上 SSL 证书还挺麻烦的&#xff0c;尤其是没有运维经验的同学。本来最省事的方法是买个证书&#xff0c;但是一看价格&#xff0c;还是算了吧&#xff0c;动辄就是几万块一年。作为个人来说&#xff0c;这…

简单走近ChatGPT

目录 一、ChatGPT整体背景认知 &#xff08;一&#xff09;ChatGPT引起关注的原因 &#xff08;二&#xff09;与其他公司的竞争情况 二、NLP学习范式的发展 &#xff08;一&#xff09;规则和机器学习时期 &#xff08;二&#xff09;基于神经网络的监督学习时期 &…