Advanced RAG 11:对用户输入的内容进行「分类处理」和「再优化」
Advanced RAG 11:对用户输入的内容进行「分类处理」和「再优化」
编者按:你是否曾经遇到过这些情况:你向 AI 助手提出了一个比较复杂的问题,但它给出的回答却比较浅显,甚至完全偏离了你的意图?或者,你询问了一个非常简单的问题, AI 助手却给出了一大堆不必要的信息,让你感到烦恼?
传统的 RAG 技术虽然能有效减少 AI 回答内容中的错误,但并不能改进用户最初提交的 query 内容,因此可能会出现以下这些问题:
- 对于用户提交的简单 query ,系统可能会消耗过多的计算资源,浪费用户时间和增加资源消耗。
- 面对复杂的 query,直接使用原始的 query 进行检索往往无法整理到足够的信息,导致回答不完整或不准确。
- 对于含义模糊、模棱两可的 query ,仅凭原始的 query 进行信息检索更是远远不够,可能会误解用户的真实意图。
那么,我们如何才能缓解这些问题,提高 AI 系统的理解能力和回答质量呢?本文将介绍两种技术方案:query classification和query refinement,并通过代码实例加以阐释,同时还在本文中记录了作者对这些技术方案的理解和思考内容。
传统RAG技术的局限性
虽然传统 RAG 技术能够有效降低 LLMs 回答内容中的错误发生率,但这种技术方案并不能优化用户最初提交的 query,如图 1 中红色框标记的内容所示。
图 1:传统 RAG 技术没有对 initial query 进行改进(图中红色框标记的部分),图片由原作者原创
这种方法可能会出现以下这些问题:
处理简单的 queries 时,该 RAG 系统可能会消耗过多的计算资源。
面对复杂的 queries 时,直接使用 original query(未经任何改动的 query 内容,由用户最初提交的搜索请求。)进行检索常常无法收集到足够的信息。
对于可能存在多个答案的模糊不清的 queries,仅凭 original query 进行信息检索是远远不够的。
两种进阶策略
本文将探讨两种进阶策略:query classification和query refinement,两者均通过训练小模型提升了系统的整体性能。文章最后,作者还将分享对这两个算法的理解与思考。
Adaptive-RAG:根据问题复杂程度分类处理
Adaptive-RAG 提出了一种创新的 adaptive framework(该系统可以根据 query 的复杂程度动态选择最合适的信息检索和生成策略)。如图 2 所示,该系统可根据 query 的复杂度,动态选择最合适的 LLMs 使用策略(包含从最简单到最复杂多种策略)。
图 2:对比不同检索增强型 LLMs(retrieval-augmented LLM)的解答策略差异。资料来源:Adaptive-RAG
图 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 的工作流程,本文会结合具体代码来加以说明。目前,该技术存在四个不同版本的代码实现,它们分别是官方版本、Langchain 版本、LlamaIndex 版本以及 Cohere 版本。本文将以 LlamaIndex 版本作为示例介绍该技术。
代码的运行方式会根据 query 的复杂程度而产生变化,并相应地调用不同的工具:
面对复杂的 queries:需要多个工具协同工作。这些工具会从多份文档中提取信息,具体示例可见于图 3 的右上方。
针对简单的 queries:仅需单个工具从单个文档中获取所需上下文,如图 3 左上方所示。
处理直接明了的 queries:直接调用 LLMs 给出答案,这一过程如图 3 底部所示。
如图 2(C)所示,我们可以通过分类器(classifier)来挑选合适的工具。但与官方版本不同,此处使用的分类器并未针对该应用场景进行过针对性地训练,而是直接应用现成的 LLMs,这一做法在图 4 中有明确描述。
构建分类器(Classifier)
虽然 LlamaIndex 版本的代码实现并没有分类器的构建这一环节,但深入了解分类器的构建过程,对于我们的后续开发工作有着至关重要的作用。
构建数据集(Dataset)
在该技术的实现过程中面临一个重大挑战,我们缺乏带有 query-complexity pairs(query 与其相应的复杂度(complexity)的配对数据)。那么,我们该如何应对这一问题呢?Adaptive-RAG 采用了两种策略,以自动化的方式创建所需的训练数据集(training dataset)。
根据 Adaptive-RAG 提供的数据集,我们可以看到,其对分类器训练集的数据标注工作,是依托于那些已经公开并带有标签的问答数据集完成的。
存在两种处理策略:
对于用户上传的 query ,若使用最简易的、非基于检索的方法能够得出正确答案,那么对应的 query 就会被打上‘A’的等级标签。同样的逻辑,通过单步方法(single-step approach)能够得到正确答案的 query 会标记为 ‘B’ 等级,而通过分多个步骤进行处理(multi-step process)的方法正确解答的 query 则会被标记为 ‘C’ 等级。不过有一点需要在此强调,较为简单的模型优先级更高。也就是说,当单步法(single-step)和多步法(multi-step)均能给出正确答案,但非基于检索的方法无法做到时,就会给该 query 打上 ‘B’ 的等级标签,如图 5 所示。
图 6:不同规模(size)分类模型的实验结果。来源:Adaptive-RAG
从图 6 可以看出,无论分类器模型的 size 如何,其性能表现并无明显差异。即便是小型模型也能维持相同水平的性能,有利于提高资源利用效率。
接下来,我们将介绍一种 query 优化技术:RQ-RAG。
RQ-RAG: 一种 RAG 系统中的 Queries 优化技术方案
针对上述挑战,RQ-RAG 提出了三项优化方法,如图 7 所示。
图 8:数据集的构建流程。来源:RQ-RAG
- 对于日常问候(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 的代码目前正处于重构阶段,某些功能尚未完全实现,因此本文暂无法进行演示。
构建数据集
考虑到 RQ-RAG 系统的端到端(end-to-end)特性,关注数据集的构建流程至关重要。
数据集的构建主要包括以下几个步骤:
1.首先,搜集一个涵盖多种使用场景的语料库(如图 9 所示),包括但不限于多轮对话(multi-turn dialogues)、需分解的 query 语句及需消解歧义的 query 语句。依据该语料库,构建一个任务池(task pool)。
图 15:面对不同情况(paths),我们制定了三种不同的策略 —— 基于困惑度(PPL)、基于置信度(confidence)和基于集成学习(Ensemble)的选择方法。来源:RQ-RAG
正如图 15 所示,RQ-RAG 研发了一套树形解码策略(tree decoding strategy),并使用了三种选择机制:基于困惑度(PPL)的选择方法、基于置信度(Confidence)的选择方法以及基于集成学习(Ensemble)的选择方法。
在基于困惑度(PPL)的选择方法中,模型会选择所有输出中困惑度(PPL)最低的答案。基于置信度(Confidence)的选择方法则是选择所有置信度最高的结果。而基于集成学习的选择方法,则倾向于选取累积置信度分数(confidence score)最高的最终结果。
Insights and Thoughts
这些技术与 Self-RAG 和 CRAG 进行对比
不同于 Adaptive-RAG 和 RQ-RAG 在检索前对原始 query 进行优化的做法,Self-RAG 和 CRAG 的关注重点在于判断何时执行检索(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)来验证这些观点。
小模型(Small Model)亦可大放异彩
RQ-RAG 的实践过程表明,即使是一个 7B 参数量的模型,只要数据集构建得当、生成流程精细, 7B 参数量的模型也能创造卓越的性能表现。
盲目追求模型规模的庞大并不一定等同于更高的性价比。对于那些资源有限的团队而言,专注于优化数据集与精进算法或许是更为明智的选择。
Conclusion
在本文中,我们探讨了 query classification 与 query refinement 这两项技术方案,并通过代码实例加以阐释,同时还在本文中介绍了作者对这些技术的理解和思考。
倘若您对检索增强生成(RAG)技术感兴趣,请随时浏览本系列其他文章