自省式RAG 与 LangGraph的实践

自省式 RAG

对实现 RAG 的步骤进行逻辑分析:比如,我们需要知道什么时候进行检索(基于问题和索引的构成)、何时改写问题以提升检索效率,或者何时抛弃无关的检索结果并重新检索。因此提出了自省式 RAG,自省式 RAG 利用大型语言模型自我校正检索质量不佳或生成内容不够优质的问题。

基础 RAG 流程,实质上是种链式过程:大型语言模型根据检索到的文档来决定生成的内容。有些 RAG 运作模式采用的是路由机制,大型语言模型会根据提出的问题选择不同的检索器。但是自省式 RAG 通常需要某种反馈机制,比如重新生成问题或重新检索文档。这时候,状态机制作为第三种认知架构,因其能够支持循环操作而非常适用:状态机可定义一系列步骤(例如检索、评估文档、改写问题)并设置它们的转换逻辑;比如,如果我们检索到的文档无关,我们可以重新改写问题再进行检索。

图片

利用认知架构实施 RAG 的示意图

利用 LangGraph 实现自省式 RAG

LangGraph,简单的大型语言模型状态机实现工具。这为设计各种不同的RAG 流程提供了极大的灵活性,并支持在 RAG 中进行所谓“流程工程”,即在具体的决策点(如:评估文档)和循环(比如:重新检索)中进行特定操作。

图片

状态机让我们得以设计出更复杂的 RAG "流"

为了展现 LangGraph 的灵活性,我们利用它来实现了两篇引人入胜、前沿的自省式 RAG 论文,CRAG 和 Self-RAG 中提出的思想。

纠正式 RAG (CRAG)

纠正式 RAG(CRAG)在其论文中提出了以下鲜明的理念:

  • 引入轻量级检索评估工具,用以对查询返回的文档进行整体质量评估,并为每项文档打分。

  • 当检索的结果不明确或与用户的查询不够相关时,启用基于网络的文档检索来补充上下文

  • 执行知识细化:把检索的文档分成“知识条”,对每条进行评分,过滤出无关的内容。

图片

在描述流程时,我们对一些步骤进行了简化和调整:

  • 如果发现任意一个检索的文档不相关,我们将通过网络搜索来补充检索内容。

  • 改写查询语句,以便于网络搜索能提供更优的结果。

  • 对于二选一的决策节点,我们用 Pydantic 来确定输出模型,并作为每一次执行大型语言模型的调用过程中运行的 OpenAI 工具函数。

图片

CRAG 流程的 LangGraph 实施示意图

自 RAG

自 RAG 是一个与之相望的解决方案,论文中提出了许多独到的 RAG 理念。框架中训练大型语言模型生成自我反思的提示符号,用以控制 RAG 流程的各个阶段。下面是提示符号的一览:

  • Retrieve 符号决定是否需要根据 x(问题) 或 x(问题)y(回答) 检索 D 数据块。可能的输出结果有 yes, no, continue

  • ISREL 符号针对 x 问题,判断数据块 D 是否相关。输入为 (x(问题),d(数据块))。结果为 relevant(相关), irrelevant(不相关)

  1. ISSUP 符号判断 D 中每个数据块生成的答复是否与之相关。输入包括 xdy。这个标记也是验证 d 是否支持 y(生成) 中的所有需要证实的陈述。可输出 fully supported(完全支持), partially supported(部分支持), no support(不支持)

  2. ISUSE 符号评估 D 中每个数据块生成的答复是否对 x 有用。输入 xy 对于 d 在 D 里。输出是 {5, 4, 3, 2, 1}

论文中的下表为上述信息提供了进一步细节:

图片

Self-RAG 中采用的四种提示符号

以下简图帮助我们理解信息流的运转机制:

图片

Self-RAG 使用的流程简图

可以在 LangGraph 中对其进行实现:

  • 如上文所述,我们对每个检索到的文档进行评分。如果发现任何文档相关,我们就进行下一步的生成工作。如果全部文档都不相关,那我们就会改写查询来提出一个更加精确的问题,然后重新进行检索。这一环节可以很容易地结合上述 CRAG 所述的网络搜索补充节点。

  • 论文中会针对每一个数据块进行生成,并进行双重评估。但在我们的实现中,只从所有相关文档生成一次内容。然后,我们根据文档检查这次生成的内容(例如,以保护免受错误印象的影响)并根据答案进行评估。这减少了调用大型语言模型的次数,提高了响应速度,并允许在生成答案时综合更多的上下文信息。

图片

LangGraph 实现 Self-RAG 流程示意图

这里展示的示例轨迹强调了主动 RAG 的自我纠正能力。查询的问题是 解释不同类型代理记忆是如何工作的?在此示例中,所有四个文档都被认为相关,对照文档检查生成答案的环节顺利通过,但生成的答案未被认定完全有用。

