你让一个 AI 帮你查下周去上海出差的航班。
如果它只是普通聊天模型,它可能告诉你怎么买票、该比较哪些因素,却不知道真实票价。如果给它接上航班查询工具,它可以调用接口拿到结果。但新的问题马上出现:查哪一天?直飞还是转机?结果太贵怎么办?要不要继续换时间查?
真正困难的地方,从来不只是"会不会调用工具"。
一个能完成任务的 Agent,需要根据当前情况判断下一步做什么,并且在执行之后读取环境反馈,及时调整计划。
这正是 ReAct 值得理解的地方。
Agent 真正需要的,不只是会调用工具

可以先想象一个简单任务:
帮我找到明天下午北京到杭州最合适的航班。
如果按照固定流程设计程序,我们可能会写成:
查询航班 → 按价格排序 → 返回第一名。
但现实任务往往没有这么规整。
查询之后可能发现下午没有合适航班;最便宜的一班需要中转;某个结果虽然价格低,但到达时间已经是凌晨;甚至工具直接返回"没有结果"。
这时候,系统需要重新判断:
"是不是应该把时间范围扩大到中午?"
"用户说的'最合适',更看重价格还是时间?"
"要不要换一个查询条件?"
这类任务有一个共同特点:下一步行动无法在任务开始时完全确定。
Agent 必须边做边判断。
ReAct 正好为这种工作方式提供了一个非常直观的框架:模型先推理当前应该做什么,再执行一个 Action,然后读取执行结果,继续决定下一步。
它不是一条提前写死的流水线,更像一个人在陌生环境里解决问题。
ReAct 的核心,是一个不断闭环的循环

ReAct 可以理解成三个关键环节:
Thought → Action → Observation
为了便于理解,可以把它翻译成:
思考 → 行动 → 观察结果。
假设 Agent 的任务是:
查一下北京今天的天气,如果下雨,帮我推荐几个室内活动。
它可能经历这样的过程。
Thought:
我需要先知道北京今天是否下雨,因此应该查询天气。
Action:
调用天气工具,查询北京今日天气。
Observation:
天气工具返回:下午有雨。
这时任务并没有结束。
Agent 会继续进入下一轮。
Thought:
既然下午有雨,用户需要室内活动。我应该寻找室内场所,而不是推荐公园。
Action:
查询博物馆、美术馆、室内展览等地点。
Observation:
得到一组候选结果。
模型再次思考,可能继续筛选距离、开放时间或者评分。
于是 ReAct 的真正价值出现了:
每一次工具返回的结果,都会改变模型对任务的理解。

这也是 Agent 与传统自动化程序非常重要的区别。
传统程序通常是:
A → B → C → D。
而 ReAct 更像:
A → 看结果 → 决定 B
B → 看结果 → 决定 C
如果 B 不成功,也可能转向 E。
Agent 因此具有了一定程度的动态决策能力。
ReAct 和 Function Calling,并不是同一层东西

很多人第一次接触 Agent 时,很容易把 ReAct 和 Function Calling 混在一起。
因为它们看起来都涉及"模型调用工具"。
但两者解决的问题并不相同。
Function Calling 解决的是:
模型怎么把一个动作可靠地交给外部程序执行。
比如模型判断需要查询天气,于是生成结构化参数:
get_weather(
city="北京",
date="today"
)
程序收到参数后执行查询,再把结果返回给模型。
它更像一套"工具调用接口"。
ReAct 解决的则是另一个问题:
什么时候应该调用工具?调用哪个工具?拿到结果之后下一步怎么办?
可以把 Function Calling 想象成一个人的"手"。
它负责真正按按钮、搜索数据库、发送请求。
而 ReAct 更像这个人的工作节奏:
先判断情况,伸手做一件事,看结果,再决定接下来做什么。
因此两者完全可以组合。
一个常见 Agent 架构就是:
ReAct 负责决策循环,Function Calling 负责把 Action 转换成可靠的工具调用。
如果只有 Function Calling,而没有持续决策机制,系统当然也能调用工具,但很可能只完成一次调用。
真正复杂的任务通常需要多轮:
查资料 → 发现信息不足 → 再查 → 比较 → 验证 → 执行。
ReAct 关注的就是这条链如何动态向前推进。
ReAct 和 Chain-of-Thought 的区别,在于有没有接触外部世界

