D03-L2-PlanAndExecute深度解析
先计划再执行Plan-and-Execute 范式深度解析附完整 Python 实现适合人群已理解 ReAct 循环、想掌握第二种主流 Agent 规划范式的开发者 引言ReAct 很好但有一个致命短板上一篇我们手写了 ReAct模型边想边做每一步都调用一次大模型、交换一次上下文。灵活是灵活但每一个步骤都在烧 Token而且步骤不可控——你不知道它会在第几步停下来。想象一个场景你要处理一份 50 行的数据处理流水线。如果用 ReAct模型每处理一步就要想一次、调一次 API成本高、还不稳定。Plan-and-Execute先计划再执行就是针对这个问题的答案先把完整计划一次性想清楚再按计划执行中途除非出错不再反复想。一、Plan-and-Execute 的核心思想一句话把规划和执行分离成两个角色。用户目标 ↓ Planner规划器一次性生成完整步骤计划 ↓ Executor执行器按计划逐个执行工具 ↓ 某步失败→ Replanner重规划器基于错误调整剩余计划 ↓ 全部步骤完成 → 汇总结果 → 最终答案三个角色各司其职角色职责调用 LLM 的次数Planner把目标拆成有序步骤清单1 次计划阶段Executor执行每一步调工具、拿结果不调 LLM只执行Replanner执行出问题时调整剩余计划按需异常时关键差异ReAct 是每一步都让 LLM 思考而 Plan-and-Execute 是只让 LLM 想一次剩下交给程序执行。规划是智能的执行是确定性的。二、Plan-and-Execute vs ReAct一张表看懂维度ReActPlan-and-Execute规划时机边做边想逐步先整体规划再执行Token 消耗高每步都推理低只在规划/重规划时推理步骤可控性不可控模型自由发挥可控计划清单明确灵活应变强随时调整方向弱计划外的变化需触发重规划适合任务探索型信息搜集、开放问答流程型数据处理、批量任务、多步流水线失败恢复自然纠错思考换路依赖 Replanner 触发选型口诀任务步骤可提前预判→ Plan-and-Execute边走边看→ ReAct。三、完整实现Planner → Executor → Replanner下面用 OpenAI SDK 实现一个最小但完整的 Plan-and-Execute 系统。功能给定目标Planner 生成步骤计划Executor 调用工具执行某一步失败时 Replanner 修正剩余计划。3.1 准备工作pipinstallopenai并设置环境变量OPENAI_API_KEY。3.2 完整代码importjsonfromopenaiimportOpenAI clientOpenAI()# 自动读取 OPENAI_API_KEY# ---------- 工具 ----------defsearch(query:str)-str:模拟搜索真实项目替换为 Tavily / SerpAPI 等db{2024年奥运会在哪里举办:2024 年奥运会在法国巴黎举办。,北京与巴黎的时差:北京与巴黎时差 7 小时冬令时巴黎比北京晚 7 小时。,}returndb.get(query,f未找到与「{query}」相关的资料)defcalculator(expr:str)-str:计算数学表达式演示用生产环境请勿直接使用 evalreturnstr(eval(expr))TOOLS{search:search,calculator:calculator}# ---------- Planner一次性生成计划 ----------PLANNER_PROMPT你是一位任务规划器。请把用户目标拆解为 2~5 个有序步骤。 每个步骤只能调用一个工具。可用工具 - search: {query: 搜索关键词} - calculator: {expr: 数学表达式} 只输出 JSON 数组不要输出任何其他内容。格式 [{tool: search, args: {query: ...}, goal: 这一步的目的}] defplan(goal:str)-list:调用 LLM 生成步骤计划respclient.chat.completions.create(modelgpt-4o-mini,messages[{role:system,content:PLANNER_PROMPT},{role:user,content:f用户目标{goal}},],)textresp.choices[0].message.content# 兼容模型输出中可能的代码块包裹texttext.strip().removeprefix(json).removesuffix().strip()stepsjson.loads(text)ifnotisinstance(steps,list)orlen(steps)0:raiseValueError(计划格式异常)returnsteps# ---------- Replanner执行失败时重规划剩余部分 ----------REPLANNER_PROMPT你是任务重规划器。执行过程中某个步骤失败了请根据错误信息 重新生成【剩余步骤】的计划。可用工具search / calculator。 只输出 JSON 数组格式同前。defreplan(goal:str,done:list,error:str)-list:基于已完成的步骤与错误信息重新生成剩余计划respclient.chat.completions.create(modelgpt-4o-mini,messages[{role:system,content:REPLANNER_PROMPT},{role:user,content:(f用户目标{goal}\nf已完成步骤{json.dumps(done,ensure_asciiFalse)}\nf失败信息{error}\nf请重新生成剩余步骤的计划JSON 数组。)},],)textresp.choices[0].message.content.strip()texttext.removeprefix(json).removesuffix().strip()returnjson.loads(text)# ---------- Executor确定性执行单步 ----------defexecute_step(step:dict):执行一个步骤返回 (是否成功, 结果文本)toolstep.get(tool)argsstep.get(args,{})iftoolnotinTOOLS:returnFalse,f未知工具{tool}try:resultTOOLS[tool](**args)returnTrue,resultexceptExceptionase:# 工具执行异常returnFalse,f工具执行失败{e}# ---------- 主流程Plan → Execute → (Replan) → Summarize ----------defrun(goal:str)-str:# 1) 规划stepsplan(goal)print( 初始计划,json.dumps(steps,ensure_asciiFalse,indent2))results,done[],[]i0whileilen(steps):stepsteps[i]print(f⚙️ 执行步骤{i1}/{len(steps)}{step.get(tool)}{step.get(args)})ok,outexecute_step(step)ifok:results.append({step:step,result:out})done.append(step)i1else:# 2) 失败 → 触发重规划print(f⚠️ 步骤失败{out}触发重规划…)stepsreplan(goal,done,out)i0# 从头执行新的剩余计划保持顺序简单# 3) 汇总把步骤结果交给 LLM 生成最终答案summaryclient.chat.completions.create(modelgpt-4o-mini,messages[{role:system,content:你是总结助手根据执行记录用中文简洁回答用户目标。},{role:user,content:(f用户目标{goal}\n执行记录{json.dumps(results,ensure_asciiFalse,indent2)})},],)returnsummary.choices[0].message.contentif__name____main__:answerrun(2024年奥运会在哪里举办举办地巴黎与北京的时差是几小时)print(f✅ 最终答案{answer})3.3 运行效果示意 初始计划 [ {tool: search, args: {query: 2024年奥运会在哪里举办}, goal: 查询举办地}, {tool: search, args: {query: 北京与巴黎的时差}, goal: 查询时差} ] ⚙️ 执行步骤 1/2search {query: 2024年奥运会在哪里举办} ⚙️ 执行步骤 2/2search {query: 北京与巴黎的时差} ✅ 最终答案2024 年奥运会在法国巴黎举办巴黎比北京晚 7 小时。对比 ReAct整个过程LLM 只被调用 2 次1 次规划 1 次汇总执行全部由确定性代码完成——这就是省 Token 的秘密。四、工程实践中的三个关键点4.1 计划要做校验不能盲信 LLMPlanner 返回的 JSON 可能格式错乱或出现未知工具。三个保险解析容错剥离代码块包裹、处理 JSON 解析失败示例已做白名单校验tool必须存在于TOOLS未知工具直接跳过步骤上限计划步骤数限制在 2~5防止 LLM 生成 20 步的离谱计划。4.2 重规划的触发条件要克制不是所有失败都要重规划。建议分级处理可重试错误网络抖动、临时 429→ 先重试不重规划逻辑错误工具参数不对、检索无结果→ 才触发 Replanner重规划次数上限如 2 次→ 超限直接终止并返回错误避免无限循环。4.3 安全提醒 ⚠️示例中calculator使用eval()仅用于演示生产环境存在代码注入风险请改用ast.literal_eval或专用计算库并对工具做白名单与权限校验。五、适用场景与选型建议强烈推荐用 Plan-and-Execute 的场景数据处理流水线清洗 → 转换 → 聚合 → 导出步骤固定批量报表生成多数据源抓取后统一汇总️日程编排查交通 → 查酒店 → 排行程顺序明确与人工流程对齐需要向业务方展示接下来会做什么的确定性步骤。仍应选 ReAct 的场景开放探索答案在哪都不知道需要边搜边调整多轮对话式推理用户会不断补充信息。工程上两者常混用用 Plan-and-Execute 定骨架遇到计划外的分叉再降级为 ReAct 模式——这也是图编排框架如 LangGraph能同时支持两种模式的原因。✅ 总结Plan-and-Execute 规划与执行分离Planner 一次性出计划Executor 确定性执行Replanner 按需修正相比 ReActToken 消耗更低、步骤可控、稳定可预测代价是灵活性下降工程三件套计划校验 分级重试/重规划 重规划次数上限选型口诀能预判步骤就先计划探索性任务才边想边做与 ReAct、Reflexion 组成三大规划范式按任务特性搭配使用。 觉得有用就点赞 收藏 关注更多 AI Agent 干货持续输出。

