开篇:那个"完美提示词"第二天就失效了

你大概经历过这样的时刻:花两个小时把一段提示词打磨到满意,角色、任务、约束、示例、输出格式,每一块都反复调过。在演示里,模型的表现堪称惊艳——措辞得体、结构清晰、几乎不用改。

第二天它被接进真实业务。任务要求它先查三个系统,把结果汇总成一张表,中途遇到一个查不到的字段,再根据实际情况决定要不要换个数据源。提示词一个字都没改,任务却卡在了第三步。模型停在那个查不到的字段前面,一遍又一遍地给出看起来很像、但完全没用的回答。

问题不在提示词写得不够好。提示词的上限,是把"这一次输入"写对;而真实任务从来不是一次输入能解决的。 真正让模型解决复杂任务的,不是更聪明的提示词,而是一个能让它边想、边做、边根据结果修正的循环——这个循环有一个正式的名字,叫 ReAct。

这篇文章想讲清一件事:从提示词到思维链,再到 ReAct,我们设计的东西一直在变——从"一段话",变成一个"能自我纠正的流程"。而 ReAct 之所以重要,是因为它第一次把"想"和"做"放进了同一个循环里。

一、提示词的天花板:它只能优化"这一次输入"

提示词工程能优化的只有"这一次输入",而真实任务从来不是一次输入能解决的。

先看提示词工程到底在做什么。它并不神秘,也不是什么咒语,而是一套可复现的输入设计方法:角色、任务、约束、示例、输出格式,每一部分都有它明确的作用。这套方法确实有效,中文世界里那些播放量几十万的提示词教程,讲的也基本是这些——把角色设定清楚,把约束写明白,给几个示例,规定输出格式。

要理解它的边界,得先理解模型的底层在做什么。有讲解者打过一个很贴切的比方:模型生成文本,本质上是一场"高级版成语接龙"——它理解上下文,然后计算下一个词出现的概率。你给它"今天天气真好,我打算去___",它会算出海边、公园、散步等几百个候选,并给每个候选算一个概率。

这个机制决定了提示词能做的事:它只能让"这一次的上下文"变得更好,从而让下一个词的概率分布更接近你想要的。 它改变的是这一次输入的形状,改变不了任务的形状。

而真实任务的形状是什么样?一位讲智能体循环的工程师把这件事说得很直白:在传统的聊天机器人里,你要回一封邮件,是你自己从邮箱里复制粘贴;你要排一个会议,是你自己去看日历、切标签页、点按钮,然后把这一切塞进提示词的上下文窗口里。做动作的人是你。

这就是提示词的天花板所在。它能让模型把"你给的材料"处理得更好,但材料得你自己去找、动作得你自己去做、下一步得你自己判断。当任务需要查资料、调接口、根据结果决定下一步时,提示词工程能做的,只是让你写完这一个完美提示词之后,再写下一个。

那能不能让模型自己想得更久一点,一次把复杂问题想完?

图1:提示词工程的能力边界

二、思维链让模型想得更久,但它始终在闭卷答题

思维链把计算摊到更长的 token 序列上,让模型想得更久,但它始终在闭卷答题,无法接触外部世界。

思维链(Chain-of-Thought)的做法很朴素:不要直接要答案,让模型把中间步骤写出来。有个经典的例子能说明它的效果——问"一个人有 5 个网球,又买了两箱、每箱 3 个,一共几个",如果只给模型看"答案是 11"这样的示例,同一个模型可能算出 27;但如果把"5 + 2 × 3 = 11"这个计算过程写下来作为示例给它看,它就能一步步推出正确答案。

为什么多写几步就有效?这里有一个很物理的解释:模型每输出一个 token 都需要算力。如果只让它吐几个 token,每个 token 的算力是固定的,这几个 token 的总算力就远远小于后面那一大堆 token。让它多写,等于给它更多算力去算。