ReAct 还有一个经常被混淆的概念:Chain-of-Thought,也就是常说的思维链。
两者都涉及推理,但作用不同。
可以想象这样一个问题:
如果一个商品原价 200 元,打八折后多少钱?
模型完全可以通过内部推理得到答案。
这里不需要查询数据库,也不需要打开网页,更不需要执行外部动作。
这种任务主要发生在模型自己的推理空间里。
但如果问题变成:
帮我找一款目前售价低于 200 元、适合通勤的机械键盘。
模型只靠思考是不够的。
它可以推理"通勤应该考虑重量、尺寸和连接方式",却无法仅靠推理知道现在有哪些商品、价格是多少、是否仍在销售。
这时必须让推理和外部世界发生互动。
ReAct 相比单纯的 Chain-of-Thought,多了两个关键环节:
Action 和 Observation。
模型不仅要想,还要做。
做完之后,还要允许现实反馈推翻自己之前的判断。
可以用一个很简单的类比理解:
Chain-of-Thought 像坐在房间里规划旅行。
ReAct 则像真正走出去旅行。
你规划路线,走到车站,发现地铁停运,于是重新规划路线。现实不断给你反馈,你的计划也不断改变。
这正是 Agent 最需要的能力。
Observation 决定了 Agent 是"执行脚本",还是"解决问题"

ReAct 中最容易被低估的部分,其实不是 Thought,也不是 Action,而是 Observation。
因为 Agent 是否真的具有适应能力,很大程度取决于它能不能正确理解工具返回的结果。
假设 Agent 正在帮用户订餐厅。
它先调用工具查询周五晚上 7 点的位置。
Observation 返回:
19:00 无空位,18:30 和 20:00 可预订。
一个机械式系统可能直接结束:
"7 点没有位置。"
但一个 ReAct Agent 应该把这个结果当成新的信息。
它接下来可能判断:
用户想吃这家餐厅,时间可能存在一定弹性,可以询问用户是否接受 18:30 或 20:00。
于是 Observation 改变了下一步 Action。
再比如写代码 Agent。
它修改代码之后运行测试。
Observation:
18 个测试通过,2 个测试失败。
此时 Agent 不应该继续假设修改已经完成,而应该读取错误信息、定位失败原因,再决定修改哪部分代码。
所以,一个很重要的判断标准是:
如果外部结果发生变化,Agent 的下一步行动会不会跟着变化?
如果答案是否定的,那么所谓 Agent 很可能只是披着 AI 外衣的固定工作流。
真正的 Agent,需要让环境反馈进入决策过程。
设计 Agent 时,真正该关注什么

如果你正在设计自己的 Agent,可以少问一个问题:
"模型能不能调用这个工具?"
多问几个更关键的问题:
工具返回结果之后,模型能不能理解成功和失败?
如果结果不符合预期,它有没有第二种行动方案?
什么情况下应该继续循环,什么情况下应该停止?
Observation 里是否包含足够的信息,让模型判断下一步?
很多 Agent 项目真正的瓶颈,并不是模型不够聪明,而是整个循环没有设计好。
工具返回一句模糊的"执行失败",模型很难知道下一步应该怎么调整;如果返回清晰的错误原因、候选方案和状态信息,Agent 才有机会做出合理决策。
所以,好的 Agent 不只是给大模型装上一堆工具。
更重要的是,让"思考、行动、反馈、再判断"形成稳定闭环。
ReAct 提供的正是这样一种思路。
下一次你看到一个号称 Agent 的系统,不妨观察一件事:当第一次行动失败时,它会做什么?
如果它只能报错退出,它更接近一个带 AI 接口的自动化程序。
如果它能够读取失败原因、重新判断局面、选择新的动作并继续推进任务,你才真正看到了 Agent 的味道。
理解 ReAct,也就抓住了 Agent 设计里一个非常重要的原则:智能并不只来自一次正确的思考,更来自行动之后,愿意根据现实继续修正下一步。
