当前位置: 首页 > news >正文

[文献阅读]ReAct: Synergizing Reasoning and Acting in Language Models

文章目录

  • 摘要
  • Abstract:
  • 思考与行为协同化
    • Reason(Chain of thought)
    • ReAct
  • ReAct如何协同推理 + 响应
    • Action(动作空间)
    • 协同推理
  • 结果
  • 总结

摘要

ReAct: Synergizing Reasoning and Acting in Language Models [2210.03629] ReAct: Synergizing Reasoning and Acting in Language Models 来自普林斯顿大学和谷歌团队,发表于2022年,中稿于ICLR 2023。

为了解决大型语言模型(LLMs)在处理语言理解和决策任务时的两方面局限性:(1)推理能力和动作能力过于隔离;(2)思维链推理中普遍存在的幻觉和错误传播

文章作者提出了ReAct方法,**推理(Reason)**帮助模型诱导更新动作计划以及处理异常,动作(Action)允许它与外部知识库对接,通过交错生成推理轨迹和特定任务的动作,增强了推理和动作之间的协同作用。ReAct在多种语言和决策任务中显示出比传统方法更优的性能,有效地提升了模型处理复杂任务的能力。

尽管方法很简单,但具有大动作空间的复杂任务需要更多的演示,但缺点是很容易超出上下文限制,未来应该从更多高质量的人工标注中学习。通过多任务训练扩大ReAct的规模,并将其与强化学习等补充范式相结合,可以产生更强大的agent,进一步释放潜力。

Abstract:

This week I read ReAct: Synergizing Reasoning and Acting in Language Models. It introduces ReAct, a novel approach that synergizes reasoning and acting within large language models to address their limitations in language understanding and decision-making tasks. ReAct enhances the models’ ability to dynamically reason and interact with external knowledge bases, such as Wikipedia, through a series of thought-action-observation steps. The report details the methodology, experimental evaluations on various language and decision tasks, and the comparative performance of ReAct against traditional methods. It concludes that ReAct outperforms other approaches and offers interpretable decision trails, highlighting its potential for improving complex task handling in language models.

思考与行为协同化

人类智力的一个独特特征是能够将面向任务的动作与言语推理无缝结合,这被认为在人类认知中发挥了重要作用,以实现自我调节或策略化并保持工作记忆。

考虑一下在厨房里做一道菜的例子。在任何两个具体的动作之间,我们可能会用语言进行推理,以便跟踪进度(“现在所有东西都切好了,我应该把锅里的水加热”),处理例外情况或根据情况调整计划(“我没有盐,所以让我用酱油和胡椒粉代替”),并在需要外部信息时意识到(“我如何准备面团? 让我在网上搜索”)。我们也可能采取动作(打开食谱阅读,打开冰箱,检查成分)来支持推理和回答问题(“我现在可以做什么菜?”)。这种 "动作 "和 "推理 "之间的紧密协同作用使人类能够快速学习新的任务,并进行强有力的决策或推理,即使是在以前没有见过的情况下或面临信息不确定的情况下。

Reason(Chain of thought)

为了模仿人类的思考过程,CoT被提出。

Chain of thought prompting elicits reasoning in large language models [2201.11903] Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

此文是CoT的开山之作,同样来自于Google,中稿于NeurIPS 2022。本文思路清晰,方法简单,通俗易懂,并且实验巧妙,同样值得精读。

CoT是一种简单高效的大模型prompt,用于帮助语言模型进行复杂的推理和思考过程。它通过引导模型逐步解决问题,以一系列连贯的步骤展示推理的思路和逻辑关系。CoT是当前热门的方向之一,是prompt 工程工作的重要基础。

在这里插入图片描述

然而,这种 "思维链 "推理是一个静态的黑箱,即模型使用自己的内部表示来产生思维,并不以外部世界为基础,这限制了它反应性推理或更新知识的能力。这可能导致事实幻觉错误在推理过程中传播等问题。

ReAct

