news 2026/3/14 17:30:37

Planning vs ReAct大对决:智能体架构终极指南,一篇收藏够用!附完整代码实现与性能评测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Planning vs ReAct大对决:智能体架构终极指南,一篇收藏够用!附完整代码实现与性能评测

Planning架构是一种前瞻性决策的智能体设计模式,与ReAct"边走边看"不同,它先规划后执行。由Planner(规划)、Executor(执行)和Synthesizer(综合)三组件组成,遵循"接受任务→创建计划→执行计划→合成结果"流程。优点是结构化高效,缺点是脆弱性差。文章通过代码实现、对比测试和LLM-as-a-Judge评估,分析两种架构适用场景:Planning适合步骤固定任务,ReAct适合探索性任务,实际应用需根据场景权衡选择。


目录

  1. 架构定义
  2. 宏观工作流
  3. 应用场景
  4. 优缺点分析
  5. 代码实现详解
  6. 评估方法
  7. 架构选择思考
  8. 总结与核心要点

  1. 架构定义

Planning(规划)架构是一种引入前瞻性决策层的智能体设计模式。与 ReAct 模式的"边走边看"不同,Planning Agent 会在采取任何行动之前,先将复杂任务分解为一系列可管理的子目标,制定完整的"作战计划"。

核心理念

特性描述
前瞻性在执行前完成全部规划
结构化任务被分解为有序的步骤列表
可预测整个执行路径在开始时就已确定

Planning vs ReAct 核心区别

[!IMPORTANT]
🎯 核心创新

Planning 架构的核心创新在于分离关注点

  • Planner(规划者)

    :负责分析问题并制定计划

  • Executor(执行者)

    :负责按计划执行每一步

  • Synthesizer(综合者)

    :负责整合所有结果


  1. 宏观工作

Planning 架构遵循“接受任务 → 创建计划 → 执行计划 → 合成结果”的线性流程:

详细步骤说明

步骤组件描述示例
1接受任务智能体接收复杂任务“比较三个城市的人口与英国的人口”
2创建计划Planner 分析目标,生成有序的子任务列表["搜索北京人口", "搜索上海人口", ...]
3执行计划Executor 按顺序执行每个子任务,使用工具获取结果依次调用web_search工具
4合成结果Synthesizer 整合所有中间结果,生成最终答案汇总数据并进行比较

  1. 应用场景

场景描述示例
多步骤工作流操作顺序已知且关键的任务生成报告:获取数据 → 处理 → 总结
项目管理助手将大目标分解为团队子任务“发布新功能” → 设计、开发、测试、部署
教育辅导创建教学计划从基础原理 → 高级应用的课程规划
数据收集需要从多个来源收集信息比较多个实体的属性

  1. 优缺点分析

✅ 优点

优点说明
结构化 & 可追溯整个工作流预先铺设,过程透明、易于调试
高效对于可预测任务,避免了步骤间不必要的推理循环
减少 LLM 调用规划一次,执行多次,无需每步都调用 LLM 决策
并行潜力独立步骤理论上可以并行执行

❌ 缺点

缺点说明
脆弱性预制计划在执行过程中环境发生变化时可能失败
适应性差不如 ReAct 灵活,无法根据中间结果调整计划
依赖计划质量如果初始计划有缺陷,整个执行都会受影响

[!WARNING]
⚠️ 何时不适用

Planning 架构不适用于:

  • 探索性任务(不知道下一步需要什么信息)
  • 高度动态的环境
  • 需要根据中间结果调整策略的场景

  1. 代码实现详解

5.1 环境配置

依赖库安装
pip install -U langchain-openai langchain langgraph python-dotenv rich tavily-python pydantic langchain-core

5.2 导入库并设置密钥