之后,如这里所示,循环重新开始,问题稍微改写为:不同类型代理记忆的运作方式如何?此时,四份文档中有一份因为无关而被筛选出去。之后的生成答案成功通过了所有检查:

不同类型的代理记忆包含感官记忆、短期记忆和长期记忆。感官记忆能够保留短暂的感觉信息。短期记忆则被用于实时学习和构建提示。而长期记忆则让代理人可以在很长的时间里保存和回忆信息,并常常依赖外部的向量存储来实现。

整体流程轨迹清晰可见,可以容易地进行审核。

结语

自省机制可以显著提升 RAG 的功能,允许改正检索和生成过程中的质量问题。本文展示了如何利用 LangGraph 进行“流程工程化”地实施自反式 RAG。我们还提供了实施两篇引人注目的论文 —— Self-RAG 和 CRAG 中的理念的详细指导。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车载以太网AVB交换机 TSN交换机 时间敏感网络 6端口 百兆 SW100TSN

SW100 TSN时间敏感网络AVB交换机 为6端口百兆车载以太网交换机,其中包含5通道100BASE-T1泰科MATEnet接口和1个通道100/1000BASE-T标准以太网(RJ45接口),可以实现纳米级时间同步,车载以太网多通道交换,Bypass数据采集和监控等功能&…

【Linux】进程状态(R运行状态、S睡眠状态、D磁盘休眠状态、T停止状态、X死亡状态)

目录 01.运行状态 02.睡眠状态 03.磁盘睡眠状态 04.停止状态 05.死亡状态 进程的状态会随着操作系统的调度和外部事件的发生而不断地发生转换。例如,一个新创建的进程经过初始化后会进入就绪态,等待被调度执行;当调度器分配处理器资源给…

SpringBoot学习笔记一、SpringBoot应用初创建以及应用

一、创建SpringBoot的两种方式 1.Spring Initializr方式创建 (1)第一步在IDEA中选择 File-->NEW-->Project ,选择 Spring Initializr ,指定Maven坐标、包名、指定 JDK 版本 1.8 ,然后点击Next 。如下图&#x…

亚信安慧AntDB解析:数据库技术的新里程碑

AntDB简化了开发运维,更提高了数据库的易用性。AntDB是一种创新的数据库管理系统,其设计理念旨在让用户能够更便捷地进行数据库操作,减少繁琐的配置和管理工作,提升工作效率。 通过AntDB,用户可以快速部署和管理数据库…

leetCode刷题 20. 有效的括号

目录 题目: 1. 思路 2. 解题方法 3. 复杂度 4. Code 题目: 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型…

USART发送单字节数据原理及程序实现

硬件接线: 显示屏的SCA接在B11,SCL接在B10,串口的RX连接A9,TX连接A10。 新建Serial.c和Serial.h文件 在Serial.c文件中,实现初始化函数,等需要的函数,首先对串口进行初始化,只需要…

Teamcenter 快速获取所有激活状态用户的方法

问题描述: License数量有限,需要分析Teamcenter 中所有激活状态下的用户,对其进行删减。如何快速获取Teamcenter 中所有激活状态用户呢? 解决方法: Teamcenter Query Builder提供了强大的自定义搜索功能。 新建查询…

Jenkins--在Linux上使用Docker安装

一、Jenkins 简介 Jenkins是一个流行的开源自动化服务器,用于持续集成和持续交付(CI/CD)。Jenkins的核心功能主要包括以下几点: 持续集成:Jenkins可以监控版本控制系统(如Git、SVN)中的代码变…

TCP重传机制详解——02SACK

文章目录 TCP重传机制详解——02 SACKSACK是什么?为什么要有SACK?实际场景抓包具体显示信息流程 实战抓包讲解SACK关闭场景下,三次重复ACK后会快速重传SACK打开但是不携带SACK块信息场景下,三次重复ACK也不会快速重传SACK打开并且…

Docker搭建LNMP环境实战(04):安装VMwareTools共享文件夹

1、加载VMware Tools安装盘 在VMware客户端,点击主菜单: 图1 启动VMware Tools安装 再点击下面的菜单: 图2 打开设置界面 出现下面的界面,虚拟DVD加载的是linux.iso 图3 查看VMware Tools的DVD虚拟安装映像文件 将DVD加载到CentO…

C++ 控制语句(一)

一 顺序结构 程序的基本结构有三种: 顺序结构、分支结构、循环结构 大量的实际问题需要通过各种控制流程来解决。 1.1 顺序结构 1.2 简单语句和复合语句 二 循环 2.1 for循环 语句流程图 注意:使用for语句的灵活性 三 while语句 四 do while语句

SpringCloud详解(持续更新)

springcloud定义 springcloud搭建 Eureka(注册发现) Eureka主页信息 Eureka服务注册中心(Eureka Server) 搭建 失效剔除(配置) Eureka服务提供方(Eureka Client) 搭建 Eureka服务消…