自省式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.mzph.cn/news/772609.shtml

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

相关文章

[医学分割大模型系列] (3) SAM-Med3D 分割大模型详解

[医学分割大模型系列] -3- SAM-Med3D 分割大模型解析 1. 特点2. 背景3. 训练数据集3.1 数据集收集3.2 数据清洗3.3 模型微调数据集 4. 模型结构4.1 3D Image Encoder4.2 3D Prompt Encoder4.3 3D mask Decoder4.4 模型权重 5. 评估5.1 评估数据集5.2 Quantitative Evaluation5.…

【详细讲解yarn的安装和使用】

🌈个人主页:程序员不想敲代码啊🌈 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家🏆 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提…

面向对象【Annotation注解】

文章目录 注解概述注解与注释常见的 Annotation最基本的注解使用@Override@Override@SuppressWarnings元注解@Retention@Target@Documented@Inherited自定义注解格式定义使用注解概述 注解(Annotation)是从 JDK5.0 开始引入,以“@注解名”在代码中存在。例如: @Override @D…

Git入门(Git快速下载,安装,配置,远程仓库,本地仓库,IDEA提交代码,VScode提交代码使用方案一体)

Git快速下载 通过阿里镜像可以自由挑选版本并快速下载CNPM Binaries Mirrorhttp://npm.taobao.org/mirrors/git-for-windows/ 这里安装最新版本 下载安装文件 安装完后双击文件即可开始安装git 安装 git的安装傻瓜式Next即可 配置 打开git:桌面空白处右击&#…

SolidWorks教育版本的优势是什么

随着工程设计和制造技术的不断进步,计算机辅助设计(CAD)软件在教育领域的应用越来越广泛。SolidWorks教育版本作为一款专为教育机构和学生设计的三维CAD软件,具有许多明显的优势。本文将探讨SOLIDWORKS教育版本的主要优势&#xf…

谁再问你数据库三范式,这篇文章甩给他!!!

前几天有粉丝私信说面试被问到了数据库三范式(面试问这种的不去也好),今天我们就来聊聊。在数据库设计的过程中,为了确保数据的准确性和完整性,我们通常遵循一定的规则和标准,其中最为人所熟知的便是“数据…

linux文本三剑客 --- grep、sed、awk

1、grep grep&#xff1a;使用正则表达式搜索文本&#xff0c;将匹配的行打印出来&#xff08;匹配到的标红&#xff09; 命令格式&#xff1a;grep [option] pattern file <1> 命令参数 -A<显示行数>&#xff1a;除了显示符合范本样式的那一列之外&#xff0c;并…

开源博客项目Blog .NET Core源码学习(11:App.Core项目结构分析)

开源博客项目Blog的App.Core项目主要定义数据库表对应的数据类&#xff0c;同时定义配置文件读取、日志记录、辅助缓存等辅助类。App.Core项目安装的Nuget包不多&#xff0c;仅包括SqlSugarCore和Microsoft.Extensions.DependencyInjectio两类。   App.Core项目的顶层文件夹如…

TouchGFX之Drawable

TouchGFX框架中的所有控件均为Drawable类的子类。 该类别包含控制大小和位置的一般方法。 #ifndef TOUCHGFX_DRAWABLE_HPP #define TOUCHGFX_DRAWABLE_HPP #include <touchgfx/Bitmap.hpp> #include <touchgfx/events/ClickEvent.hpp> #include <touchgfx/event…

WEB测试之兼容性测试

1. 软件兼容性测试 兼容性测试是指待测试项目在特定的硬件平台上&#xff0c;不同的应用软件之间&#xff0c;不同的操作系统平台上&#xff0c;在不同的网络等环境中能正常的运行的测试。 兼容性测试的目的&#xff1a;待测试项目在不同的操作系统平台上正常运行&#xff0c…

[蓝桥杯 2023 省 A] 颜色平衡树:从零开始理解树上莫队 一颗颜色平衡树引发的惨案

