来源:市场资讯
(来源:机器学习算法那些事)
三个数字,看懂一篇四年前的论文为什么至今还在所有智能体里转。
71% 对 37%:模拟家庭任务 ALFWorld 上,ReAct 提示的成功率,比用每类 10 万条专家轨迹训出来的模仿学习智能体 BUTLER 高出 34 个百分点,而它只看了 1-2 个示例。0% 对 56%:HotpotQA 抽样里,ReAct 失败案例中的幻觉占比是零,闭卷推理的思维链(CoT)是 56%。第三个数字是本文算给你看的:循环跑起来,token 花销是单轮直答的 3.5 倍。
这篇论文叫 ReAct(arXiv:2210.03629,ICLR 2023,普林斯顿 Shunyu Yao 在谷歌实习期间的工作),全名"Synergizing Reasoning and Acting"——推理与行动协同。今天你用的编程智能体、浏览器智能体,拆开外壳,里面转的都是同一个循环:想(Thought)→ 做(Action)→ 看(Observation)。这篇文章把它的机制、四张结果表、失败模式和成本边界一次拆完,全部对原始论文数据,末尾附一个 60 行就能跑的复现引擎。
一、解决什么问题:会推理的不敢查,会动手的不会想
2022 年,模型的两项能力各练各的。
推理侧是思维链(CoT,让模型把推理过程写出来再给答案):强,但闭卷。它只靠训练时记住的知识空想,查不了资料,错了也不知道错在哪。论文的抽样给过一个刺眼的数字:CoT 的失败案例里,56% 是幻觉——推理链条像模像样,事实是编的。
行动侧是 Act-only(直接生成动作去调工具):模型会发查询、能拿到维基百科的返回,但没有中间思考,拿到信息也不会用。论文里有个典型现场:Act-only 与 ReAct 执行了完全相同的搜索动作、拿到完全相同的观察,最后一步合成答案时,Act-only 掉链子了。
ReAct 的做法用论文作者自己的比喻:像人做菜。切完菜想一句"现在该烧水了",发现没盐想一句"用酱油和胡椒替代"——行动间隙穿插语言推理,推理靠行动去核实。两种能力互补:推理给行动定方向,行动给推理供事实。
打个更直白的比方:CoT 是闭卷考试,会想但不能翻书;Act-only 是让你翻书但不许打草稿;ReAct 是既许翻书、又许打草稿——那份草稿纸(上下文)就是它的工作记忆。
![]()
图 1|论文图 1:同一道 HotpotQA 问题,(b) 纯推理凭记忆编事实(红色为幻觉)、(c) 纯动作有信息不会综合、(d) ReAct 交替进行拿到可解释轨迹(图源:react-lm.github.io)
二、机制:三个动作、四类想法、一张越写越长的草稿纸
先看全景:循环里只有三个角色——模型(出想法和动作)、上下文(草稿纸)、环境(接动作、回观察)。
![]()
图 2|想-做-看最小单元:Thought 只写草稿纸不惊动环境,Action 真去执行,Observation 回填;上下文逐轮累积,finish 或步数上限退出
ReAct 的动作空间小得惊人。以知识任务为例,论文只给模型三个动作:
- search[实体]
:查维基页面,返回该词条开头的几句;查无此页则返回 5 个相似实体建议
- lookup[字符串]
:在当前页内找下一个含该字符串的句子——模拟浏览器 Ctrl+F
- finish[答案]
:交卷
论文特意说明:这套检索器比当时的神经检索器弱得多,就是为了让模型像人一样,靠显式推理决定查什么、下一步查什么。
每一轮,模型先写一条 Thought(不发给环境,只写进草稿纸),再发一个 Action(真去执行),环境返回 Observation 追加进草稿纸。用论文的符号写就一行公式:
c[t+1] = (c[t], Thought/Action/Observation)
上下文从问题出发,每轮把想、做、看全部追加。想法不是废话,论文归纳了四类各有分工:分解目标("先查 X 再查 Y")、从观察中提取("X 出版于 1844 年")、常识与算术判断("1844 < 1989")、改写检索("换个关键词再搜")。
提示词本身朴素得可疑:HotpotQA 只放 6 条人工写好的示例轨迹,FEVER 只放 3 条。论文试过加更多,没有提升——循环行为的少样本学习,示例贵精不贵多。底座也不挑:主实验用 PaLM-540B,附录换 GPT-3 重跑,结论方向不变,成绩还略好一点。
这个循环本体,60 行 Python 就能搭出来(本文复现版,python3.10+、零依赖、零 API,LLM 决策用确定性脚本替身,骨架与论文一致):
def react_engine(question, max_steps=7): # 论文回退上限:HotpotQA 7 步 context = [] # 草稿纸(工作记忆) for step in range(1, max_steps + 1): thought, action = think(question, context, step) # 真实系统=LLM 生成 if thought: context.append(f"Thought {step}: {thought}") # 想法只写草稿 context.append(f"Action {step}: {action}") if action.startswith("finish"): # 交卷退出 return context obs = execute(action) # search/lookup 真执行 context.append(f"Observation {step}: {obs}") # 观察回填 return context # 步数用尽,触发回退实际跑一遍"《城堡》和《变形记》是否同一位作家"这种两跳问题,轨迹长这样:
![]()
图 3|本文最小引擎的实际运行轨迹:三轮"想做看",Thought 1 分解、Thought 2 提取、Thought 3 综合——四类想法各就其位,全程可读可查
三、四张表:赢在哪,输在哪
只看"想-做-看"的示意图,你不会知道 ReAct 在知识任务上单打并不赢。逐表看数据。
表 1:主结果——单打不赢,组合才赢。 HotpotQA(多跳问答,EM 为精确匹配率)上,ReAct 27.4,低于 CoT 的 29.4;FEVER(事实核查)上反过来,ReAct 60.9 明显高于 CoT 的 56.3。为什么?FEVER 的判断依赖新事实,去查就有用;HotpotQA 更吃推理链的灵活组织,ReAct 的结构化约束反而碍事。论文的解法是让两者互补:ReAct 七步查不出就退给 CoT-SC(采样 21 次思维链投票);CoT-SC 的多数票不足半数(说明模型心里没底)就退给 ReAct 去查。组合后 35.1 / 64.6,双双成为最佳。两个回退阈值不是拍的:正确答案里超过 7 步才完成的只占 0.84%,FEVER 超过 5 步的只占 1.33%。
![]()
图 4|HotpotQA 精确匹配率(论文表 1,PaLM-540B):ReAct 单打不敌 CoT,与 CoT-SC 互补回退后登顶;监督式最优系统 67.5 仍遥遥领先(数据源:arXiv:2210.03629 表 1)
表 2:失败模式——不编事实了,但开始原地打转。 论文人工标注了 200 条抽样轨迹。成功的里面,ReAct 有 6% 是"答对但推理含幻觉"的假阳性,CoT 是 14%;失败的里面,ReAct 幻觉占比 0%,CoT 高达 56%。但代价摆在同一张表上:ReAct 的失败案例中 47% 是推理错误——最典型的形态是循环卡死,反复生成上一轮的想法和动作,论文怀疑贪心解码难辞其咎;另有 23% 是检索无果后被带偏。把表 1 和表 2 复合计算(成功率 × 假阳性 + 失败率 × 幻觉):CoT 的轨迹里约 43.7% 沾着幻觉,ReAct 只有约 1.6%,差 27 倍——这是 ReAct 真正的卖点:不是更聪明,而是更可信。
![]()
图 5|200 条人工标注抽样的成败结构(论文表 2):幻觉被外部观察压到 0%,推理错误却涨到 47%——接地与灵活,一头涨一头落(数据源:arXiv:2210.03629 表 2)
表 3、表 4:决策任务——想法到底值多少钱。 ALFWorld(文本版家务游戏,134 个未见任务,场景超过 50 个位置)上,ReAct 最佳口径成功率 71%,无想法的 Act-only 45%,每类 10 万条专家轨迹训出的 BUTLER 37%;论文做了六组配对对照,ReAct 全部占优。还有个狠对照 ReAct-IM:把"想法"换成照抄环境状态(inner monologue 式复读),成功率掉到 53%——光念叨看到什么不算思考,想法的价值在于写草稿纸上的增量。WebShop(118 万真实商品的购物环境)上,one-shot(只给一条示例)ReAct 成功率 40.0%,比用 10,587 条指令做强化学习的基线高 11 个点;但人类 59.6%,还差着 20 个百分点——提示范式的天花板肉眼可见。
![]()
图 6|论文表 3/表 4:想法值 26 个百分点(71 对 45);复读环境不算思考(53);1-2 个示例打赢十万专家轨迹,离人类仍有 20 个点(数据源:arXiv:2210.03629 表 3、表 4)
四、复现与成本单:循环不是免费午餐
论文之外,本文把引擎真的跑了,顺手记了一本 token 账。上面那道两跳问题:单轮直答的提示约 273 token;ReAct 循环三轮,因为每一轮都要把完整草稿纸重发一遍,单轮提示从 279 涨到 336,累计输入 942 token——直答的 3.5 倍。为什么要重发?自回归模型没有跨轮状态,草稿纸就是它的全部记忆。步数越多,账单越陡:第 k 轮的输入包含前 k-1 轮的全部想法、动作、观察,总开销随步数超线性增长。论文设 7 步回退上限,既是性能判断(99% 以上的正确答案 7 步内完成),也是成本刹车。
![]()
图 7|本文实算(本地引擎真实输出):三轮循环累计输入 942 token ≈ 单轮直答 3.5 倍;草稿纸每轮全量重发,步数越多单价越高
论文自己也没回避提示范式的极限,于是留了第三条路:用 3,000 条 ReAct 生成的正确轨迹去微调小模型——8B 模型微调后反超 62B 模型的任何提示方法,62B 微调后反超 540B 提示。知识任务上,监督式最优系统 67.5 的 EM 仍把所有提示方法甩在身后,ReAct 的定位从来不是"打败专用系统",而是"通用、少样本、可解释"。
五、边界:什么时候别用
ReAct 官方仓库(github.com/ysymyth/ReAct,4.3k star,MIT 协议)两年多没大更新,但循环骨架活成了行业标准——LangChain 等框架的智能体循环、各家编程智能体的"调用-看结果-再决定",都是它的变体。Anthropic 工程团队 2024 年底那篇《Building effective agents》说得直白:智能体"通常就是在循环中根据环境反馈使用工具的 LLM",同时他们也敲了黑板——能用简单方案就别上智能体,循环换来的是性能,付出的是延迟、成本和错误复利。
![]()
图 8|一棵决策树判断该不该上循环:一步能答别上、流程固定用编排、有工具可验才值得;上下文紧、错误会滚雪球的场景必须配沙箱与步数上限
三条实操边界,来自论文失败模式与成本账的直接推论:检索质量差的环境别硬上(23% 的失败源于检索无果);上下文窗口紧的任务慎用(草稿纸指数变厚);答案可机器验证的任务优先上(代码、数学类错误能被 Observation 当场抓住)。还有一条工程经验:遇到循环卡死,先检查是不是贪心解码在复读,加温度、限重复,比换模型便宜。
四年后回看,ReAct 给智能体留下的不是某个具体算法,而是一个最小可用的思考单元。下一个问题是:那三个土味的 search[...] 文本动作,是怎么长成今天结构化的工具调用(function calling)接口的?
下一篇就拆这个:工具调用与 function calling——模型怎么"伸手"拿外部能力,动作从文本约定变成结构化协议,中间丢了什么、赚了什么。
你的智能体上次卡死循环,是想法不够,还是检索不济?对着表 2 的三类失败看一眼轨迹,比急着换模型便宜。
参考资料
Yao et al. ReAct: Synergizing Reasoning and Acting in Language Models. ICLR 2023,arXiv:2210.03629(文中表 1-4、图 1、回退阈值、微调结论均出自此论文)
官方项目站(含原图):react-lm.github.io ;代码仓库:github.com/ysymyth/ReAct(4.3k star,截至发文 GitHub 口径)
Google Research 博客:ReAct: Synergizing Reasoning and Acting in Language Models(2022-11)
Anthropic 工程博客:Building effective agents(2024-12-19,"LLM 在循环中用工具"定义与"能简单勿复杂"警告)
LangChain 智能体文档(Agent = Model + Harness 循环结构):https://docs.langchain.com
本文循环引擎、token 账本与幻觉复合率均为本地实算(python3.10+、零 API),口径在文中标注,数字可复现
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.