想象你走进一家餐厅,点了一道“鱼香茄子”。普通的厨师会怎么做?凭记忆直接开炒——结果茄子忘了焯水,豆瓣酱放多,端出来一尝,完全不对味。 而一位“边想边做”的老师傅是这样的:他先在心里盘算“这道菜需要什么食材?”(推理),然后转身打开冰箱翻找(行动),看到茄子有点蔫了(观察),于是决定先焯水去涩(推理),又去查看了调料架(行动),最后尝一口确认咸淡(观察),这才起锅装盘。 大模型也一样。普通的 AI 问答,模型看一眼你的问题,凭“记忆”直接吐答案——它从不“打开冰箱检查”,所以经常一本正经地胡说八道,这就是“幻觉”。而 ReAct 推理模式,正是让大模型学会“边想边做”:先说出自己的推理,再调用工具去查证,根据看到的结果修正思路,循环往复,直到有把握才回答。 ReAct 的名字来自两个词的组合:Reason(推理)+ Act(行动)。它让 AI 不再是一个“背书的学霸”,而是一个“动手查证的侦探”。这篇文章,我们就用“厨房”这个场景,把 ReAct 掰开揉碎讲清楚。

岗位关联

掌握 ReAct 推理提示词,等于给大模型装上“会思考的手”——让 AI 回答从“背诵”走向“求证”,这是 AI 应用从“演示能用”迈向“生产可靠”的关键技能。

目录
  1. 可视化演示
  2. 什么是ReAct — 从“背诵型厨师”到“查证型厨师”
  3. 核心循环机制 — 推理、行动、观察的“厨房三步曲”
  4. 提示词设计 — 写一份“边想边做”的厨房工作手册
  5. 行动工具 — 给大模型一双“能伸向世界的手”
  6. 减少幻觉 — 让每道菜都有“试吃依据”
  7. 应用场景 — 从“话痨”到“实干家”
  8. 调试与局限 — 透明背后的时间账
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示ReAct推理模式中思考→行动→观察的循环过程,通过推理步骤和工具调用结合,减少幻觉提高准确性。

本节配有交互动效(进入视口后自动加载,约 3KB)。

ReAct推理模式 思考→行动→观察循环,推理与工具调用交替进行 先推理再行动,展示思考过程减少幻觉提高准确性 让大模型边想边做,Prompt工程中的核心推理范式

什么是ReAct — 从“背诵型厨师”到“查证型厨师”

餐厅里有两类厨师。一类是“背诵型厨师”,只靠背过的菜谱做菜,从不检查食材。客人问“今天有河鱼吗”,他扫一眼菜单没有,就瞎编一句“有,三文鱼不错”。另一类是“查证型厨师”,会先在心里盘算需要什么,再掀开冰箱看一眼,才给出靠谱的回答。不幸的是,大模型天生就像第一类厨师——训练时见过海量文本,回答时却无法“掀开世界看一眼”。

ReAct 正是把大模型从“背诵型厨师”改造成“查证型厨师”的提示词方法。它的名字来自两个英文单词的组合:Reason(推理)和 Act(行动),由研究者 Yao 等人在 2022 年提出。核心思想极其朴素:让模型在作答之前,先输出一段“内心独白”,再调用外部工具(搜索引擎、计算器、数据库)获取真实信息,把结果带回来继续思考,而不是一步登天直接给答案。

为什么普通提示词不够?因为“一步到位的生成”意味着模型只凭参数里储存的“记忆”作答。你问“2023 年全球人口最多的城市”,如果训练数据里没有,模型就现场编一个。ReAct 通过把推理和行动交替写进生成文本,强迫模型走“先想后做、边做边想”的流程。这里还要区分一个容易混淆的概念——思维链(CoT,Chain of Thought)。CoT 只是让模型“多想一想”,把推理过程写在回答里;ReAct 更进一步,让模型真的“动手做”,通过与外部环境交互来获取证据。

就像老师傅做菜前必须先看一眼冰箱,ReAct 让大模型在开口前先“看一眼世界”。这一看,就是 AI 从“嘴硬”到“靠谱”的分水岭。