另一方面,一些研究探索了使用预训练好的语言模型在互动环境中计划和动作,重点是通过语言先验预测动作。这些方法通常将多模态观察转换为文本,使用语言模型来生成特定领域的动作或计划,然后使用控制器来选择或执行这些动作。然而,除了执行有限形式的语言推理以重申关于当前状态的空间事实之外,他们并没有采用语言模型来抽象推理高级别的目标或维持工作记忆以支持动作。

除了这种简单的体现任务与几个区块互动之外,还没有研究如何将推理和动作以协同的方式结合起来解决一般的任务,以及与单独的推理或动作相比,这种结合是否能带来系统的好处。

于是文章提出了ReAct,一个将推理和动作与语言模型结合起来的通用范式,用于解决不同的语言推理和决策任务(如图)。ReAct提示语言模型以交错的方式产生与任务相关的语言推理轨迹和动作,这使得模型能够进动作态推理,以创建、维护和调整动作的高级计划(推理到动作),同时也与外部环境(例如维基百科)互动,将额外信息纳入推理(动作到推理)。

在这里插入图片描述

4种提示方法的比较,(a)标准,(b)思维链(CoT, Reason Only),©仅动作,和(d)ReAct(Reason+Act),解决一个HotpotQA问题

比较(a) Act-only和(b) ReAct提示,解决一个AlfWorld游戏

在这两个领域中,我们省略了提示中的上下文例子,只显示由模型(Act,Thought)和环境(Obs)产生的任务解决轨迹。

ReAct如何协同推理 + 响应

考虑一个agent与环境互动以解决任务的一般设置。在时间步t,agent从环境中收到一个观察值 o t ∈ O o_t \in O otO ,并按照一些策略 π ( a t ∣ c t ) π(a_t|c_t) π(atct) 采取动作$ a_t \in A ,其中 ,其中 ,其中 c_t=(o_1,a_1,⋅⋅⋅ ,o_{t−1},a_{t−1},o_t) $是agent的背景。

ReAct的想法很简单:我们将agent的动作空间扩大到 $A˙=A∪L $,其中L是语言空间。语言空间中的动作 $a_t∈L ,我们将其称为思想或推理轨迹,不影响外部环境,因此不会导致观察反馈。相反,一个思想 ,我们将其称为思想或推理轨迹,不影响外部环境,因此不会导致观察反馈。相反,一个思想 ,我们将其称为思想或推理轨迹,不影响外部环境,因此不会导致观察反馈。相反,一个思想a_t 的目的是通过对当前上下文 的目的是通过对当前上下文 的目的是通过对当前上下文c_t$的推理来组成有用的信息,并更新上下文 c t + 1 = ( c t , α t ) c_{t+1} =(c_t,α_t) ct+1=(ct,αt) 以支持未来的推理或动作。如图所示,可能有各种类型的有用思想,例如分解任务目标和创建动作计划(2b,动作1;1d,思想1),注入与任务解决相关的常识性知识(2b,动作1),从观察中提取重要部分(1d,思想2,4),跟踪进度和转运动作计划(2b,动作8),处理异常情况和调整动作计划(1d,思想3),等等。

在这里插入图片描述

然而,由于语言空间L是无限的,在这个增强的动作空间中学习是困难的,需要强大的语言先验。在本文中,我们交替生成思想和动作,这样任务解决的轨迹就由多个思想-动作-观察步骤组成。相反,对于可能涉及大量动作的决策任务,思想只需要少量地出现在轨迹的最相关位置,所以我们让语言模型为自己决定思想和动作的异步发生