相关新闻

LangChain Plan-and-Execute智能体:复杂任务规划与执行架构详解

LangChain Plan-and-Execute智能体:复杂任务规划与执行架构详解

1. 项目概述:为什么我们需要“先计划,再执行”的智能体?如果你已经跟着这个系列教程一路走来,从基础的链(Chain)到简单的代理(Agent),再到更复杂的多代理协作&#xff0c…

2026/10/5 19:09:13 阅读更多 →
这些赚钱项目打死也不做

这些赚钱项目打死也不做

独孤做副业6年。 有这些副业从来没碰过。 一是实体行业,独孤从来没有接触,不是因为独孤看不上。 而是独孤有厌恶风险,一个实体,需要店面租金,装修,用人成本。 加上每日正常进货,还没开始&#x…

2026/10/14 19:36:15 阅读更多 →
信号频域分析与滤波器设计实战:从FFT到Python代码实现

信号频域分析与滤波器设计实战:从FFT到Python代码实现

这次我们来看一个信号处理领域的核心概念:信号的频域分析,特别是频率响应与滤波特性。对于从事通信、音频处理、图像处理、控制系统或任何涉及信号分析的工程师和研究者来说,理解如何将一个时域信号转换到频域进行观察,并掌握系统…

2026/10/6 16:18:51 阅读更多 →

