当前位置: 首页 > backend >正文

[论文阅读]RQ-RAG: Learning to Refine Queries for Retrieval Augmented Generation

RQ-RAG: Learning to Refine Queries for Retrieval Augmented Generation

[2404.00610] RQ-RAG: Learning to Refine Queries for Retrieval Augmented Generation

现有的 RAG 实现主要集中在用于上下文检索的初始输入,忽略了模棱两可或复杂查询的细微差别,这些查询需要进一步澄清或分解以获得准确的响应。 为此,本文提出学习改进查询以用于检索增强生成 (RQ-RAG),旨在通过为模型配备显式重写、分解和消歧的能力来增强模型

无脑整合RAG导致的问题:不相关的上下文降低生成质量,甚至阻碍LLM回答它们原本能够回答问题的能力;对于简单的查询类似日常问候等,应该直接回复,此时整合上下文十分不必要。因此,模型应该学会按需搜索(图1左上角场景)。

对于复杂查询,只用原始查询及逆行搜索通常无法检索到足够的信息,对于LLM来说,首先把这些查询分解为更加简单,可回答的子查询,然后搜索与这些子问题相关的信息,这个路径会更加具有可解释性并且回答结果更加准确。通过整合对这些子查询的响应,LLM 可以构建对原始复杂查询的全面答案。(图1右上角)

对于具有多个可能答案的模糊查询,使用原始查询进行信息检索是不够的。 为了提供完整和细致的响应,LLM 必须学会澄清查询,理想情况下是通过识别用户的意图,然后制定更具针对性的搜索查询。 收集到相关信息后,LLM 就可以提供详细且全面的回复(图1下)

具体措施:端到端方式训练大模型,使其能够通过改写、分解和澄清歧义来动态地精炼搜索查询。

RQ-RAG

训练数据集的构建

给定原始数据集中的一个输入-输出对 (Xorigin,Yorigin),主要目标是构建包含特殊token的动作序列。 这些特殊符元指定了细化的类型 S⁢P⁢E⁢C⁢I⁢A⁢L_type,并后跟细化的查询,以特定特殊符元为条件,表示为 Q_{i, type},其中“type”指的是细化操作(重写、分解或消歧),而“i”指的是迭代的轮次。 随后检索前 k 个文档,表示为 [Di⁢1,Di⁢2,…,Di⁢k]。 在最后的迭代步骤中,根据上面表示为 Y_new 的上下文生成一个新的答案。

数据主要包含单跳问答任务,包括 Arc-Easy/Arc-Challenge (Clark 等人,2018)、OpenbookQA (Mihaylov 等人,2018),多跳问答任务,包括 HotpotQA (Yang 等人,2018)、Musique (Trivedi 等人,2022),模糊任务,包括 ASQA (Stelmakh 等人,2022),为了使模型具备通用能力,还添加了指令遵循任务,包括 LIMA (Zhou 等人,2024)、WizardLM (Xu 等人,2023b)、Open-Orca (Mukherjee 等人,2023)、OpenAssistant (Köpf 等人,2024)、GPT4-Alpaca (Taori 等人,2023)。 总\收集了 42810 个实例。

搜索增强显著改变了概率密度下的符元分布。 增强的 dataset 显示出符元数量的显著增长,其中大多数实例的符元数量介于 150 到 2000 之间。 相反,原始数据集的长度明显更短,大多数条目在 200 个符元以下。

把上面提到的多种任务合并后,建立一个任务池,按照公式1中的流程进行转换。按理来说需要人工参与来完善查询,但是过于耗时、耗费资源,因此用CHATGPT来自动执行标注。

使用 gpt-3.5-turbo-0125 用于数据标注,将温度参数设置为 0 以增强复现性。出现拒绝回答以及无法遵循指定输出格式的都被抛弃掉。

如图2,自动化标注包含以下三个阶段:

  1. 从将收集池中的任务分类到前面提到的三类中开始。 此步骤很简单,因为每个数据集都对应于特定的数据类型。
  2. 对于每种数据集类型,最初使用 ChatGPT 和预定义的提示模板来生成一个完善的查询。 然后使用此查询从外部数据源中搜索信息。 在大多数情况下,主要使用 DuckDuckGo,并将检索过程视为黑盒。
  3. 之后提示 ChatGPT 根据完善的查询及其相应的上下文生成新的响应。 通过重复此过程,总共积累了大约 40,000 个实例。

生成器训练

自回归方式训练 LLM

最大化给定输入 x 和经过细化的查询 qi 以及检索到的文档 di 的情况下生成响应 y 的概率的对数的期望。

采样策略

在每个时间步模型可以选择重写、分解或消解给定的查询,也可以选择直接生成响应。作者针对不同的查询细化方法设计了树解码策略。 但是使用不同的查询进行搜索会得到不同的检索上下文,从而导致不同的最终答案。 也就是说,如何在这些轨迹中采样最合适的路径是系统中的一个关键部分。 因此提出了三种不同类型的采样策略,如下所示:

使用 p_M 来表示具有参数 M 的语言模型,并且使用 [R1,R2,…,Rn] 来表示 n 条轨迹,其中每条轨迹包含一个序列列表,该序列列表表示为 [X,Y]。 这里,X 是输入提示,Y 是 Z1,…,Zi 的 i 个中间步骤(每个 Zi 是查询和检索上下文的组合)和最终答案 Yfinal 的串联。

基于困惑度:选择总生成输出PPL最低的轨迹

基于置信度:选择对最终答案Yfinal具有最高置信度的轨迹Rfinal(将其与基于PPL的选择区分开来,后者评估生成的总输出)

基于集成的选择:选择累积置信度得分最高的最终结果来集成最终结果

上限:定义了系统的上限,这意味着如果任何一个轨迹导致正确答案,那么就认为它是正确的

实验

评估任务

使用数据集:

对于单跳QA:Arc-Challenge包含 1172 个四选一 QA 实例使用准确率来衡量模型性能;PopQA专注于 1399 个实例的长尾子集,并采用匹配得分指标来评估模型输出是否包含基本事实;OpenbookQA包含 500 个四选一 QA 实例,使用准确率来衡量模型性能。

对于多跳QA:使用F1分数

检索器设置:

数据整理过程中主要使用 DuckDuckGo 来收集大多数场景的相关上下文,并选择前 3 个文档。 每个结果都包含标题、预览摘要和网页的 URL。 为了简化流程只使用标题和预览文本,而不会进一步抓取 URL。 对于多跳 QA 任务,利用 BM25 从特定数据集提供的候选文档中提取上下文,并丢弃上下文与支持文档不一致的实例。

在单跳 QA 任务的推理过程中标准方法是从 DuckDuckGo 检索三个上下文。 对于多跳 QA 场景利用 text-embedding-3-large 模型 (OpenAI) 来识别每一步中来自候选文档的三个最相关的上下文。

基线

无检索基线,它们在不使用从外部数据库检索到的上下文的的情况下回答问题

有检索基线,它们首先从外部来源检索相关上下文,然后根据这些上下文进行回答。

比较包括 Llama2-7B 和 Llama2-7B-Chat的零样本配置以及这些模型在特定任务数据集(例如,ARC_C 和 OBQA 用于单跳 QA 任务,需要注意的是,POPQA 缺乏训练集,因此无法在此数据集上进行训练,而 HOTPOTQA、2WIKI 和 MUSIQUE 用于多跳 QA 任务)和 作者精心制作的数据集(没有中间步骤)上进行了微调,作为更稳健的基线。

评估了 SAIL-7B(Luo et al.,, 2023) 和之前建立的最新技术 Self-RAG-7B(Asai et al.,, 2024) 在三个单跳 QA 数据集上的表现。 对于多跳 QA 任务,扩展到 思维链(Wei et al.,, 2022) 和 笔记链 (Yu et al.,, 2023),利用 ChatGPT 和 GPT-4 作为底层语言模型。

实验结果