由于决策和推理能力被整合到一个大的语言模型中,ReAct享有几个独特的特征:

  • A) 直观且易于设计: 设计ReAct的提示是直接的,因为人工标注者只是在他们采取的动作上面用语言输入他们的想法。本文没有使用临时的格式选择、思想设计或例子选择。我们在第3节和第4节中详细介绍每个任务的提示设计。
  • B)一般性和灵活性: 由于灵活的思维空间和思维-动作发生格式,ReAct适用于具有不同动作空间和推理需求的不同任务,包括但不限于QA、事实验证、文本游戏和网络导航。
  • C) 性能好和稳定性强: ReAct对新的任务实例表现出很强的泛化能力,同时仅从1到6个上下文中的例子中学习,在不同的领域中始终优于只进行推理或动作的基线。我们还在第3节中展示了启用微调时的额外好处,并在第4节中展示了ReAct的性能对提示选择的稳健性。
  • D) 人工调整和可控: ReAct 承诺了一个可解释的序列决策和推理过程,人类可以轻松地检查推理和事实的正确性。此外,人类还可以通过思维编辑来控制或纠正agent的行为。

Action(动作空间)

为了进行知识密集型的推理任务,如多跳问答和事实验证。我们设置通过与维基百科的API交互,ReAct能够检索信息以支持推理,同时也利用推理来确定下一步要检索的目标,展示了推理和动作的协同作用

我们设计了一个简单的维基百科网络API,有三种类型的动作来支持交互式信息检索:

  • (1)搜索[实体],如果存在实体维基页面,则返回相应实体维基页面的前5个句子,否则建议使用维基百科搜索引擎的前5个类似实体;
  • (2)查找[字符串],这将返回包含字符串的页面中的下一句话,模拟浏览器上的Ctrl+F功能。
  • (3)结束[答案],它将用答案完成当前任务。

我们注意到,这个动作空间大多只能根据准确的段落名称检索出一小部分段落,这明显弱于最先进的词法或神经检索器。我们的目的是模拟人类如何与维基百科互动,并迫使模型通过语言的明确推理来检索。

不过,未来的研究可以进一步使用更先进的检索方式来替代这个简单的WIK交互。

整个动作空间被结合例子(simple)放入了prompt中:

webthink_examples = prompt_dict['webthink_simple6']
instruction = """Solve a question answering task with interleaving Thought, Action, Observation steps. Thought can reason about the current situation, and Action can be three types: 
(1) Search[entity], which searches the exact entity on Wikipedia and returns the first paragraph if it exists. If not, it will return some similar entities to search.
(2) Lookup[keyword], which returns the next sentence containing keyword in the current passage.
(3) Finish[answer], which returns the answer and finishes the task.
Here are some examples.
"""
webthink_prompt = instruction + webthink_examples

协同推理

  • 循环从1到7,生成思考和行动。

  • 每次循环增加 n_calls 计数器,最多进行8次思考。

  • 调用 llm 生成思考和行动,llm 使用提示字符串 prompt 并生成一个包含思考和行动的字符串。

  • 尝试将生成的字符串拆分为思考和行动。如果拆分失败(例如字符串格式不正确),则记录错误调用,并重新生成行动。

每一步都进行以下的协同过程:

  • 调用 step 函数在环境中执行行动,并获取观察结果 obs、奖励 r、是否完成 done 和其他信息 info
  • 构建当前步骤的字符串 step_str,包括思考、行动和观察。

任务结束:

  • 执行 finish[] 动作以结束任务
def webthink(idx=None, prompt=webthink_prompt, to_print=True):question = env.reset(idx=idx)if to_print:print(idx, question)prompt += question + "\n"n_calls, n_badcalls = 0, 0for i in range(1, 8):n_calls += 1thought_action = llm(prompt + f"Thought {i}:", stop=[f"\nObservation {i}:"])try:thought, action = thought_action.strip().split(f"\nAction {i}: ")except:print('ohh...', thought_action)n_badcalls += 1n_calls += 1thought = thought_action.strip().split('\n')[0]action = llm(prompt + f"Thought {i}: {thought}\nAction {i}:", stop=[f"\n"]).strip()obs, r, done, info = step(env, action[0].lower() + action[1:])obs = obs.replace('\\n', '')step_str = f"Thought {i}: {thought}\nAction {i}: {action}\nObservation {i}: {obs}\n"prompt += step_strif to_print:print(step_str)if done:breakif not done:obs, r, done, info = step(env, "finish[]")if to_print:print(info, '\n')info.update({'n_calls': n_calls, 'n_badcalls': n_badcalls, 'traj': prompt})return r, info

