本文是专栏《从零看懂 AI Agent》第 3 篇。回到目录与导读。上一篇:Agent 的大脑与四肢。
ReAct 是什么
ReAct 是两个词的合体:Reasoning(推理)+ Acting(行动)。它描述的是一个特别简单、却特别有用的循环:
想(Thought) → 做(Action) → 看(Observation) → 再想 → 再做 → ……直到搞定。
你可以把它想成一个人解决问题的自然过程。比如你要查"北京今天要不要带伞":
- 想:我需要知道北京今天的天气。
- 做:打开天气 App 查北京。
- 看:显示"多云转小雨"。
- 想:有雨,那应该带伞。
- 做:告诉你"带伞吧"。
ReAct 就是让大模型也这样一步步来,而不是憋着一口气直接给答案。
为什么不直接一步到位?
你可能会问:模型那么聪明,为什么不直接回答,非要绕这个圈?
因为模型自己不知道实时信息,也容易想当然。如果你直接问它"北京今天要不要带伞",它没有实时天气,只能瞎猜。而 ReAct 强制它:先停下来想缺什么信息 → 去用工具查 → 拿到真实结果再下结论。
这带来两个好处:
- 接上了真实世界:通过"行动"这一步,模型能查到它本来不知道的东西。
- 推理更可靠:把"想"显式写出来,模型不容易跳步、乱猜,出错也更容易看出错在哪一步。
一次真实的 ReAct 过程长什么样
我们让 Agent 回答:"帮我算一下,北京今天最高温比上海高几度?"
模型会一轮轮这样输出(Thought/Action/Observation 是它内部的循环,Observation 由外部工具填回):
Thought: 我需要北京今天的最高温。先查北京。
Action: 查天气(city="北京")
Observation: 北京今天 32℃,多云。
Thought: 再查上海的最高温。
Action: 查天气(city="上海")
Observation: 上海今天 29℃,小雨。
Thought: 北京 32,上海 29,差 3 度。信息够了,可以回答。
Action: 给出最终答案
Answer: 北京今天最高温比上海高 3 度(32℃ vs 29℃)。
看到没?模型没有一次算完,而是:查一次 → 看结果 → 再查一次 → 看结果 → 最后综合。每一步的"想"都写得明明白白。这就是 ReAct 的全部精髓。
它和上一篇的循环是一回事
还记得第 2 篇里调度器那个圈吗?ReAct 就是给那个圈里的每一步起了名字:
| 调度器循环 | ReAct 里的叫法 |
|---|---|
| 模型判断下一步 | Thought(想) |
| 调用工具 | Action(做) |
| 工具返回结果写回历史 | Observation(看) |
| 输出最终结果 | Answer(答) |
所以 ReAct 不是什么高深的新东西,它就是给"边想边做"这个循环起了个名字,并且约定模型要把"想"这一步显式地写出来。
关键的一环:把"看到的"塞回去
ReAct 能转起来,靠的是每次都把 Observation(工具结果)重新拼回对话历史,再整个丢给模型。因为上一篇说过,模型是"失忆"的——你不把上一步的结果再喂给它,它下一轮就忘了自己查到过北京 32℃。
用伪代码看就是:
历史 = ["任务:北京比上海最高温高几度?"]
while True:
输出 = 模型.生成(历史) # 想 + 决定做什么
if 输出.是最终答案:
return 输出.answer # 答
结果 = 执行工具(输出.action) # 做
历史.append(输出) # 把"想+做"记下来
历史.append(结果) # 把"看到的"记下来 ← 关键!
# 回到循环开头,带着新信息再想一遍
那行"把看到的记下来",就是整个 Agent 能持续推进的命脉。
ReAct 的局限,以及 2026 年的新趋势
ReAct 很经典,是简单工具型 Agent 的默认之选,但它也有毛病:
- 每一步都靠模型自由发挥,路线不可预测,偶尔会绕远路、甚至原地打转。
- 步数多了又慢又贵,因为每一轮都要调一次大模型。
所以到 2026 年,工程实践出现了一个明显趋势:在能预先确定流程的地方,用更"死板"但更可控的方式——比如预先定义好的状态图(把"第一步只能到第二步或第三步"这种转移写死),或者结构化的工具调用,而不是每一步都让模型自由推理。一句话概括这个趋势:
能确定的部分就写死,不确定的部分才交给模型临场决定。 把自由发挥的空间收窄到真正需要它的地方。
这其实呼应了第 1 篇的那句忠告——灵活是有代价的。ReAct 给了你最大的灵活,但生产系统往往需要在灵活和可控之间找平衡。
小结
- ReAct = 想(Thought)→ 做(Action)→ 看(Observation) 的循环,直到给出答案。
- 它的价值:让模型接上真实世界,并把推理过程显式化,从而更可靠。
- 命脉是把每一步的观察结果重新塞回历史,弥补模型的"失忆"。
- 它是简单 Agent 的默认之选,但生产环境常常需要更可控的编排——能写死的就写死。
下一篇,我们钻进 ReAct 里的"做(Action)"这一步:模型明明只会输出文字,它到底是怎么真的调用工具、动手做事的?