RQ-RAG 在单跳 QA 任务中优于 Self-RAG 和 SAIL

RQ-RAG 在多跳问答数据集上表现出优越的性能

即使RQ-RAG的最终结果不如GPT4,但是考虑到它是对LLama2-7B进行的微调,效果只比增强后的gpt4稍逊一筹,足以体现其强势性。

RQ-RAG展示了系统的高上限

对于单跳问答任务,基于置信度的策略通常表现出色,而对于多跳问答任务,基于集成的策略表现出优越的性能。基于 ppl 的策略表现出中等性能。 

基于上下文重新生成答案很重要

方法的一个关键创新是使用 ChatGPT 基于提供的上下文重新生成答案,而不是依赖数据集中的原始答案。探讨了改变从数据集中保留的原始答案比例的影响。 为了确保公平的比较,我们在实验中保持一致的训练超参数。 我们通过保留 0%(我们的主要方法)、25%、50%、75% 和 100% 的原始答案来策划我们的搜索增强数据集,然后评估了对三个多跳 QA 数据集性能的影响。 图4 说明了我们在 HotpotQA 上的发现,完全重新生成的答案设置(0% 保留)显示了最佳性能。 此外,随着保留的原始答案比例的增加,有效性明显下降,这表明我们基于检索到的上下文重新生成答案的策略是有益的。

系统对不同的数据资源具有弹性

在推理期间分别使用 DuckDuckGo、维基百科和必应搜索作为数据源,结果就是表3所示,文章提出的RQ-RAG更加稳定。

【这篇文章还是很有意义很有意思的,数据集开源于zorowin123/rq_rag · Datasets at Hugging Face,通过数据集可以看到作者新构造了一些token,比如[S_Decomposed_Query],[/R_Evidences],[A_Response],[S_Disambiguated_Query],[S_Response]通过这些token来标榜作者划分的三种不同场景的问题形式,使用训练来让llama2学习到这三种不同的场景。不过system prompt似乎设定的并不一致,少了一些case study,无法得知具体在RAG中的应用。】

http://www.xdnf.cn/news/18702.html

相关文章:

  • k8s的etcd备份脚本
  • AR技术赋能农业机械智能运维
  • 电机控制::基于编码器的速度计算与滤波::RLS
  • 【C++】第二十六节—C++11(中) | 右值引用和移动语义(续集)+lambda
  • Linux_用 `ps` 按进程名过滤线程,以及用 `pkill` 按进程名安全杀进程
  • 机器学习-大语言模型Finetuning vs. Prompting
  • 大型语言模型基准测试综述《A Survey on Large Language Model Benchmarks.pdf》核心内容总结
  • 京东前端社招面经
  • 多维度指标交叉计算查询方案
  • 【芯片后端设计的灵魂:Placement的作用与重要性】
  • 6、RocketMQ消息积压问题如何解决
  • Python爬虫实战:Selenium模拟操作爬取马蜂窝旅游攻略
  • 数据挖掘 6.1 其他降维方法(不是很重要)
  • redis----list详解
  • 深度学习入门第一课——神经网络实现手写数字识别
  • 读《精益数据分析》:A/B测试与多变量测试
  • 【栈 - LeetCode】739.每日温度
  • [Java恶补day51] 46. 全排列
  • 无人机芯片休眠模式解析
  • 关于传统的JavaWeb(Servlet+Mybatis)项目部署Tomcat后的跨域问题解决方案
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(19):文法复习+单词第7回1
  • 基于知识图谱的装备健康智能维护系统KGPHMAgent
  • C++ #pragma
  • 少儿舞蹈小程序需求规格说明书
  • 【Hot100】二分查找
  • Fluent Bit系列:字符集转码测试(上)
  • 使用 Prometheus 监控服务器节点:Node Exporter 详解与配置
  • 实时监测蒸汽疏水阀的工作状态的物联网实时监控平台技术解析
  • 容器学习day02
  • 基于 OpenCV 与 Mediapipe 的二头肌弯举追踪器构建指南:从环境搭建到实时计数的完整实现