AI Agent推理循环深度解析:从ReAct到Plan-and-Execute的范式演进

标题选项

  1. 《AI Agent推理循环深度拆解:从ReAct到Plan-and-Execute的范式演进全链路》
  2. 《从思考到行动:万字详解大模型Agent推理范式的迭代路径》
  3. 《告别瞎跑的Agent:ReAct、Reflexion到Plan-and-Execute的核心逻辑对比》
  4. 《AI Agent落地必备:一文搞懂主流推理循环的优劣势与适用场景》

引言

不知道你有没有过这样的经历:花了一周时间搭了一个AI Agent,接入了搜索、计算器、数据库等一堆工具,信心满满地测试的时候,却发现它要么调用工具的时候参数填错,要么做了3步就忘了最初的任务目标,要么拿到了数据却不会分析,明明很简单的多步骤任务,成功率却不到30%。你翻遍了各种教程,别人都说用ReAct、用Plan-and-Execute,但是你却不知道这两个范式到底有什么区别,什么时候该用哪个,怎么优化才能提升成功率。

本文将从底层原理出发,一步步拆解AI Agent推理循环的演进路径,从最早的ReAct到现在主流的Plan-and-Execute,讲透每个范式的核心逻辑、优劣势、适用场景,还有可直接运行的代码示例。读完本文,你将能够:

  • 清晰理解不同推理范式的核心差异
  • 根据业务场景选择最合适的Agent推理架构
  • 独立实现基础的ReAct和Plan-and-Execute Agent
  • 掌握Agent推理循环的优化技巧,提升任务成功率

准备工作

在开始阅读本文之前,你需要具备以下基础:

技术栈/知识要求

  1. 了解大语言模型的基本工作原理,熟悉Prompt工程的基本技巧
  2. 了解大模型的Function Call(工具调用)能力,知道怎么让大模型输出结构化参数
  3. 有基本的Python编程能力,能看懂简单的Python代码
  4. 对AI Agent的基本概念有初步了解,知道Agent的核心是「感知-推理-行动」闭环

环境/工具要求

如果想要运行本文中的代码示例,需要准备:

  1. Python 3.9+ 运行环境
  2. 可用的OpenAI API Key(或其他支持Function Call的大模型API Key)
  3. 安装langchainopenaipython-dotenvserpapi等依赖包

核心概念:AI Agent推理循环的本质

问题背景

普通大模型问答是「输入-输出」的一次性交互,只能依赖训练数据回答问题,无法获取外部实时信息,也无法执行复杂的多步骤任务,很容易产生幻觉。而AI Agent的核心价值就是打破这个限制,通过多轮循环交互,主动调用工具、获取反馈、动态调整策略,完成复杂任务。

核心定义

AI Agent的推理循环,是指Agent接收用户任务之后,从理解任务、制定策略、执行动作、获取反馈到迭代优化,直到完成任务的整个闭环过程。它本质上是一个马尔可夫决策过程(MDP),核心由四大要素构成:

  1. 感知(Perception):接收用户输入、工具返回结果、环境反馈等信息
  2. 推理(Reasoning):处理感知信息,判断当前状态、决策下一步动作
  3. 行动(Action):根据推理结果执行对应动作,比如调用工具、输出结果、修改记忆
  4. 观察(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^*π,使得累计奖励最大:
    π∗=arg⁡max⁡π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=0TγtR(St,At)]
    其中γ∈[0,1]\gamma \in [0,1]γ[0,1]是折扣因子,权衡当前奖励和未来奖励的权重。

核心架构图

感知模块

推理模块

行动模块

环境/工具

观察模块

所有的Agent推理范式都是基于这个核心循环演化而来,只是在推理的粒度、模块的拆分、能力的增强上有不同的设计。接下来我们按照时间顺序,逐个拆解每个范式的核心逻辑。


范式演进一:ReAct 推理与行动的首次结合

问题背景

在ReAct出现之前,大模型的推理和行动是完全割裂的:

  • 推理流派(代表是思维链CoT):只能「空想」,无法获取外部信息,容易产生幻觉,比如问2024年奥运会金牌数,只能靠训练数据瞎编
  • 行动流派(代表是早期工具调用Agent):只会机械调用工具,没有思考过程,多步任务容易出错,比如问「北京和上海的面积差」,只会直接搜差值,不会先搜两个城市的面积再计算

ReAct就是为了解决推理和行动割裂的问题,2022年由谷歌大脑和普林斯顿大学联合提出。

核心逻辑

ReAct的名字是**Reasoning(推理)Acting(行动)**的组合,核心思想是模仿人类解决问题的过程:每一步先思考「我现在要做什么,为什么要做」,再执行对应行动,拿到结果后进入下一轮思考,直到完成任务。

每一轮ReAct循环都包含四个固定要素:

  1. Thought(思考):当前步的推理内容,说明动作的原因和目标
  2. Action(行动):选择要执行的动作,比如调用的工具名称
  3. Action Input(行动参数):执行动作需要的参数
  4. Observation(观察):执行行动后获得的反馈结果

算法流程图

接收用户任务

构建初始上下文

调用大模型生成Thought、Action、Action Input

是否触发结束条件?

输出最终结果

执行Action,获取Observation

将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,ItHt)=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的基础上增加了两个核心模块:

  1. 反思模块(Self-Reflection):任务失败或执行到一定步数时,分析错误原因,总结经验教训
  2. 经验记忆库(Experience Memory):存储过往的成功/失败经验,下次遇到类似任务时调取参考,避免重复犯错

算法流程图

接收用户任务

从经验记忆库调取相关经验

构建初始上下文,加入经验

ReAct循环执行任务

任务是否成功?

返回结果

反思模块分析失败原因,总结经验

将经验存入经验记忆库

是否重试?

返回失败结果

执行中是否定期反思?

核心效果

根据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采用分层设计,核心由五大模块构成:

  1. Planner(规划器):接收用户任务,生成全局规划,拆分出符合MECE原则(相互独立、完全穷尽)的子任务列表,明确每个子任务的目标、输入、输出、依赖关系
  2. Memory(记忆模块):存储全局规划、子任务执行结果、历史经验、外部知识等信息,供所有模块调用
  3. Executor(执行器):接收单个子任务,用ReAct/Reflexion等范式执行子任务,返回执行结果
  4. Reviewer(评审器):评审子任务结果是否符合要求,不符合则给出修改建议,要么让Executor重新执行,要么触发重规划
  5. Replanner(重规划器):子任务执行失败、用户修改任务、规划有遗漏时,调整全局规划,更新子任务列表

算法流程图

结果符合要求

结果不符合要求

不需要

需要

用户任务输入

Planner 规划器

生成全局规划 + 子任务列表

Memory 记忆模块 存储规划

取出下一个待执行子任务

Executor 执行器 执行子任务

Reviewer 评审器 检查结果

将子任务结果存入Memory

所有子任务是否完成?

整合所有子任务结果 生成最终输出

是否需要调整规划?

Replanner 重规划器 调整全局规划

用户中途修改任务

数学模型

  1. 规划阶段子任务拆分:
    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]是子任务列表,每个子任务包含目标、输入、输出、依赖四个属性。
  2. 执行阶段子任务结果生成:
    Ri=Execute(Pi,{Rj∣j∈depsi},Tools)R_i = Execute(P_i, \{R_j | j \in deps_i\}, Tools)Ri=Execute(Pi,{Rjjdepsi},Tools)
    其中{Rj∣j∈depsi}\{R_j | j \in deps_i\}{Rjjdepsi}是当前子任务依赖的其他子任务的结果,ToolsToolsTools是可调用的工具集合。
  3. 评审阶段校验函数:
    C(Ri,Pi)={True结果符合子任务要求False结果不符合,返回错误信息C(R_i, P_i) = \begin{cases} True & \text{结果符合子任务要求} \\ False & \text{结果不符合,返回错误信息} \end{cases}C(Ri,Pi)={TrueFalse结果符合子任务要求结果不符合,返回错误信息
  4. 重规划阶段调整:
    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会自动拆分出以下子任务逐个执行:

  1. 搜索2024年上半年国内新能源车企总销量
  2. 搜索2024年上半年比亚迪的新能源销量
  3. 搜索2024年上半年特斯拉中国区的新能源销量
  4. 计算比亚迪市占率 = 比亚迪销量 / 总销量
  5. 计算特斯拉市占率 = 特斯拉销量 / 总销量
  6. 计算两者的市占率差值
  7. 整合所有数据生成分析报告

优劣势分析

优势 劣势
全局规划能力强,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%
典型应用 简单工具助手、智能客服 代码生成、内容创作 数据分析、工作流自动化

范式演进关系图

扩展,加入反思和记忆

扩展,加入规划和分层执行

REACT

string

核心要素

Thought, Action, Observation

float

复杂度

float

短任务准确率

90%

REFLEXION

string

核心要素

ReAct要素 + Reflection + Memory

float

复杂度

float

中任务准确率

70%

PLAN_AND_EXECUTE

string

核心要素

Planner + Executor + Reviewer + Memory

float

复杂度

float

长任务准确率

80%

选型最佳实践

  1. 优先看任务步数:平均任务步数<3用ReAct,3-10步用Reflexion,>10步用Plan-and-Execute
  2. 成本敏感场景优先用轻量范式:不要一上来就用Plan-and-Execute,避免不必要的成本浪费
  3. 范式可以混合使用:Plan-and-Execute的Executor内部可以用ReAct/Reflexion,充分发挥各范式的优势
  4. 小模型优先做非核心模块:规划、评审模块不需要太强的推理能力,用微调过的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年(预测) 世界模型驱动的推理循环 通用世界模型 推理前先模拟行动结果,几乎零错误 机器人、自动驾驶、通用人工智能

未来演进方向

  1. 自适应:Agent自动根据任务、资源、环境选择最合适的推理范式,不需要开发者手动选型
  2. 轻量化:推理成本越来越低,延迟越来越小,甚至可以完全跑在端侧,保障隐私安全
  3. 通用化:支持多模态输入输出,能处理各种领域的复杂任务,和现实世界深度交互

总结

本文从底层原理出发,完整拆解了AI Agent推理循环的演进路径:

  1. ReAct首次打通了推理和行动的闭环,让Agent能够调用工具完成简单的多步骤任务
  2. Reflexion加入了反思和记忆,提升了Agent的容错能力和中等复杂度任务的成功率
  3. Plan-and-Execute采用规划执行分层的架构,让Agent能够处理非常复杂的多步骤任务

没有最好的范式,只有最适合的范式,选型的核心是匹配业务场景的任务复杂度、成本要求、延迟要求。看完本文,你已经掌握了不同范式的核心逻辑和选型方法,完全可以根据自己的业务需求搭建或优化自己的AI Agent。


行动号召

如果你在AI Agent落地的过程中遇到了任何问题,或者有自己的优化思路,欢迎在评论区留言讨论,我们一起交流进步。如果需要本文中的完整代码,可以关注我的公众号「AI工程化笔记」,回复「Agent范式」获取下载链接。如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、转发给更多的朋友~

全文约12800字

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