AG07 Plan-and-Execute让Agent先想清楚再干活AI Agent实战手册· 第三章架构篇前文AG06 ReAct框架 后文AG08 多智能体协作你有没有见过想一步做一步和先想清楚再干的两种人想象两个项目经理面对同一个任务从零搭建一个企业官网。项目经理AReAct风格“先写个首页吧……嗯首页需要一个导航栏我来加……导航栏需要一个Logo我去设计……Logo需要品牌色让我查查公司手册……”他在不断想一步→做一步→发现新问题→再想一步。灵活但可能做了很多无用功最后发现方向就不对。项目经理BPlan-and-Execute风格“先让我列个计划1.需求分析→2.技术选型→3.设计稿→4.前端开发→5.后端开发→6.测试→7.部署。好现在按计划执行第一步。”他先花时间规划出完整路线图然后一步步执行。如果中间发现计划行不通他会停下来重新规划后续步骤。在AI Agent的世界里这两种风格对应了两种核心架构ReAct边想边做和Plan-and-Execute先规划再执行。上一篇我们讲了ReAct这篇就来拆解Plan-and-Execute。一、Plan-and-Execute的核心思想Plan-and-Execute规划-执行架构的核心原则把想什么和做什么彻底分开。具体来说它引入了两个明确分工的角色Planner规划者只负责一件事——根据任务目标生成完整的执行计划。Executor执行者只负责一件事——按计划一步步调用工具完成任务。这种分离带来了三个关键优势优势解释成本降低每步执行不需要调用大模型做推理执行器甚至可以用小模型或规则引擎全局视野Planner一开始就能看到任务全貌避免走一步看一步的短视可控性强计划是显式的、可审查的你可以随时调整或中断二、三种Plan-and-Execute变体Plan-and-Execute不是只有一个固定形态。随着需求复杂度的提升它演化出了三种主要变体变体1基础版 Plan-and-Execute最简单的形式——Planner生成列表式计划Executor按顺序执行。用户分析一家公司的投资价值 Planner 输出计划 Step 1: 搜索公司基本信息营收、利润 Step 2: 查询行业竞争格局 Step 3: 分析财务指标PE、PB、ROE Step 4: 查看近期新闻和风险事件 Step 5: 综合评估并生成报告 Executor 逐步执行 Step 1 → Step 2 → Step 3 → Step 4 → Step 5特点串行执行每步完成后检查是否需要重新规划。适用步骤较少、依赖关系简单的任务。变体2ReWOO带变量传递ReWOOReasoning WithOut Observation的核心改进Planner生成计划时用变量占位符来引用前面步骤的结果。用户比较北京和上海的房价 Planner 输出计划 Step 1: search[北京2026年3月平均房价] → 结果存入 #E1 Step 2: search[上海2026年3月平均房价] → 结果存入 #E2 Step 3: compare[#E1, #E2] → 比较两个城市的房价数据 Worker 执行 Step 1, Step 2, Step 3变量会自动替换为实际结果 Solver 整合最终答案关键改进变量机制#E1,#E2允许步骤间传递数据同时Planner不需要等待每步执行完再规划下一步节省了多次大模型调用。适用步骤间有数据依赖但不需要并行的中等长度流程。变体3LLMCompiler带任务并行LLMCompiler是目前最先进的变体它引入了任务DAG有向无环图和并行调度。用户为一篇AI技术文章收集素材Planner 输出 DAG关键改进任务DAGPlanner生成的是一张依赖关系图不是简单列表并行执行没有相互依赖的任务可以同时执行动态重规划Joiner节点检查执行结果决定是否需要调整后续计划适用多任务可并行、对响应速度要求高的复杂场景。三、用LangGraph实现Plan-and-ExecuteLangGraph是构建Plan-and-Execute Agent的最佳工具之一因为它天然支持状态机和条件分支。fromlanggraph.graphimportStateGraph,ENDfromtypingimportTypedDict,List# 1. 定义状态 classPlanExecuteState(TypedDict):task:str# 用户任务plan:List[str]# 执行计划步骤列表current_step:str# 当前正在执行的步骤past_steps:List[str]# 已执行步骤及结果response:str# 最终回答# 2. 规划节点 asyncdefplanner(state:PlanExecuteState):Planner根据任务生成执行计划promptf给定任务{state[task]}请生成一个详细的执行计划返回JSON格式的步骤列表。 每步描述要具体到可以直接执行。responseawaitmodel.invoke(prompt)planparse_json(response.content)return{plan:plan}# 3. 执行节点 asyncdefexecutor(state:PlanExecuteState):Executor执行当前步骤stepstate[plan][0]resultawaittool_executor.invoke({input:step})return{current_step:step,past_steps:state[past_steps][f{step}:{result}],plan:state[plan][1:],# 移除已完成的步骤}# 4. 重新规划节点可选 asyncdefre_planner(state:PlanExecuteState):根据执行结果判断是否需要调整后续计划promptf原始任务{state[task]}已完成的步骤和结果{chr(10).join(state[past_steps])}剩余计划{state[plan]}请根据已有结果决定 1. 如果任务已完成返回 FINISH 2. 如果需要调整计划返回新的步骤列表 3. 如果继续原计划返回 CONTINUE responseawaitmodel.invoke(prompt)returnhandle_response(response)# 5. 构建工作流图 workflowStateGraph(PlanExecuteState)# 添加节点workflow.add_node(planner,planner)workflow.add_node(executor,executor)workflow.add_node(re_planner,re_planner)# 定义边workflow.set_entry_point(planner)workflow.add_edge(planner,executor)workflow.add_edge(executor,re_planner)# 条件边重新规划后决定下一步workflow.add_conditional_edges(re_planner,lambdastate:ENDifstate.get(response)FINISHelseexecutor)# 编译并运行appworkflow.compile()resultawaitapp.invoke({task:分析三家公司的财务健康度})print(result[response])这段代码展示了Plan-and-Execute的核心流程Planner先生成完整计划Executor按步骤执行每步调用工具Re-planner根据执行结果决定是继续、调整还是结束LangGraph的状态机机制让你可以精确控制每一步的流转逻辑——这在ReAct的简单循环中是做不到的。四、ReAct vs Plan-and-Execute如何选择既然两种架构都能完成复杂任务该选哪个下面这个决策表帮到你对比维度ReActPlan-and-Execute核心模式边想边做先规划再执行灵活性⭐⭐⭐⭐⭐ 极高随时调整⭐⭐⭐ 中等需重新规划成本较高每步都调大模型较低规划用大模型执行可用小模型可控性⭐⭐ 低不可预测行动⭐⭐⭐⭐⭐ 高计划可见、可审查适合步骤数5步以内5-20步上下文压力大每步都追加轨迹小执行器上下文短失败恢复难状态混乱易回到上一步重新执行简单决策规则任务步骤不确定需要灵活应对 → 是 → ReAct 任务步骤基本可预见 → 是 → Plan-and-Execute 步骤间有复杂的依赖关系 → 是 → LLMCompilerPlan-and-Execute变体 任务简单到一步就能搞定 → 直接调LLM不需要任何框架五、实际生产中的最佳实践1. 动态重新规划很关键不要指望一次规划就能完美覆盖所有情况。好的Plan-and-Execute系统一定会在执行过程中动态调整计划。# 每执行完2-3步就触发一次重新规划ifstep_count%30:new_planawaitre_plan(original_task,completed_steps,remaining_plan)2. 给Executor设定安全边界执行器是做事的人必须限制它的权限executorToolExecutor(toolssafe_tools,# 只能用预审批的工具max_steps_per_task3,# 每个子任务最多3步timeout30,# 单步超时30秒require_confirmationTrue# 高风险操作需人工确认)3. 计划粒度要适中太粗的计划“做调研→写报告”没有指导意义太细的计划“打开浏览器→输入URL→点击搜索”缺乏灵活性。好的计划粒度每个步骤应该是一个可以独立验证的最小单元。本篇要点回顾要点内容核心思想规划和执行分离——Planner想Executor做三种变体基础版串行、ReWOO变量传递、LLMCompiler并行DAG最佳工具LangGraph状态机条件分支vs ReActPlan-and-Execute更可控、成本更低但灵活性稍差选型原则步骤不确定→ReAct步骤可预见→Plan-and-Execute下一篇AG08 多智能体协作——一群AI如何分工合作一个Agent能力有限一群Agent能做什么CrewAI、AutoGen、LangGraph分别怎么编排多智能体系统下一篇揭晓。本文收录于「AI Agent实战手册」专栏作者孤岛站岗相关阅读AG06 ReAct框架 · AG05 MCP vs A2A