研究者对这个现象有两个假设。一个是"草稿纸"假设:模型下一步可以参考上一步显式写下来的想法,不必把所有计算都压在权重里完成。另一个更直接:它解码了更多 token,就等于在一个问题上投入了更多计算时间。这两个假设后来被工程界进一步放大——新一代的推理模型干脆把算力从训练阶段搬到了推理阶段,先花更多 token 去"想",再给答案,这就是所谓的测试时计算。

但思维链有一个根本性的局限,而这个局限恰恰是 ReAct 出场的理由。

ReAct 那篇论文在开篇就点出了它:思维链是一个静态的黑盒——它不接地于外部世界,无法根据外部反馈调整自己的推理。换句话说,思维链再长,也是在闭卷答题。 它只能凭训练时记住的东西作答,答错了也不知道自己错了,因为没有任何外部信号告诉它"这一步不对"。

闭卷答题的极限,就是它只能凭记忆答。要突破这个极限,得允许它翻书、允许它动手——这就是 ReAct 要做的事。

当然,思维链也不是万能的。有工程实践者提醒,简单的分类、抽取、格式转换任务用推理模型反而又慢又贵,效果还未必更好;而且思考的 token 也是要计费的,用户还得等。选不选它,要看任务复杂度。

图2:思维链——把计算摊到更长的 token 序列上

三、ReAct 的框架:把"说话"也变成一种合法的动作

ReAct 的框架创新不在提示词的措辞,而在动作空间的定义——它允许模型输出一种不改变环境、只更新上下文的动作,也就是"思考"。

ReAct 这个名字来自 Reasoning 和 Acting 的组合。它的做法是让模型交错地生成推理轨迹和任务动作:推理帮助模型归纳、跟踪、更新行动计划,也能处理异常;动作则让模型能够对接外部信息源,比如知识库或环境,去取回新信息。

但它真正的机制创新,藏在一个很技术、却极关键的表述里。论文说,ReAct 把智能体的动作空间从原来的动作集合,扩展成了"动作 ∪ 语言"。语言空间里的一个动作,就是一次思考、一段推理轨迹。这种动作有一个特殊性质:它不改变外部环境,因此不会产生任何观察反馈;它只做一件事——把有用的信息组织进上下文,供下一步推理或行动使用。

这句话值得多读一遍。它意味着,"想"被正式承认为一种动作了。在 ReAct 之前,模型要么输出文本(说话),要么调用工具(动手),两者是分开的两件事;在 ReAct 里,它们被放进了同一个动作空间,用同一套机制调度。

那么模型"想"的时候,具体在想什么?论文归纳出五类有用的思考:

一是分解任务目标、制定行动计划——先把大任务拆成几步。二是注入与任务相关的常识——把模型自己知道但没写在题目里的背景知识调出来。三是从观察中抽取关键部分——工具返回了一大段内容,只挑出真正有用的那几句。四是跟踪进度、切换计划——做到哪一步了,下一步该换方向了。五是处理异常、调整计划——工具报错了、查不到东西了,怎么办。

这五类思考不是并列的技巧,它们对应着循环里五个不同的位置:开始时要拆解,动手中要抽信息,走偏了要纠回来,出错了要补救。

至于思考和动作怎么交替,论文给了两种节奏。对于以推理为主的任务,比如问答和事实验证,它让思考和动作逐轮交替,形成"思考—动作—观察"的连续序列。而对于动作密集的决策任务,比如玩游戏、操作网页,思考不需要每一步都出现,只需要稀疏地出现在最关键的几个位置,具体出现在哪里,交给模型自己决定。

一次完整的 ReAct 轨迹长这样:思考,然后一个动作,然后一个观察结果,再思考,再动作,再观察……直到模型输出一个"完成"动作,给出最终答案。这个格式看起来简单,但它把整个解题过程变成了可读、可检查、可中断的记录。

论文还总结了 ReAct 的三个设计特性。第一是直观易设计——人类标注者只需要把自己的想法用自然语言写在动作上面,不需要设计什么特殊格式。第二是通用灵活——因为思考空间是自由的、思考与动作的出现方式也是灵活的,它能适配动作空间完全不同的各类任务。第三是少样本即有效——只用一到六个示例,它就能在新任务上稳定超过"只推理"或"只行动"的基线。

