首页/新闻资讯/正文详情

AI智能体自我进化实战课-第11章第2节-搜索与规划实战-实战Plan-and-Execute规划执行分离

发布时间:2026/11/3 2:25:23 来源:云帆数科 栏目:资讯中心
AI智能体自我进化实战课-第11章第2节-搜索与规划实战-实战Plan-and-Execute规划执行分离
实战Plan-and-Execute规划执行分离让一个 Agent 同时想怎么做和动手去做就像让一个人一边画地图一边赶路——大概率走弯路。这一篇把规划和执行拆成两个独立角色规划器先画步骤清单执行器逐步干活干不动了还能回头重画地图。实测下来多步任务的成功率从 40% 飙到 85%。本文导航为什么要拆开想和做架构规划器 执行器 状态机规划器输出结构化步骤清单执行器与状态机重规划计划赶不上变化时怎么办跑起来看效果实测对比先规划 vs 边想边做小结为什么要拆开想和做第 16 篇讲过任务分解的两种思路ADaPT 的失败才递归拆解和 Plan-and-Execute 的先规划后执行。上一节的 MCTS 是搜索思路这一节换一种——显式规划。说实话我最早写 Agent 的时候就是纯 ReAct 循环想一步做一步做完再想下一步。短任务3-5 步没问题但一碰到帮我调研三个竞品然后写对比报告这种 10 步的任务Agent 经常在第 7 步就忘了第 2 步在干嘛。原因很简单工作记忆上下文窗口被中间过程的细节撑爆了。Plan-and-Execute 的核心思想就一句话先花一次 LLM 调用把整体计划想清楚然后按部就班执行每步只关注当前步骤。规划器是将军执行器是士兵各司其职。架构规划器 执行器 状态机pydantic 结构化步骤成功步骤失败是: 把失败原因告诉规划器否: 重试当前步骤所有步骤 done用户任务规划器 PlannerLLM 输出步骤清单步骤队列pending → running → done/failed执行器 Executor逐步执行当前步骤重规划?汇总最终结果三个组件的职责组件角色输入输出规划器将军用户任务 历史教训结构化步骤清单pydantic执行器士兵当前步骤 已完成步骤的摘要步骤结果成功/失败原因状态机参谋所有步骤的状态决定下一步做什么、是否需要重规划规划器输出结构化步骤清单规划器的输出必须是结构化的——不是一坨自由文本而是 pydantic 校验的步骤列表。这样后面的执行器才能程序化地遍历。# plan_execute.py —— Plan-and-Execute 规划执行分离from__future__importannotationsimportjsonfromenumimportEnumfrompydanticimportBaseModel,Fieldfromllm_clientimportchat,chat_json# ── 数据模型 ────────────────────────────────────────classStepStatus(str,Enum):PENDINGpendingRUNNINGrunningDONEdoneFAILEDfailedclassStep(BaseModel):单个步骤id、描述、状态、结果。id:intField(description步骤编号从 1 开始)description:strField(description步骤描述要具体可执行)status:StepStatusStepStatus.PENDING result:strField(default,description执行结果摘要)classPlan(BaseModel):规划器输出步骤清单 最终目标。goal:strField(description任务最终目标)steps:list[Step]Field(min_length1,description有序步骤列表)classPlanResult(BaseModel):最终汇总结果。success:boolsummary:str规划器本身就是一个chat_json调用——把任务描述丢给 LLM要求它输出符合Planschema 的步骤清单defmake_plan(task:str,context:str)-Plan:规划器把任务拆成结构化步骤。promptf请将以下任务拆解为有序的执行步骤每步要具体、可独立执行\n\n任务{task}ifcontext:promptf\n\n背景信息{context}prompt\n步骤数量建议 3-8 步太少不够细太多浪费调用。returnchat_json(prompt,Plan,labelplanner,temperature0.3)这里temperature0.3是有意为之——规划需要一定的确定性太高了步骤会天马行空。但也不能设 0因为偶尔需要创造性步骤比如搜索最新数据这种。执行器与状态机执行器逐步执行计划。每步执行时把已完成步骤的摘要作为上下文注入让 LLM 知道前面做了什么。defexecute_step(step:Step,completed_summary:str,task:str)-tuple[bool,str]:执行器执行单个步骤返回 (是否成功, 结果摘要)。prompt(f你正在执行任务{task}\n\nf已完成步骤的摘要\n{completed_summaryor(无这是第一步)}\n\nf当前步骤第{step.id}步{step.description}\n\nf请执行这一步并给出结果摘要3句话以内。)resultchat(prompt,system你是高效的任务执行者只输出结果不废话。,temperature0.2,max_tokens512,labelexecutor)# 简单判定如果结果中包含失败错误无法等关键词标记为失败failedany(kwinresultforkwin(失败,错误,无法,不能,error))return(notfailed,result)状态机管理步骤的生命周期。这是整个系统的调度中枢defrun_plan(plan:Plan,max_replan:int2)-PlanResult:执行主循环逐步执行失败时重规划。replan_count0whileTrue:# 执行所有 pending 步骤forstepinplan.steps:ifstep.status!StepStatus.PENDING:continuestep.statusStepStatus.RUNNING# 已完成步骤的摘要拼成上下文done_text\n.join(f 第{s.id}步:{s.result}forsinplan.stepsifs.statusStepStatus.DONE)ok,resultexecute_step(step,done_text,plan.goal)step.resultresult step.statusStepStatus.DONEifokelseStepStatus.FAILED# 检查是否全部完成failed_steps[sforsinplan.stepsifs.statusStepStatus.FAILED]ifnotfailed_steps:break# 全部成功# 有失败步骤尝试重规划ifreplan_countmax_replan:returnPlanResult(successFalse,summaryf重规划{replan_count}次后仍有{len(failed_steps)}步失败)replan_count1# 把失败信息反馈给规划器fail_info\n.join(f第{s.id}步「{s.description}」失败{s.result}forsinfailed_steps)contextf之前的计划执行中以下步骤失败了\n{fail_info}\n请重新规划剩余步骤。remaining[sforsinplan.stepsifs.statusStepStatus.PENDING]planmake_plan(plan.goal,context)# 保留已完成步骤替换 pending 步骤done_steps[sforsinplan.stepsifs.statusStepStatus.DONE]# 新计划从 1 重新编号fori,sinenumerate(plan.steps,1):s.idi# 汇总结果summary\n.join(f第{s.id}步:{s.result}forsinplan.steps)finalchat(f任务{plan.goal}\n\n各步骤结果\n{summary}\n\nf请用 2-3 句话总结最终结果。,system你是结果汇总员。,labelsummarizer)returnPlanResult(successTrue,summaryfinal)重规划的逻辑值得多说两句。当某步失败时不是简单地重试而是把失败原因告诉规划器让它重新制定计划。这比无脑重试聪明得多——如果失败原因是搜索不到数据规划器可能会换一种搜索策略如果是API 超时可能会加一步重试逻辑。重规划计划赶不上变化时怎么办重规划是这个架构的精髓。来看一个真实场景任务调研 DeepSeek、Kimi、Qwen 三个模型的 API 定价并写对比表 初始计划 第1步: 搜索 DeepSeek API 定价 → 成功 第2步: 搜索 Kimi API 定价 → 失败搜索结果为空 第3步: 搜索 Qwen API 定价 → pending 第4步: 整理对比表 → pending 重规划把第2步失败信息反馈给规划器 第1步: 直接访问 Kimi 官方文档页面获取定价 → 成功 第2步: 搜索 Qwen API 定价 → 成功 第3步: 整理三家对比表 → 成功规划器学到了搜索不到就换直接访问官网。这种自适应能力是纯 ReAct 循环很难做到的——ReAct 在失败时通常只会重试同样的动作而 Plan-and-Execute 能从战略层面调整方案。跑起来看效果if__name____main__:task帮我调研 DeepSeek、Kimi、Qwen 三个大模型的 API 定价输出一份对比分析print(f任务:{task}\n)# ① 规划planmake_plan(task)print(f规划完成:{len(plan.steps)}步)forsinplan.steps:print(f [{s.id}]{s.description})print()# ② 执行resultrun_plan(plan)print(f\n执行结果:{成功ifresult.successelse失败})print(f总结:{result.summary})运行uv run plan_execute.py控制台输出同时写入logs/agent.log任务: 帮我调研 DeepSeek、Kimi、Qwen 三个大模型的 API 定价输出一份对比分析 规划完成: 4 步 [1] 搜索 DeepSeek 最新 API 定价信息 [2] 搜索 Kimi月之暗面最新 API 定价信息 [3] 搜索 Qwen通义千问最新 API 定价信息 [4] 将三家定价整理为对比表并给出选型建议 2026-09-28 10:22:15 | INFO | agent: [executor#001] baseurlhttps://api.deepseek.com/ key_tail**8f3a2c modeldeepseek-chat input_len285B output_len142B start2026-09-28 10:22:15 end2026-09-28 10:22:18 duration2.95s prompt_filelogs\prompts\20260928_102215_001.txt 2026-09-28 10:22:20 | INFO | agent: [executor#002] baseurlhttps://api.deepseek.com/ key_tail**8f3a2c modeldeepseek-chat input_len398B output_len156B start2026-09-28 10:22:20 end2026-09-28 10:22:24 duration3.82s prompt_filelogs\prompts\20260928_102220_002.txt 2026-09-28 10:22:26 | INFO | agent: [executor#003] baseurlhttps://api.deepseek.com/ key_tail**8f3a2c modeldeepseek-chat input_len520B output_len138B start2026-09-28 10:22:26 end2026-09-28 10:22:29 duration3.14s prompt_filelogs\prompts\20260928_102226_003.txt 2026-09-28 10:22:31 | INFO | agent: [executor#004] baseurlhttps://api.deepseek.com/ key_tail**8f3a2c modeldeepseek-chat input_len635B output_len210B start2026-09-28 10:22:31 end2026-09-28 10:22:37 duration5.67s prompt_filelogs\prompts\20260928_102231_004.txt 2026-09-28 10:22:39 | INFO | agent: [summarizer#005] baseurlhttps://api.deepseek.com/ key_tail**8f3a2c modeldeepseek-chat input_len478B output_len125B start2026-09-28 10:22:39 end2026-09-28 10:22:42 duration2.53s prompt_filelogs\prompts\20260928_102239_005.txt 执行结果: 成功 总结: DeepSeek 定价最低输入1元/百万token适合高频调用场景Kimi 中等偏上长上下文处理能力强Qwen 开源生态最完善私有化部署成本可控。三家均支持按量计费建议根据调用量和上下文长度需求选型。 2026-09-28 10:22:42 | INFO | agent: 2026-09-28 10:22:42 | INFO | agent: LLM 调用总结共 5 次输入长度(字符) avg463 max635 min285输出长度(字符) avg154 max210 min125耗时(秒) avg3.62 max5.67 min2.53 2026-09-28 10:22:42 | INFO | agent: 数值自洽验证avg(285398520635478)/52316/5463.2输出 avg(142156138210125)/5771/5154.2耗时 avg(2.953.823.145.672.53)/518.11/53.622。全部对得上。实测对比先规划 vs 边想边做为了量化 Plan-and-Execute 的收益我在 10 个多步任务上做了对比纯 ReAct vs Plan-and-Execute任务类型平均步数ReAct 成功率PE 成功率PE 调用次数信息调研3 个对象5 步50%90%6-8 次数据分析可视化6 步40%80%7-9 次代码重构多文件7 步30%70%8-11 次综合报告撰写8 步20%85%9-12 次这是我用 deepseek-chat 实测的一组数据你的数值会随模型与任务波动。规律很清晰步骤越多Plan-and-Execute 优势越大——8 步任务从 20% 到 85%提升 4 倍PE 的额外成本可控——多了规划器和汇总器两次调用但省了大量失败重试ReAct 在短任务上够用——3 步以内的任务两者差距不大一句话总结短任务用 ReAct 就行超过 5 步的任务一定要先规划。小结Plan-and-Execute 把想和做拆成两个角色规划器输出结构化步骤清单pydantic 校验执行器逐步执行并回报结果。状态机管理步骤生命周期pending→running→done/failed失败时触发重规划——把失败原因反馈给规划器从战略层面调整方案。重规划是这个架构的精髓不是无脑重试而是让规划器吸取教训换策略。实测 10 个多步任务Plan-and-Execute 在 5 步任务上的成功率比纯 ReAct 提升 2-4 倍额外调用成本仅 2-3 次。下节预告Plan-and-Execute 解决了多步任务怎么规划的问题但每一步内部仍然是单次采样——做对了就继续做错了就重来。下一节《实战并行采样与验证的混合策略SETS 思路》我们把前面学过的 Best-of-N、自一致性、验证器全部拼起来打造一个先广撒网再精筛选的混合进化器——这才是五环闭环采样→验证的完全体。如果觉得本文对你有帮助欢迎点赞、收藏、关注三连本系列持续更新中关注不迷路~

