微信扫码
与创始人交个朋友
我要投稿
编者按:你是否曾经遇到过这些情况:你向 AI 助手提出了一个比较复杂的问题,但它给出的回答却比较浅显,甚至完全偏离了你的意图??或者,你询问了一个非常简单的问题, AI 助手却给出了一大堆不必要的信息,让你感到烦恼??
传统的 RAG 技术虽然能有效减少 AI 回答内容中的错误,但并不能改进用户最初提交的 query 内容,因此可能会出现以下这些问题:
对于用户提交的简单 query ,系统可能会消耗过多的计算资源,浪费用户时间和增加资源消耗。
面对复杂的 query,直接使用原始的 query 进行检索往往无法整理到足够的信息,导致回答不完整或不准确。
对于含义模糊、模棱两可的 query ,仅凭原始的 query 进行信息检索更是远远不够,可能会误解用户的真实意图。
那么,我们如何才能缓解这些问题,提高 AI 系统的理解能力和回答质量呢?本文将介绍两种技术方案:query classification 和 query refinement,并通过代码实例加以阐释,同时还在本文中记录了作者对这些技术方案的理解和思考内容。
作者 | Florian June
编译 | 岳扬
1.1 Overall Process
02 RQ-RAG: 一种 RAG 系统中的 Queries 优化技术方案
2.1 构建数据集
03 Insights and Thoughts
04 Conclusion
虽然传统 RAG 技术能够有效降低 LLMs 回答内容中的错误发生率,但这种技术方案并不能优化用户最初提交的 query,如图 1 中红色框标记的内容所示。
图 1:传统 RAG 技术没有对 initial query 进行改进(图中红色框标记的部分),图片由原作者原创
这种方法可能会出现以下这些问题:
处理简单的 queries 时,该 RAG 系统可能会消耗过多的计算资源。
面对复杂的 queries 时,直接使用 original query(译者注:未经任何改动的 query 内容,由用户最初提交的搜索请求。)进行检索常常无法收集到足够的信息。
对于可能存在多个答案的模糊不清的 queries,仅凭 original query 进行信息检索是远远不够的。
本文将探讨两种进阶策略:query classification 和 query refinement,两者均通过训练小模型提升了系统的整体性能。文章最后,作者还将分享对这两个算法的理解与思考。
Adaptive-RAG 提出了一种创新的 adaptive framework (译者注:该系统可以根据 query 的复杂程度动态选择最合适的信息检索和生成策略。)。如图 2 所示,该系统可根据 query 的复杂度,动态选择最合适的 LLMs 使用策略(包含从最简单(the simplest)到最复杂(the most complex)的多种策略)。
图 2:对比不同检索增强型 LLMs(retrieval-augmented LLM)的解答策略差异。资料来源:Adaptive-RAG[1]
图 2(A)描绘的是一种单步方法(single-step approach),这种方法会先检索出相关文档,然后生成答案。但这一方法对于那些需要多级逻辑推理(multi-step reasoning)的复杂 query 而言,可能精度不足。
图 2(B)是一种分多个步骤进行处理(multi-step process)的方法,包括迭代进行文档检索(document retrieval)及生成中间答案(generation of intermediate responses)等步骤。虽然这种方法效果比较好,但由于需多次调用大语言模型(LLMs)和检索器(retrievers),处理简单 queries 时效率不太高。
图 2(C)是一种 adaptive (译者注:可根据具体情况选择具体的策略。)的方法,通过精心设计的分类器(classifiers),我们能够更精准地判断、选择最佳检索策略(是选择迭代检索(iterative)、一次性检索(single),还是不使用检索方法(no retrieval methods))。
为了帮助大家更直观地理解 Adaptive-RAG 的工作流程,本文会结合具体代码来加以说明。目前,该技术存在四个不同版本的代码实现,它们分别是官方版本(official version)[2]、Langchain 版本[3]、LlamaIndex 版本[4]以及 Cohere 版本[5]。本文将以 LlamaIndex 版本作为示例介绍该技术。
想要了解更多详细信息,可以查看这份文档[6]。考虑到代码量比较大,在本文将着重描述其中的核心代码片段。
图 3:Different tools of Adaptive-RAG. Image by author, inspired by LlamaIndex version[4].
面对复杂的 queries:需要多个工具协同工作。这些工具会从多份文档中提取信息,具体示例可见于图 3 的右上方。
针对简单的 queries:仅需单个工具从单个文档中获取所需上下文,如图 3 左上方所示。
处理直接明了的 queries:直接调用 LLMs 给出答案,这一过程如图 3 底部所示。
如图 2(C)所示,我们可以通过分类器(classifier)来挑选合适的工具。但与官方版本不同,此处使用的分类器并未针对该应用场景进行过针对性地训练,而是直接应用现成的 LLMs ,这一做法在图 4 中有明确描述。
虽然 LlamaIndex 版本的代码实现并没有分类器的构建这一环节,但深入了解分类器的构建过程,对于我们的后续开发工作有着至关重要的作用。
在该技术的实现过程中面临一个重大挑战,我们缺乏带有 query-complexity pairs(译者注:query 与其相应的复杂度(complexity)的配对数据。)的训练数据集。那么,我们该如何应对这一问题呢?Adaptive-RAG 采用了两种策略,以自动化的方式创建所需的训练数据集(training dataset)。
根据 Adaptive-RAG 提供的数据集[7],我们可以看到,其对分类器训练集的数据标注工作,是依托于那些已经公开并带有标签?的问答数据集完成的。
存在两种处理策略:
对于用户上传的 query ,若使用最简易的、非基于检索的方法能够得出正确答案,那么对应的 query 就会被打上 ‘A’ 的等级标签。同样的逻辑,通过单步方法(single-step approach)能够得到正确答案的 query 会标记为 ‘B’ 等级,而通过分多个步骤进行处理(multi-step process)的方法正确解答的 query 则会被标记为 ‘C’ 等级。不过有一点需要在此强调,较为简单的模型优先级更高。也就是说,当单步法(single-step)和多步法(multi-step)均能给出正确答案,但非基于检索的方法无法做到时,就会给该 query 打上 ‘B’ 的等级标签,如图 5 所示。
图 5:Adaptive-RAG 数据集的样本示例,截图出自原文作者
训练方法采用交叉熵损失函数(cross-entropy loss),基于这些自动收集的 query-complexity pairs (译者注:query 与其相应的复杂度(complexity)的配对数据。)来训练分类器。
然后,在推理过程中,我们将 query 输入至分类器,即可判定 query 的复杂度等级,该等级标签可为 'A'、'B' 或 'C' 中的任意一种:o = Classifier(q)。
接下来,我们将介绍一种 query 优化技术:RQ-RAG。
针对上述挑战,RQ-RAG 提出了三项优化方法,如图 7 所示。
图 7:RQ-RAG 使用的模型可根据需求进行信息检索,必要时能对 query 进行重写(rewrite)、分解(decompose)和歧义消除(disambiguate)等操作。来源:RQ-RAG[8]。
对于日常问候(daily greetings)等这类简单 query,加入额外的上下文反而可能降低大模型的回复质量。对于这种情况,大语言模型应当直接做出响应,而非添加不必要的上下文信息,以避免造成大模型的回答质量下降。换句话说,如图 7 左上方所示,模型应具备按需应答(respond on demand)的能力。
面对复杂的 query ,RQ-RAG 会将其细分为若干个更易于解答的 subquery。逐一检索 subquery 的相关信息,从而形成对原始复杂 query 的完整响应,如图 7 右上方所示。
遇到含义模糊、可能有多重解释的 query 时,仅使用原始的 query 文本进行检索是远远不够的。大语言模型必须掌握 query 文本的具体细节、理解用户的真实意图并制定出针对性的检索方案。
这种方法确保了检索到的信息既全面又精准,从而更加有效地回答问题,如图 7 底部所示。
RQ-RAG 通过端到端(end-to-end)的方式 training (译者注:Llama2 是一个预训练模型,此处的 training 应当是指微调。)一个 Llama2 7B 模型。使得该模型能够动态地通过重写(rewriting)、分解(decomposing)和消除 query 中的歧义来增强 query 的检索效果。
由于 RQ-RAG[9] 的代码目前正处于重构阶段[10],某些功能尚未完全实现,因此本文暂无法进行演示。
考虑到 RQ-RAG 系统的端到端(end-to-end)特性,关注数据集的构建流程至关重要。
图 8:数据集的构建流程。来源:RQ-RAG[8]
数据集的构建[11]主要包括以下几个步骤:
1. 首先,搜集一个涵盖多种使用场景的语料库(如图 9 所示),包括但不限于多轮对话(multi-turn dialogues)、需分解的 query 语句及需消解歧义的 query 语句。依据该语料库,构建一个任务池(task pool)。
图 9:数据集结构。来源:RQ-RAG[8]
2. 第二步,任务池中的任务被划分为三大类型:多轮对话(multi-turn dialogue)、分解 query 语句(decomposition)和消除 query 中的歧义(disambiguation)。例如,多轮对话数据集中的每一个样本都会被归入为多轮对话类型(multi-turn dialogue category)。
3. 第三步,首先使用 ChatGPT 对各类 query 进行优化。接着,使用这些优化后的 query 语句向外部数据源检索信息。一般情况下,DuckDuckGo 是主要的信息检索来源,而这个检索过程被视为一个不透明的“黑盒”(black box)。
4. 第四步,指示 ChatGPT 根据优化后的 query 及相应的上下文,生成修正后的模型响应。通过重复执行这一流程,我们得以积累了总计约 40,000(40k) 个实例。
图 10、11 及 12 呈现了与 ChatGPT 交互时所使用的提示词模板。其中,蓝色文字部分代表了应根据具体情况输入的具体内容。
图 10:构建数据集时采用的多轮对话提示词模板。来源:RQ-RAG[8]
图 11:构建数据集时采用的 query 分解提示词模板。来源:RQ-RAG[8]
图 12:构建数据集时运用的 query 消歧提示词模板。来源:RQ-RAG[8]
当上述步骤全部完成后,我们将得到图 13 右侧所示的训练样本。
图 13:Training sample。来源:RQ-RAG[8]
每个训练样本实质上都是一个带有特定 tokens(special tokens)的操作序列(operation sequence),其中:
‘Xorigin’ 和 ‘Yorigin’ 表示原始数据集中的一组输入与输出的对应关系(input-output pair)。
‘Type’ 是指优化操作(optimization action):可能是重写 query(rewrite)、分解 query(decompose),或是消除歧义(eliminate ambiguity)。
‘i’ 表示迭代轮数。
‘SPECIALtype’ 表示优化类型(type of optimization)。
‘Qi, type’ 指代在第 i 次迭代中,依据特定 tokens(special tokens)进行优化后的 query 文本。
‘[Di1, Di2, . . . , Dik]’ 表示第 i 次迭代中检索出的前 k 个文档。
‘Ynew’ 是在最后一次迭代中产生的新答案。
在得到训练数据集后,我们便能以常规的自回归方式(auto-regressive)[12]来训练大语言模型(LLM)。具体的训练目标函数(Training objective)如图 14 所示。
图 14:RQ-RAG 模型的训练目标函数(Training objective)。来源:RQ-RAG[8]
说白了,训练的核心在于微调模型参数,确保在每一个步骤 i 中,面对原始的输入 x 、优化后的 query qi 及检索出的文档 di 时,模型 M 能够对模型响应 y 给出最大化的概率预测(highest probability)。
每次迭代时,该模型都会针对特定需求生成多种用于检索的 query 语句,比如对 query 进行重写、分解或消除其歧义。这些 query 反过来又能获得不同的上下文,有助于模型更全面、更灵活地处理复杂任务(leading to the diversification of expansion paths)。
图 15:面对不同情况(paths),我们制定了三种不同的策略 —— 基于困惑度(PPL)、基于置信度(confidence)和基于集成学习(Ensemble)的选择方法。来源:RQ-RAG[8]
正如图 15 所示,RQ-RAG 研发了一套树形解码策略(tree decoding strategy),并使用了三种选择机制[13]:基于困惑度(PPL)的选择方法、基于置信度(Confidence)的选择方法以及基于集成学习(Ensemble)的选择方法。
在基于困惑度(PPL)的选择方法中,模型会选择所有输出中困惑度(PPL)最低的答案。基于置信度(Confidence)的选择方法则是选择所有置信度最高的结果。而基于集成学习的选择方法,则倾向于选取累积置信度分数(confidence score)最高的最终结果。
不同于 Adaptive-RAG 和 RQ-RAG 在检索前对原始 query 进行优化的做法,Self-RAG[14] 和 CRAG[15] 的关注重点在于判断何时执行检索(retrieval)操作以及如何优化检索操作之后的信息处理效率。特别值得一提的是,CRAG 通过重写用于网络检索的 query 语句,提升了检索结果的信息质量。
RQ-RAG 和 Self-RAG 均通过训练小型语言模型的方式来替代原有的大模型(LLMs)。相比之下,Adaptive-RAG 和 CRAG 保留了原有模型,仅是新增了对 query 进行分类或评估的两个功能层。
后起之秀 Adaptive-RAG 和 RQ-RAG 都声称自己的性能优于 Self-RAG,在它们的论文中都有对应的实验报告。
从生成流程(generation process)的角度考量,Self-RAG、CRAG 及 Adaptive-RAG 因未采用复杂的树形解码策略(tree decoding),显得更为简洁明快。
当 query 转化为多轮对话的情况时,利用大语言模型处理冗长的提示词数据可能会造成响应延时。根据我目前的理解,采用并行处理技术(parallelization)或许能有效解决这一问题。
此外,无论是 Adaptive-RAG 还是 RQ-RAG 技术,它们都对 query 进行了分类。但这些分类方式是否真正达到了最优状态?它们是否能完美适用于特定的生产场景?有没有可能采用其他分类策略能取得更好的效果?需要通过一系列对比实验(comparative experiments)来验证这些观点。
RQ-RAG 的实践过程表明,即使是一个 7B 参数量的模型,只要数据集构建得当、生成流程精细, 7B 参数量的模型也能创造卓越的性能表现。
盲目追求模型规模的庞大并不一定等同于更高的性价比。对于那些资源有限的团队而言,专注于优化数据集与精进算法或许是更为明智的选择。
在本文中,我们探讨了 query classification 与 query refinement 这两项技术方案,并通过代码实例加以阐释,同时还在本文中介绍了作者对这些技术的理解和思考。
倘若您对检索增强生成(RAG)技术感兴趣,请随时浏览本系列其他文章
AI researcher, focusing on LLMs, RAG, Agent, Document AI, Data Structures. Find the newest article in my newsletter:
https://florianjune.substack.com/
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-07-18
2024-05-05
2024-06-20
2024-05-19
2024-09-04
2024-07-09
2024-07-09
2024-07-07
2024-07-07
2024-07-08
2024-12-21
2024-12-14
2024-12-01
2024-11-27
2024-11-25
2024-11-06
2024-11-06
2024-11-05