用一个更日常的画面来理解这个差别:在聊天机器人里,复制粘贴、切标签页、点按钮的人是你;在 ReAct 里,这些动作由模型自己完成,而它每做完一个动作,都会抬头看一眼结果。

也正因为如此,有人把这件事概括成一个正在发生的转变:提示词工程优化的是"一次输入",而循环工程优化的是"一个能自我纠正的流程"。前者关心这句话怎么写,后者关心这个系统怎么自己判断下一步该干什么。

框架讲清了,但"循环"具体长什么样?跑起来每一步到底发生什么?

图3:ReAct 框架——动作空间扩展与五类思考

四、ReAct 的执行路径与案例:收益来自"边做边修正"

ReAct 的执行路径本质是一个带终止条件的循环,它的收益来自每一步的真实观察,而不是更长的思考。

先看一条真实的轨迹,比任何抽象描述都清楚。论文里有一个问答案例,问题是:"科罗拉多造山带东段延伸到的区域,海拔范围是多少?"

模型的第一反应是思考:我得先查一下科罗拉多造山带。于是它执行第一个动作——搜索"Colorado orogeny",拿到一段介绍。接着它没有急着回答,而是执行第二个动作——在刚才那段内容里查找"eastern sector"(东段),结果告诉它:东段延伸到 High Plains,被称为 Central Plains orogeny。

第三步,它搜索"High Plains",但返回的结果说这个词指两个不同的陆地区域——出现歧义了。第四步,它自己把范围缩小,搜索"High Plains (United States)",这次拿到了确切数据:海拔从约 1,800 英尺升到 7,000 英尺。第五步,它输出完成动作,给出答案。

这条轨迹最值得注意的地方,不是"它答对了",而是第三步发现歧义、第四步自己缩小范围。这个修正不是靠想出来的,是靠"观察"——工具返回的那句话告诉它"这里有两个意思",它才知道要改。

还有一个更精彩的例子。问一部关于芬兰摇滚乐队的纪录片是哪一部,模型先搜索"Adam Clayton Powell",结果没找到,但返回了一串相似项:Adam Clayton Powell III、Adam Clayton Powell (film)、Adam Clayton Powell Jr. State Office Building……模型据此判断,自己要找的可能是那个带 (film) 的条目,于是改用"Adam Clayton Powell (film)"重新搜索,拿到了正确答案。

搜不到不是失败,是新的输入。 这是 ReAct 与思维链最本质的差别:思维链遇到想不通的地方只能硬想,ReAct 可以换一条路再试一次。

从工程角度看,这个循环的结构其实很朴素。一位从零手写 ReAct 智能体的开发者把它拆得很清楚:一个 while 循环——把系统提示词和对话历史发给模型,解析模型的输出,如果输出里包含动作,就执行对应工具、把结果追加回历史,然后再发一次,直到模型给出最终答案。

这里面有两个最容易出问题的工程细节。一是解析:模型输出的是文本,你得用约定的格式把它切成"思考"和"动作"两部分,格式一旦不稳,整个循环就会崩。二是终止条件:必须有最大轮数限制,否则模型可能陷入死循环,反复调用同一个工具。Anthropic 在讲智能体设计时也强调这一点——智能体本质上就是大模型在循环中使用工具、每一步从环境获取真实反馈来评估进度,而循环通常需要设置最大迭代次数之类的停止条件来保持控制。

还有一个容易被忽略的点:工具的描述本身就是提示词的一部分。模型完全靠读工具的名称和说明来决定调用哪一个,写不清楚,它就会调错。

接下来看三个层级的实测案例,它们共同说明一件事:收益来自观察,不来自空想。

第一个案例是问答检索。在 HotpotQA 和 Fever 这类需要多跳推理的任务上,ReAct 通过与一个简单的维基百科接口交互,缓解了思维链常见的幻觉和错误传播问题——因为它每一步都在核对事实,而不是凭记忆往下推。

