68-Plan-Execute-Agent-规划器-执行器-重规划机制

发布时间:2026/7/19 15:48:06

68-Plan-Execute-Agent-规划器-执行器-重规划机制 文章目录【68.PythonAI】Plan-and-Execute Agent先做计划再执行长任务不再跑偏导入语1 ~ ReAct vs Plan-Execute两种思维模式1.1 执行路径对比1.2 什么时候用哪种2 ~ Plan-Execute 的核心设计2.1 两大角色2.2 架构图3 ~ Planner 的设计3.1 Planner 的 Prompt3.2 规划示例4 ~ Executor 的设计4.1 单步执行器4.2 重规划机制5 ~ 完整 Plan-Execute Agent6 ~ 适用场景与限制6.1 什么时候 Plan-Execute 比 ReAct 更好6.2 Plan-Execute 的局限思考 总结结尾【68.PythonAI】Plan-and-Execute Agent先做计划再执行长任务不再跑偏文章简介本文深入讲解Plan-and-Execute计划-执行分离Agent架构——这是处理5步以上长链条任务的最优方案。文章对比了ReAct边走边看与Plan-Execute先谋后动在执行长任务时的本质差异ReAct容易在中间步骤迷失方向而Plan-Execute通过规划器Planner生成完整步骤计划、再由执行器Executor逐条执行来保持全局一致性。文中给出完整Python实现——包含Planner的Prompt设计、Executor的单步执行循环、重规划Replan机制的触发条件以及一个自动生成市场调研报告的真实案例。配以Mermaid流程图对比两种架构的执行路径适合已经开始写ReAct Agent、发现它在长任务上频繁跑偏的开发者。 个人主页源码骑士❄专栏传送门《Android开发基础》《python基础课程》⭐️热衷从源码视角拆解技术底层原理将复杂架构讲得通俗易懂 源码骑士的简介5年Android Framework系统开发经验曾主导多项系统级性能优化专项技术栈覆盖Android系统全链路Binder/Handler/AMS/WMS/启动流程及Java后端全家桶Spring MyBatis Redis Oracle累计产出原创技术文章100篇文章以流程图为特色被读者评价为看一篇胜过啃一周源码导入语你用 ReAct 写了一个 Agent处理 2~3 步的简单任务很顺畅。但当你让它帮我分析一下整个部门的销售数据和行业水平对比后生成一份改进建议时——它跑着跑着就跑偏了。这不是你的 Prompt 写得不好而是 ReAct 的边走边看模式在长任务上有天生的劣势它没有全局视角每一步只能根据上一步的结果决定下一步。就像一个没有地图的人在城市里找路——他知道在下一个路口往哪拐但他不知道这条路最终去不去得到目的地。Plan-and-Execute 正是为了解决这个问题而生。它先把整条路画出来再一步一步走。1 ~ ReAct vs Plan-Execute两种思维模式1.1 执行路径对比Plan-Execute模式发现异常规划: 列出1-2-3-4步执行第1步执行第2步执行第3步执行第4步 → 完成重规划: 调整剩余步骤ReAct模式步骤1: 搜索A步骤2: 根据结果搜索B步骤3: 发现方向偏了, 调整步骤4: 重新搜C...容易迷失1.2 什么时候用哪种任务类型推荐架构原因查询回答2-3步ReAct开销小灵活代码生成修复不确定步数ReAct需要根据每次结果动态调整报告生成4-8步Plan-Execute需要全局规划多源数据汇总分析Plan-Execute需要协调多个数据源的收集顺序2 ~ Plan-Execute 的核心设计2.1 两大角色角色职责输入输出Planner规划器分析任务拆成步骤列表用户问题[步骤1, 步骤2, 步骤3, ...]Executor执行器逐条执行步骤返回结果单个步骤执行结果2.2 架构图结果异常?用户问题规划器 LLM步骤列表1. 搜索A2. 搜索B3. 对比分析4. 生成报告执行步骤1结果1执行步骤2结果2执行步骤3结果3执行步骤4最终结果重新规划剩余步骤3 ~ Planner 的设计3.1 Planner 的 PromptPLANNER_PROMPT你是任务规划器。请将用户问题分解为按顺序执行的步骤列表。 规则 1. 每个步骤必须是一个独立的操作搜索、计算、查询等 2. 步骤数控制在3~8个 3. 第1步通常是理解问题并确定信息需求 4. 最后一步通常是综合所有信息生成最终答案 5. 每步写明步骤描述 需要调用哪个工具 可用工具 - web_search[关键词]: 搜索互联网 - database_query[SQL]: 查询数据库 - python_executor[代码]: 执行Python计算 请严格按以下格式输出计划 PLAN: 1. [工具名] 步骤描述 2. [工具名] 步骤描述 ... 用户问题{question} PLAN:defplanner(llm,question:str)-list:规划器返回步骤列表responsellm.invoke(PLANNER_PROMPT.format(questionquestion)).content# 解析步骤importre stepsre.findall(r\d\.\s*(\[.*?\]|)\s*(.),response)return[(tool.strip([]),desc.strip())fortool,descinsteps]3.2 规划示例用户问题帮我生成一份Python异步编程的市场调研报告Planner 输出: PLAN:1.[web_search]搜索Python异步编程的概念和基础用法2.[web_search]搜索asyncio在企业中的应用案例3.[web_search]搜索主流异步框架asyncio vs Trio vs Curio的对比4.[web_search]搜索Python异步编程的市场需求和招聘趋势5.[python_executor]整理所有搜索结果生成结构化的报告大纲6.[]综合所有信息生成最终的市场调研报告4 ~ Executor 的设计4.1 单步执行器EXECUTOR_PROMPT你是步骤执行器。请执行当前步骤并返回结果。 当前步骤{current_step} 工具{tool_name} 已有的上下文信息 {context} 请执行这个步骤并返回执行结果。defexecutor(llm,step:tuple,context:str,tools:dict)-str:执行器执行单个步骤tool_name,step_descstepiftool_nameandtool_nameintools:# 有工具就走工具resulttools[tool_name](step_desc)returnf[工具执行结果]{result}else:# 纯推理步骤——交给LLM处理responsellm.invoke(EXECUTOR_PROMPT.format(current_stepstep_desc,tool_nametool_nameor无,contextcontext)).contentreturnf[推理结果]{response}4.2 重规划机制defshould_replan(step_result:str)-bool:判断是否需要重新规划failure_signals[未找到相关信息,查询无结果,执行错误,数据不足,]returnany(signalinstep_resultforsignalinfailure_signals)defreplan(llm,original_plan:list,completed_steps:list,current_result:str,question:str)-list:根据当前失败情况重新规划剩余步骤promptf原计划在执行中遇到问题 已完成{completed_steps}失败步骤的结果{current_result}原始问题{question}请为剩余的步骤生成新的计划格式与原始计划相同。 REVISED_PLAN:responsellm.invoke(prompt).contentimportre new_stepsre.findall(r\d\.\s*(\[.*?\]|)\s*(.),response)return[(tool.strip([]),desc.strip())fortool,descinnew_steps]5 ~ 完整 Plan-Execute AgentclassPlanExecuteAgent:def__init__(self,llm,tools,max_replans2):self.llmllm self.toolstools self.max_replansmax_replansdefrun(self,question:str)-str:# 1. 生成计划planplanner(self.llm,question)print(f 计划生成完毕共{len(plan)}步:)fori,(tool,desc)inenumerate(plan,1):print(f{i}. [{tool}]{desc})# 2. 逐步执行contextf任务{question}\ncompleted_steps[]replan_count0fori,stepinenumerate(plan):print(f\n▶ 执行步骤{i1}/{len(plan)})# 执行当前步骤resultexecutor(self.llm,step,context,self.tools)completed_steps.append(step)contextf\n步骤{i1}结果{result}# 检查是否需要重规划ifshould_replan(result)andreplan_countself.max_replans:print(⚠️ 检测到异常重新规划剩余步骤...)remainingplan[i1:]new_remainingreplan(self.llm,plan,completed_steps,result,question)plancompleted_stepsnew_remaining replan_count1# 3. 生成最终答案final_promptf根据以下执行结果生成最终答案{context}请给出完整、结构化的回答。returnself.llm.invoke(final_prompt).content# 使用agentPlanExecuteAgent(llm,tools)reportagent.run(生成一份Python异步编程的市场调研报告)print(report)6 ~ 适用场景与限制6.1 什么时候 Plan-Execute 比 ReAct 更好✅ 任务有明确的终点和可预见的步骤 ✅ 需要按照特定顺序收集信息 ✅ 任务的每个步骤相对独立 ✅ 最终需要综合多个来源的信息来回答6.2 Plan-Execute 的局限局限说明缓解方式计划赶不上变化初始计划可能基于错误的假设加 1~2 次重规划机会规划本身开销大多一次 LLM 调用来生成计划简单任务直接用ReAct不适合探索型任务某些任务需要看到中间结果才知道下一步ReAct更合适思考 总结Plan-Execute 解决的是 ReAct 的视野短浅问题ReAct 每一步只能看前一步Plan-Execute 一开始就有全局视野。长任务上这个差异会被放大。规划器和执行器的分离是最优雅的设计各自关注各自的职责互不干扰。Planner 不需要知道工具怎么执行Executor 不需要知道整体计划。重规划是 Plan-Execute 的灵魂没有重规划的 Plan-Execute 就是一次性画地图——地图画错了就全完了。1~2次重规划机会成本极低效果显著。不是所有任务都适合 Plan-Execute2~3步的短任务用 ReAct 更灵活。Plan-Execute 的价值在5步以上的长任务中才会体现出来。把 Planner 的输出打印出来这是调试 Agent 最有价值的信息源——看一眼计划就知道 Agent 对任务的理解对不对。ReAct 是边走边看Plan-Execute 是先画地图再出发。你不会画地图就出门远行那迷路是大概率事件。结尾各位小伙伴本文的内容到这里就全部结束了源码骑士在这里再次感谢您的阅读源码骑士 — Android Framework 全栈开发关注跟博主一起从源码视角深耕底层原理见证每一次成长❤️点赞让优质内容被更多人看见让知识传递更有力量⭐收藏把核心知识点存好在需要时随时查、随时用评论分享你的经验或疑问评论区一起交流避坑一键四连不要忘记给博主一键四连哦️寄语技术之路难免有困惑但同行的人会让前进更有方向结语ReAct 和 Plan-Execute 不是互相替代的关系而是适用不同复杂度任务的两种武器。你Agent工具箱里两把都有才能根据任务类型灵活切换。不要忘记给博主一键四连哦

相关新闻