核心循环机制 — 推理、行动、观察的“厨房三步曲”

厨房里的节奏是这样的:老师傅接到订单,先想“这道菜还缺什么”→ 动手翻冰箱 → 看到食材的实际状态 → 再想“要不要焯水去涩” → 动手烧水 → 观察水滚了没有 → … 直到菜出锅。每一个“想—动—看”都是一次迭代,这就是 ReAct 的循环节拍。

ReAct 的完整生成过程可以用一条“轨迹”(trajectory)来描述,它是三类文本块交替出现的序列。每次循环包含三个环节:Thought(推理)用自然语言写明当前的理由和计划,Action(行动)调用一个环境接口(工具),Observation(观察)记录工具返回的信息。三者首尾相接,构成闭环——上一轮的观察,就是下一轮推理的起点。

用数学记号表达,一条 ReAct 轨迹长这样:

这个循环和老师傅做饭的节拍一模一样:心里盘算,动手验证,瞪眼观察,再盘算……唯一的不同是,大模型的“厨房”在文本世界里——推理是文字,行动是工具调用,观察也是文字。

τ=[ T1,  A1,  O1,  T2,  A2,  O2,  …,  Tn ]\tau = [\, T_1,\; A_1,\; O_1,\; T_2,\; A_2,\; O_2,\; \ldots ,\; T_n \,]
这个公式描述了大模型从开始思考到最终得出答案的完整“行动路线”:推理、行动、观察不断交替,直到最后一轮推理 Tₙ 给出结论。
  1. T₁ 第一轮推理模型面对问题时先展开内心独白,例如“我需要查证人口数据才能回答”,这是行动前的计划。
    T1:模型的内心推理\displaystyle T_1 : \text{模型的内心推理}
  2. A₁ 第一轮行动模型把推理转化为具体动作,例如调用一个搜索工具去查询关键词。
    A1=Tool(q1)\displaystyle A_1 = \text{Tool}(q_1)
  3. O₁ 第一轮观察工具返回一段文本结果,例如“北京约2186万”,被写回模型上下文。
    O1:工具返回的观察结果\displaystyle O_1 : \text{工具返回的观察结果}
  4. 循环往复观察结果触发下一轮推理,推理又引发新的行动,形成“观察→推理→行动→观察”的滚轮。
    Ot→Tt+1→At+1→Ot+1\displaystyle O_t \to T_{t+1} \to A_{t+1} \to O_{t+1}
  5. Tₙ 终止推理模型判断证据已充分,停止循环,给出最终答案,轨迹至此结束。
    Tn→Final Answer\displaystyle T_n \to \text{Final Answer}

提示词设计 — 写一份“边想边做”的厨房工作手册

要让一位新来的大厨按“边想边做”的方式工作,光口头叮嘱没用,得把规矩白纸黑字写进手册。提示词就是给大模型的“厨房工作手册”。你写得多清楚,模型就执行得多规范。

ReAct 提示词的核心是“格式约定”。最常见的做法是在系统提示里明确要求:你必须交替使用 Thought:、Action:、Observation: 三种标签,并在答案收敛后以 Answer: 结尾。同时给出 1-2 个完整的示范例子(这就是 few-shot,即“给几个示例让模型模仿”)。例如:

写 ReAct 提示词有四个要点。第一,工具调用语法必须唯一且机器可解析,比如统一写成 Action: 工具名("参数"),否则程序不知道该执行什么。第二,要求模型“每步先说明理由再行动”,这能逼出真正的推理而不是瞎猜。第三,告诉模型“只有观察结果足以支撑结论时才能输出最终答案”,防止它在证据不足时提前刹车。第四,用一个完整示例展示循环如何结束——很多模型需要“看到”终止条件才会正确停止。另外,开头加上“让我们一步一步思考”这类短语,虽然简单粗放,但能帮助模型进入推理模式。

手册写得越清楚,大厨越少自由发挥;提示词写得越规范,模型越少胡编乱造。

text9 行
Question: 北京和上海哪个城市更大?Thought: 我需要两座城市的人口数据来对比。Action: search("北京人口")Observation: 北京约2186万Thought: 还需要上海的数据。Action: search("上海人口")Observation: 上海约2475万Thought: 2475万 > 2186万,证据充分。Answer: 上海更大。

行动工具 — 给大模型一双“能伸向世界的手”

光会把想法说出来还不够。老师傅的手要能伸到冰箱、调料架、灶台上,大模型的“手”就是外部工具。没有手,再好的推理也只是“纸上谈兵”。

ReAct 依赖一组预先定义好的工具,常见的有四类:搜索引擎(查事实)、计算器(做精确运算)、代码解释器(跑程序处理数据)、数据库查询(检索结构化记录)。模型的行动环节输出一条特殊指令,程序在外部解析并执行该指令,再把工具返回的文本当作“观察”重新喂回模型。整个过程对模型而言,只是在“生成文本”——但文本被外部世界赋予了真实的语义。

工具调用格式是连接模型与环境的“接口协议”。以搜索为例,模型的输出中出现了 Action: search("北京人口2024"),程序就解析出工具名 search 和参数 "北京人口2024",执行后把结果 Observation: 约2186万 追加到对话中。这一步看似简单,却是整个循环的关键——它保证模型的每一个结论都能回溯到某个外部证据。另一个值得注意的点是:工具本身不需要理解模型,它只负责“返回文本”,至于文本怎么解读,那是下一轮推理的事。

工具是厨师的手,但手怎么伸、伸向哪,由脑子里的推理决定。工具列表再丰富,不会“想”也白搭。

减少幻觉 — 让每道菜都有“试吃依据”

老师傅为什么从不吹牛说“这道菜绝对正宗”?因为他自己尝过。大模型有了工具,就等于有了“味觉”。幻觉的根源是“只靠记忆生成”——模型把训练数据里的碎片拼接成看似合理的答案,却没有任何验证。ReAct 恰恰在这一点上动了手术。

ReAct 从两个层面压制幻觉。第一,推理环节让模型暴露知识缺口。当模型被迫写下“我需要知道 X 才能回答”时,它自己就会发现“我其实不知道 X”,于是转入行动去查证。第二,行动环节用外部证据替代记忆猜测。观察结果成为回答的“锚点”,模型引用观察而不是引用想象——就像厨师说“这茄子是新鲜的”是因为他刚摸过,而不是因为菜谱上这么写。

ReAct 还有一个普通提示词不具备的能力:即时纠错。如果第一次搜索没有返回有用信息,模型会通过观察发现“我查的方向不对”,然后修改关键词再次行动。比如先搜“最大城市”没结果,改为搜“2024 城市常住人口排名”,再对比数据。这种“发现问题—调整策略—重新行动”的自愈能力,正是建立在循环结构之上的。但也要清醒:ReAct 显著降低幻觉,却不能根除。如果工具本身返回了错误信息,模型依然可能把“垃圾”当“证据”。

就像老师傅发现茄子发蔫后立刻改做“凉拌茄条”——看到实际情况马上调整方案,而不是硬着头皮按原菜谱炒。这种“以观察为准、随时修正”的精神,就是 ReAct 减少幻觉的全部秘密。

应用场景 — 从“话痨”到“实干家”

一个只会“谈思路”的顾问和一个“动手验证”的工程师,你更信任谁?ReAct 的意义就是把大模型从前者变成后者。凡是需要“多步求证”的复杂任务,都是 ReAct 的用武之地。

第一个典型场景是复杂问答。用户问“去年大模型推理成本下降了多少?”,普通模型会编一个百分比;ReAct 模型先搜索两份行业报告,再用计算器计算差值比例,最后引用数据来源作答。第二个场景是智能体(Agent)应用。客服机器人收到“订单 12345 显示已签收但我没收到货”,不再回答“请您联系快递”,而是推理“需要查物流轨迹和签收人”,调用订单系统工具,观察“由前台代收”后,给出“请先询问物业前台”的精准建议。第三个场景是决策支持。在数据分析平台上,用户问“哪个地区的增长潜力最大”,Agent 先推理需要哪些指标,再调用数据库查询和代码解释器完成统计,最后拿着真实计算结果给建议。