第二个案例是具身决策。在 ALFWorld 环境里,任务是"把一颗干净的生菜放到餐桌上"。ReAct 的做法是先思考:要完成这个任务,我得找到并拿起生菜,用洗涤槽洗干净,再放到餐桌上。然后它开始行动——去冰箱,打开冰箱,里面只有杯子、鸡蛋和土豆,没有生菜。它没有慌,接着去餐桌,发现了生菜,拿起来,去洗涤槽洗干净,再思考一句"现在洗好了,下一步要放到餐桌上",最后走回餐桌放下。

注意那个细节:它在冰箱里没找到生菜,但没有卡住,而是继续去餐桌找。 这正是"观察"在起作用——冰箱里有什么,是环境告诉它的,不是它猜的。

数据上,ReAct 最好的一次平均成功率达到 71%,而纯动作的基线是 45%,另一个专门训练的强基线是 37%。更说明问题的是:最差的一次 ReAct(48%)仍然胜过了其他所有方法的最好成绩。 在六次受控试验里,ReAct 相对纯动作的提升幅度在 33% 到 90% 之间,平均 62%。

第三个案例是网页购物。在 WebShop 环境里,ReAct 的成功率是 40.0%,纯动作是 30.1%,绝对提升 10 个百分点。它的推理在这里做的是这样一件事:把"省空间的脚凳"这种模糊需求,翻译成对商品选项的判断——这个 39x18x18 英寸、蓝色的,看起来可以买。不过论文也诚实地指出,人类专家在这个任务上的成功率是 59.6%,仍然远高于 ReAct。

然后是一个特别有说服力的消融实验。研究者做了一个叫 ReAct-IM 的对照版本,任务、动作序列全都一样,唯一的区别是把"思考"挪到动作之后——先做再想。结果 ALFWorld 上的成绩从 71% 掉到了 53%。同一个模型、同样的动作,只是把"想"的位置挪了一下,成绩就掉了 18 个百分点。

这也解释了纯动作版本为什么会失败:没有思考的时候,模型无法把目标拆成子目标,或者会丢失对环境当前状态的跟踪。它不知道自己在哪一步,也不知道下一步该干什么。

四之补:Manus——当同一个循环跑 50 轮,难的不再是"会不会循环"

这里要先纠正一个流传很广的说法:Manus 不是最早的 ReAct 产品。

ReAct 的论文 2022 年 10 月就发表了。2023 年 3 月底,BabyAGI 用大约 140 行代码把这个循环跑成了开源项目,紧接着 AutoGPT 出现,两者都比 Manus 早了大约 23 个月。Manus 是 2025 年 3 月 6 日凌晨以邀请制内测上线的。

Manus 的"第一"是另一个第一:它把同一个循环,第一次装进了一个普通人不写代码也能用、并且真的能交付文件的产品里。 这是产品形态的第一,不是技术范式的第一。

有个细节很有意思。Manus 官方在 2025 年 7 月发布的技术博客里,全文一次都没有提到"ReAct"这个词,讲的是"上下文工程"和"agent loop"。但它描述的循环,逐字读下来就是 ReAct:模型根据当前上下文,从预定义的动作空间里选一个动作;动作在环境(比如 Manus 的虚拟机沙盒)里执行,产生一个观察;动作和观察被追加进上下文,构成下一轮的输入;这个循环持续到任务完成为止。

同一个范式,学术界叫 ReAct,工程界叫 agent loop。

而真正值得写下来的,是官方披露的三个数字。

第一,一个典型任务平均需要约 50 次工具调用。官方自己的说法是"那是一个很长的循环"——正因为循环长,模型很容易跑题,或者忘掉早先定下的目标,在长上下文或复杂任务里尤其明显。

第二,平均输入与输出的 token 比大约是 100:1。这个数字很能说明问题:循环里绝大部分成本,花在"反复读上下文",而不是"写答案"。