十四是一名生物工程的学生&#xff0c;他已经7年没碰过信息学竞赛了&#xff0c;有一天他走在蓝桥上看见了一颗漂亮的颜色平衡树&#xff1a; ​​​​​​​[蓝桥杯 2023 省 A] 颜色平衡树 - 洛谷 十四想用暴力解决问题&#xff0c;他想枚举每个节点&#xff0c;每个节点代表…

Word通配符替换章节序号

这里写自定义目录标题 通配符替换章节序号切换域通配符替换内容插入编号切换域代码 通配符替换章节序号 碎片化学习word通配符知识 切换域 切换域&#xff1a;Alt F9 域都变成静态文字&#xff1a;Ctrl/Command Shift F9 通配符 内容通配符单个数字[0-9]多个数字&#…

office办公技能|word中的常见使用问题解决方案2.0

一、设置多级列表将表注从0开始&#xff0c;设置为从1开始 问题描述&#xff1a;word中插入题注&#xff0c;出来的是表0-1&#xff0c;不是1-1&#xff0c;怎么办&#xff1f; 写论文时&#xff0c;虽然我设置了“第一章”为一级标题&#xff0c;但是这三个字并不是自动插入的…

【C语言】【Leetcode】70. 爬楼梯

文章目录 题目思路&#xff1a;简单递归 > 动态规划 题目 链接: link 思路&#xff1a;简单递归 > 动态规划 这题类似于斐波那契数列的算法&#xff0c;结果其实就是到达前一步和到达前两步的方法之和&#xff0c;一直递归到n1和n2时就行了&#xff0c;但是这种算法有个…

解决vllm推理框架内在开启多显卡时报错问题

前言 vLLM在开启多显卡并行模式下&#xff0c;-tp 2 或者 --tensor-parallel-size 2&#xff0c;运行报错提示如下&#xff1a; The above exception was the direct cause of the following exception:Traceback (most recent call last): File "/usr/lib/python3.8/ru…

【echart】数据可视化

什么是数据可视化&#xff1f; 数据可视化主要目的:借助于图形化手段&#xff0c;清晰有效地传达与沟通信息。 数据可视化可以把数据从冰冷的数字转换成图形&#xff0c;揭示蕴含在数据中的规律和道理。 如何绘制&#xff1f; echarts 图表的绘制&#xff0c;大体分为三步:…

数据湖与湖仓一体是如何演变而来的?详谈大数据存储架构的变迁

在大数据存储架构的发展历程中&#xff0c;可以划分为三个显著的演进阶段。首先&#xff0c;随着Hadoop和Hive等初期项目的出现&#xff0c;数据仓库&#xff08;Data Warehouse&#xff09;的概念得以确立&#xff1b;随着数据仓库的不断演化&#xff0c;同时有了云与对象存储…

Unity DOTS中的baking(四)blob assets

Unity DOTS中的baking&#xff08;四&#xff09;blob assets blob assets表示不可变的二进制数据&#xff0c;在运行时也不会发生更改。由于blob assets是只读的&#xff0c;这意味着可以安全地并行访问它们。此外&#xff0c;blob assets仅限于使用非托管类型&#xff0c;这意…

C++引用学习day2

思维导图 定义一个矩形类&#xff08;Rectangle&#xff09;&#xff0c;包含私有成员&#xff1a;长(length)、宽&#xff08;width&#xff09;, 定义成员函数&#xff1a; 设置长度&#xff1a;void set_l(int l) 设置宽度&#xff1a;void set_w(int w) 获取长度&#…

STL和泛型编程

STL和泛型编程 一.STL六大部件"前开后闭"区间 二.容器(1)顺序容器1.array源码剖析 2.vector源码剖析vector的迭代器 3.list源码剖析迭代器的设计规则关于重载操作符关于重载->和*操作符 4.forward_list源码剖析 5.deque源码剖析底层数据结构操作实现deque的设计de…