LangChain+LLM实战---使用知识图谱和大模型来实现多跳问答
原文:Knowledge Graphs & LLMs: Multi-Hop Question Answering
可以使用检索增强方法来克服大型语言模型(Large Language Models, llm)的局限性,比如幻觉和有限的知识。检索增强方法背后的思想是在提问时引用外部数据,并将其提供给LLM,以增强其生成准确和相关答案的能力。

当用户提出问题时,智能搜索工具会在提供的知识库中查找相关信息。例如,您可能遇到过在pdf文件或公司文档中搜索相关信息的情况。这些例子中的大多数使用向量相似性搜索来识别哪些文本块可能包含准确回答用户问题的相关数据。实现相对简单。

pdf文件或文档首先被分割成多个文本块。一些不同的策略包括文本块应该有多大,以及它们之间是否应该有重叠。在下一步中,使用任何可用的文本Embedding模型生成文本块的向量表示。这就是在查询时执行向量相似性搜索所需的所有预处理。剩下的唯一步骤是在查询时将用户输入编码为向量,并使用余弦或任何其他相似性来比较用户输入和嵌入文本块之间的距离。最常见的是,您将看到返回前三个最相似的文档,为LLM提供上下文,以增强其生成准确答案的能力。当向量搜索可以产生相关的文本块时,这种方法非常有效。
然而,当LLM需要来自多个文档甚至多个块的信息来生成答案时,简单的向量相似性搜索可能是不够的。
例如,考虑以下问题:
OpenAI的前员工中有谁创办了自己的公司吗?
如果你仔细想想,这个问题可以分为两个问题。
-
谁是OpenAI的前雇员?
-
他们中有人开了自己的公司吗?

回答这些类型的问题是一个多跳问答(可在文末查看什么是多跳问题)任务,其中单个问题可以分解为多个子问题,并且可能需要向LLM提供大量文档以生成准确的答案。
上述简单地将文档分块和Embeddings到数据库中,然后使用纯向量相似度搜索的工作流程可能会遇到多跳问题,原因如下:
-
前N个文档中的重复信息:所提供的文档不保证包含回答问题所需的补充和完整信息。例如,排名前三的类似文件可能都提到shaariq曾在OpenAI工作,并可能成立了一家公司,而完全忽略了所有其他成为创始人的前员工
-
缺少引用信息:根据块大小,您可能会丢失对文档中实体的引用。这可以通过块重叠部分解决。但是,也有引用指向另一个文档的例子,因此需要某种形式的共同引用解析或其他预处理。
-
很难定义理想的检索文档数量:有些问题需要向LLM提供更多的文档才能准确地回答问题,而在其他情况下,大量提供文档只会增加噪音(和成本)。

因此,简单的向量相似性搜索可能会遇到多跳问题。然而,我们可以采用多种策略来尝试回答需要来自不同文档的信息的多跳问题。
作为压缩信息存储的知识图谱
如果您非常关注LLM空间,那么您可能会想到使用各种技术来压缩信息,以便在查询期间更容易地访问信息。例如,您可以使用LLM提供文档摘要,然后嵌入并存储摘要而不是实际文档。使用这种方法,您可以消除大量噪声,获得更好的结果,并且不必担心prompttoken空间。
有趣的是,您可以在摄取时执行上下文摘要,也可以在查询时执行上下文摘要。查询期间的上下文压缩很有趣,因为它选择了与所提供的问题相关的上下文,因此它更具有指导性。但是,查询期间的工作负载越重,预期的用户延迟就越差。因此,建议将尽可能多的工作负载移动到摄取时间,以改善延迟并避免其他运行时问题。
同样的方法也可以应用于总结会话历史,以避免遇到token限制问题。
我还没有看到任何关于将多个文档合并和汇总为单个记录的文章。问题可能是我们需要合并和总结的文档组合太多了。因此,在摄取时处理所有文档组合的成本可能太高。
然而,知识图谱在这里也可以提供帮助。
从非结构化文本中提取实体和关系形式的结构化信息的过程已经存在了一段时间,更广为人知的是信息提取管道。将信息提取管道与知识图相结合的好处在于,您可以单独处理每个文档,并且当构建或丰富知识图时,来自不同记录的信息可以连接起来。