结果

ReAct持续优于Act ,表显示了使用PaLM540B作为基础模型,采用不同提示方法的HotpotQA和Fever结果。我们注意到,ReAct在这两项任务中都优于Act,证明了推理指导行为的价值,特别是对于综合最终答案,如图所示。微调结果也证实了推理轨迹对更多知情行为的好处。

在这里插入图片描述

ReAct在Fever上的表现优于CoT(60.9 vs. 56.3),在HotpotQA上略微落后于CoT(27.4 vs. 29.4)。Fever对SUPPORTS/REFUTES的主张可能只相差一点点,所以采取动作检索准确和最新的知识是至关重要的。

ReAct + CoT-SC在提示LLMs方面表现最好,在HotpotQA和Fever上最好的提示方法分别是ReAct → CoT-SC和CoT-SC → ReAct。此外,图显示了不同方法在使用CoT-SC样本数量方面的表现。虽然两种ReAct + CoT-SC的方法在一项任务中各有优势,但它们在不同的样本数量上都明显地持续优于CoT-SC,只用3-5个样本就达到了CoT-SC的性能。这些结果表明适当结合模型内部知识和外部知识对推理任务的价值。

在这里插入图片描述

总结

文章提出了ReAct——一种简单而有效的方法来协同推理和行动大型语言模型,解决掉思维链中幻觉传播的问题。通过一组不同的实验,对多跳问答,事实检查和交互式决策任务,表明ReAct带来了卓越的性能具有可解释的决策痕迹。尽管ReAct的方法简单,但复杂的任务用大动作空间需要更多的演示来学习,不幸的是,这很容易超出语境学习的输入长度限制。同时,简单的WIKI交互仅仅是模仿了人类的查询行为,未来的研究可以进一步使用更先进的检索方式来替代这个简单的WIK交互。

相关文章:

[文献阅读]ReAct: Synergizing Reasoning and Acting in Language Models

文章目录 摘要Abstract:思考与行为协同化Reason(Chain of thought)ReAct ReAct如何协同推理 响应Action(动作空间)协同推理 结果总结 摘要 ReAct: Synergizing Reasoning and Acting in Language Models [2210.03629] ReAct: Synergizing Reasoning an…...

摄像头监视脚本

摄像头监视脚本,若检测到摄像头画面有变化,保存这一段视频 一、使用方法 1.运行脚本 默认参数Threshold3, Period3, path./recordings python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…...

FreeRTOS的内存管理(选择heap4.c文件的理由)

目录 1. 了解FreeRTOS内存管理 2. 了解内存碎片 3.了解各个heap.c的内存分配方法 1.heap1.c 2.heap2.c 3.heap3.c 4.heap4.c 5.heap5.c 总结: 内存管理是一个系统基本组成部分,FreeRTOS 中大量使用到了内存管理,比如创建任务、信号量…...

SQL-leetcode-183. 从不订购的客户

183. 从不订购的客户 Customers 表: -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | -------------------- 在 SQL 中,id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。 Orders 表&#…...

苹果系统MacOS下ObjectC建立的App程序访问opencv加载图片程序

前言 苹果系统下使用opencv感觉还是有些不太方便,总是感觉有点受到限制。本博客描述的是在MacOS下建立App程序然后调用opencv显示图片时出现的一些问题并最后解决的一个过程。 一、程序的建立 选择程序的类型: 选择界面模式和编程语言: 其余…...

《代码随想录》Day21打卡!

写在前面:祝大家新年快乐!!!2025年快乐,2024年拜拜~~~ 《代码随想录》二叉树:修剪二叉搜索树 本题的完整题目如下: 本题的完整思路如下: 1.本题使用递归进行求解,所以分…...

Dell服务器升级ubuntu 22.04失败解决

