LLM agentic模式之reflection:SELF-REFINE、Reflexion、CRITIC

2024-06-23 19:04

本文主要是介绍LLM agentic模式之reflection:SELF-REFINE、Reflexion、CRITIC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SELF-REFINE

SELF-REFINE出自2023年3月的论文《Self-Refine: Iterative Refinement with Self-Feedback》,考虑到LLM第一次生成结果可能不是最好的输出,提出一种包括反馈(feedback)和改善(refinement)两个步骤的迭代方法来改进LLM的初始输出。

基本思路

对于输入,SELF-REFINE让LLM生成一个初始输出,接着让同一个LLM对这个输出提供反馈(Feedback),再让LLM根据反馈来改善其输出(Refine),不断迭代进行Feedback和Refine步骤,直到满足停止条件,停止条件为指定的时间步或者从反馈中提取的停止标记(如停止分数)。流程示意如下图:

在这里插入图片描述

SELF-REFINE算法示意如下图,所用的prompts都是任务相关的few-shot prompt,根据不同类型的任务指定不同的prompt。

在这里插入图片描述

反馈会包含输出的不同方面,比如对于代码优化任务,反馈包括效率、可读性、代码整体质量等,prompt模型提供actionable且specific的反馈,actionable是指反馈包括一个可以提升输出效果的action,比如下面代码优化例子中的action:“use the formula”;specific是指反馈要包括输出中具体要改进的地方,比如下面代码优化例子中的反馈提到了"for loop"效率不高。

在这里插入图片描述

实验结论

实验模型是GPT 3.5 和GPT 4,有以下分析结果:

  • SELF-REFINE在不同大小模型下都有提升效果,在GPT 4上提升效果更明显,作者认为SELF-REFINE可以使得更强的模型如GPT-4解锁其潜能。
  • 反馈质量对于SELF-REFINE的影响较大,根据反馈进行Refine也能有效提升输出质量。
  • 模型输出质量随着迭代次数增加而提升,同时存在边际效应递减。
  • 在Vicuna-13B上的实验结果表明它很难进行Refine步骤。

Reflexion

Reflexion出自2023年3月的论文《Reflexion: Language Agents with Verbal Reinforcement Learning》,使用语言反馈来增强LLM agent,让LLM可以从之前的错误中学习。

下图是Reflexion agent通过试错和自我反思(self-reflection)解决决策、编程、推理任务的示例。

在这里插入图片描述

基本思路

Reflexion的框架和算法示意如下图所示,包括三个模型:Actor模型记作 M a M_a Ma,用来生成文本和动作;Evaluator模型记作 M e M_e Me,用来对 M a M_a Ma的输出打分;Self-Reflection模型记作 M s r M_{sr} Msr用来生成文字增强反馈以帮助Actor进行自我提升。

在这里插入图片描述

  • Actor:LLM经prompt根据观测状态生成文本和动作,就像传统基于策略的RL算法一样,在时刻t,从当前策略 π θ \pi_{\theta} πθ采样动作或者输出,并从环境得到一个observation o t o_t ot。作者们使用了不同Actor模型,包括CoT和ReAct,且设计了一个记忆组件mem用来提供额外上下文给agent。
  • Evaluator:评估Actor生成输出的质量,给定任务上下文和Actor的输出轨迹计算出一个奖励分数。对于推理任务,奖励函数基于绝对匹配(exact match)打分,确保生成输出与期望方案尽可能地对齐;对于决策任务,使用预定义的启发式函数,这些函数满足特定的评估准则。此外对于决策任务和编程任务,还尝试使用一个LLM的不同实例作为Evaluator来生成奖励。
  • Self-reflection:生成文本自我反思来为Actor未来的尝试提供反馈。它对给定的奖励信号如成功状态(成功/失败)、当前轨迹、存储记忆mem,生成细致且具体的反馈,这个反馈也会被存储到agent的记忆模块mem中。 比如对于一个多步决策任务,当agent收到一个失败信号,它能推测出动作 a i a_i ai导致了不正确的动作 a i + 1 a_{i+1} ai+1 a i + 2 a_{i+2} ai+2;且可推断它应该执行动作 a i ′ a_i^{'} ai并且得到 a i + 1 ′ a_{i+1}^{'} ai+1 a i + 2 ′ a_{i+2}^{'} ai+2;这样在接下来的尝试中,agent就可以利用其过去的经验在t时刻选择动作 a i ′ a_i^{'} ai
  • Memory:Reflexion包括短期记忆和长期记忆,短期记忆是历史轨迹,Self-Reflection模型的输出则是长期记忆。