知识图使用节点和关系来表示数据。在这个例子中,第一份文件提供了Dario和Daniela曾经在OpenAI工作的信息,而第二份文件提供了他们的Anthropic创业公司的信息。每条记录都是单独处理的,但知识图表示将数据连接起来,并使回答跨多个文档的问题变得容易。
大多数使用大语言模型来回答我们遇到的多跳问题的新方法都侧重于在查询时解决任务。然而,我们相信许多多跳问答问题可以通过在摄取数据之前对其进行预处理并将其连接到知识图中来解决。信息提取管道可以使用大语言模型或自定义文本域模型来执行。
为了在查询时从知识图中检索信息,我们必须构造一个适当的Cypher语句。幸运的是,大语言模型非常擅长将自然语言转换为Cypher图查询语言。

在本例中,智能搜索使用LLM生成适当的Cypher语句,以便从知识图中检索相关信息。然后将相关信息传递给另一个LLM调用,该调用使用原始问题和提供的信息生成答案。在实践中,您可以使用不同的大语言模型来生成Cypher语句和答案,或者在单个LLM上使用各种prompts。
结合图形和文本数据
有时,您可能希望结合文本和图形数据来查找相关信息。例如,考虑以下问题:
关于Prosper Robotics创始人的最新消息是什么?
在本例中,您可能希望使用知识图结构识别Prosper Robotics创始人,并检索提到他们的最新文章。

要回答关于Prosper Robotics创始人的最新消息的问题,您可以从Prosper Robotics节点开始,遍历到其创始人,然后检索提到他们的最新文章。
知识图可用于表示关于实体及其关系的结构化信息,以及作为节点属性的非结构化文本。此外,您可以使用自然语言技术,如命名实体识别,将非结构化信息连接到知识图中的相关实体,如提及关系所示。
我们相信,检索增强生成应用的未来是利用结构化和非结构化信息来生成准确的答案。因此,知识图是一个完美的解决方案,因为您可以存储结构化和非结构化数据,并将它们与明确的关系连接起来,从而使信息更易于访问和查找。

当知识图谱中包含结构化和非结构化数据时,智能搜索工具可以利用Cypher查询或向量相似度搜索来检索相关信息。在某些情况下,您也可以使用两者的组合。例如,可以从Cypher查询开始识别相关文档,然后使用向量相似性搜索在这些文档中查找特定信息。
在思维链流中使用知识图谱
围绕大语言模型的另一个非常令人兴奋的发展是所谓的思维链问答,特别是LLM代理。LLM代理背后的思想是,它们可以将问题分解为多个步骤,定义计划,并使用所提供的任何工具。在大多数情况下,代理工具是api或知识库,代理可以访问它们来检索其他信息。让我们再考虑一下这个问题:
关于Prosper Robotics创始人的最新消息是什么?