ubuntu系统原版本20.04,服务器dell T40. 执行apt update后,再执行apt upgrade。 apt update执行成功,但apt upgrade执行中断,提示如下: Checking package manager Reading package lists... Done Building dependen…...

构建全志 T113 Tina SDK

1、环境配置: 准备一个 Ubuntu 系统,可以是 WSL,虚拟机等,建议版本是 20.04。 1.1、安装必要的软件 进入系统后,输入下方命令安装需要的工具 : sudo apt update -y sudo apt full-upgrade -y sudo apt i…...

(推荐)【通用业务分发架构】1.业务分发 2.rpc调用 3.Event事件系统

一.Reflections和SpringUtil完成扫描包的(反射缓存) 二.id与class的映射泛型上下文(玩家是否登录,rpc调用SeqId,class类名)反射调用 1.netty层的 AccountMsgParam // 登录前 OnlineMsgParam // 登录后 SceneMsgParam // 发到场景层的 2.跨进程rpc调用的…...

最近的一些事情

正义不会缺席 这家公司违法辞退不给工资乱开离职证明。严重影响个人发展。 今天终于收到法院的判决书。 警醒自身发展与社会之间密切交流,敲响警钟。 虽然最终得到的法院的支持,但过程举步维艰。 这其中的过程,也让我对律师、法院和中国…...

CP AUTOSAR标准之FlexRayDriver(AUTOSAR_SWS_FlexRayDriver)(更新中……)

1 简介和功能概述 FlexRay驱动程序(Fr)抽象了特定FlexRay通信控制器(CC)的硬件相关实现细节。本规范主要依赖于符合FlexRay规范[13]的FlexRay CC。此外,本规范还支持符合FlexRay规范[14]的旧版FlexRay控制器。本SWS中因支持的FlexRay规范不同而导致的不同行为在适用的情况下以…...

Cesium 实战 27 - 三维视频融合(视频投影)

Cesium 实战 27 - 三维视频融合(视频投影) 核心代码完整代码在线示例在 Cesium 中有几种展示视频的方式,比如墙体使用视频材质,还有地面多边形使用视频材质,都可以实现视频功能。 但是随着摄像头和无人机的流行,需要视频和场景深度融合,简单的实现方式则不能满足需求。…...

GraphRAG实践:docker部署neo4j

概述 随着图数据库(Graph Database)的流行,越来越多的应用场景开始采用图数据库来处理复杂的关系数据。Neo4j作为领先的图数据库之一,提供了强大的图形查询语言Cypher、高效的存储结构和丰富的生态系统,使得它成为开发…...

常用的数据库类型都有哪些

在Java开发和信息系统架构中,数据库扮演着存储和管理数据的关键角色。数据库种类繁多,各有特色,适用于不同的应用场景。 1. 关系型数据库(RDBMS): • 关系型数据库是最为人熟知的数据库类型,数据…...

swiftui开发页面加载发送请求初始化@State变量

在SwiftUI中,你不能直接在init中更新State变量,因为State是由SwiftUI框架管理的,初始化时不允许直接修改。所以需要在onAppear发送请求然后修改State状态。 在SwiftUI中,如果希望在页面加载时立即发送网络请求,可以使…...

Ribbon和Eureka的集成

Ribbon和Eureka的集成是Spring Cloud Netflix生态系统的一部分,通常用于微服务架构中,以实现客户端负载均衡和服务发现。以下是更详细的集成步骤: 1. 引入依赖 在你的Spring Boot项目的pom.xml文件中添加Eureka客户端和Ribbon的依赖&#x…...

关于UE加载osgb数据的研究(一)

最近关于倾斜数据在UE中加载显示的问题,直接转换格式本地加载的方式避免了数据延迟加载、缓存加载,动态刷新等问题,但是也暴露了突出的问题:常规的模型格式会丢失掉倾斜数据的lod,致使效果缺失。 故而需要深入研究一下UE加载osgb数据的方式方法。 首先,我们需得学习一下…...

探索数据之美,Plotly引领可视化新风尚