这些场景的共同特点是:答案必须建立在事实之上,且过程可以被追溯。传统的“一问一答”式提示词无法胜任,因为模型根本没有机会去“查”。ReAct 的循环结构恰好补上了这一环。

从“话痨”到“实干家”,差的不是模型更聪明,而是模型学会了“先查再答”。

调试与局限 — 透明背后的时间账

老师傅边做菜边报菜名,客人随时知道他在干什么,非常放心。但代价是:每多说一句、每多翻一次冰箱,都要花时间。ReAct 的优缺点,恰恰长在同一根藤上。

先看优点:可调试性。Thought 轨迹相当于“思维过程日志”,用户和开发者可以清楚地看到模型在哪一步跑偏——是推理错了,还是工具选错了,还是观察解读错了。这种透明度在金融、医疗、客服等对可解释性要求高的场景里极其宝贵。出了问题,你不再是面对一个“黑盒”,而是面对一份可以逐行审查的记录。

再看代价:成本和延迟。模型每多一轮循环,就多消耗一批 token(token 是模型处理文本的最小单位,可以近似理解为“字词碎片”)。一个需要 5 步工具调用的任务,调用成本可能是一个普通回答的 5-10 倍。另一个更隐蔽的风险是错误累积:如果第 2 步的观察结果有误,第 3、4 步的推理会建立在错误地基上,越走越偏——就像厨师尝了一口发酸的酱油没察觉,之后的整道菜都带着怪味。

边想边做是优点,但想太多、做太多,也可能“过度烹饪”。工程上的智慧不在于无脑增加循环轮数,而在于设计好“什么时候该停”——这恰恰是 ReAct 落地时最考验 Prompt 工程师的地方。

AI 应用场景

智能客服故障排查

阶段:推理增强 / 应用部署

解决的问题:传统客服机器人只会“问题模板匹配”,遇到需要查订单、查物流等多跳问题就答非所问;ReAct 让客服先推理“用户卡在哪一步”,再调用订单系统和物流工具逐一查证,最后给出有依据的处置建议。

具体案例:用户反馈“订单 12345 显示已签收但我没收到货”。客服 Agent 先推理“需要核实物流轨迹和签收人”,调用物流查询工具,观察到“由前台代收”,再推理“需要向用户确认居住地与前台的关系”,最终给出“请先询问物业前台”的建议,而不是空泛地道歉。

研究资料助手

阶段:信息检索增强

解决的问题:研究者提问“2024 年大模型推理成本趋势”时,模型凭记忆编造数据;ReAct 让模型先搜索行业报告,再用计算器计算成本降幅,最后引用来源总结,回答的每个数字都有出处。

具体案例:助手循环执行 search("2024 LLM 推理成本报告") → 观察摘要 → 推理“需要同比数据” → 继续搜索“2023 基准成本” → 用计算器算出降幅 → 输出带数据来源的结论。若第一次搜索无结果,会自动换关键词重试。

数据分析 Agent

阶段:工具调用 / 代码执行

解决的问题:普通对话模型无法操作数据,只能泛泛而谈;ReAct 让模型自主决定“查哪张表、算什么指标”,通过代码解释器执行查询,并根据观察结果修正自己的操作。

具体案例:用户问“各部门季度流失率”。Agent 推理“需要员工表和离职表”,调用 SQL 工具查询,观察结果发现“离职日期为空的行被误算了”,于是修改查询条件加上过滤,重新计算后再输出结果。整个过程用户都能看到模型“想了什么、查了什么”。

Python 演示

