总结
文章介绍了两种高级的检索增强生成(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 中的红框说明了这一点。
这种方法可能会导致一些潜在的问题,例如
- 对于简单问题,该系统可能会消耗过多的计算资源来处理。
- 对于复杂的查询,仅使用原始查询进行检索往往无法收集到足够的信息。
- 对于可能有多个答案的模糊查询,使用原始查询进行信息检索是不够的。
本文将介绍两种先进的解决方案:查询分类和查询细化。通过对小型模型的训练,这两种方法都有所改进。最后,文章将讨论从这两种算法中获得的启示和思考。
自适应-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 所示。
构建分类器
虽然 LlamaIndex 代码不包括分类器的训练过程,但了解分类器的构建过程对我们的进一步开发至关重要。
数据集的构建
一个关键的挑战是缺乏查询复杂性对的注释数据集。如何解决这个问题?
Adaptive-RAG 采用两种特定策略来自动构建训练数据集。
Adaptive-RAG 提供的数据集显示,分类器训练数据的标注是基于公开标注的 QA 数据集。
有两种策略:
- 对于收集到的问题,如果最简单的非检索方法生成了正确答案,则其对应查询的标签标记为 “A”。同样,通过单步法得到正确答案的查询标记为 “B”,而通过多步法得到正确答案的查询标记为 “C”。值得一提的是,较简单的模型优先级较高。这意味着,如果单步法和多步法都得到了正确的结果,而非检索法却失败了,我们就会给相应的查询贴上 "B "的标签,如图 5 所示。
- 如果这三种方法都无法生成正确答案,则表明有些问题仍未标记。在这种情况下,我们会直接根据公共数据集进行分配。具体来说,我们将 "B "分配给单跳数据集中的查询,将 "C "分配给多跳数据集中的查询。
训练和推理
训练方法包括使用交叉熵损失,根据这些自动收集的查询复杂度对来训练分类器。
然后,在推理过程中,我们通过将查询转发给分类器来确定查询的复杂度(查询是 {‘A’、‘B’、‘C’} 中的一个):o = Classifier(q)。
分类器的选择
如图 6 所示,不同大小的分类器之间没有明显的性能差异。即使是较小的模型也不会影响性能,从而有助于提高资源效率。
接下来,我们将介绍一种查询细化方法:RQ-RAG。
RQ-RAG:学习优化RAG查询
针对上述挑战,RQ-RAG 提出了三项改进措施,如图 7 所示。
- 对于简单的询问,如日常问候类型的“你好”,引入上下文实际上会降低回复质量。LLM 应该直接回复,而不是添加不必要的上下文,以避免潜在的低质量回复。换句话说,如图 7 左上方所示,模型应该学会按需回复。
- 对于复杂的查询,它们会被分成更简单、可回答的子查询。然后为每个子查询检索相应的信息,从而形成对原始复杂查询的全面回复,如图 7 右上方所示。
- 对于具有多个潜在响应的模糊查询,仅仅使用初始查询语句进行检索是不够的。**LLM 必须学会澄清查询、辨别用户意图,然后制定具体的搜索策略。**这种方法有助于检索全面而精确的信息来回答问题,如图 7 底部所示。
从 RQ-RAG 的核心思想可以看出,该算法的关键在于对查询进行分类和细化。
RQ-RAG 的方法包括以端到端方式训练 Llama2 7B 模型。这样,该模型就能通过改写、分解和澄清歧义来动态增强搜索查询。
由于 RQ-RAG 的代码目前正在重构,某些部分尚未投入使用。因此,这里不提供演示。
数据集构建
鉴于其端到端的性质,关注数据构建策略至关重要。
数据集的构建主要包括以下步骤:
- 收集一个语料库,如图 9 所示,其中包括各种场景,包括多轮对话、需要分解的查询和需要消除歧义的查询。使用该语料库创建任务池。
- 任务池中的任务分为三类:多轮对话、分解和消歧义(multi-turn dialogue, decomposition, and disambiguation**)**。例如,多轮对话数据集中的样本被归入多轮对话类别。
- 首先,使用 ChatGPT 完善每种类型的查询。然后,使用这些细化查询从外部数据源检索信息。通常,DuckDuckGo 是主要来源,检索过程被视为黑盒。
- 接下来,提示 ChatGPT 根据改进后的查询及其相应的上下文生成修改后的响应。通过重复这一过程,我们总共可以积累约 40k 个实例。
图 10、11 和 12 显示了与 ChatGPT 交互的提示模板。蓝色文字是特定输入的占位符。
完成上述过程后,我们就可以得到图 13 右侧所示的训练样本。
每个样本都是一个带有特殊标记的操作序列,其中:
Xorigin
和Yorigin
代表原始数据集中的输入输出对。- **
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