假设在它们提到的文章和实体之间没有明确的联系。文章和实体甚至可以在不同的数据库中。在这种情况下,使用思维链流的LLM代理将非常有帮助。首先,agent将问题分解为子问题。
- Prosper Robotics的创始人是谁?
- 关于他们的最新消息是什么?
现在,代理可以决定使用哪个工具。假设我们为它提供一个知识图访问,它可以使用它来检索结构化信息。因此,代理可以选择从知识图谱中检索Prosper Robotics公司创始人的信息。正如我们所知,Prosper Robotics的创始人是shaariq Hashme。现在第一个问题已经回答了,代理可以将第二个子问题重写为:
- 关于Shariq Hashme的最新消息是什么?
代理可以使用任何可用的工具来回答随后的问题。这些工具的范围包括知识图、文档或矢量数据库、各种api等等。对结构化信息的访问允许LLM应用程序在需要聚合、过滤或排序的情况下执行各种分析工作流。考虑以下问题:
- 哪一家创始人一人的公司估值最高?
- 谁创办的公司最多?
纯向量相似性搜索可能难以解决这些类型的分析问题,因为它搜索的是非结构化文本数据,因此很难对数据进行排序或聚合。因此,结构化和非结构化数据的组合可能是检索增强LLM应用程序的未来。此外,正如我们所看到的,知识图也非常适合表示连接的信息,因此也适合多跳查询。
虽然思维链是大语言模型的一个引人入胜的发展,因为它显示了LLM如何进行推理,但它并不是最用户友好的,因为由于多个LLM调用,响应延迟可能很高。然而,我们仍然非常兴奋地了解更多关于将知识图合并到各种用例的思维链流中的知识。
总结
检索增强生成应用程序通常需要从多个源检索信息以生成准确的答案。虽然文本摘要可能具有挑战性,但以图形格式表示信息可以提供几个优点。
通过单独处理每个文档并将它们连接到知识图中,我们可以构建信息的结构化表示。这种方法允许更容易地遍历和导航相互连接的文档,支持多跳推理来回答复杂的查询。此外,在摄取阶段构造知识图减少了查询期间的工作负载,从而改善了延迟。
使用知识图的另一个优点是它能够存储结构化和非结构化信息。这种灵活性使其适用于广泛的语言模型(LLM)应用程序,因为它可以处理各种数据类型和实体之间的关系。图结构提供了知识的可视化表示,促进了开发人员和用户的透明性和可解释性。
总的来说,在检索增强生成应用程序中利用知识图提供了一些好处,比如提高查询效率、多跳推理能力以及对结构化和非结构化信息的支持。
附加
多跳问题(来源于《一文带你入门知识图谱多跳问答》)
通俗来说,多跳问题 (Multi-hop Questions) 指的是那些需要知识图谱 「多跳推理」 才能回答的问题。例如,若要回答 ”成龙主演电影的导演是哪些人?“ 这一问题,则需要多个三元组所形成的多跳推理路径 <成龙,主演,新警察故事>, <新警察故事,导演,陈木胜> 才能够回答。
这种类型的问题在实际应用中十分普遍,但想要构建出一个高准确率的知识图谱多跳问答系统却并非易事。下图展示了一个谷歌搜索中的 Bad Case。

