ReAct:推理与行动交替

5,652 字 · 预计阅读 16 分钟

2022 · Yao 等 / Princeton、Google · 推理与行动交替进行,今天 Agent 循环的原型

ReAct 让大模型像人一样「想一步、做一步、看一眼结果,再想下一步」。它不需要重新训练模型,只要在提示词里给几个示范,模型就能一边推理、一边查资料或操作环境。

今天几乎所有 AI Agent 的工作循环,都能在这篇论文里找到原型。

原文:ReAct: Synergizing Reasoning and Acting in Language Models(2022 年 10 月发布)

作者:姚顺雨(Shunyu Yao)等,普林斯顿大学与 Google Research。

第一作者当时是普林斯顿的博士生,这项工作是他在 Google 实习期间完成的。


先看看人是怎么做事的

周末你想带爸妈出去吃顿饭,脑子里大概是这样转的:

  • 想:爸妈不吃辣,最好离家近一点。
  • 做:打开地图,搜「附近 粤菜」。
  • 看:评分最高那家,周末要排两个小时队。
  • 想:排队太久了,换一家能提前订位的。
  • 做:给第二家打电话。
  • 看:订到了,晚上六点。
  • 想:好,搞定。

这个过程里,「想」和「做」是交替进行的:想清楚了才知道该做什么,做了之后看到新情况,又会改变接下来的想法。没人会坐在沙发上光靠想就把餐厅订好,也没人会闭着眼睛把手机上的按钮挨个点一遍。

这件事对人来说再自然不过。但在 2022 年,大模型还不会这样做事。

小黑在手机地图和念头之间来回,看到排队太久就换一家

像这样自己想、自己动手、看了结果再想的 AI 助手,今天有个名字:Agent,中文叫智能体。开头说的「今天几乎所有 AI Agent」,指的就是它。


一、2022 年的大模型

当时研究者让大模型解决复杂问题,大致有两条路,各有各的毛病。

偏科一:只会想,不会查

前面讲过「思维链」(Chain-of-Thought,简称 CoT):

让模型先把推理步骤写出来,再给答案。这一招让模型做数学题、逻辑题的能力明显提升。

但思维链有个根本问题:它是闭卷考试,所有知识都来自训练时记住的东西。

记错了、记混了,或者知识已经过时了,它都没办法发现,只会顺着错误的前提一本正经地推下去。

前面一步错,后面步步错。这就是常说的「幻觉」和「错误传递」。


偏科二:只会做,不会想

另一条路是让模型直接输出动作:

搜索什么、点击哪里、拿起什么东西。模型像一个跑腿的,终于能和外部世界打交道了。

可它只跑腿、不动脑:不会拆解目标,不记得自己做到了哪一步,

结果和预期不一样时也不会调整计划。

论文里有个例子。模型在一个文字版的家务游戏里找胡椒瓶,走到水槽边,环境已经告诉它这里没有胡椒瓶,它还是一遍遍地尝试「从水槽拿起胡椒瓶」,原地打转。

一个会想不会查,一个会查不会想。ReAct 要做的,就是把两者合起来。

小黑在水槽边反复抓空,只做不想就会原地打转

这里有个问题:模型只会写字,它怎么「搜索」「拿起胡椒瓶」?

答案是旁边有个程序替它动手。模型写出一行约定好格式的字,比如「搜索[苹果遥控器]」;程序认出这行字,真的去搜,再把搜到的内容贴回给模型看。

下命令的是模型,动手的是程序。文末选修部分的代码,就是这个程序。


二、核心:把 ”想“ 也当成一种动作

ReAct 这个名字来自 Reasoning(推理) + Acting(行动)

做法很简单:在模型原本能做的动作(搜索、点击、拿东西……)之外

再加一种特殊的动作——说出自己的想法。

这个动作不改变外部世界,也不触发任何工具,只是把想法写在「草稿纸」上。

但写下来的想法会留在上下文里,帮模型理清楚:

我现在知道了什么?还缺什么?下一步该做什么?

上下文,就是模型写下一个字时能看到的全部文字:提示词、题目,还有它自己前面写过的东西。

前面讲过,模型每次只算下一个 token,算的时候看着前面所有的文字。它没有另一个「脑子里记着」的地方:没写出来的想法,下一步就看不到了。

所以「说出想法」虽然不碰外部世界,却很管用。开头订餐厅时那句「排队太久了,换一家」,写下来,下一步一眼就能看到。


于是,模型解题的过程变成了三种内容交替出现:

环节 谁来写 作用
思考(Thought) 模型 拆解问题、总结已知信息、决定下一步,发现不对劲时调整计划
行动(Action) 模型 调用工具,比如搜索一个词条
观察(Observation) 外部环境 工具返回的结果,比如搜到的那段文字

思考 → 行动 → 观察 → 思考 → 行动 → 观察 → …… → 给出答案

ReAct 的思考、行动、观察三步循环,小黑在三个石头上走一圈

说白了,想,是为了更好地做;做,是为了更好地想。

思考帮模型制定和调整行动计划,行动带回来的真实信息又让思考有据可依,不再凭空编造。

这样一圈圈转下来,模型眼前的文字越积越长。每一轮,模型接着写「思考」和「行动」;程序执行行动,把结果作为「观察」贴到后面;下一轮,模型看着这一整段接着写:

每转一圈,文字就长一截:思考和行动是模型写的,观察是程序贴上的

注意「观察」那一截不是模型写的。这正是 ReAct 不瞎编的原因:事实来自程序贴回来的结果,不是模型自己想出来的。

还有最关键的一点:ReAct 不需要训练模型。

研究者只是在提示词里放了几个人工写好的示范(问答任务里只有 3~6 个)。

示范里,人把自己解题时的想法和动作一条条写下来。大模型看了这几个例子,就学会了照着这个格式去解新问题。

几个示范为什么就够?前面讲过,语言模型做的事就是接着往下写。它在训练里见过海量文字,很会「照着前面的样子写」。

提示词大概长这样(示意):

请按「思考、行动、观察」的格式解题。行动只能是:搜索[词条]、查找[关键词]、完成[答案]。

问题:(示范题 1)
思考 1:……
行动 1:搜索[……]
观察 1:……
……
行动 3:完成[……]

(再放几道示范题)

问题:(新题)

本文是会员内容

全文 5,652 字,已试读约 29%。开通专业版可阅读全文,并解锁全部官方课程与后续更新。

开通专业版

支持 7 天无理由退款 · 早鸟价 99 元/年(售完恢复365/年)

课程中涉及的第三方项目,其著作权与商标归各自权利人所有;引用处的署名与许可见《开源与来源说明》。