《Advanced RAG》-11-RAG查询分类和细化

总结

文章介绍了两种高级的检索增强生成(RAG)技术:自适应 RAG 和 RQ-RAG,以及它们在问题复杂性学习和查询细化方面的应用和优势,以及如何通过小型模型的训练来提高这些技术的性能。

摘要

传统 RAG 技术虽然能够减少大型语言模型(LLM)答案的不准确性,但不能增强初始查询。

自适应 RAG 和 RQ-RAG 两种技术,通过对小型模型的训练,提出了查询分类和查询细化的概念,以适应不同复杂度的查询。

  • 自适应 RAG 通过精心构建的分类器根据查询的复杂程度,动态选择最合适的 LLM 策略,包括迭代、单一甚至无检索方法。
  • RQ-RAG 则侧重于学习如何根据需要重写、分解和消除查询的歧义,以提高信息检索的质量。

文章详细描述了自适应 RAG 的整体流程,包括如何根据查询的复杂性选择合适的工具,以及如何使用 LlamaIndex 版本的代码来解释这一过程。还强调了分类器的构造,包括数据集的构建和训练、以及如何通过交叉熵损失来训练分类器。此外,文章讨论了分类器尺寸的选择,并通过实验结果表明,即使是较小的模型也能达到较高的性能。

接着,文章介绍了 RQ-RAG 的查询细化方法,包括它如何通过重写、分解和消除歧义来提高检索增强生成的查询质量。RQ-RAG 的方法包括以端到端的方式训练 Llama2 7B 模型,以便动态增强搜索查询。RQ-RAG 的数据集构建过程,包括如何收集语料库、分类任务、使用 ChatGPT 完善查询以及如何生成训练样本。

最后,文章对 Self-RAG 和 CRAG 进行了比较,并讨论了工程实施时的一些考虑点,如查询分类的优化性和小型模型的性能。文章强调,通过精心构建的数据集和生成过程,小型模型也能取得显著的成果。

虽然传统的 RAG 技术可以减少 LLM 答案的不准确性,但它并不能以任何方式增强初始查询。图 1 中的红框说明了这一点。

在这里插入图片描述

这种方法可能会导致一些潜在的问题,例如

  1. 对于简单问题,该系统可能会消耗过多的计算资源来处理。
  2. 对于复杂的查询,仅使用原始查询进行检索往往无法收集到足够的信息。
  3. 对于可能有多个答案的模糊查询,使用原始查询进行信息检索是不够的。

本文将介绍两种先进的解决方案:查询分类和查询细化。通过对小型模型的训练,这两种方法都有所改进。最后,文章将讨论从这两种算法中获得的启示和思考。

自适应-RAG:通过问题复杂性学习调整检索增强大型语言模型

整体流程

Adaptive-RAG 引入了一个新的自适应框架。如图 2 所示,它根据查询的复杂程度,动态选择最合适的 LLM 策略,从最简单到最复杂不等。

在这里插入图片描述

图 2 (A) 表示一种单步方法,即首先检索相关文档,然后生成答案。但是,对于需要多步骤推理的复杂查询,这种方法可能不够准确。

图 2(B)是一个多步骤过程,包括迭代文档检索和生成中间响应。尽管这种方法很有效,但对于简单查询来说效率很低,因为它需要多次访问 LLM 和检索器。

图 2(C)是一种自适应方法,它利用精心构建的分类器来确定查询的复杂性。这有助于为 LLM 检索选择最合适的策略,包括迭代、单一甚至无检索方法。

为了更直观地了解 Adaptive-RAG 流程,我们将结合代码进行说明。代码目前有四个版本:官方版本、Langchain 版本、LlamaIndex 版本和 Cohere 版本。我们将使用 LlamaIndex 版本进行解释。

有关详细信息,请参阅本 Jupyter Notebook。代码相当长,因此这里只讨论关键部分。

在这里插入图片描述

代码的运行取决于查询的复杂程度,并相应地调用不同的工具:

  • 对于复杂查询:需要使用多种工具。这些工具需要多个文档的上下文,如图 3 右上方所示。
  • 对于简单查询:如图 3 左上所示,使用一个单独的工具,只需要单个文档中的上下文。
  • 对于直接查询:直接使用 LLM 提供答案,如图 3 底部所示。

如图 2(C)所示,工具是通过分类器选择的。与最初的论文相反,这里使用的分类器没有经过训练。相反,它直接利用了已有的 LLM,如图 4 所示。

图 4:Adaptive-RAG 的工具选择。

构建分类器

虽然 LlamaIndex 代码不包括分类器的训练过程,但了解分类器的构建过程对我们的进一步开发至关重要。

数据集的构建