import osfrom typing importList, Annotated, TypedDict, Optionalfrom dotenv import load_dotenv# LangChain 组件from langchain_openai import ChatOpenAIfrom tavily import TavilyClientfrom langchain_core.messages import BaseMessage, ToolMessagefrom pydantic import BaseModel, Fieldfrom langchain_core.tools import toolfrom langchain_core.messages import SystemMessage# LangGraph 组件from langgraph.graph import StateGraph, ENDfrom langgraph.graph.message import AnyMessage, add_messagesfrom langgraph.prebuilt import ToolNode, tools_condition# 输出美化from rich.console import Consolefrom rich.markdown import Markdown# --- API 密钥以及追踪设置 ---load_dotenv()os.environ["LANGCHAIN_TRACING_V2"] = "true"os.environ["LANGCHAIN_PROJECT"] = "Agentic Architecture - Planning (GPT)"# 确保密钥已载入for key in ["OPENAI_API_KEY", "LANGCHAIN_API_KEY", "TAVILY_API_KEY"]:ifnot os.environ.get(key):print(f"{key} not found. Please create a .env file and set it.")print("Environment variables loaded and tracing is set up.")

运行结果:

Environment variables loaded and tracing isset up.

5.3 基础对照:ReAct Agent

为了理解 Planning 的价值,首先构建 ReAct Agent 作为基准对比。

console = Console()# 定义图的状态classAgentState(TypedDict): messages: Annotated[list[AnyMessage], add_messages]# 定义基础的 Tavily 搜索工具client = TavilyClient(os.environ["TAVILY_API_KEY"])@tooldefweb_search(query: str) -> str:"""基于传入的信息在网络上搜索相关信息""" result = client.search(query, max_results=2)returnstr(result["results"])llm = ChatOpenAI( model="gpt-4o-mini", temperature=0.2, api_key=os.environ["OPENAI_API_KEY"], base_url="https://api.openai.com/v1")llm_with_tool = llm.bind_tools([web_search])# Agent 节点:强制每次只调用一个工具defreact_agent_node(state: AgentState): console.print("--- ReAct Agent: Thinking... ---") messages_with_system_prompt = [ SystemMessage(content="You are a helpful research assistant. You must call one and only one tool at a time. Do not call multiple tools in a single turn. After receiving the result from a tool, you will decide on the next step.") ] + state["messages"] response = llm_with_tool.invoke(messages_with_system_prompt)return {"messages": [response]}# 构建 ReAct 图tool_node = ToolNode([web_search])react_graph_builder = StateGraph(AgentState)react_graph_builder.add_node("agent", react_agent_node)react_graph_builder.add_node("tools", tool_node)react_graph_builder.set_entry_point("agent")react_graph_builder.add_conditional_edges("agent", tools_condition)react_graph_builder.add_edge("tools", "agent")react_graph_app = react_graph_builder.compile()print("ReAct tool-using agent compiled successfully.")

运行结果:

ReAct tool-using agent compiled successfully.
ReAct Agent 架构图


5.4 Planning Agent 核心组件

Planning Agent 由三个核心节点组成:

核心组件职责
节点职责输入输出
📋Planner分析任务,生成计划用户请求步骤列表
⚙️Executor按计划执行工具调用当前步骤执行结果
📝Synthesizer整合所有结果中间步骤列表最终答案
5.4.1 定义计划、执行、合成节点
from langchain_core.messages import ToolMessageimport re# 使用 Pydantic 确保计划节点的输出是结构化的步骤列表classPlan(BaseModel):"""A plan of tool calls to execute to answer the user's query.""" steps: List[str] = Field(description="A list of tool calls that, when executed, will answer the query.")# 定义计划 Agent 的状态classPlanningState(TypedDict): user_request: str plan: Optional[List[str]] intermediate_steps: List[ToolMessage] final_ans: Optional[str]defplanner_node(state: PlanningState):"""Generates a plan of action to answer the user's request.""" console.print("--- PLANNER: 解析任务... ---") plan_llm = llm.with_structured_output(Plan) prompt = f"""You are an expert planner. Your job is to create a step-by-step plan to answer the user's request. Each step in the plan must be a single call to the `web_search` tool. **Instructions:** 1. Analyze the user's request. 2. Break it down into a sequence of simple, logical search queries. 3. Format the output as a list of strings, where each string is a single valid tool call. **Example:** Request: "What is the capital of France and what is its population?" Correct Plan Output: [ "web_search('capital of France')", "web_search('population of Paris')" ] **User's Request:**{state['user_request']} """ plan_res = plan_llm.invoke(prompt) console.print(f"--- PLANNER: 计划输出: {plan_res.steps} ---")return {"plan": plan_res.steps}defexecutor_node(state: PlanningState):"""Executes the next step in the plan""" console.print("--- EXECUTOR: 执行计划... ---") plan = state["plan"] next_step = plan[0]# 使用正则表达式匹配单引号和双引号match = re.search(r"(\w+)\((?:\"|\'|)(.*?)(?:\"|\'|)\)", next_step)ifnotmatch: tool_name = "web_search" query = next_stepelse: tool_name, query = match.groups()[0], match.groups()[1] console.print(f"--- EXECUTOR: 调用工具 '{tool_name}' 处理 '{query}' ---") res = web_search.invoke(query)# 创建 tool message tool_msg = ToolMessage( content=str(res), name=tool_name, tool_call_id=f"manual-{hash(query)}" )return {"plan": plan[1:],"intermediate_steps": state["intermediate_steps"] + [tool_msg] }defsynthesizer_node(state: PlanningState):"""Synthesizes the final answer from the intermediate steps.""" console.print("--- SYNTHESIZER: 组装结果... ---") context = "\n".join([f"Tool {msg.name} returned: {msg.content}"for msg in state["intermediate_steps"]]) prompt = f"""You are an expert synthesizer. Based on the user's request and the collected data, provide a comprehensive final answer. Request: {state['user_request']} Collected Data:{context} """ final_ans = llm.invoke(prompt).contentreturn {"final_ans": final_ans}print("计划、执行、合成节点创建完毕")

