AI Agent的ReAct Loop(Reasoning and Acting 循环)

在 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: 输出最终结果。

🧠 形象的比喻:

这就像一个探长在破案

  1. Thought(推理):"死者的鞋上有独特的红泥,我怀疑他昨晚去过郊区的红砖厂。"

  2. Action(行动) :派警员去红砖厂调取昨晚的监控录像(调用工具)。

  3. Observation(观察) :警员带回录像,发现死者确实在昨晚 11 点出现在那里(获取工具返回的数据)。

  4. 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)。它通常由两个核心节点不断打架来完成:

  1. LLM Node(思考节点):接收状态,决定是继续调工具还是直接回答。

  2. 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 的自主性,又极大地提升了工业级应用的确定性和速度。

相关推荐
fthux1 小时前
「装闭」-AI驱动的开源装修闭坑系统
人工智能·docker·开源
一拳不是超人1 小时前
AI 辅助研发时代,如何用“规范 Skill”缩短测试周期
前端·人工智能·代码规范
却道天凉_好个秋1 小时前
HEVC(二):如何实现并行处理
人工智能·算法·计算机视觉·hevc·瓦片技术·波前并行处理wpp
linge_sun1 小时前
SpringAI RAG 智能问答实战:用自然语言查询知识库
java·人工智能·ai编程
一切皆是因缘际会1 小时前
从生成智能到自主智能:人工智能的技术重构与价值迭代
人工智能·深度学习·ai·重构
xingyuzhisuan1 小时前
多模态聚合API核心技术:如何统一处理文本、图像与语音请求
人工智能·ai·语言模型·语音识别
高德开放平台1 小时前
全新发布!高德开放平台AI打车解决方案
人工智能
2601_955767422 小时前
iPhone17 屏幕偏振片减配?深度解析OLED圆偏振光缺失与磁控溅射AR修复方案
大数据·人工智能·ar·护眼钢化膜·圆偏振光·#观复盾护景贴