Agent的核心:ReAct循环,让AI不再瞎编,而是真的“干活”

在这里插入图片描述

如果你用过ChatGPT这类大模型,大概率踩过这样的坑:

问它“查下竞争对手A的定价策略”,它甩给你一堆“成本加成法、竞争定价法”的理论;问它“API为啥返回500错误”,它罗列“数据库连接失败、内存不足”等通用原因,却没命中你实际的空指针问题。

问题出在哪?大模型天生是“一口气说完”的——它不会中途停下来验证、不会主动查新信息,更不会修正自己的错误。而解决这个问题的核心,就是ReAct循环:Reasoning + Acting(推理+行动),也是现代Agent的“心脏”。

先看个真实对比:普通LLM vs ReAct Agent

同样是“调查竞争对手定价”,两者的表现天差地别:

普通ChatGPT的回答

定价策略通常包括成本加成法、竞争定价法、价值定价法……不同企业会根据自身成本、市场竞争情况选择不同策略。

听起来全对,但毫无用处——你要的是“竞争对手A卖多少钱、有哪些套餐”,不是“定价策略百科”。

ReAct Agent的操作流程

[第1轮]
思考:用户没说具体是哪家竞争对手,先确认对象,不然查的都是无效信息。
行动:追问用户“你指的竞争对手是哪几家?(给名字/官网)”
观察:用户回复“主要看竞争对手A”

[第2轮]
思考:有名字了,先搜官网定价页,优先官方信息。
行动:调用搜索工具,关键词“竞争对手A pricing”
观察:找到官网定价页+两篇评测文章

[第3轮]
思考:读取官网定价页,提取准确数字和套餐差异。
行动:调用网页读取工具访问定价页
观察:基础版$29/月,专业版$99/月,企业版需联系销售

[第4轮]
思考:整理信息,对比自家定价,生成分析报告。
行动:输出带来源链接的分析报告
观察:任务完成

在这里插入图片描述

核心差异很明显:ReAct不是“一口气蒙答案”,而是边想边做、做完再想——把“猜”变成了“查+证据+可回滚”。它依然可能犯错,但你能清楚看到错在哪,也能轻松拉回正轨。

ReAct的本质:为什么这个循环有效?

大模型有两个天生缺陷,而ReAct刚好能补上:

LLM天生缺陷 表现 ReAct的解决方式
信息过时 只能用训练数据里的旧知识 行动阶段调用搜索/API,获取最新信息
无法验证 说完就完,容易编造细节 每一步都有观察记录,能追溯、能修正

ReAct的核心逻辑其实特别简单:

普通LLM:问题 → 一口气生成答案
ReAct Agent:问题 → 想一步 → 做一步 → 看结果 → 再想 → 再做 → … → 答案

这个逻辑来自2022年的《ReAct: Synergizing Reasoning and Acting in Language Models》论文,核心发现就一句话:推理和行动交织进行,比单独推理或单独行动都强

  • 只推理不行动(比如Chain-of-Thought):想得再周全,也拿不到新信息;
  • 只行动不推理(比如直接调工具):瞎调用工具,不知道为什么要调;
  • 推理+行动(ReAct):想清楚“为什么做”,做完看结果,再决定下一步。

拆解ReAct循环:三步走,每步都有讲究

ReAct的循环就三步:Reason(思考)→ Act(行动)→ Observe(观察),每一步都有核心原则,错了就容易出问题。
在这里插入图片描述

1. Reason(思考):只想“下一步”

输入是“用户目标+历史观察结果”,输出是“下一步要做什么,为什么”。
关键原则:别让LLM想太远,它会发散。只让它基于当前信息,判断“下一个动作是什么”——想太多反而容易跑偏。

2. Act(行动):一轮只做一个关键动作

输入是思考阶段确定的动作,输出是执行结果。
关键原则:前期调试时,动作越小越好(比如先搜、再读、再整理),容易定位问题;流程跑顺了,再考虑并行调工具提速。
常见的行动类型:追问用户、网页搜索、读文件、调API、执行代码等。

3. Observe(观察):客观记录,不做判断

输入是行动的执行结果,输出是结构化的观察记录。
关键原则:只记事实,不做主观判断(比如“搜索结果没用”)——判断留给下一轮的思考阶段,避免提前带偏。

生产落地:让ReAct循环“停得下来”

ReAct最关键的问题之一是“什么时候停”:停太早,任务没完成;停太晚,Token烧光、成本失控。

两类核心终止条件(必配)

  1. 硬护栏(优先级最高):预算耗尽(Token/成本上限)、超时(端到端时延上限)、用户主动中断——这些是生产环境的“保命符”,必须先配。
  2. 柔性判断:任务完成(LLM明确表示搞定)、结果收敛(连续两次观察没新进展)、最大轮数(兜底,比如10-15轮)。
    在这里插入图片描述

举个Shannon框架里的配置例子(Go代码),核心逻辑一看就懂:

func shouldStop(state *ReactState) bool {
    // 硬护栏:用户中断/预算超/超时,立刻停
    if state.UserCanceled || state.TokensUsed >= state.Config.TokenBudget || time.Since(state.StartTime) > state.Config.Timeout {
        return true
    }
    // 兜底:达到最大轮数
    if state.Iteration >= state.Config.MaxIterations {
        return true
    }
    // 防偷懒:没到最小轮数,继续(比如至少调1次工具)
    if state.Iteration < state.Config.MinIterations {
        return false
    }
    // 柔性判断:任务完成/结果收敛
    return containsCompletionSignal(state.LastThought) || isResultConverged(state.Observations)
}

生产环境必配的3个关键配置

  1. MaxIterations:防无限循环(比如Agent反复搜同一个关键词,卡20轮还没结果),建议设10-15轮;
  2. MinIterations:防LLM偷懒(比如第一轮就编答案,没调任何工具),建议至少设1轮;
  3. ObservationWindow:控成本(只保留最近5条观察记录,老记录做摘要压缩),避免上下文越长、Token越贵。

ReAct落地:4个最容易踩的坑,附解决办法

坑1:无限循环

症状:Agent反复做同一件事(比如搜同一个关键词,读同一个广告页),停不下来。
解决:加MaxIterations硬限制;检测连续两次观察的相似度,相似就换策略;Prompt里提醒“发现结果重复,立刻换方法”。

坑2:过早放弃

症状:Agent第一轮就说“完成了”,但根本没调工具、没查信息。
解决:加MinIterations强制调工具;Prompt里明确“必须用工具获取信息,不能直接回答”。

坑3:Token爆炸

症状:几轮下来上下文暴涨,费用失控。
解决:限制ObservationWindow;老观察做摘要;配BudgetAgentMax(Token上限)。

坑4:思考和行动脱节

症状:LLM想的是“搜定价”,实际却调了“读日志”工具。
解决:Act阶段的Prompt里明确引用Reason结果:“你刚才的思考是:{thought},请严格执行对应的行动”。

不同框架怎么实现ReAct?

ReAct是通用模式,不是某款框架专属,核心逻辑都一样,只是实现细节不同:

框架 实现方式 适用场景
LangChain create_react_agent() 快速做原型,生态丰富
LangGraph 状态图+节点 生产系统,可视化调试
OpenAI Function Calling 原生支持,延迟低
AutoGPT 自定义循环 高度自主,但稳定性差

选框架的核心原则:快速原型用LangChain,生产系统优先LangGraph(或自建),追求低延迟选OpenAI原生Function Calling。

最后:ReAct不是魔法,但足够实用

ReAct不是“让AI变正确”的魔法,它的核心价值是:把大模型的“黑箱回答”变成“可追溯、可修正、有证据”的行动链。

记住这5个核心要点,就能用好ReAct:

  1. ReAct是“推理+行动”的交织循环,不是一次性生成答案;
  2. 核心三步:思考(只想下一步)→ 行动(一轮一个动作)→ 观察(客观记录);
  3. 解决了LLM“信息过时、无法验证”的核心缺陷;
  4. 终止条件要配“硬护栏(预算/超时)+ 柔性判断(完成/收敛)”;
  5. 生产落地必配MaxIterations/MinIterations/ObservationWindow。

下一篇我们会聊Agent的“手脚”——工具调用:毕竟光有思考的循环,没有动手的能力,Agent还是干不成事。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