运行结果:

计划、执行、合成节点创建完毕

[!TIP]
💡 关键设计

  • Planner

    使用with_structured_output确保输出格式化的步骤列表

  • Executor

    使用正则表达式解析工具调用,并维护中间步骤列表

  • Synthesizer

    整合所有中间结果,生成最终答案


5.4.2 创建 Planning Agent 图
defplanning_router(state: PlanningState):ifnot state["plan"]: console.print("--- ROUTER: 计划结束,开始生成答案。---")return"synthesize"else: console.print("--- ROUTER: Plan has more steps. Continuing execution. ---")return"execute"planning_graph_builder = StateGraph(PlanningState)planning_graph_builder.add_node("plan", planner_node)planning_graph_builder.add_node("execute", executor_node)planning_graph_builder.add_node("synthesize", synthesizer_node)planning_graph_builder.set_entry_point("plan")planning_graph_builder.add_conditional_edges("plan", planning_router, {"execute": "execute", "synthesize": "synthesize"})planning_graph_builder.add_conditional_edges("execute", planning_router, {"execute": "execute", "synthesize": "synthesize"})planning_graph_builder.add_edge("synthesize", END)planning_graph_app = planning_graph_builder.compile()print("Planning tool-using agent compiled successfully.")

运行结果:

Planning tool-using agent compiled successfully.
Planning Agent 架构图


5.5 对比测试

使用同一个需要多步骤的问题测试两种 Agent:

plan_centric_prob = """分别找出北京、上海、深圳三个城市的2025年的总人口数。然后算出这三个城市的总人口之和。最后,将这三个城市的总人口之和与英国的总人口数比较,并告诉我哪个更大。"""
5.5.1 ReAct Agent 执行过程

ReAct Agent 采用迭代探索方式:

--- ReAct Agent: Thinking... ---================================ Human Message ================================分别找出北京、上海、深圳三个城市的2025年的总人口数...--- ReAct Agent: Thinking... ---================================== Ai Message ==================================Tool Calls: web_search (call_xxx) Args: query: 北京 2025 年 总人口 上海 2025 年 总人口 深圳 2025 年 总人口 英国 2025 年 总人口[多次迭代搜索后...]--- ReAct Agent的最终输出 ---我用官方统计数据做比较...- 北京:2183.2 万人- 上海:2480.26 万人- 深圳:1798.95 万人- 合计 = 64,624,100(约 6462.41 万人)- 英国(ONS mid-2025):69,487,000(约 6948.7 万人)- 比较结果:英国人口更大
5.5.2 Planning Agent 执行过程

Planning Agent 采用先规划后执行方式:

--- PLANNER: 解析任务... ------ PLANNER: 计划输出: ["web_search('北京市 2025 年 总人口')", "web_search('上海市 2025 年 总人口')", "web_search('深圳市 2025 年 总人口')", "web_search('英国 2025 年 总人口')"] ------ ROUTER: Plan has more steps. Continuing execution. ------ EXECUTOR: 执行计划... ------ EXECUTOR: 调用工具 'web_search' 处理 '北京市 2025 年 总人口' ------ ROUTER: Plan has more steps. Continuing execution. ------ EXECUTOR: 执行计划... ------ EXECUTOR: 调用工具 'web_search' 处理 '上海市 2025 年 总人口' ---[继续执行剩余步骤...]--- ROUTER: 计划结束,开始生成答案。------ SYNTHESIZER: 组装结果... ------ 最终结果 ---1. 各城 2025 年总人口 - 北京:2300 万人 - 上海:2487 万人(估计) - 深圳:2237.88 万人2. 三城人口之和 ≈ 70.25 百万3. 与英国比较 - 英国 ≈ 69.5 百万 - 结论:三城总人口略大于英国
执行流程对比
Agent执行步骤LLM调用次数
ReActThink → Act → Observe → Think → Act → … → 最终答案多次(每步都要决策)
PlanningPlan → Execute × 4 → Synthesize较少(规划1次+综合1次)


  1. 量化评估

使用LLM-as-a-Judge对两种 Agent 进行量化评估:

6.1 评估代码

classProcessEvaluation(BaseModel):"""Schema for evaluating an agent's problem-solving process.""" task_completion_score: int = Field(description="Score 1-10 on whether the agent successfully completed the task.") process_efficiency_score: int = Field(description="Score 1-10 on the efficiency and directness of the agent's process.") justification: str = Field(description="A brief justification for the scores.")judge_llm = llm.with_structured_output(ProcessEvaluation)defevaluate_agent_process(query: str, final_state: dict):if'messages'in final_state: trace = "\n".join([f"{m.type}: {str(m.content)}"for m in final_state['messages']])else: trace = f"Plan: {final_state.get('plan', [])}\nSteps: {final_state.get('intermediate_steps', [])}" prompt = f"""You are an expert judge of AI agents. Evaluate the agent's process for solving the task on a scale of 1-10. Focus on whether the process was logical and efficient. **User's Task:** {query} **Full Agent Trace:** {trace} Use Chinese as output. """return judge_llm.invoke(prompt)

6.2 评估结果

评估维度ReAct AgentPlanning Agent
任务完成度10/102/10
过程效率9/104/10

[!WARNING]
⚠️ 评估结果分析

在这个特定测试中,ReAct Agent 表现更好,这与我们的预期相反!

原因分析:

  • ReAct Agent 的迭代探索使其能够根据搜索结果动态调整查询策略
  • Planning Agent 虽然流程更清晰,但其Synthesizer 未能有效整合中间结果
  • 这表明 Planning 架构需要更强大的 Synthesizer 组件

这个结果说明:

  1. Planning 架构的优势依赖于计划质量综合能力
  2. 简单地"规划 → 执行 → 综合"不一定比 ReAct 更好
  3. 实际应用中需要根据具体场景选择合适的架构

  1. 架构选择思考

何时使用 Planning?

适用场景原因
步骤已知且固定计划可以预先确定
需要透明性整个流程可审计
步骤间相互独立可按顺序执行无需反馈
成本敏感减少 LLM 调用次数

何时使用 ReAct?

适用场景原因
探索性任务下一步依赖前一步结果
动态环境需要根据反馈调整
复杂推理需要多轮思考
不确定性高无法预知解决路径

架构对比图

判断维度选择 Planning选择 ReAct
任务可预测性✅ 步骤已知❌ 未知
环境稳定性✅ 稳定❌ 动态
步骤依赖关系✅ 相互独立❌ 前后依赖
成本敏感度✅ 是❌ 否


  1. 总结与核心要点

🎓 核心成果

成果说明
架构实现成功实现 Planner → Executor → Synthesizer 三段式架构
对比验证通过 ReAct vs Planning 的对比,展示两种模式的差异
评估框架引入 LLM-as-a-Judge 量化评估流程效率

