作者 |Florian June
编译|岳扬
目录
01 Adaptive-RAG:根据问题复杂程度分类处理(Adapt)的检索增强型 LLMs
1.1 Overall Process
1.2 构建分类器(Classifier)
1.3 构建数据集(Dataset)
1.4 Training and Inference
1.5 选择分类器模型的 Size(Selection of Classifier Size)
02 RQ-RAG: 一种 RAG 系统中的 Queries 优化技术方案
2.1 构建数据集
2.2 Training
2.3 Answer Selection
03 Insights and Thoughts
3.1 这些技术与 Self-RAG 和CRAG进行对比
3.2 技术实践过程中发现的一些问题(About Engineering Implementation)
3.3 小模型(Small Model)亦可大放异彩
04 Conclusion
虽然传统 RAG 技术能够有效降低 LLMs 回答内容中的错误发生率,但这种技术方案并不能优化用户最初提交的 query,如图 1 中红色框标记的内容所示。
图 1:传统 RAG 技术没有对 initial query 进行改进(图中红色框标记的部分),图片由原作者原创
这种方法可能会出现以下这些问题:
本文将探讨两种进阶策略: query classification 和 query refinement, 两者均通过训练小模型提升了系统的整体性能。文章最后,作者还将分享对这两个算法的理解与思考。
01 Adaptive-RAG:根据问题复杂程度分类处理(Adapt)的检索增强型 LLMs
1.1 Overall Process
Adaptive-RAG 提出了一种创新的 adaptive framework(译者注:该系统可以根据 query 的复杂程度动态选择最合适的信息检索和生成策略。)。如图 2 所示,该系统可根据 query 的复杂度,动态选择最合适的 LLMs 使用策略(包含从最简单(the simplest)到最复杂(the most complex)的多种策略)。
图 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)是一种(译者注:可根据具体情况选择具体的策略。)的方法,通过精心设计的分类器(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].
代码的运行方式会根据 query 的复杂程度而产生变化,并相应地调用不同的工具:
如图 2(C)所示,我们可以通过分类器(classifier)来挑选合适的工具。但与官方版本不同, 此处使用的分类器并未针对该应用场景进行过针对性地训练,而是直接应用现成的 LLMs ,这一做法在图 4 中有明确描述。
图 4:Tools selection of Adaptive-RAG. Image by author, inspired by LlamaIndex version[4].
1.2 构建分类器(Classifier)
虽然 LlamaIndex 版本的代码实现并没有分类器的构建这一环节,但深入了解分类器的构建过程,对于我们的后续开发工作有着至关重要的作用。
1.3 构建数据集(Dataset)
在该技术的实现过程中面临一个重大挑战,我们缺乏带有 query-complexity pairs(译者注:query 与其相应的复杂度(complexity)的配对数据。)的训练数据集。那么,我们该如何应对这一问题呢?Adaptive-RAG 采用了两种策略,以自动化的方式创建所需的训练数据集(training src="https://oscimg.oschina.net/oscnet/up-490f1452f0b064bc8d942b5fcc6231c0713.png" alt="Advanced RAG 11:对用户输入的内容进行「分类处理」和「再优化」-AI.x社区">
图 5:Adaptive-RAG 数据集的样本示例,截图出自原文作者
倘若上述三种方法均未能生成正确答案,则说明有些问题仍未被标注分类。这种情况下,我们会直接根据公开数据集进行分类。具体而言,单步数据集(single-hop> 1.4 Training and Inference
训练方法采用交叉熵损失函数(cross-entropy loss),基于这些自动收集的 query-complexity pairs(译者注:query 与其相应的复杂度(complexity)的配对数据。)来训练分类器。
然后,在推理过程中,我们将 query 输入至分类器,即可判定 query 的复杂度等级,该等级标签可为 ‘A’、‘B’ 或 ‘C’ 中的任意一种:o = Classifier(q)。
1.5 选择分类器模型的 Size(Selection of Classifier Size)
图 6:不同规模(size)分类模型的实验结果。来源:Adaptive-RAG[1]从图 6 可以看出, 无论分类器模型的 size 如何,其性能表现并无明显差异。 即便是小型模型也能维持相同水平的性能,有利于提高资源利用效率。
接下来,我们将介绍一种 query 优化技术:RQ-RAG。
02 RQ-RAG: 一种 RAG 系统中的 Queries 优化技术方案
针对上述挑战,RQ-RAG 提出了三项优化方法,如图 7 所示。
这种方法确保了检索到的信息既全面又精准,从而更加有效地回答问题,如图 7 底部所示。
RQ-RAG 通过端到端(end-to-end)的方式 training(译者注:Llama2 是一个预训练模型,此处的 training 应当是指微调。)一个 Llama2 7B 模型。使得该模型能够动态地通过重写(rewriting)、分解(decomposing)和消除 query 中的歧义来增强 query 的检索效果。
由于 RQ-RAG[9]的代码目前正处于重构阶段[10],某些功能尚未完全实现,因此本文暂无法进行演示。
2.1 构建数据集
考虑到 RQ-RAG 系统的端到端(end-to-end)特性,关注数据集的构建流程至关重要。
数据集的构建[11]主要包括以下几个步骤:
1. 首先 ,搜集一个涵盖多种使用场景的语料库(如图 9 所示),包括但不限于多轮对话(multi-turn dialogues)、需分解的 query 语句及需消解歧义的 query 语句。依据该语料库,构建一个任务池(task pool)。
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 交互时所使用的提示词模板。其中,蓝色文字部分代表了应根据具体情况输入的具体内容。
当上述步骤全部完成后,我们将得到图 13 右侧所示的训练样本。
每个训练样本实质上都是一个带有特定 tokens(special tokens)的操作序列(operation sequence),其中:
2.2 Training
在得到训练数据集后,我们便能以常规的自回归方式(auto-regressive)[12]来训练大语言模型(LLM)。具体的训练目标函数(Training objective)如图 14 所示。
说白了,训练的核心在于微调模型参数,确保在每一个步骤 i 中,面对原始的输入 x 、优化后的 query qi 及检索出的文档 di 时,模型 M 能够对模型响应 y 给出最大化的概率预测(highest probability)。
2.3 Answer Selection
每次迭代时,该模型都会针对特定需求生成多种用于检索的 query 语句,比如对 query 进行重写、分解或消除其歧义。这些 query 反过来又能获得不同的上下文,有助于模型更全面、更灵活地处理复杂任务(leading to the diversification of expansion paths)。
正如图 15 所示,RQ-RAG 研发了一套树形解码策略(tree decoding strategy),并使用了三种选择机制[13]: 基于困惑度(PPL)的选择方法 、 基于置信度(Confidence)的选择方法 以及 基于集成学习(Ensemble)的选择方法 。
在基于困惑度(PPL)的选择方法中,模型会选择所有输出中困惑度(PPL)最低的答案。基于置信度(Confidence)的选择方法则是选择所有置信度最高的结果。而基于集成学习的选择方法,则倾向于选取累积置信度分数(confidence score)最高的最终结果。
03 Insights and Thoughts
3.1 这些技术与 Self-RAG 和 CRAG 进行对比
不同于 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),显得更为简洁明快。
3.2 技术实践过程中发现的一些问题(About Engineering Implementation)
当 query 转化为多轮对话的情况时,利用大语言模型处理冗长的提示词数据可能会造成响应延时。根据我目前的理解,采用并行处理技术(parallelization)或许能有效解决这一问题。
此外,无论是 Adaptive-RAG 还是 RQ-RAG 技术,它们都对 query 进行了分类。但这些分类方式是否真正达到了最优状态?它们是否能完美适用于特定的生产场景?有没有可能采用其他分类策略能取得更好的效果?需要通过一系列对比实验(comparative experiments)来验证这些观点。
3.3 小模型(Small Model)亦可大放异彩
RQ-RAG 的实践过程表明,即使是一个 7B 参数量的模型,只要数据集构建得当、生成流程精细, 7B 参数量的模型也能创造卓越的性能表现。
盲目追求模型规模的庞大并不一定等同于更高的性价比。对于那些资源有限的团队而言,专注于优化数据集与精进算法或许是更为明智的选择。
04 Conclusion
在本文中,我们探讨了 query classification 与 query refinement 这两项技术方案,并通过代码实例加以阐释,同时还在本文中介绍了作者对这些技术的理解和思考。
倘若您对检索增强生成(RAG)技术感兴趣,请随时浏览本系列其他文章
Thanks for reading!
Hope you have enjoyed and learned new things from this blog!
Florian June
AI researcher, focusing on LLMs, RAG, Agent, Document AI, target="_blank">
参考资料
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]
原文链接: