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

news2024/12/29 9:23:22

文章目录

  • 摘要
  • 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, 0
    for i in range(1, 8):
        n_calls += 1
        thought_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 += 1
            n_calls += 1
            thought = 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_str
        if to_print:
            print(step_str)
        if done:
            break
    if 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交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ISDP010_基于DDD架构实现收银用例主成功场景

信息系统开发实践 | 系列文章传送门 ISDP001_课程概述 ISDP002_Maven上_创建Maven项目 ISDP003_Maven下_Maven项目依赖配置 ISDP004_创建SpringBoot3项目 ISDP005_Spring组件与自动装配 ISDP006_逻辑架构设计 ISDP007_Springboot日志配置与单元测试 ISDP008_SpringB…

Linux -- 从抢票逻辑理解线程互斥

目录 抢票逻辑代码: thread.hpp thread.cc 运行结果: 为什么票会抢为负数? 概念前言 临界资源 临界区 原子性 数据不一致 为什么数据不一致? 互斥 概念 pthread_mutex_init(初始化互斥锁) p…

1.微服务灰度发布落地实践(方案设计)

前言 微服务架构中的灰度发布(也称为金丝雀发布或渐进式发布)是一种在不影响现有用户的情况下,逐步将新版本的服务部署到生产环境的策略。通过灰度发布,你可以先将新版本的服务暴露给一小部分用户或特定的流量,观察其…

从 Coding (Jenkinsfile) 到 Docker:全流程自动化部署 Spring Boot 实战指南(简化篇)

前言 本文记录使用 Coding (以 Jenkinsfile 为核心) 和 Docker 部署 Springboot 项目的过程,分享设置细节和一些注意问题。 1. 配置服务器环境 在实施此过程前,确保服务器已配置好 Docker、MySQL 和 Redis,可参考下列链接进行操作&#xff1…

丢失的MD5

丢失的MD5 源代码: import hashlib for i in range(32,127):for j in range(32,127):for k in range(32,127):mhashlib.md5()m.update(TASCchr(i)O3RJMVchr(j)WDJKXchr(k)ZM)desm.hexdigest()if e9032 in des and da in des and 911513 in des:print des 发现给…

基于51单片机的交通灯外部中断proteus仿真

地址: https://pan.baidu.com/s/1WSlta_7pz5HdWsyIGoviHg 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…

JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介

1. 基本概念 1.1、前言 web开发: web,网页的意思,www.baidu.com静态 web html,css提供给所有人看的数据始终不会发生变化! 动态 web 淘宝,几乎是所有的网站;提供给所有人看的数据始终会发生变化&#xf…

C语言性能优化:从基础到高级的全面指南

引言 C 语言以其高效、灵活和功能强大而著称,被广泛应用于系统编程、嵌入式开发、游戏开发等领域。然而,要写出高性能的 C 语言代码,需要对 C 语言的特性和底层硬件有深入的了解。本文将详细介绍 C 语言性能优化的背后技术,并通过…

C语言-数据结构-查找

目录 一,查找的概念 二,线性查找 1,顺序查找 2,折半查找 3,分块查找 三,树表的查找 1,二叉排序树 (1)查找方式: (2)、二叉排序树的插入和生成 (3)、二叉排序树的删除 2,平衡二叉树 (1)、什么是平衡二叉树 (2)、平衡二叉树的插入调整 (1)L…

[江科大编程技巧] 第1期 定时器实现非阻塞式程序 按键控制LED闪烁模式——笔记

提前声明——我只是写的详细其实非常简单,不要看着多就放弃学习! 阻塞:执行某段程序时,CPU因为需要等待延时或者等待某个信号而被迫处于暂停状态一段时间,程序执行时间较长或者时间不定 非阻塞:执行某段程…

如何理解:产品线经营管理的战略、组织、业务、项目、流程、绩效之间的逻辑关系?-中小企实战运营和营销工作室博客

如何理解:产品线经营管理的战略、组织、业务、项目、流程、绩效之间的逻辑关系?-中小企实战运营和营销工作室博客 产品线经营管理中,战略、组织、业务、项目、流程、绩效之间存在着紧密的逻辑关系,它们相互影响、相互作用&#xf…

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…

Oracle 11G还有新BUG?ORACLE 表空间迷案!

前段时间遇到一个奇葩的问题,在开了SR和oracle support追踪两周以后才算是有了不算完美的结果,在这里整理出来给大家分享。 1.问题描述 12/13我司某基地MES全厂停线,系统卡死不可用,通知到我排查,查看alert log看到是…

三只脚的电感是什么东西?

最近在做加湿器,把水雾化的陶瓷片需要有专门的驱动电路。 我参考了某宝卖家的驱动板以及网上的开源项目,发现了驱动电路的核心就是一个三脚电感。 在此之前我都没注意过这玩意,三脚电感不也还是电感嘛? 今天我们就来看看三脚电…

pyQT + OpenCV相关练习

一、设计思路 1、思路分析与设计 本段代码是一个使用 PyQt6 和 OpenCV 创建的图像处理应用程序。其主要功能是通过一个图形界面让用户对图片进行基本的图像处理操作,如灰度化、翻转、旋转、亮度与对比度调整,以及一些滤镜效果(模糊、锐化、边…

【Git_bugs】remote error GH013 Repository rule violations found for.md

背景 1 在一个分支上的提交顺序如下:-> 代表新的提交 在提交 E 中,文件包含了 GitHub 生成的 token提交 F 是一次普通的提交,不包含 token A -> ... -> E -> F (敏感信息在 E 中)附:给提交起名是为了方便说明问题。…

Day1 微服务 单体架构、微服务架构、微服务拆分、服务远程调用、服务注册和发现Nacos、OpenFeign

目录 1.导入单体架构项目 1.1 安装mysql 1.2 后端 1.3 前端 2.微服务 2.1 单体架构 2.2 微服务 2.3 SpringCloud 3.微服务拆分 3.1 服务拆分原则 3.1.1 什么时候拆 3.1.2 怎么拆 3.2 拆分购物车、商品服务 3.2.1 商品服务 3.2.2 购物车服务 3.3 服务调用 3.3.1 RestTemplate 3.…

安卓执法仪Android接入国标GB28181平台实现实时监控、对讲、报警、定位等管理方案

最近协助不少企业完成了4G无线设备国标接入的需求,尤其是国产芯片的接入,国标发展了十年的时间,目前协议从完成度、性能、AI等各个方面,都已经非常完美地满足各种各样的场景需求,尤其是GB28181-2022的推出,…

SpringMVC学习(二)——RESTful API、拦截器、异常处理、数据类型转换

一、RESTful (一)RESTful概述 RESTful是一种软件架构风格,用于设计网络应用程序。REST是“Representational State Transfer”的缩写,中文意思是“表现层状态转移”。它基于客户端-服务器模型和无状态操作,以及使用HTTP请求来处理数据。RES…

国内独立开发者案例及免费送独立开发蓝图书

独立开发者在国内越来越受到关注,他们追求的是一种自由且自给自足的工作状态。 送这个: 少楠light(Flomo、小报童、如果相机):他们是独立开发者的典范,不仅开发了多款产品,还坚信“剩者为王”…