🌟 关键洞察

洞察描述
有缺陷Planning 不是万能的,需要配合高质量的 Synthesizer
互补关系ReAct 和 Planning 各有优势,应根据场景选择
设计权衡透明性 vs 灵活性、效率 vs 适应性

关键代码速查表

组件代码
定义计划结构class Plan(BaseModel): steps: List[str]
结构化输出llm.with_structured_output(Plan)
创建规划状态class PlanningState(TypedDict)
路由函数def planning_router(state)
条件边add_conditional_edges("execute", planning_router, {...})

三大节点职责

节点步骤1步骤2步骤3
Planner接收用户请求分析任务生成步骤列表
Executor取出下一步骤解析工具调用执行并记录结果
Synthesizer收集中间结果整合信息生成最终答案

AI时代,未来的就业机会在哪里?

答案就藏在大模型的浪潮里。从ChatGPT、DeepSeek等日常工具,到自然语言处理、计算机视觉、多模态等核心领域,技术普惠化、应用垂直化与生态开源化正催生Prompt工程师、自然语言处理、计算机视觉工程师、大模型算法工程师、AI应用产品经理等AI岗位。

掌握大模型技能,就是把握高薪未来。

那么,普通人如何抓住大模型风口?

AI技术的普及对个人能力提出了新的要求,在AI时代,持续学习和适应新技术变得尤为重要。无论是企业还是个人,都需要不断更新知识体系,提升与AI协作的能力,以适应不断变化的工作环境。

因此,这里给大家整理了一份《2026最新大模型全套学习资源》,包括2026最新大模型学习路线、大模型书籍、视频教程、项目实战、最新行业报告、面试题、AI产品经理入门到精通等,带你从零基础入门到精通,快速掌握大模型技术!

由于篇幅有限,有需要的小伙伴可以扫码获取!

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

4. 大模型项目实战

学以致用,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

5. 大模型行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

为什么大家都在学AI大模型?

随着AI技术的发展,企业对人才的需求从“单一技术”转向 “AI+行业”双背景。企业对人才的需求从“单一技术”转向 “AI+行业”双背景。金融+AI、制造+AI、医疗+AI等跨界岗位薪资涨幅达30%-50%。

同时很多人面临优化裁员,近期科技巨头英特尔裁员2万人,传统岗位不断缩减,因此转行AI势在必行!

这些资料有用吗?

这份资料由我们和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。


大模型全套学习资料已整理打包,有需要的小伙伴可以微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费】

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 13:32:43

职场必备!ima知识库+AI,让你的收藏夹变成生产力神器

文章介绍了ima知识库工具,通过AI技术重新定义知识的收集、管理、应用和分享。用户可多渠道收集信息,AI自动整理生成摘要,智能问答辅助决策创作,支持团队协作共享。文章提供了PC端和手机端的使用技巧,帮助用户建立标签体…

作者头像 李华
网站建设 2026/3/14 2:23:00

藏在新丰江的野趣秘境!漂流溯溪玩转河源野趣沟

位于广东省河源市源城区大桂山主峰北部的野趣沟旅游区,是一处以“野趣”为核心主题的自然生态景区。它毗邻万绿湖,地处新丰江国家森林公园范围内,总面积约5至8平方公里。景区内古藤巨树遮天蔽日,飞瀑流泉层叠分布,形成…

作者头像 李华
网站建设 2026/3/13 8:19:58

网络安全毕设简单的项目选题思路

0 选题推荐 - 云计算篇 毕业设计是大家学习生涯的最重要的里程碑,它不仅是对四年所学知识的综合运用,更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要,它应该既能体现你的专业能力,又能满足实际应…

作者头像 李华
网站建设 2026/3/12 11:33:00

从贝叶斯抠图到CV-UNet实践|基于科哥大模型镜像的高效方案

从贝叶斯抠图到CV-UNet实践|基于科哥大模型镜像的高效方案 1. 技术背景与问题提出 图像抠图(Image Matting)是计算机视觉中一项基础而关键的任务,其目标是从一张图像中精确分离前景对象并生成对应的Alpha透明通道。传统方法如Gr…

作者头像 李华