一个关键的挑战是缺乏查询复杂性对的注释数据集。如何解决这个问题?

Adaptive-RAG 采用两种特定策略来自动构建训练数据集。

Adaptive-RAG 提供的数据集显示,分类器训练数据的标注是基于公开标注的 QA 数据集。

有两种策略:

  1. 对于收集到的问题,如果最简单的非检索方法生成了正确答案,则其对应查询的标签标记为 “A”。同样,通过单步法得到正确答案的查询标记为 “B”,而通过多步法得到正确答案的查询标记为 “C”。值得一提的是,较简单的模型优先级较高。这意味着,如果单步法和多步法都得到了正确的结果,而非检索法却失败了,我们就会给相应的查询贴上 "B "的标签,如图 5 所示。

图 5:Adaptive-RAG 提供的数据集样本。

  1. 如果这三种方法都无法生成正确答案,则表明有些问题仍未标记。在这种情况下,我们会直接根据公共数据集进行分配。具体来说,我们将 "B "分配给单跳数据集中的查询,将 "C "分配给多跳数据集中的查询。
训练和推理

训练方法包括使用交叉熵损失,根据这些自动收集的查询复杂度对来训练分类器。

然后,在推理过程中,我们通过将查询转发给分类器来确定查询的复杂度(查询是 {‘A’、‘B’、‘C’} 中的一个):o = Classifier(q)。

分类器的选择

在这里插入图片描述

如图 6 所示,不同大小的分类器之间没有明显的性能差异。即使是较小的模型也不会影响性能,从而有助于提高资源效率。

接下来,我们将介绍一种查询细化方法:RQ-RAG。

RQ-RAG:学习优化RAG查询

针对上述挑战,RQ-RAG 提出了三项改进措施,如图 7 所示。

在这里插入图片描述

  1. 对于简单的询问,如日常问候类型的“你好”,引入上下文实际上会降低回复质量。LLM 应该直接回复,而不是添加不必要的上下文,以避免潜在的低质量回复。换句话说,如图 7 左上方所示,模型应该学会按需回复。
  2. 对于复杂的查询,它们会被分成更简单、可回答的子查询。然后为每个子查询检索相应的信息,从而形成对原始复杂查询的全面回复,如图 7 右上方所示。
  3. 对于具有多个潜在响应的模糊查询,仅仅使用初始查询语句进行检索是不够的。**LLM 必须学会澄清查询、辨别用户意图,然后制定具体的搜索策略。**这种方法有助于检索全面而精确的信息来回答问题,如图 7 底部所示。

从 RQ-RAG 的核心思想可以看出,该算法的关键在于对查询进行分类和细化。

RQ-RAG 的方法包括以端到端方式训练 Llama2 7B 模型。这样,该模型就能通过改写、分解和澄清歧义来动态增强搜索查询。

由于 RQ-RAG 的代码目前正在重构,某些部分尚未投入使用。因此,这里不提供演示。

数据集构建

鉴于其端到端的性质,关注数据构建策略至关重要。

在这里插入图片描述

数据集的构建主要包括以下步骤:

  1. 收集一个语料库,如图 9 所示,其中包括各种场景,包括多轮对话、需要分解的查询和需要消除歧义的查询。使用该语料库创建任务池。

在这里插入图片描述

  1. 任务池中的任务分为三类:多轮对话、分解和消歧义(multi-turn dialogue, decomposition, and disambiguation**)**。例如,多轮对话数据集中的样本被归入多轮对话类别。
  2. 首先,使用 ChatGPT 完善每种类型的查询。然后,使用这些细化查询从外部数据源检索信息。通常,DuckDuckGo 是主要来源,检索过程被视为黑盒。
  3. 接下来,提示 ChatGPT 根据改进后的查询及其相应的上下文生成修改后的响应。通过重复这一过程,我们总共可以积累约 40k 个实例。

图 10、11 和 12 显示了与 ChatGPT 交互的提示模板。蓝色文字是特定输入的占位符。

图 10:数据构建过程中的多轮对话提示模板。

图 11:数据构建过程中的查询分解提示模板。

图 12:数据构建过程中的查询消歧提示模板。

完成上述过程后,我们就可以得到图 13 右侧所示的训练样本。

在这里插入图片描述

每个样本都是一个带有特殊标记的操作序列,其中:

  • XoriginYorigin 代表原始数据集中的输入输出对。
  • **Type**指优化操作:重写、分解或消除歧义。
  • **i**指迭代的轮次。
  • **SPECIALtype**表示优化类型。
  • **Qi, type**表示第 i 轮中根据特定特殊标记优化的查询。
  • **[Di1, Di2, . . . , Dik]**代表第 i 轮检索到的前 k 个文档。
  • **Ynew**表示在最后迭代步骤中生成的新答案。