相关文章:
LangChain+LLM实战---使用知识图谱和大模型来实现多跳问答
原文:Knowledge Graphs & LLMs: Multi-Hop Question Answering 可以使用检索增强方法来克服大型语言模型(Large Language Models, llm)的局限性,比如幻觉和有限的知识。检索增强方法背后的思想是在提问时引用外部数据,并将其提供给LLM&a…...
【实践篇】一次Paas化热部署实践分享 | 京东云技术团队
前言 本文是早些年,Paas化刚刚提出不久时,基于部门内第一次Paas化热部署落地经验所写,主要内容是如何构建一些热部署代码以及一些避雷经验。 一、设计-领域模型设计 1.首先,确定领域服务所属的领域 2.其次,确定垂直…...
蓝桥杯官网填空题(算式问题)
题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 看这个算式: ☆☆☆ ☆☆☆ ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字。 这个算式有多少种可能的正确填写方法? 173 286 459 …...
Verilog HDL语言基础知识
目录 Verilog HDL语言基础知识 6.1.2 Verilog HDL模块的结构 6.1.3 逻辑功能定义 6.2.1 常量 6.3 运算符及表达式 6.4.2 条件语句 Verilog HDL语言基础知识 先来看两个Verilog HDL程序。 例6.1 一个8位全加器的 Verilog HDL源代码 module adder8(cout,sum,ina,…...
11.1~11.2数电实验一些点+11.4~11.5报错复盘
方框写在前面是说这个数有多大,写在后面是说这类数有多少 前面的用于计数,每位无实际意义;后面每位都代表一个同类型的,即数组,每位有实际意义 使用四位格雷码作为深度为8的FIFO的读写指针 将格雷码转换成四位二进制…...
从电脑的角度,探究被强制删除的文件的去向和恢复方法!
当我们在进行电脑操作的时候,由于一些原因,我们可能会误操作,将电脑里面的某些文件强制删除掉。有的时候,我们误以为这些文件已经彻底消失了,但实际上这些被删除的文件只是被隐藏了,它们并没有真正离开我们…...
淘宝、天猫电商平台商品详情最低价skuid爬取、各类sku信息调取
淘宝商品描述详细信息API接口是一个用于获取淘宝商品详细信息的API,通过它可以获取到商品的标题、价格、图片等信息。通过淘宝商品描述详细信息API接口,开发者可以方便地获取宝贝的相关信息,并将它们用于各种应用场景中。淘宝商品描述详细信息…...
C/S架构学习之组播
组播:过多的广播会占用网络带宽,产生广播风暴的现象,从而影响正常的通信活动;组播(或者多播)是局域网内部的通信,只有加入到某个多播组的主机才能收到数据;组播的方式既可以发给多个…...
vue package.json Script配置讲解
Vue 项目的 scripts 配置如下: "scripts": {"dev": "vite --force","build": "vite build","build:docker": "vite build --outDir ./docker/dist/","lint:eslint": "eslin…...
wagtail的使用
文章目录 安装虚拟环境新建项目时指定虚拟环境打开已有项目添加虚拟环境 安装wagtail查看安装后的包 创建wagtail项目安装依赖迁移创建超级用户运行项目 管理工作台内容扩展首页的数据模型更新数据库修改模板页创建一个页面的过程 models中的基本字段templates字符型文本字段富…...
【JavaScript】零碎知识点总结_2
1. 引入网站图标 可以直接放在根目录 还可以 link 引入(推荐) <linkrel"shortcut icon"href"./assets/favicon.ico"type"image/x-icon">2. 转换为数字 123 -> 123 除 做字符串拼接,算术运算符都…...
P1182 数列分段 Section II 题解
文章目录 题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示完整代码 题目描述 对于给定的一个长度为N的正整数数列 A 1 ∼ N A_{1\sim N} A1∼N,现要将其分成 M M M( M ≤ N M\leq N M≤N)段,并要求每段连续&am…...
vscode1.83远程连接失败
(报错信息忘记截图了 总之卡在vscode-server.tar.gz的下载那里,一直404,删了C:\Users\Administrator\.ssh\known_hosts也不管用 看了一下vscode1.83的commitID为a6606b6ca720bca780c2d3c9d4cc3966ff2eca12,网友说可以通过以下网…...
Leetcode-141 环形链表
使用HashSet,从头遍历链表并写入哈希表,遍历每个元素找哈希表是否出现过,如果出现过则存在环。 HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的,即不会记录…...
深入了解汽车级功率MOSFET NVMFS2D3P04M8LT1G P沟道数据表
汽车级功率MOSFET是一种专门用于汽车电子领域的功率MOSFET。它具有高电压、高电流、高温、高可靠性等特点,能够满足汽车电子领域对功率器件的严格要求。汽车级功率MOSFET广泛应用于汽车电机驱动、泵电机控制、车身控制等方面,能够提高汽车电子系统的效率…...
C 作用域规则
任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量在所有函数外部的全局变量在形式参数的函数参数定义中 让我们来看看什么是局部变量、全局变…...
Go中第一类函数
什么是第一类函数? 支持第一类函数的语言允许将函数分配给变量,作为参数传递给其他函数,并从其他函数返回。Go 支持第一类函数。 在本教程中,我们将讨论第一类函数的语法和各种用例。 匿名函数 让我们从一个简单的例子开始&am…...
Linux内核分析(五)--IO机制原理与系统总线
目录 一、引言 二、I/O设备 ------>2.1、块设备 ------>2.2、字符设备 ------>2.3、设备控制器 ------------>2.3.1、I/O寻址 ------------>2.3.2、内存映射 I/O 三、系统总线 ------>3.1、数据总线 ------>3.2、地址总线 ------>3.3、控制…...
oracle-sql语句执行过程
客户端输入sql语句。 sql语句通过网络到达数据库实例。 服务器进程(server process)接收到sql语句。 sql – 解析成执行计划,然后sql才能执行。 会将sql和sql的执行计划缓存到共享池中。解析: 会消耗很多资源。 从数据库找数据,先从buffer cache中找&a…...
京东数据分析:2023年9月京东打印机行业品牌销售排行榜
鲸参谋监测的京东平台9月份打印机市场销售数据已出炉! 鲸参谋数据显示,今年9月,京东平台打印机的销量为60万,环比增长约32%,同比下滑约25%;销售额为5亿,环比增长约35%,同比下滑约29%…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