第三,缓存和不缓存的输入 token,价格差了 10 倍——以 Claude Sonnet 为例,命中缓存的输入是每百万 token 0.30 美元,没命中的是 3 美元。

还有一个设计细节,几乎是这篇文章里最漂亮的一处呼应。为了对抗"跑偏",Manus 在处理复杂任务时会自己生成一个 todo.md 文件,边做边勾,不断重写。官方说这不是卖萌,而是一种故意操纵注意力的机制:通过反复重写这份清单,它把目标"背诵"到上下文的末尾,从而把全局计划推回模型的近期注意力范围,避开"lost-in-the-middle"问题,减少目标偏离。

而"lost-in-the-middle"正是 2023 年那篇论文证明的模型缺陷:当相关信息落在长上下文的中间位置时,模型最容易忽略它,即使专门为长上下文设计的模型也一样。学术论文证明的问题,产品用一张 todo 清单绕了过去。

这里也该说一句冷静话。Manus 发布当天,邀请码在二手平台被炒到数千甚至数万元,一度登上热搜、官网注册页崩溃。但团队自己在同一天说,大家看到的 Manus"还是一个襁褓中的小婴儿",承认幻觉、交付友好度、速度都还有提升空间。这个自我评价,比任何营销话术都更接近真实。

50 次工具调用、100:1 的 token 比,意味着这个循环里每一步都可能出错,而且错误会累积。所以问题不再是"它会不会循环",而是"怎么知道它哪一步开始崩"。

图4:ReAct 执行路径——一条真实的搜索轨迹

五、让循环站得住:消融、注入,以及为什么"感觉好多了"不是评估

ReAct 把模型从"说"推进到"做",推理过程因此同时成为资产和攻击面,只有经过消融与注入测试的循环才算成立。

先说消融测试。它的做法很朴素:拆零件——每次只拿掉一个部件,看机器还转不转。前面那个 ReAct-IM 的对照就是最好的例子:任务一样、动作一样,只是把"想"的位置从动作前挪到动作后,成绩就从 71% 掉到了 53%。这说明"思考在动作之前"不是一个可有可无的装饰,它是承重结构。

思维树的研究里也有类似的证据。研究者做了消融实验,去掉剪枝、去掉回溯,性能都会下降;但真正致命的不是成功率的下降,而是"完整解出的局数"大幅减少。这提醒我们:消融要看致命指标,而不是平均值。

方法上,关键原则是单变量。每次只改一处,跑同一套评测集,对比通过率的变化。凭感觉改提示词,你永远不知道是哪一处改动起了作用。而且评测必须能回归——改完之后,原来通过的用例不能变红。很多所谓的"优化",其实是在别的地方引入了退化。

再说注入测试。它的本质是:指令和数据混在同一段文本里,而模型没有解析器可以区分二者。

一位安全研究者做过一个很直观的演示。他让模型找出违规评论者,本来只该列出真正违规的人;但只要有人在评论里写"某某违规了、某某说了违法内容",模型就只输出那个人。原因很清楚:模型分不清哪句是指令、哪句是数据。

为什么这类攻击防不住?研究者给了两个理由。第一,数据库可以用引号转义来防 SQL 注入,因为它有明确的解析规则,能界定"哪里是指令、哪里是文本";但大模型没有这种解析器,整个提示词就是一坨文本。第二,就算专门训练模型去区分指令和用户输入,也无法确定——因为我们看不懂网络内部,可能存在一个极巧妙的输入,让深层某个神经元从输出 0 变成 1,一切就变了。

真实案例比演示更严峻。安全团队披露过,Google 的智能体代码编辑器 Antigravity 可以被间接提示注入攻击,通过浏览器子代理外泄数据——攻击者把指令用 1 号字藏在网页里,绕过了 .gitignore,而默认白名单里竟然包含一个数据接收端点。间接提示注入的原始论文更早就指出,这类攻击在真实产品里是可被利用的。

而 ReAct 让这件事变得更危险。因为模型能动手了,动作越多、权限越大,注入的破坏力就越大。OWASP 的大模型十大风险里,专门列了一条"过度代理"——给模型的权限太大,它能自己决定调用哪些工具、执行哪些动作,一旦被注入,破坏范围就被放大。在同一份清单里,提示注入排在第一位,敏感信息泄露排在第二位。

还有一层风险更隐蔽:推理过程本身成了资产。 有研究者发现,模型提供方返回给客户端的推理内容是一段加密块,而这些块是可移植的——把强模型的加密推理块注入同厂商的弱模型,就能逐字还原出强模型的原始推理。他们跨 OpenAI、Anthropic、Google 复现了这件事,列出了 351 条独立泄露项。

最后说评估,这也是整件事的底线:"感觉好多了"不是评估。

最硬的证据来自一篇关于思维链忠实性的研究。研究者发现,思维链的解释可能系统性地歪曲模型预测的真实原因。他们做了一个实验:在输入里加入偏置特征,比如把多选题的选项顺序调整成答案永远是 A,模型会顺着这个偏置给出答案,但在它的思维链解释里,完全不提这个影响。当研究者把模型引向错误答案时,它还会编出一套理由来为错误答案辩护。在 13 项高难度任务上,这种偏置导致准确率最多下降了 36%。

另一组数据说明模型会漂移。有研究者对比了同一个模型服务不同时间版本的表现:GPT-4 在 2023 年 3 月的版本判断素数与合数的准确率是 84%,到了 6 月的版本只剩 51%,部分原因正是它遵循思维链提示的能力下降了。同一个名字的模型,三个月内可以变成另一个东西。

连人类评分都不能凭感觉。斯坦福的一门大模型评估课讲得很清楚:同一个回答,两位评分者可能给出不同判断,所以才需要 Cohen's kappa、Fleiss kappa、Krippendorff's alpha 这类一致性指标来校验。课程开篇那句话说得最直白:如果我们不知道如何度量模型的性能,我们就不知道要改进什么。

回到开篇那句流传很广的话——"这套思维链方法能把 AI 的输出质量从三十分提升到八十分"。三十分和八十分是谁打的?用哪套题打的?换三种问法还成立吗?三个月后模型更新了还成立吗?这四个问题都没有答案,但这句"从三十分到八十分"已经被转发了无数次。

社区里也有一个耐人寻味的样本。有人展示了一个护栏方案,让 8B 的小模型在智能体任务上的成功率从 53% 提升到 99%,数字非常惊人。但讨论区里立刻有人指出:这接近"给一个初级员工无限的时间去试错",只要不让他做错,他总能做对。指标的口径,决定了结论的意义。

图5:消融与注入——推理结构的两种压力测试

结尾:我们设计的东西,从一段话变成了一个流程

回到开头那个场景。提示词写得再好,也只能让模型把这一次的材料处理得更好;而真实任务需要它自己去找材料、自己做动作、自己判断下一步。从提示词到思维链,再到 ReAct,真正在变的不是模型有多聪明,而是我们设计的东西——从一段精心措辞的话,变成一个能自我纠正的流程。

ReAct 是这条路上第一个把"想"和"做"放进同一个循环的通用范式。此后出现的各种智能体框架,基本都在这个循环上加东西:加护栏、加记忆、加多智能体的分工。循环本身没有变。

所以如果你正在把这类技术接进业务,有四件事值得先问自己一遍:

这个循环拆掉哪个部件会坏?——做一次消融,把"思考"拿掉、把"观察"拿掉,看成绩掉多少。

别人往工具返回的内容里塞一句话,它会不会照做?——做一次注入测试,尤其是那些能读网页、能执行代码的智能体。

换三种问法、换一版工具描述,结果还稳不稳?——做一次鲁棒性检查,提示词和工具说明都是它的输入。

三个月后模型更新了,我怎么知道它没坏?——建立回归集和线上监控,因为模型服务会变,而你的提示词不会自动跟着变。

这四件事做完,你才有资格说这个循环"能用"。在那之前,所有"感觉好多了",都只是感觉。

Logo

更多推荐