训练模型

获得训练数据集后,我们就可以用它来以标准的自动回归方式训练 LLM。目标如图 14 所示。

在这里插入图片描述

简单地说,训练的目的是调整模型参数,以便在第 i 步时,在给定原始输入 x、增强查询 qi 和检索文档 di 的情况下,模型 M 能够生成最高概率的响应 y。

选择答案

在每次迭代过程中,该模型都会解码针对特定需求定制的各种搜索查询:重写、分解或解决歧义。这些查询反过来又会获得不同的语境,从而导致扩展路径的多样化。

在这里插入图片描述

如图 15 所示,RQ-RAG 开发了一种树状解码策略,并使用三种选择方法:基于 PPL 的选择、基于置信度的选择和基于集合的选择。

在 "基于 PPL 的选择 "中,会从总输出中选出困惑度(PPL)最低的答案。另一方面,基于置信度的选择会选择置信度最高的所有结果。最后,"基于集合的选择 "会选择累计置信度最高的最终结果。

见解与思考

Self-RAG 和 CRAG 的比较

与 Adaptive-RAG 和 RQ-RAG 不同,Self-RAG 和 CRAG 不会在检索前增强原始查询。相反,它们的重点在于决定是否执行检索以及如何优化检索后的操作。值得一提的是,CRAG 重写了网络搜索查询,以提高检索信息的质量。

RQ-RAG 和 Self-RAG 都是通过训练一个较小的 LLM 来取代原来的 LLM。Adaptive-RAG 和 CRAG 不会替换原始 LLM。相反,它们增加了一个查询分类层或评估层。

作为后起之秀,Adaptive-RAG 和 RQ-RAG 都声称,根据各自论文中报告的实验结果,它们的性能优于 Self-RAG。

从生成过程的角度来看,Self-RAG、CRAG 和 Adaptive-RAG 更为简单,因为它们不使用树解码。

工程实施

在将查询转换为多轮对话的情况下,使用 LLM 的较长提示数据可能会导致延迟。

在这种情况下,根据我目前的理解,并行化可能是一个可行的解决方案。

此外,Adaptive-RAG 和 RQ-RAG 都对查询进行了分类。然而,这些分类是否最优?它们是否适用于特定的工业场景?其他分类方法能否产生更好的结果?

为了证明这些观点,有必要进行比较实验。

小模型也能表现出色

RQ-RAG 的流程表明,通过精心构建数据集和生成流程,7B 模型可以取得令人瞩目的成果。

追求过大的模型规模并不一定能提高成本效益。

对于资源有限的团队来说,深入研究数据集和算法可能是适当的策略。

结论

本文介绍了查询分类和查询细化这两种高级解决方案,并辅以代码说明。其中还包括我的见解和想法。

本位为翻译,原文地址:https://medium.com/ai-advances/advanced-rag-11-query-classification-and-refinement-2aec79f4140b

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

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

相关文章

「MyBatis」数据库相关操作2

🎇个人主页 🎇所属专栏:Spring 🎇欢迎点赞收藏加关注哦! #{} 和 ${} 我们前面都是采用 #{} 对参数进行赋值,实际上也可以用 ${} 客户端发送⼀条 SQL 给服务器后,大致流程如下: 1.…

51单片机之动态数码管显示

一、硬件介绍 LED数码管是一种由多个发光二极管(LED)封装在一起,形成“8”字型的显示器件。它广泛用于仪表、时钟、车站、家电等场合,用于显示数字、字母或符号。 通过控制点亮a b c d e f g dp来显示数字,本实验开发板…

前端八股文笔记【三】

JavaScript 基础题型 1.JS的基本数据类型有哪些 基本数据类型:String,Number,Boolean,Nndefined,NULL,Symbol,Bigint 引用数据类型:object NaN是一个数值类型,但不是…

十三、代理模式

文章目录 1 基本介绍2 案例2.1 Sortable 接口2.2 BubbleSort 类2.3 SortTimer 类2.4 Client 类2.5 Client 类的运行结果2.6 总结 3 各角色之间的关系3.1 角色3.1.1 Subject ( 主体 )3.1.2 RealObject ( 目标对象 )3.1.3 Proxy ( 代理 )3.1.4 Client ( 客户端 ) 3.2 类图 4 动态…

Java网络编程、TCP、UDP、Socket通信---初识版

标题 InetAddress----IP地址端口号协议(UDP/TCP)JAVA操作-UDP一发一收模式多发多收 JAVA操作-TCP一发一收多发多收 实现群聊功能BS架构线程池优化 InetAddress----IP地址 端口号 协议(UDP/TCP) JAVA操作-UDP 一发一收模式 多发多收…