python27 行
def search(query):    """模拟搜索工具:从本地知识库查找信息"""    knowledge = {        "北京人口": "约2186万",        "上海人口": "约2475万",    }    return knowledge.get(query, "未找到相关信息")  def react_agent(question):    """ReAct 推理循环:推理 -> 行动 -> 观察 -> 再推理"""    print(f"[问题] {question}")    print("[推理] 需要人口数据支撑回答,先查北京。")    print("[行动] search(北京人口)")    obs1 = search("北京人口")    print(f"[观察] {obs1}")    print("[推理] 还需上海人口才能对比。")    print("[行动] search(上海人口)")    obs2 = search("上海人口")    print(f"[观察] {obs2}")    print("[推理] 上海2475万 > 北京2186万,证据充分。")    print(f"[回答] 上海人口更多(约2475万),北京约2186万。")    return obs1, obs2  if __name__ == "__main__":    react_agent("北京和上海哪个城市人口更多?")
目的:用最简单的 Python 模拟一个 ReAct 推理循环——模型每输出一条“推理”和“行动”,程序就执行对应的搜索工具,把结果作为“观察”返回,直到证据充分才给最终答案。
  1. def search(query):定义一个“工具”函数,相当于厨师可以随时查看的“食材档案”。
  2. return knowledge.get(query, "未找到相关信息")工具以纯文本形式返回结果,这正是 ReAct 中“观察”的形态。
  3. print("[推理] 需要人口数据支撑回答,先查北京。")Thought 环节:模型先说清楚“我为什么这么做”。
  4. print("[行动] search(北京人口)")Action 环节:模型输出固定格式的工具调用指令。
  5. obs1 = search("北京人口")程序解析并执行工具调用,把结果拿来给模型“观察”。
  6. print(f"[观察] {obs1}")Observation 环节:工具返回的文本被写回上下文,供下一轮推理使用。
  7. if __name__ == "__main__":可执行入口,保证脚本能被直接运行。

常见误区

误区“我只要在提示词最后加一句'让我们一步一步思考',模型就会自动使用 ReAct 了。”

正解这句话只是让模型“多说话”,它依然只能凭记忆生成,无法真正获取外部信息。ReAct 需要明确的 Thought/Action/Observation 三段式格式,并配合可执行的工具接口。就像告诉厨师“你好好想”,他不动手翻冰箱,照样不知道食材新不新鲜。

为何常见:思维链(CoT)和 ReAct 都表现为“多步推理”,初学者容易把两者混为一谈,误以为只要有多步思考就是 ReAct。

误区“用上 ReAct 之后,模型就像上了双保险,再也不会胡说八道了。”

正解ReAct 大幅降低幻觉,但不能根除。如果工具返回的信息本身有误,或者模型在某一步误解了观察结果,错误会继续传播;模型还有可能在推理中“脑补”工具结果。它更像是“多次试吃降低了出错率”,而不是“绝对不出错”。

为何常见:宣传口径常把 ReAct 描绘成“幻觉克星”,忽略了工具的可靠性问题和错误累积风险。

误区“Thought 部分只是为了显得有逻辑,对最终答案没什么影响,删掉也行。”

正解Thought 是模型真实生成过程的一部分,它决定了下一步调用哪个工具、如何解读观察结果。推理轨迹既是“展示”,也是模型决策路径的载体。你可以把推理文字隐藏,但那样工程上就不是 ReAct 了——就像厨师默默做菜还是大声报步骤,前者你就没法知道他为什么换了菜谱。

为何常见:把 Thought 误当成“答案后的解释”,以为它只是给用户看的后处理文本。

误区“我没有搜索引擎也没有数据库,所以 ReAct 对我没用。”

正解ReAct 有两层价值:工具层和推理层。即使没有工具,显式的“推理—行动—观察”结构也能迫使模型更条理地组织思路,减少跳跃式错误。比如让它先写下“我知道什么、不知道什么”,再决定下一步,这本身就有增益。

为何常见:ReAct 论文里的经典例子都是调用搜索引擎,让人误以为工具是 ReAct 的必要条件。

面试题

Q1. ReAct 中 "Re" 代表什么?

单选题 · easy

  • A.重新尝试(Retry)
  • B.推理(Reasoning)← 正确答案
  • C.读取数据(Read)
  • D.记录结果(Record)

答案:B。ReAct = Reason + Act,Re 代表推理(Reasoning),即让模型在行动前先说明思路。Retry/Read/Record 都不是 ReAct 名称的来源,也与“边想边做”的核心无关。

Q2. ReAct 中 "Act"(行动)环节通常指什么?

单选题 · easy

  • A.输出一段心灵鸡汤
  • B.调用外部工具获取信息← 正确答案
  • C.修改模型参数设置
  • D.结束对话并退出