在数据如潮的今天,如何精准捕捉信息的脉搏,让数据说话?Plotly,这款强大的数据可视化工具,正以其卓越的性能和丰富的功能,成为数据分析师、科学家及工程师们的得力助手。 Plotly不仅仅是一个绘图库&#xf…...

List排序的方法

List 排序方法: 1. list 的 sort() package com.example.a; import java.util.ArrayList; import java.util.Comparator; import java.util.List; class User{private Integer score;private Integer age;public User(Integer score, Integer age){super();this.…...

BurstAttention:高效的分布式注意力计算框架

BurstAttention:高效的分布式注意力计算框架 在现代大型语言模型(LLMs)的应用中,提升注意力机制的计算效率已成为研究的热点。当前,提升计算效率主要有两种方法:一种是优化单设备的计算和存储能力&#xf…...

大数据治理:构建稳健的数据生态系统

引言 随着信息技术的迅猛发展,企业每天都在生成海量的数据。这些数据不仅来自传统的业务交易系统,还包括社交媒体、物联网设备、移动应用程序等多个渠道。大数据治理旨在确保组织能够有效地管理其拥有的所有数据资产,以支持决策制定、优化业…...

【图书介绍】几本适合当教材的大数据技术图书

《Spark SQL大数据分析快速上手》 《Spark SQL大数据分析快速上手(大数据技术丛书)》(迟殿委,王泽慧,黄茵茵)【摘要 书评 试读】- 京东图书 《Spark SQL大数据分析快速上手》内容基于Spark新版本展开,符合企业目前开…...

阴阳师の新手如何速刷5个SP/SSR?!(急速育成)

目标:攒5个SP/SSR式神,参与急速育成,省四个黑蛋(想要快速升级技能而且经常上场的式神在攒够5个式神前先不升级)【理论上组成:10蓝40蓝预约召唤福利20修行or抽卡】 关键点:蓝票,新手…...

unity学习4:git和SVN的使用差别

目录 1 svn 1.1 操作逻辑 1.2 对应工具 1.3 SVN避免冲突的好习惯 2 git 2.1 git的基础操作逻辑 2.1.1 commit时,提交文件之外的其他文件需要pull 2.1.2 commit时,发现要提交的本地文件和服务器的文件冲突了 2.1.3 pull 时 2.2 对应工具 2.3 …...

四大自平衡树对比:AVL树、红黑树、B树与B+树

AVL树、红黑树、B树和B树的对比与应用场景 树系列相关文章(置顶) 1、从链表到平衡树:二叉查找树的退化与优化 2、自平衡二叉查找树:如何让二叉查找树始终保持高效 3、AVL树入门:理解自平衡二叉查找树的基础 4、红黑树全…...

BUUCTF Pwn ciscn_2019_es_2 WP

1.下载 checksec 用IDA32打开 定位main函数 发现了个假的后门函数: 看看vul函数: 使用read读取 想到栈溢出 但是只有48个 只能覆盖EBP和返回地址 长度不够构造 所以使用栈迁移: 栈迁移需要用到leave ret 使用ROPgadget找地址: …...

MongoDb-mongosh-登录

本地登录 mongosh --username root --password xxx 参考:Connect to a Deployment - MongoDB Shell...

C语言day3:shell脚本

一、作业题3 使用数组求出当前目录下.sh文件的个数 二、作业题4 使用数组求家目录下文件的个数 三、思维导图...

微信小程序Uniapp

使用命令行创建项目(vuets) npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project然后用HBX打开项目 再安装依赖 npm i 再运行开发版本,生成dist目录 pnpm dev:mp-weixin 注意要设置APPid 再用微信小程序打开...

mongoTemplate的复杂组装条件查询

mongoTemplate不像SQL那么灵活,组装条件较为复杂。 如下演示了查询类似于 AND name ‘张三’ OR age 12 NOT birthday > 2024-12-31 这类结构的代码示例。 脑子里的范围图: 所有的AND锁定一个范围,再跟所有的OR组成的范围取并集&#…...