React 性能优化

使用 useMemo 缓存数据 (类似 vue 的 computed)使用 useCallback 缓存函数异步组件 ( lazy )路由懒加载( lazy )服务器渲染 SSR用 CSS 模拟 v-show 循环渲染添加 key使用 Fragment (空标签)减少层级 不在JSX 中定义函数&#xff0…

一篇教会搭建ELK日志分析平台

日志分析的概述 日志分析是运维工程师解决系统故障,发现问题的主要手段日志主要包括系统日志、应用程序日志和安全日志系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因经常分析日志可以了解服务器的负荷,性…

使用本地大模型从论文PDF中提取结构化信息

1 安装ollama 点击前往网站 https://ollama.com/ ,下载ollama软件,支持win、Mac、linux 2 下载LLM ollama软件目前支持多种大模型, 如阿里的(qwen、qwen2)、meta的(llama3、llama3.1), 读者根据自己电脑…

C语言:求最大数不用数组

(1)题目: 输入一批正数用空格隔开,个数不限,输入0时结束循环,并且输出这批整数的最大值。 (2)代码: #include "stdio.h" int main() {int max 0; // 假设输入…

Qt——多线程

一、QThread类 如果要设计多线程程序,一般是从QThread继承定义一个线程类,并重新定义QThread的虚函数 run() ,在函数 run() 里处理线程的事件循环。 应用程序的线程称为主线程,创建的其他线程称为工作线程。主线程的 start() 函数…

计算机网络408考研 2014

1 计算机网络408考研2014年真题解析_哔哩哔哩_bilibili 1 111 1 11 1

MyBatis:Maven,Git,TortoiseGit,Gradle

1,Maven Maven是一个非常优秀的项目管理工具,采用一种“约定优于配置(CoC)”的策略来管理项目。使用Maven不仅可以把源代码构建成可发布的项目(包括编译、打包、测试和分发),还可以生成报告、生…

短视频SDK,支持Flutter跨平台框架,加速产品上线进程

在数字内容爆炸式增长的今天,短视频已成为连接用户、传递情感、展现创意的重要桥梁。为助力开发者快速融入这股潮流,美摄科技匠心打造了一款专为Flutter框架优化的短视频SDK解决方案,旨在降低技术门槛,加速产品迭代,让…

主题与分区

主题和分区是Kafka的两个核心概念,分区的划分不仅为Kafka提供了可伸缩性、水平扩展的功能,还通过多副本机制来为Kafka提供数据冗余以提高数据可靠性。 主题创建 主题和分区都是提供给上层用户的抽象,而在副本层面或更加准确地说是Log层面&a…

Unity效果优化之抗锯齿

Unityde 基于HDRP渲染管线的抗锯齿处理的设置参考图: 前提:需要导入HDRP的插件包才行, 该参数设置能保证在PC版上抗锯齿效果非常好, 英文版:

AWS Lambda 十年回顾:功能总览、更新记录与入门指南

这次,我为2014年11月发布的AWS Lambda创建了一个历史时间表。AWS Lambda 是一项无服务器、全托管的代码执行服务,今年2024年11月将迎来其宣布发布的十周年纪念。虽然提前了一些,但为了提前庆祝这一重要时刻,我写了这篇文章。 文章…

论文解读 | ACL 2024:自我蒸馏在语言模型微调中架起分布差异的桥梁

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 杨兆瑞 浙江大学CAD&CG全国重点实验室博士生 导师为陈为教授 概述 大型语言模型(LLMs)的兴起彻底改变了自然语言处理领域,但对它们进行特定任务的微调常常面临在平衡性能…

C++ | (一)C++入门基础

从本篇文章开始,我们正式进行C的系统学习。C是在C语言的基础上添加了面向对象编程的特性,是C语言的延伸,并遵循C语言的绝大多数语法。如果想学习C,必须要有一定的C语言基础,这样学起来才不会太过痛苦。 本文章即假设读…

【实战】Spring Security Oauth2自定义授权模式接入手机验证

文章目录 前言技术积累Oauth2简介Oauth2的四种模式授权码模式简化模式密码模式客户端模式自定义模式 实战演示1、mavan依赖引入2、自定义手机用户3、自定义手机用户信息获取服务4、自定义认证令牌5、自定义授权模式6、自定义实际认证提供者7、认证服务配置8、Oauth2配置9、资源…

【数据结构】—— 队列

1、队列的概念2、队列的结构如何选择合适的数据结构实现队列(数组or链表) 3、队列的链式存储3.1 队列的链式存储结构3.2 队列的常见接口3.3 队列的接口实现初始化判空入队列出队列获取队头元素获取队尾元素获取节点个数销毁 3.4 源代码 4、队列的顺序存储…