答案:B。行动环节是模型以固定格式调用外部工具(搜索、计算器等),相当于厨师动手翻冰箱。C 是训练阶段的事,A 和 D 与行动的定义完全无关。

Q3. ReAct 循环的正确顺序是?

单选题 · easy

  • A.行动 → 推理 → 观察
  • B.推理 → 行动 → 观察← 正确答案
  • C.观察 → 推理 → 行动
  • D.推理 → 观察 → 行动

答案:B。标准顺序是推理先于行动:先想清楚需要什么,再行动去查证,最后观察结果。这符合“想→动→看”的认知节奏,也是 ReAct 轨迹的标准写法。

Q4. 下面哪一项是 ReAct 提示词中“行动”环节的正确写法?

单选题 · mid

  • A.Thought: 我需要搜索数据
  • B.Action: search(“人口”)← 正确答案
  • C.Observation: 约2475万
  • D.Answer: 上海人口更多

答案:B。行动必须以 Action 开头并给出具体的工具调用,如 Action: search("人口")。A 是推理、C 是观察、D 是最终回答,三者都不属于行动格式。

Q5. ReAct 的“观察”环节对回答质量有哪些作用?

多选题 · mid

  • A.提供外部事实依据← 正确答案
  • B.帮助修正推理方向← 正确答案
  • C.让答案有据可查← 正确答案
  • D.直接决定模型参数量

答案:ABC。观察为推理提供证据(A)、纠正错误方向(B)、提升可解释性(C),故选 A/B/C。D 与回答质量无关——参数量是训练阶段决定的,观察环节碰不到它。

Q6. ReAct 为什么能减少幻觉?

单选题 · mid

  • A.模型学会了隐藏信息
  • B.观察代替记忆猜测← 正确答案
  • C.把答案输出更简短
  • D.完全禁用训练数据

答案:B。幻觉源于凭记忆生成。ReAct 的观察环节让模型依据工具返回的真实信息作答,把“猜”变成了“查”。A/C/D 都不是 ReAct 的机制,禁用训练数据更是无从谈起。

Q7. 与思维链(CoT)相比,ReAct 的特点包括?

多选题 · mid

  • A.增加与外部环境的交互← 正确答案
  • B.多出行动与观察环节← 正确答案
  • C.推理过程可以被用户检查← 正确答案
  • D.一定比思维链回答更快

答案:ABC。ReAct 在 CoT 的推理基础上加入了工具调用与结果观察,且轨迹透明可查,故选 A/B/C。D 错误:工具调用通常会增加延迟而非更快。

Q8. ReAct 可能面临的主要风险是什么?

单选题 · hard

  • A.答案一定会正确无误
  • B.早期观察错误会累积← 正确答案
  • C.不需要任何外部工具
  • D.推理过程完全不可见

答案:B。ReAct 是循环链条,若某步观察有误,后续推理会“将错就错”,错误不断累积放大。A 过于绝对;C 与 ReAct 的特征相反;D 也和 ReAct 可解释性强的特点矛盾。

Q9. 下面哪些做法能提升 ReAct 提示词的效果?

多选题 · hard

  • A.给出完整的示范例子← 正确答案
  • B.明确工具调用格式← 正确答案
  • C.观察充分后再回答← 正确答案
  • D.禁止模型使用任何工具

答案:ABC。示范例子(few-shot)让模型学会循环格式,工具调用格式约定保证指令可被程序解析,观察收敛条件防止过早下结论,故选 A/B/C。D 去掉了行动环节,等于放弃了 ReAct 的核心优势。

Q10. 若工具返回结果与模型的先验知识冲突,ReAct 模型应如何处理?

单选题 · extreme

  • A.无条件相信先验知识
  • B.以观察结果为准调整← 正确答案
  • C.忽略观察继续原计划
  • D.立即终止并拒绝回答

答案:B。ReAct 的设计哲学是“依据外部观察修正推理”,当冲突时应以工具返回的观察为准(前提是工具可靠且未被污染)。A/C 违背循环机制,D 属于过度反应。这也说明工具本身的可靠性是 ReAct 应用的重要前提。