Reflection的算法流程如上图右侧所示,也是一个迭代优化过程。Actor与环境交互后生成轨迹 τ 0 \tau_0 τ0,Evaluator生成分数 r 0 r_0 r0,由 r t = M e ( τ 0 ) r_t=M_e(\tau_0) rt=Me(τ0)计算得到, r t r_t rt是第t次尝试的标量分数并随着任务表现提升而增加。Self-Reflection模型分析 { τ 0 , r 0 } \{\tau_0, r_0 \} {τ0,r0}后生成总结 s r 0 sr_0 sr0并存储在记忆模块mem s r t sr_t srt是第t次尝试的自然语言经验反馈。Actor、Evaluator、Self-Reflection模型一起协同迭代直到Evaluator认为轨迹 τ t \tau_t τt是正确的。 试验时,记忆模块mem的大小由最大存储经验个数 Ω \Omega Ω来决定,通常被设置为1-3。

CRITIC

CRITIC是Self-Correcting with Tool-Interactive Critiquing的简称,出自2023年5月的论文《CRITIC: Large Language Models Can Self-Correct with Tool-Interactive Critiquing》,它使用外部工具来核实和改正LLM的输出。

基本思路

CRITIC的示意图如下图所示,给定输入,LLM先生成初始输出,再通过text-to-text API与外部工具交互来核实输出,核实结果与初始输出一起作为LLM的反馈让其改正其输出,这个"Verify → Correct → Verify"的循环不断迭代直到满足终止条件。

在这里插入图片描述

CRITIC方法的算法描述如下图:

在这里插入图片描述

  • CRITIC方法利用LLM的COT推理涌现能力和few-shot in-context learning能力。
  • 为了让LLM能够使用工具,将不同的外部工具如搜索引擎、代码编译器、各种API变成text-to-text函数,用in-context learning的方式让LLM利用工具。(虽然可以让LLM自动选择使用哪种工具,在论文实验中是不同的任务使用不同的工具来校验生成结果,比如问答会使用搜索引擎)
  • 输入x,模型记为M, prompt为 ℘ \wp ,LLM生成的初始输出为 y 0 ^ ∼ P M ( ⋅ ∣ ℘ ⊕ x ) \hat{y_0} \sim \mathbb{P}_{\mathcal{M}} (\cdot |\wp \oplus \ x) y0^PM( x) ⊕ \oplus 为表示连接),LLM使用外部工具来评估 y ^ i \hat{y}_i y^i并生成critiques c i ∼ P M ( ⋅ ∣ ℘ ⊕ x ⊕ y i ^ , T ) c_i \sim \mathbb{P}_{\mathcal{M}} (\cdot |\wp \oplus \ x \oplus \hat{y_i}, \mathcal{T}) ciPM( xyi^,T) T \mathcal{T} T是指工具集合)。critiques可识别错误、提供可执行建议或者提供可信的原则等。
  • LLM根据输入x、之前的输出、和critiques c i c_i ci生成改进的输出 y ^ i + 1 ∼ P M ( ⋅ ∣ ℘ ⊕ x ⊕ y i ^ ⊕ c i ) \hat{y}_{i+1} \sim \mathbb{P}_{\mathcal{M}} (\cdot |\wp \oplus \ x \oplus \hat{y_i} \oplus c_i) y^i+1PM( xyi^ci)​ 。
  • "vevify-then-correct"的过程不断迭代直到满足停止标准,停止标准如满足了校验条件、收到环境反馈、达到最大迭代次数等。

参考资料

  1. Self-Refine: website 、github 、arxiv

  2. Reflexion: arxiv, github

  3. CRITIC: arxiv, github, 使用工具github

这篇关于LLM agentic模式之reflection:SELF-REFINE、Reflexion、CRITIC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088007

相关文章

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易