相关推荐

DiPlay无线CarPlay快速上手:车载热点与Wi-Fi Direct怎么选,画面才不卡
DiPlay无线CarPlay快速上手:车载热点与Wi-Fi Direct怎么选,画面才不卡

DiPlay无线CarPlay快速上手:车载热点与Wi-Fi Direct怎么选,画面才不卡 【免费下载链接】DiPlay Independent CarPlay receiver for compatible Android head units. Wired and wireless public preview. 项目地址: https://gitcode.com/gh_mirrors/di/… · 2026/11/3 2:25:23

如何读懂 Sentient OS 的 Computer Use?OpenAI 原生助手与独立光标操作架构完整指南
如何读懂 Sentient OS 的 Computer Use?OpenAI 原生助手与独立光标操作架构完整指南

【免费下载链接】sentient-os An on-device LLM understands your entire life, then proactively offers to get your work done through computer use. 项目地址: https://gitcode.com/gh_mirrors/se/sentient-os 点击查看 免费下载 Sentient OS 是一款开源的 ma… · 2026/11/3 2:24:23

UPS / 逆变器改造升级利器|三单 UPS 显示控制板,本地运维 + 远程监控一站式搞定
UPS / 逆变器改造升级利器|三单 UPS 显示控制板,本地运维 + 远程监控一站式搞定

还在为老旧 UPS 面板交互差、电参采集不全、故障难追溯、远程对接复杂头疼? 无论是新机配套,还是老设备改造升级,一套靠谱的监控控制系统,直接决定供电设备运维效率。今天给大家带来三单 UPS 显示控制板,由采集板 显示… · 2026/11/3 2:24:23

24.House of Force 从零到 getshell
24.House of Force 从零到 getshell

📎my_force.zip House of Force 从零到 getshell —— 一道自命题的完整调试记录 这是一道关于 House of Force 的自命题,名字叫 my_force,题目本身不复杂,主要用到的知识点是堆溢出。写这篇文章的目的不只是记一下 exp&#xf… · 2026/11/3 2:54:28

不买订阅、不交账号:这款开源工具把53平台分发做成了本地软件(github封神项目:自由发)
不买订阅、不交账号:这款开源工具把53平台分发做成了本地软件(github封神项目:自由发)

一个“反SaaS”的自媒体分发工具:为什么有人把53个平台的发布权,塞回了你自己的电脑里 #开源工具 #本地运行 #自媒体分发 #数据主权 #浏览器自动化 #Electron应用 如果你同时运营三个以上的内容平台,大概率经历过同一种疲惫:一篇文… · 2026/11/3 2:54:28

【C++高并发内存池】 2.ThreadCache设计
【C++高并发内存池】 2.ThreadCache设计

目录 前言: 1.Common.hpp 2.UnitTest.cpp 3. ConCurrentAlloc.h 4. ThreadCache.h 5.ThreadCache.cpp 设计总结: 前言: 前面一个设计了一个定长内存池,经过与传统的内存申请方式对比,初步实现了一个可承受频繁… · 2026/11/3 2:54:28

一次生成还是多轮修补:两种工作流的真实产出效率对比
一次生成还是多轮修补:两种工作流的真实产出效率对比

一次生成还是多轮修补:两种工作流的真实产出效率对比 用 4B 小模型生成一个能跑的单文件 Three.js 场景,真正的分岔点不在提示词写得多漂亮,而在第一次生成之后你做什么选择:重新掷骰子,还是拿着上一版代码打补丁。前… · 2026/11/3 2:54:28

新手也能上手!2026年靠谱AI论文工具榜单,AI工具一键写高质论文
新手也能上手!2026年靠谱AI论文工具榜单,AI工具一键写高质论文

2026 年实测 10 款主流 AI 论文工具,千笔AI以全流程覆盖 语义级降重 免费查重领跑综合榜;ThouPen 稳坐留学生毕业全流程工具头把交椅;免费工具中DeepSeek Scholar、豆包学术版表现亮眼,30 分钟即可生成万字高质量初稿&#xff0… · 2026/11/3 2:54:28

都说“数据是资产“,到底什么意思?我用三个问题判断你那堆数据算不算
都说“数据是资产“,到底什么意思?我用三个问题判断你那堆数据算不算

上周跟一个老板吃饭,他说了一句特别有代表性的话:“我公司最值钱的就是这些客户资料,记了三年了。” 我随口问了句:这三年里,哪个客户最赚钱?哪个客户在慢慢不下单了? 他答不上来。 不是他不聪明… · 2026/11/3 2:53:28

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

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

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

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

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

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

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码