最新新闻

RevokeMsgPatcher:PC 微信/QQ/TIM 防撤回补丁完整指南,3 分钟装完,效果边界一次讲清

RevokeMsgPatcher:PC 微信/QQ/TIM 防撤回补丁完整指南,3 分钟装完,效果边界一次讲清

RevokeMsgPatcher:PC 微信/QQ/TIM 防撤回补丁完整指南,3 分钟装完,效果边界一次讲清 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也…

2026/10/16 2:53:57 阅读更多 →
回溯法求解数独:LeetCode 37 解数独的三重占用标记剪枝与多语言实现解析

回溯法求解数独:LeetCode 37 解数独的三重占用标记剪枝与多语言实现解析

示例工程 【免费下载链接】leetcode 🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解 项目地址: https://git…

2026/10/16 2:53:57 阅读更多 →
让 Linux 上的 Claude Code/codex 拿到 Windows 截图的小工具

让 Linux 上的 Claude Code/codex 拿到 Windows 截图的小工具

让 Linux 上的 Claude Code/codex 拿到 Windows 截图的小工具 picopaste 把 Windows 截图送到 Linux 的步骤压缩为一次热键:截图进入剪贴板后按 altshiftv,工具通过已有 SSH 通道上传图片,将远端绝对路径写入剪贴板并注入当前焦点窗口。Linu…

2026/10/16 2:53:57 阅读更多 →
GetQzonehistory:一次扫码,把 QQ 空间历史说说完整导出成本地 Excel 和图片

GetQzonehistory:一次扫码,把 QQ 空间历史说说完整导出成本地 Excel 和图片

GetQzonehistory:一次扫码,把 QQ 空间历史说说完整导出成本地 Excel 和图片 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 翻 QQ 空间翻到 2018 年,…

2026/10/16 2:53:57 阅读更多 →
微信聊天记录导出完整指南:留痕把对话存成 HTML、Word 和年度报告

微信聊天记录导出完整指南:留痕把对话存成 HTML、Word 和年度报告

微信聊天记录导出完整指南:留痕把对话存成 HTML、Word 和年度报告 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendi…

2026/10/16 2:53:57 阅读更多 →
如何把来路可疑的 iOS 安装包变成一份可审计清单

如何把来路可疑的 iOS 安装包变成一份可审计清单

如何把来路可疑的 iOS 安装包变成一份可审计清单 【免费下载链接】rea Reverse engineer anything with agents, from app behavior down to native binaries. 项目地址: https://gitcode.com/GitHub_Trending/rea2/rea 做 iOS 应用逆向不一定从反汇编开始。REA&#xf…

2026/10/16 2:52:57 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →