在 AI Agent 的工程落地中,ReAct Loop(Reasoning and Acting 循环) 是让大模型真正"动起来、会干活"的核心驱动引擎。
这个概念最早源于 Google 团队 2022 年发表的里程碑式论文 《ReAct: Synergizing Reasoning and Acting in Language Models》 。它完美地解释了 Agent = LLM + Tools + Knowledge + Memory 架构中,大脑(LLM)是如何具体去操控双手(Tools)完成复杂任务的。
如果不走 ReAct 流程,大模型只是在"盲目猜测"或"一口气胡言乱语";而引入了 ReAct Loop,Agent 就拥有了像人类一样"边思考、边行动、边观察、边修正"的动态控制流。
1. ReAct 的核心公式:Thought \\rightarrow Action \\rightarrow Observation
ReAct Loop 的本质是一个不断循环的四部曲,直到任务最终搞定。它的标准提示词结构(Prompt Template)通常强制大模型按以下格式输出:
Plaintext
Thought: 思考下一步该做什么,以及为什么要这么做。
Action: 决定调用什么工具(Tool),并给出具体参数。
Observation: 观察工具返回的真实结果(这是由外部系统塞回给大模型的)。
... (重复上述过程,直到找到最终答案)
Final Answer: 输出最终结果。
🧠 形象的比喻:
这就像一个探长在破案:
-
Thought(推理):"死者的鞋上有独特的红泥,我怀疑他昨晚去过郊区的红砖厂。"
-
Action(行动) :派警员去红砖厂调取昨晚的监控录像(调用工具)。
-
Observation(观察) :警员带回录像,发现死者确实在昨晚 11 点出现在那里(获取工具返回的数据)。
-
Thought(新一轮推理) :"既然他去过,那么门口的小卖部老板可能看到了随行人员......"(进入下一个 Loop)。
2. 纯文本视角:看懂一个真实的 ReAct 运行轨迹
假设我们给 Agent 提了一个任务:"查一下 Meta 今天的股票价格,并计算如果我买 100 股需要多少美元。"
大模型在后台的 ReAct 循环会像下面这样跑:
🤖 Loop 1
Thought: 用户想知道 Meta 今天的股价并计算 100 股的总价。我不知道今天的实时股价,我需要使用网络搜索工具或股票 API 来获取 Meta(META)的最新价格。
Action :
stock_search_tool(ticker="META")Observation : 系统自动执行该工具并返回
{"ticker": "META", "current_price": 500.00, "currency": "USD"}
🤖 Loop 2
Thought: 我已经获取到了 Meta 的股价是 500.00 美元。现在我需要计算买 100 股的总成本,也就是 500 \\times 100。为了保证数学计算的绝对准确,我应该调用计算器工具。
Action :
calculator_tool(expression="500 * 100")Observation : 系统自动执行计算器并返回
50000.00
🤖 Loop 3
Thought: 计算结果是 50000。我已经拥有了回答用户问题的所有必要信息,可以结束循环了。
Final Answer: Meta 今天的最新股票价格是每股 500.00 美元。如果您购买 100 股,总共需要 50,000 美元。
3. ReAct 在现代工程(LangChain / LangGraph)中的实现
在传统的 LangChain 中,ReAct 被封装成了经典的 ReActAgent 或者是 StructuredChatAgent。它的核心代码逻辑其实是一个 while 循环:
Python
# 伪代码逻辑
while not final_answer_reached:
# 1. 喂给 LLM 当前的 Prompt + 历史记忆 + 观察结果
response = llm.predict(current_prompt)
# 2. 解析大模型输出的文本,看它是要 Action 还是 Final Answer
if "Action:" in response:
tool_name, tool_input = parse_action(response)
# 3. 驱动双手:在 Python 环境中真实执行这个工具
observation = execute_tool(tool_name, tool_input)
# 4. 把 Observation 追加到下一次的上下文里
current_prompt += f"\nObservation: {observation}"
elif "Final Answer:" in response:
return parse_final_answer(response)
而到了 LangGraph 时代,这个经典的线性 while 循环演变成了更加优雅、可控的状态图(State Graph)。它通常由两个核心节点不断打架来完成:
-
LLM Node(思考节点):接收状态,决定是继续调工具还是直接回答。
-
Tools Node(执行节点) :如果 LLM 决定调工具,就由该节点执行,并将结果写回全局状态(State),然后再连线画个圈拐回去让 LLM 继续看。
4. ReAct 模式的核心痛点
虽然 ReAct 极为强大,但在生产环境落地时,开发者经常会遇到以下头疼的工程问题:
-
1. 陷入死循环(Loop Infinity):如果工具返回的数据不符合大模型的预期(或者报错了),大模型可能会固执地用同样的参数一遍又一遍地调用这个工具,直到把你的 Token 费用彻底烧光。
-
2. 逻辑梦游(Context Drift) :当 ReAct 的轮次(Loops)太多时(比如超过 5 轮),中间产生的大量
Observation废话会迅速占满上下文窗口,导致大模型忘记最开始用户要干嘛,开始在图里"梦游"。 -
3. 费用与延迟高:每走一个 Loop,大模型就要做一次完整的长文本推理,这不仅带来了几秒钟的延迟,而且每次都要重新输入长长的 Tool Definition(工具描述),Token 成本极其高昂。
💡 进化方向:从 ReAct 到 GraphRAG 和 Plan-and-Solve
为了解决 ReAct "走一步看一步、缺乏大局观"的缺点,2025/2026 年的 AI 架构逐渐向 Plan-and-Solve(先规划再解决) 演进------先让大模型生成一个完整的、包含多步执行的图谱规划,再由底层的轻量化小模型或硬编码代码去挨个执行工具,最后再交给大模型总揽。这样既保留了 Agent 的自主性,又极大地提升了工业级应用的确定性和速度。