Agent 规划与推理:让AI从应激反应到主动思考 Agent 规划与推理让 AI 从应激反应到主动思考工具是 Agent 的手记忆是 Agent 的存储规划是 Agent 的大脑。没有规划能力的 Agent只能做应激反应。前言为什么 Agent 需要规划没有规划的 Agent用户帮我写一个数据分析报告 Agent 直接开始写写到一半发现需要数据 → 搜索数据 → 发现有数据但格式不对 → 重新处理 → 效率极低有规划的 Agent用户帮我写一个数据分析报告 Agent 先规划 1. 明确数据源和格式 2. 获取数据 3. 数据清洗 4. 数据分析 5. 生成报告 → 按顺序执行效率高出错少规划 把复杂任务拆解成可管理的子任务。一、任务分解1.1 任务分解方法classTaskDecomposer:任务分解defdecompose(self,task,max_subtasks5):promptf 任务{task}请将这个任务分解成{max_subtasks}个以内的子任务。 每个子任务应该 - 可独立执行 - 有明确的输入和输出 - 有明确的完成标准 输出格式JSON [ {{ id: 1, name: 子任务名称, description: 子任务描述, dependencies: [], # 依赖的子任务 ID tools_needed: [], # 需要的工具 success_criteria: 完成标准 }} ] returnllm(prompt)1.2 任务依赖图classTaskDAG:任务依赖图DAGdef__init__(self,tasks):self.taskstasks self.dagself._build_dag(tasks)def_build_dag(self,tasks):构建有向无环图dag{t[id]:{task:t,deps:t.get(dependencies,[])}fortintasks}returndagdefget_execution_order(self):拓扑排序获取执行顺序visitedset()order[]defdfs(task_id):iftask_idinvisited:returnvisited.add(task_id)fordepinself.dag[task_id][deps]:dfs(dep)order.append(task_id)fortask_idinself.dag:dfs(task_id)return[self.dag[tid][task]fortidinorder]defget_parallel_tasks(self):获取可以并行执行的任务orderself.get_execution_order()batches[]current_batch[]completedset()fortaskinorder:depsset(task.get(dependencies,[]))ifdeps.issubset(completed):current_batch.append(task)else:ifcurrent_batch:batches.append(current_batch)completed.update(t[id]fortincurrent_batch)current_batch[task]ifcurrent_batch:batches.append(current_batch)returnbatches二、计划生成与执行2.1 计划生成classPlanner:Agent 规划器def__init__(self,llm,tools):self.llmllm self.toolstoolsdefplan(self,task,contextNone):生成执行计划promptf 任务{task}可用工具{list(self.tools.keys())}上下文{context}请生成一个详细的执行计划 1. 任务分解成多个步骤 2. 每个步骤指定使用的工具 3. 步骤之间的依赖关系 4. 预期输出 计划 plan_textself.llm.generate(prompt)returnself._parse_plan(plan_text)defvalidate_plan(self,plan):验证计划的可行性forstepinplan:toolstep.get(tool)iftoolandtoolnotinself.tools:returnFalse,f步骤{step[id]}需要工具{tool}但不可用returnTrue,计划可行2.2 计划执行classPlanExecutor:计划执行器def__init__(self,planner,tools,max_retries2):self.plannerplanner self.toolstools self.max_retriesmax_retriesdefexecute(self,task):# 1. 生成计划planself.planner.plan(task)# 2. 验证计划valid,messageself.planner.validate_plan(plan)ifnotvalid:return{status:error,message:message}# 3. 获取执行顺序dagTaskDAG(plan)batchesdag.get_parallel_tasks()# 4. 按批次执行results{}forbatchinbatches:batch_resultsself._execute_batch(batch,results)results.update(batch_results)# 5. 动态调整ifself._needs_replan(task,plan,results):planself.planner.plan(task,contextresults)batchesdag.get_parallel_tasks()# 6. 汇总结果returnself._summarize_results(task,results)def_execute_batch(self,batch,previous_results):执行一批并行任务batch_results{}forstepinbatch:# 准备参数paramsself._prepare_params(step,previous_results)# 执行forattemptinrange(self.max_retries):try:resultself.tools[step[tool]](**params)batch_results[step[id]]resultbreakexceptExceptionase:ifattemptself.max_retries-1:batch_results[step[id]]{error:str(e)}returnbatch_results三、动态重规划3.1 什么时候需要重规划classReplanDetector:重规划检测defcheck(self,task,plan,results):triggers[]# 1. 工具调用失败forstep_id,resultinresults.items():iferrorinresult:triggers.append(f步骤{step_id}失败)# 2. 结果不符合预期forstep_id,resultinresults.items():ifnotself._check_expectation(plan,step_id,result):triggers.append(f步骤{step_id}结果不符合预期)# 3. 环境变化ifself._environment_changed():triggers.append(环境发生变化)# 4. 用户干预ifself._user_intervened():triggers.append(用户干预)returntriggers3.2 动态调整defdynamic_replan(task,plan,results,triggers): 根据触发条件动态调整计划 # 1. 分析失败原因analysisanalyze_failures(triggers,results)# 2. 生成修正方案revisedllm.generate(f 原始任务{task}原始计划{plan}执行结果{results}失败原因{analysis}请提供修正方案 1. 哪些步骤需要重做 2. 哪些步骤可以跳过 3. 需要新增哪些步骤 )returnrevised四、推理与规划的结合4.1 推理驱动的规划classReasoningPlanner:基于推理的规划defplan_with_reasoning(self,task):# 1. 推理任务本质reasoningself.llm.generate(f 任务{task}分析 1. 这个任务的本质是什么 2. 成功的关键是什么 3. 可能遇到的困难是什么 4. 已知信息有哪些 5. 需要获取什么信息 )# 2. 基于推理生成计划planself.llm.generate(f 基于以上分析请生成执行计划 推理{reasoning})returnplan4.2 规划中的推理检查点defplan_with_checkpoints(task):在规划中设置推理检查点planplanner.plan(task)forstepinplan:# 在执行前先推理reasoningllm.generate(f 当前步骤{step}上下文{context}推理 1. 这个步骤的目标是什么 2. 预期输出是什么 3. 如果出错备选方案是什么 )# 执行resultexecute(step)# 执行后验证verificationllm.generate(f 推理{reasoning}实际结果{result}验证 1. 结果是否符合预期 2. 如果不符合原因是什么 )ifverification[status]unexpected:plandynamic_replan(plan,step,result)五、规划的局限性5.1 过度规划问题花太多时间规划实际执行很少 表现生成了 20 步计划但只执行了 3 步 解决方案 - 限制规划步数最多 5-10 步 - 采用渐进式规划先规划前几步后面边做边规划 - 设置规划超时5.2 不切实际的规划问题规划了无法执行的步骤 表现假设了不存在的工具、不可用的数据 解决方案 - 规划前验证工具的可用性 - 规划时考虑实际情况数据可用性、时间限制 - 执行时验证每一步的可行性5.3 规划与执行脱节问题计划很好但执行时发现现实不一样 表现搜索不到预期的数据、工具返回错误 解决方案 - 动态重规划机制 - 执行结果反馈到规划 - 允许人工干预六、2026 年规划技术趋势6.1 分层规划高层规划抽象→ 中层规划具体→ 底层规划执行高层写一个数据分析报告 中层获取数据 → 分析数据 → 生成报告 底层search_web → extract_data → analyze → format6.2 学习型规划Agent 从历史规划中学习完成 100 个任务后Agent 学会 - 类似的任务通常需要哪些步骤 - 哪些步骤容易失败 - 哪些工具组合最有效6.3 规划即代码规划不再是自然语言而是代码plan { type: sequential, steps: [ {tool: search, params: {...}}, {tool: analyze, params: {...}}, ], fallback: {tool: ask_user, params: {...}}, }6.4 渐进式规划成为主流渐进式规划Progressive Planning - 不一次性生成完整计划 - 先规划前 2-3 步执行后再规划下一步 - 类似人类的走一步看一步策略 - 优势减少规划浪费快速响应变化 代表实践 - LangGraph 的 StateGraph支持动态状态更新和条件分支 - Claude Code 的 ReAct 循环Thought → Action → Observation - OpenClaw 的 Subagent 架构主Agent规划子Agent执行总结能力说明实现方式任务分解把复杂任务拆成子任务LLM 分解 DAG计划生成生成执行步骤LLM 规划计划执行按顺序/并行执行执行器动态重规划根据执行结果调整触发条件检测推理增强在规划中融入推理推理检查点规划让 Agent 从应激反应进化到主动思考。下一篇文章我们将深入Agent 安全与治理。思考题你的 Agent 现在有规划能力吗如果没有什么场景下最需要规划动态重规划在什么场景下特别重要什么场景下不需要如果规划步骤超过 10 步你会怎么处理上一篇[32] 工具系统与 MCP 协议下一篇[34] Agent 安全与治理