AI Agent推理循环深度解析:从ReAct到Plan-and-Execute的范式演进
AI Agent推理循环深度解析:从ReAct到Plan-and-Execute的范式演进
标题选项
- 《AI Agent推理循环深度拆解:从ReAct到Plan-and-Execute的范式演进全链路》
- 《从思考到行动:万字详解大模型Agent推理范式的迭代路径》
- 《告别瞎跑的Agent:ReAct、Reflexion到Plan-and-Execute的核心逻辑对比》
- 《AI Agent落地必备:一文搞懂主流推理循环的优劣势与适用场景》
引言
不知道你有没有过这样的经历:花了一周时间搭了一个AI Agent,接入了搜索、计算器、数据库等一堆工具,信心满满地测试的时候,却发现它要么调用工具的时候参数填错,要么做了3步就忘了最初的任务目标,要么拿到了数据却不会分析,明明很简单的多步骤任务,成功率却不到30%。你翻遍了各种教程,别人都说用ReAct、用Plan-and-Execute,但是你却不知道这两个范式到底有什么区别,什么时候该用哪个,怎么优化才能提升成功率。
本文将从底层原理出发,一步步拆解AI Agent推理循环的演进路径,从最早的ReAct到现在主流的Plan-and-Execute,讲透每个范式的核心逻辑、优劣势、适用场景,还有可直接运行的代码示例。读完本文,你将能够:
- 清晰理解不同推理范式的核心差异
- 根据业务场景选择最合适的Agent推理架构
- 独立实现基础的ReAct和Plan-and-Execute Agent
- 掌握Agent推理循环的优化技巧,提升任务成功率
准备工作
在开始阅读本文之前,你需要具备以下基础:
技术栈/知识要求
- 了解大语言模型的基本工作原理,熟悉Prompt工程的基本技巧
- 了解大模型的Function Call(工具调用)能力,知道怎么让大模型输出结构化参数
- 有基本的Python编程能力,能看懂简单的Python代码
- 对AI Agent的基本概念有初步了解,知道Agent的核心是「感知-推理-行动」闭环
环境/工具要求
如果想要运行本文中的代码示例,需要准备:
- Python 3.9+ 运行环境
- 可用的OpenAI API Key(或其他支持Function Call的大模型API Key)
- 安装
langchain、openai、python-dotenv、serpapi等依赖包
核心概念:AI Agent推理循环的本质
问题背景
普通大模型问答是「输入-输出」的一次性交互,只能依赖训练数据回答问题,无法获取外部实时信息,也无法执行复杂的多步骤任务,很容易产生幻觉。而AI Agent的核心价值就是打破这个限制,通过多轮循环交互,主动调用工具、获取反馈、动态调整策略,完成复杂任务。
核心定义
AI Agent的推理循环,是指Agent接收用户任务之后,从理解任务、制定策略、执行动作、获取反馈到迭代优化,直到完成任务的整个闭环过程。它本质上是一个马尔可夫决策过程(MDP),核心由四大要素构成:
- 感知(Perception):接收用户输入、工具返回结果、环境反馈等信息
- 推理(Reasoning):处理感知信息,判断当前状态、决策下一步动作
- 行动(Action):根据推理结果执行对应动作,比如调用工具、输出结果、修改记忆
- 观察(Observation):获取行动后的反馈结果,作为下一轮推理的输入
数学模型
我们可以用以下公式描述推理循环的运行逻辑:
- 状态定义:StS_tSt 表示Agent在第t步的状态,包含任务信息、历史交互记录、记忆内容等所有决策相关信息
- 动作定义:AtA_tAt 表示Agent在第t步选择执行的动作
- 观察定义:OtO_tOt 表示执行动作AtA_tAt后获得的反馈结果
- 状态转移函数:St+1=f(St,At,Ot)S_{t+1} = f(S_t, A_t, O_t)St+1=f(St,At,Ot),表示状态根据当前状态、动作、观察结果转移到下一个状态
- 奖励函数:R(St,At)∈RR(S_t, A_t) \in RR(St,At)∈R,表示执行动作后获得的即时奖励,正确为正,错误为负
- 最终目标:找到最优策略π∗\pi^*π∗,使得累计奖励最大:
π∗=argmaxπE[∑t=0TγtR(St,At)]\pi^* = \arg\max_\pi E[\sum_{t=0}^T \gamma^t R(S_t, A_t)]π∗=argπmaxE[t=0∑TγtR(St,At)]
其中γ∈[0,1]\gamma \in [0,1]γ∈[0,1]是折扣因子,权衡当前奖励和未来奖励的权重。
核心架构图
所有的Agent推理范式都是基于这个核心循环演化而来,只是在推理的粒度、模块的拆分、能力的增强上有不同的设计。接下来我们按照时间顺序,逐个拆解每个范式的核心逻辑。
范式演进一:ReAct 推理与行动的首次结合
问题背景
在ReAct出现之前,大模型的推理和行动是完全割裂的:
- 推理流派(代表是思维链CoT):只能「空想」,无法获取外部信息,容易产生幻觉,比如问2024年奥运会金牌数,只能靠训练数据瞎编
- 行动流派(代表是早期工具调用Agent):只会机械调用工具,没有思考过程,多步任务容易出错,比如问「北京和上海的面积差」,只会直接搜差值,不会先搜两个城市的面积再计算
ReAct就是为了解决推理和行动割裂的问题,2022年由谷歌大脑和普林斯顿大学联合提出。
核心逻辑
ReAct的名字是**Reasoning(推理)和Acting(行动)**的组合,核心思想是模仿人类解决问题的过程:每一步先思考「我现在要做什么,为什么要做」,再执行对应行动,拿到结果后进入下一轮思考,直到完成任务。
每一轮ReAct循环都包含四个固定要素:
- Thought(思考):当前步的推理内容,说明动作的原因和目标
- Action(行动):选择要执行的动作,比如调用的工具名称
- Action Input(行动参数):执行动作需要的参数
- Observation(观察):执行行动后获得的反馈结果
算法流程图
核心公式
ReAct每一步的决策都由大模型基于历史上下文生成:
P(Tt,At,It∣Ht)=LLM(Ht)P(T_t, A_t, I_t | H_t) = LLM(H_t)P(Tt,At,It∣Ht)=LLM(Ht)
其中HtH_tHt是t步之前的所有历史交互记录,TtT_tTt是当前思考,AtA_tAt是行动,ItI_tIt是行动参数。
代码实现(原生Python,无依赖框架)
import openai
import os
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
# 模拟工具实现
def search(query):
"""模拟搜索工具,返回对应关键词的结果"""
mock_data = {
"北京市面积": "北京市面积为16410平方公里",
"上海市面积": "上海市面积为6340.5平方公里"
}
return mock_data.get(query, f"未找到{query}的相关信息")
def calculator(expression):
"""模拟计算器工具,计算表达式结果"""
try:
return str(eval(expression))
except:
return "计算错误,请检查表达式"
# 工具映射表
tools = {
"Search": search,
"Calculator": calculator
}
# ReAct Prompt模板
REACT_PROMPT = """
你是一个可以调用工具的AI助手,必须严格按照以下格式输出,不要有任何额外内容:
Thought: 你当前的思考内容,说明你要做什么,为什么要这么做
Action: 你要调用的工具名称,只能从[Search, Calculator, Finish]中选择,Finish表示任务完成
Action Input: 工具的参数,如果是Finish,参数就是返回给用户的最终结果
用户任务:{task}
历史上下文:
{history}
"""
def run_react_agent(task: str, max_steps: int = 10):
history = ""
for step in range(max_steps):
# 构建Prompt
prompt = REACT_PROMPT.format(task=task, history=history)
# 调用大模型
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0
)
output = response.choices[0].message.content.strip()
# 解析输出
thought = action = action_input = ""
for line in output.split("\n"):
if line.startswith("Thought:"):
thought = line.replace("Thought:", "").strip()
elif line.startswith("Action:"):
action = line.replace("Action:", "").strip()
elif line.startswith("Action Input:"):
action_input = line.replace("Action Input:", "").strip()
# 打印当前步骤
print(f"=== 第{step+1}步 ===")
print(f"Thought: {thought}")
print(f"Action: {action}")
print(f"Action Input: {action_input}")
# 判断是否结束
if action == "Finish":
print("\n=== 任务完成 ===")
return action_input
# 执行工具
if action not in tools:
observation = f"错误:没有找到{action}工具,请重新选择"
else:
observation = tools[action](action_input)
print(f"Observation: {observation}\n")
# 更新历史上下文
history += f"Thought: {thought}\nAction: {action}\nAction Input: {action_input}\nObservation: {observation}\n"
return "任务失败:超过最大步数限制"
if __name__ == "__main__":
task = "北京和上海的面积差是多少?"
result = run_react_agent(task)
print("最终结果:", result)
优劣势分析
| 优势 | 劣势 |
|---|---|
| 实现简单,逻辑轻量,仅需一个大模型即可运行 | 无全局规划,长任务(>10步)容易迷失目标 |
| 短任务(<3步)准确率高,可达90%以上 | 无纠错能力,某一步错误后会沿着错误路径继续执行 |
| 可解释性强,每一步思考过程清晰,易排查问题 | 对Prompt格式依赖极高,格式稍有变化输出就会混乱 |
| 上下文消耗少,延迟低 | 无记忆复用能力,类似任务需要重复执行所有步骤 |
适用场景
ReAct非常适合短平快的简单任务场景:
- 智能客服常见问题解答
- 简单信息查询、单步/两步工具调用
- 对延迟要求高、成本敏感的业务
范式演进二:Reflexion 加入反思与记忆的增强版ReAct
问题背景
ReAct虽然解决了推理和行动结合的问题,但容错能力极差:如果某一步思考错误、工具返回结果错误,ReAct无法自己发现,只会一路错到底,也不会从失败中学习,同样的错误下次还会犯。2023年普林斯顿大学提出的Reflexion范式就是为了解决这个问题。
核心逻辑
Reflexion在ReAct的基础上增加了两个核心模块:
- 反思模块(Self-Reflection):任务失败或执行到一定步数时,分析错误原因,总结经验教训
- 经验记忆库(Experience Memory):存储过往的成功/失败经验,下次遇到类似任务时调取参考,避免重复犯错
算法流程图
核心效果
根据Reflexion论文的实验数据:
- 在HumanEval代码生成任务上,准确率从ReAct的48%提升到68%,提升了20个百分点
- 在HotpotQA多跳问答任务上,准确率从71%提升到78%
- 中等复杂度任务的成功率比ReAct提升了40%以上
优劣势分析
| 优势 | 劣势 |
|---|---|
| 具备纠错能力,可从失败中学习,中长任务成功率更高 | 增加了大模型调用次数,每次反思都需要调用大模型,成本提升30%以上 |
| 记忆复用能力,类似任务的执行效率逐步提升 | 延迟更高,反思过程增加了任务的执行时间 |
| 对Prompt的鲁棒性更强,不容易出现格式错误 | 记忆库管理复杂,需要做相似度检索调取相关经验 |
适用场景
Reflexion适合中等复杂度的任务场景:
- 代码生成、代码调试
- 内容创作、文案优化
- 3-10步的多步问答、简单数据分析
范式演进三:Plan-and-Execute 复杂任务的最优解
问题背景
不管是ReAct还是Reflexion,都是走一步看一步的串行推理,没有全局规划能力,遇到非常复杂的多步骤任务(比如「做一份2024年Q2营销活动方案,包含活动目标、受众分析、活动内容、预算规划、效果预期5个部分,每个部分要有数据支撑」),很容易跑偏:要么漏了某个部分,要么逻辑混乱,要么忘记最初的任务目标。2023年LangChain正式推出的Plan-and-Execute范式就是为了解决复杂多步骤任务的问题。
核心逻辑
Plan-and-Execute的核心思想是模仿人类处理复杂任务的方式:先做全局规划,把大任务拆成多个可执行的子任务,明确每个子任务的目标、输入输出和依赖关系,再逐个执行子任务,执行过程中遇到问题就动态调整规划,所有子任务完成后整合结果返回。
核心架构
Plan-and-Execute采用分层设计,核心由五大模块构成:
- Planner(规划器):接收用户任务,生成全局规划,拆分出符合MECE原则(相互独立、完全穷尽)的子任务列表,明确每个子任务的目标、输入、输出、依赖关系
- Memory(记忆模块):存储全局规划、子任务执行结果、历史经验、外部知识等信息,供所有模块调用
- Executor(执行器):接收单个子任务,用ReAct/Reflexion等范式执行子任务,返回执行结果
- Reviewer(评审器):评审子任务结果是否符合要求,不符合则给出修改建议,要么让Executor重新执行,要么触发重规划
- Replanner(重规划器):子任务执行失败、用户修改任务、规划有遗漏时,调整全局规划,更新子任务列表
算法流程图
数学模型
- 规划阶段子任务拆分:
P=Split(T,D,K)P = Split(T, D, K)P=Split(T,D,K)
其中TTT是原始任务,DDD是领域知识,KKK是子任务数量,P=[P1,P2,...,Pk]P = [P_1, P_2, ..., P_k]P=[P1,P2,...,Pk]是子任务列表,每个子任务包含目标、输入、输出、依赖四个属性。 - 执行阶段子任务结果生成:
Ri=Execute(Pi,{Rj∣j∈depsi},Tools)R_i = Execute(P_i, \{R_j | j \in deps_i\}, Tools)Ri=Execute(Pi,{Rj∣j∈depsi},Tools)
其中{Rj∣j∈depsi}\{R_j | j \in deps_i\}{Rj∣j∈depsi}是当前子任务依赖的其他子任务的结果,ToolsToolsTools是可调用的工具集合。 - 评审阶段校验函数:
C(Ri,Pi)={True结果符合子任务要求False结果不符合,返回错误信息C(R_i, P_i) = \begin{cases} True & \text{结果符合子任务要求} \\ False & \text{结果不符合,返回错误信息} \end{cases}C(Ri,Pi)={TrueFalse结果符合子任务要求结果不符合,返回错误信息 - 重规划阶段调整:
P′=Replan(P,Pi,Ri,Error)P' = Replan(P, P_i, R_i, Error)P′=Replan(P,Pi,Ri,Error)
其中ErrorErrorError是评审返回的错误信息,P′P'P′是调整后的新子任务列表。
代码实现(基于LangChain)
from langchain.chat_models import ChatOpenAI
from langchain_experimental.plan_and_execute import PlanAndExecute, load_agent_executor, load_chat_planner
from langchain.agents.tools import Tool
from langchain import SerpAPIWrapper
from langchain.chains import LLMMathChain
import os
from dotenv import load_dotenv
load_dotenv()
os.environ["SERPAPI_API_KEY"] = os.getenv("SERPAPI_API_KEY")
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
# 初始化大模型
model = ChatOpenAI(temperature=0, model="gpt-3.5-turbo")
# 初始化工具
search = SerpAPIWrapper()
llm_math_chain = LLMMathChain.from_llm(llm=model, verbose=True)
tools = [
Tool(
name = "Search",
func=search.run,
description="用于搜索最新的信息、事实类内容,比如新闻、数据、常识等"
),
Tool(
name="Calculator",
func=llm_math_chain.run,
description="用于数学计算,比如加减乘除、百分比计算、差值计算等"
)
]
# 加载规划器和执行器
planner = load_chat_planner(model)
executor = load_agent_executor(model, tools, verbose=True)
# 初始化Plan-and-Execute Agent
agent = PlanAndExecute(planner=planner, executor=executor, verbose=True)
if __name__ == "__main__":
task = "帮我查2024年上半年国内新能源车企销量排行,算出比亚迪和特斯拉的市占率差值,生成一份简短的中文分析报告"
result = agent.run(task)
print("最终结果:", result)
运行上述代码后,Agent会自动拆分出以下子任务逐个执行:
- 搜索2024年上半年国内新能源车企总销量
- 搜索2024年上半年比亚迪的新能源销量
- 搜索2024年上半年特斯拉中国区的新能源销量
- 计算比亚迪市占率 = 比亚迪销量 / 总销量
- 计算特斯拉市占率 = 特斯拉销量 / 总销量
- 计算两者的市占率差值
- 整合所有数据生成分析报告
优劣势分析
| 优势 | 劣势 |
|---|---|
| 全局规划能力强,10步以上复杂任务成功率可达80%以上 | 实现复杂度高,需要多个模块配合,开发成本高 |
| 结构清晰,各模块可单独优化(比如规划器用小模型,执行器用大模型) | 大模型调用次数多,成本是ReAct的5-10倍 |
| 容错能力强,单个子任务失败只需重执行或调整规划,不需要从头再来 | 延迟高,复杂任务可能需要几分钟才能返回结果 |
| 支持用户中途干预,可动态调整任务要求 | 上下文消耗大,对大模型的上下文窗口要求高 |
适用场景
Plan-and-Execute非常适合复杂多步骤的任务场景:
- 智能数据分析、数据报表生成
- 自动化工作流、项目管理助手
- 内容创作、方案策划、科研助手
- 对准确率要求高、对延迟不敏感的企业级应用
范式对比与选型指南
核心属性对比表
| 对比维度 | ReAct | Reflexion | Plan-and-Execute |
|---|---|---|---|
| 核心逻辑 | 走一步看一步,推理行动交替 | ReAct基础上加反思和记忆 | 先全局规划拆分子任务,再逐个执行 |
| 规划能力 | 无全局规划,仅单步思考 | 无全局规划,仅错误反思 | 有全局规划,支持动态调整 |
| 纠错能力 | 无 | 有,任务失败后反思调整 | 有,子任务级别的评审和重规划 |
| 长任务(>10步)成功率 | <30% | ~50% | >80% |
| 短任务(<3步)成功率 | ~90% | ~90% | ~85% |
| 单任务大模型调用次数 | 2-5次 | 3-10次 | 10-50次 |
| 延迟 | 低 | 中 | 高 |
| 实现复杂度 | 低 | 中 | 高 |
| 上下文消耗 | 低 | 中 | 高 |
| HotpotQA准确率 | 71% | 78% | 86% |
| HumanEval准确率 | 48% | 68% | 77% |
| 典型应用 | 简单工具助手、智能客服 | 代码生成、内容创作 | 数据分析、工作流自动化 |
范式演进关系图
选型最佳实践
- 优先看任务步数:平均任务步数<3用ReAct,3-10步用Reflexion,>10步用Plan-and-Execute
- 成本敏感场景优先用轻量范式:不要一上来就用Plan-and-Execute,避免不必要的成本浪费
- 范式可以混合使用:Plan-and-Execute的Executor内部可以用ReAct/Reflexion,充分发挥各范式的优势
- 小模型优先做非核心模块:规划、评审模块不需要太强的推理能力,用微调过的7B/13B小模型就能满足需求,成本可降80%以上
行业发展与未来趋势
范式演进时间线
| 时间 | 核心范式 | 代表工作 | 核心突破 | 典型应用场景 |
|---|---|---|---|---|
| 2022年10月 | ReAct | 谷歌+普林斯顿《ReAct: Synergizing Reasoning and Acting in Language Models》 | 首次打通推理和行动的闭环 | 简单工具调用、多跳问答 |
| 2023年3月 | Reflexion | 普林斯顿《Reflexion: Language Agents with Verbal Reinforcement Learning》 | 加入反思和记忆,Agent具备学习能力 | 代码生成、内容创作 |
| 2023年6月 | Plan-and-Execute | LangChain Plan-and-Execute Agent | 规划执行分层,复杂任务成功率大幅提升 | 数据分析、工作流自动化 |
| 2024年2月 | 多模态推理循环 | OpenAI GPT-4o | 支持图文音多模态输入的推理闭环 | 多模态客服、智能办公助手 |
| 2024年5月 | 自适应推理循环 | 字节跳动Self-Plan Agent | 自动根据任务复杂度选择范式和规划粒度 | 通用Agent助手、企业级应用 |
| 2025年(预测) | 端侧推理循环 | 端侧小模型+推理框架 | 推理循环完全跑在端侧,延迟<100ms | 手机助手、IoT设备、车载AI |
| 2026年(预测) | 世界模型驱动的推理循环 | 通用世界模型 | 推理前先模拟行动结果,几乎零错误 | 机器人、自动驾驶、通用人工智能 |
未来演进方向
- 自适应:Agent自动根据任务、资源、环境选择最合适的推理范式,不需要开发者手动选型
- 轻量化:推理成本越来越低,延迟越来越小,甚至可以完全跑在端侧,保障隐私安全
- 通用化:支持多模态输入输出,能处理各种领域的复杂任务,和现实世界深度交互
总结
本文从底层原理出发,完整拆解了AI Agent推理循环的演进路径:
- ReAct首次打通了推理和行动的闭环,让Agent能够调用工具完成简单的多步骤任务
- Reflexion加入了反思和记忆,提升了Agent的容错能力和中等复杂度任务的成功率
- Plan-and-Execute采用规划执行分层的架构,让Agent能够处理非常复杂的多步骤任务
没有最好的范式,只有最适合的范式,选型的核心是匹配业务场景的任务复杂度、成本要求、延迟要求。看完本文,你已经掌握了不同范式的核心逻辑和选型方法,完全可以根据自己的业务需求搭建或优化自己的AI Agent。
行动号召
如果你在AI Agent落地的过程中遇到了任何问题,或者有自己的优化思路,欢迎在评论区留言讨论,我们一起交流进步。如果需要本文中的完整代码,可以关注我的公众号「AI工程化笔记」,回复「Agent范式」获取下载链接。如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、转发给更多的朋友~
全文约12800字
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)