Hi,我是 Hyde。
今天我们讨论的话题是:如何通过优化 RAG 中的生成环节来最优化大模型的效果。
在最简单的 RAG 系统中,存在这样一个工作链条:
当用户进行提问时,RAG 系统首先会根据问题从预先构建好的数据库检索相关的文档,并返回给大模型进行生成。在这个过程中,我们一共做了三件事儿,分别是索引、检索和生成。为了获得更好的效果,需要对这三个环节进行针对性的优化,从而提高 RAG 系统的性能。
在本系列的前两篇文章《最优化大模型效果之 RAG(二):索引的优化策略》 和《最优化大模型效果之 RAG(三):检索的优化策略》中,我们已经针对索引和检索环节的优化进行了讨论,目的是提高目标文档的召回率和准确率,并尽量减少噪声。
我们已经为生成环节准备好了建筑材料,接下来就是如何盖房子的问题了。
回归需求本身
生成阶段的核心目标是解决用户的问题,需求场景不同,面向用户提供的服务和价值也就不同。
因此在讨论如何优化生成环节效果和设计更高效、实用、符合用户需求场景的用户体验时,不能脱离用户的需求场景而单独地考虑如何优化。核心逻辑是先梳理出核心场景和链路中各个环节的痛点,再针对性地为痛点寻找和设计合适的技术方案和产品方案。
梳理需求和链路痛点
例如在淘宝设计团队分享的案例《手机天猫+AI → 智能驱动电商新体验》中提到的:
但对电商平台来说,用户场景更为复杂,用户常常在搜索和查看商品间反复横跳,在商品详情页庞杂的信息中翻找,在多个商品间纠结不知道怎么选,看其他用户怎么评价,在购物车里来回凑不知道怎么买更省…不少问题伴随链路产生,让用户在链路和独立聊天页间来回进出,并不是合适的解决方案。
我们认为AI智能技术是手段,需求场景不同、产品功能不同,面向用户的设计形态自然也应该有所不同。要设计更高效、实用、符合电商场景的AI产品体验,核心逻辑是先梳理逛-找-看-对比-聊-买-售后完整购物链路下各个阶段的痛点,其次针对解决痛点所需功能选择对应智能技术和合适的设计形态。
需要清楚地意识到线上购物发展多年,用户痛点存在的依然存在,只是过去的技术给出的是过去的解决方案,新技术给老问题带来了新解法。
针对性地设计 RAG 管道
梳理出问题和痛点后,我们就可以针对这些问题和痛点设计专门的 RAG 管道,进行专门的优化和组合,然后在合适的时机、地点调用他们。
例如,我们可以为不同的场景设计不同的提示词,然后根据用户的提问动态得选择合适的提示词提示模型进行生成,通常这比一个大型的复杂提示词效果更好。
为特定场景设计 RAG 管道是一个见招拆招的过程,需要我们不断地发现和解决问题,为用户带来更优秀的体验。
生成环节的优化策略
RAG 中的生成就是是利用 LLM 的能力根据提示词、用户的问题和检索结果生成答案的过程,这里面有一些关键词——“提示词”和“LLM”。
我们可以从提示词和优化大模型这两个方向入手来实现生成环节的调优。
提示词工程
改进提示词是我们针对大模型进行调优的第一选择,通常这种方式能够以很小的成本换来显著地效果提升。
提示工程的手段有很多,例如编写更加清晰和结构化的提示词、使用少样本提示和思维链等策略,具体而言大家可以参考 OpenAI 的提示工程指南(需魔法),或者访问 WaytoAGI知识库中Prompts的部分。
Fine-tuning
与改进提示词不同,微调直接作用于大模型本身。通过专门设计的提示词对模型进行微调,可以让模型学习到新的知识,并在对应领域获得更好的效果。例如,在一些专门的任务上,经微调的小参数模型效果好于未经微调大参数模型
此外,微调还可以调整模型的输出格式和语言风格,并与人类的喜好对齐。
RAG Pipeline
现在我们已经将简单的 Naive RAG 优化为了个 Advanced RAG 系统,通常它长这个样子。
序贯流程(Sequential Pipeline)
这是一个非常典型的序贯流程,只涉及一次检索和生成,面对相对简单的问题时,非常有效。但一旦涉及需要进行多步推理的复杂问题时效果不好,本质上来说还是因为这种序贯流程所能提供的信息范围有限,因此我们需要设计更复杂的 RAG 管道来解决复杂的问题。
条件流程 Conditional Pipeline
在带有条件的 RAG 管道中,通常会使用 语义路由器(Semantic Router) 来将用户的问题路由到不同的检索和生成过程。
例如,针对不同的领域,我们设计了不同的提示词、训练了相应的垂类模型。这时我们就可以依据用户问题所对应的领域,自动选择合适的 RAG 管道,以获得最佳的结果。
分支流程(Branch Pipeline)
在具有分支的管道中,我们往往会并行地执行多个检索或生成过程,然后将检索或生成的结果融合,并进行最终地结果生成。
分支流程的典型案例是 RAG-Fusion,这种方法会生成多个相近的问题,然后并行地进行检索,其过程如下图所示:
循环流程(Loop Pipeline)
具有循环结构的 RAG 管道通常都涉及相互依赖的检索和推理步骤,得益于这些步骤,具有循环特征的 RAG 管道能够更好的解决复杂问题并减少幻觉。
1. 解决复杂问题
Least-to-Most
在 Least-to-Most 中,RAG 系统会将问题拆解为多个子问题,然后依次解决,直至生成最终结果,其过程示意图为:
Step-Back
通过 Step-Back Prompt,LLM 可以从原始问题中抽象和派生出更高级的概念和第一性原理,进而我们可以使用这些概念和第一性原理来指导 LLM 进行后续的推理步骤。
2. 减少幻觉
验证链(CoVe)
一些 Loop Pipeline 也有助于减少模型幻觉的产生,例如 CoVe(Chain of Verification)。这种方法由以下四个连续的步骤组成:
- 生成初始响应:生成针对原始问题的回答,此过程可以引入其他的 RAG 管道。
- 验证问题生成:创建一系列针对初始响应中事实的验证问题,这些问题将被用于检查这些事实的真实性和准确性。
- 执行验证:依次独立地回答 步骤2 中的每个验证问题,然后将答案与初始响应进行核对,检查是否存在不一致或错误(此步骤可以使用工具,例如搜索引擎来验证准确性)。
- 生成最终答案:依据 步骤3 的结果订正初始响应,生成最终的回答。
澄清树(Tree of Clarifications)
澄清树是一种递归的结构,可以用于澄清一些指向不明的开放域问题,例如“亚马逊是什么?”,这个问题可以有多种解释,例如“亚马逊”可能指的是亚马逊公司、亚马逊雨林、亚马逊河流等。
在处理模糊问题时,TOC 采用递归算法构建一个层级结构,该结构类似于一棵树,其中的每个节点代表问题的一个潜在解释或需要澄清的方面。通过利用少量的示例指导,模型能够识别并列举出问题的多种解读方式,这些解读被组织成树状结构,形成一个概念框架。
对于树中的每个节点,TOC运用先进的信息检索技术,从外部知识库中搜集相关联的信息和数据,这些信息旨在支持和丰富对该节点所代表解释的理解。一旦澄清树构建完成并经过优化,模型会整合所有有效节点中提取的细节,生成一个全面且详尽的答案。
在最终答案的生成过程中,TOC优先选取与有效节点直接相关的文本段落,结合原始问题、选择的澄清点以及相关联的上下文,进行编码和综合分析,最终产出一个条理清晰、内容丰富的综合性回答。
自适应检索(Adaptive Retrieval)
自适应检索是一种主动的检索策略,由大模型根据特定需求主动调整检索过程,选择最合适的时机和内容进行检索,并决定何时结束整个过程并产生最终结果。与传统的被动检索策略相比,自适应检索更加灵活高效,
Self-RAG
Self-RAG(Self-Reflective Retrieval-Augmented Generation,自我反思检索增强生成)是自适应检索领域的代表性框架之一。Self-RAG 结合了检索增强技术与自我反思机制的方法,使模型在生成文本的过程中能智能决定是否需要从外部知识源检索信息或自我评估已生成内容的质量。并根据这些信息进行自适应的调整,从而提高生成文本的质量和事实准确性。
在 Self-RAG 的原始论文中,研究人员对模型进行了训练,使其能够在生成结果的同时生成反思标记。反思标记分为 “检索” 和 “批判” 两种,其中“检索”标记指示模型应该检索相关的信息,“批判”标记则用于评估生成内容的质量。
当模型遇到反思令牌时,它会进入一个决策状态,决定下一步的行动:
- 如果模型决定检索,它将查询外部知识库,寻找与当前生成上下文最相关的信息。
- 如果模型决定进行自我批判,它会评估已生成文本的质量,判断是否需要修正或补充信息。
Self-RAG 的核心思想在于自我反思机制,当检索出的结果与提问不匹配时,会自动改写查询并重新执行RAG过程,直到获得满意的结果。
基于此思想,我们也可以在构建出无需额外训练模型的 Self-RAG,例如 LangChain 团队使用 LangGraph 框架实现的 Self-RAG 案例,其流程图如下:
构建更复杂的流程
为了更有效地解决复杂问题,我们经常需要灵活运用上述四种流程结构,来构建更复杂的 RAG 管道。例如,可以在现有管道的基础上加入 CoVe,用于验证最终的生成结果,尽量减少幻觉的产生。
然而,管道的复杂度并非越高越好。我们需要在成本、响应速度和准确率等多个因素之间找到最佳平衡点,依据实际业务需求做出决策。
Agentic RAG
在开始这个部分前,如果你不了解 Agnet 这一概念,可以参考 Lilian Weng 的博客文章《LLM Powered Autonomous Agents》和吴恩达关于《AI Agent 设计模式与展望》的分享。
Agentic RAG(基于代理的检索增强生成)是一种深度融合了 Agent 技术的 RAG 框架,核心思想是利用 Agnet 的环境感知、规划、推理和决策能力,来完成需要进行复杂规划、多跳推理和使用外部工具解决的复杂问题。
工具调用(Tool Use)
工具调用在 Agentic RAG 中是指,Agent 能够在适当的时刻调用和利用外部资源或工具,从而增强信息检索和生成响应的能力,以达到最佳生成结果。
例如,Agent 可以根据具体查询的需要,自主选择合适的 RAG 管道进行生成。或者动态地调用和组合工具,提供最准确和有价值的信息,不再仅仅依赖静态或预定义的信息源。
动态规划与执行(Dynamic Planning & Execution)
动态规划与执行(DPE)是指在处理复杂任务时,代理不仅需要依据用户的提问规划一系列步骤,还需要控制这些步骤的执行。
基于此策略的 Agentic RAG 需要执行以下过程:
- 规划:根据输入查询,代理构建一个执行计划,该计划可能包括一系列子任务及其相互依赖关系。
- 工具识别与执行:代理确定每个子任务所需的工具,并执行它们。
- 协调与监控:代理监控执行过程,确保任务按计划进行,同时处理可能出现的任何异常情况。
多 Agent 协作(Mulit-Agent Collaboration)
多 Agent 协作是指由多个能够自主决策、执行任务并相互协作或竞争的 Agents 组成的系统。这些智能体通常具备一定程度的自主性、反应性和社会性,能够在复杂的环境中共同解决问题。
因此,在基于 Mulit-Agent 策略的 Agentic RAG 系统中,不仅仅是一个单一的智能体在工作,而是一个由多个专门设计的智能代理组成的系统,它们能够相互协作,共同解决用户提出的问题。
在Agentic RAG系统中,通过角色划分和任务分配,多个 Agent 分别专注于不同的任务或信息源,同时由“调度Agent”分析查询需求并分配任务。各 Agent 间通过通信机制共享数据和结果,以促进信息共享与协作。
在协同规划与执行方面,Agent 共同参与动态规划和执行,确定任务顺序、优先级及并行处理策略,并根据新信息或环境变化适时调整策略,从而高效完成复杂任务。
OK,非常感谢你的观看,我是 Hyde,我们下次见。