智能体面试准备(五):规划与任务分解——从 Plan-and-Execute 到动态重规划的工程实现 智能体面试准备五规划与任务分解——从 Plan-and-Execute 到动态重规划的工程实现Agent 面试里工具调用考的是基本功规划能力考的才是深度。面试官常用的开场是你的 Agent 拿到一个复杂任务比如调研三个竞品并输出对比报告它怎么知道先做什么后做什么如果你的回答只有让模型自己想那基本就暴露了没做过复杂 Agent。这篇把任务规划的主流范式、Plan-and-Execute 的完整实现、动态重规划的触发机制讲透配一段可直接运行的 planner 代码。一、为什么需要显式规划ReAct 的天花板ReAct每步想一下→做一下→看结果是 Agent 的入门范式但它在复杂任务上有三个结构性缺陷短视每步只基于当前观察决定下一步缺乏全局视野容易在中途偏离最终目标上下文膨胀所有中间观察都塞进历史长任务后期模型忘了最初目标且 token 成本线性上涨错误累积某一步走偏后没有全局参照后续步骤在错误方向上越走越远。显式规划Planning的思路是把想清楚整体怎么做和逐步执行分离先生成任务分解plan再逐项执行execute执行中按需修订计划re-plan。这就是 Plan-and-Execute 范式LangChain 的同名实现、BabyAGI 的任务队列、OpenAI Deep Research 的多步研究流程内核都是它。二、主流规划范式对比范式核心机制优点缺点适用场景ReAct逐步交错推理与行动实现简单、灵活应变短视、上下文膨胀短链任务≤5步Plan-and-Execute先全局分解再逐项执行全局一致、可并行、省 token计划可能过时中长任务、可预估结构ReWOO计划中用变量引用未来结果#E1、#E2一次规划零中断token 最省完全无法应变步骤确定的流水线LLMCompiler生成任务 DAG无依赖任务并行执行延迟最低实现复杂多工具可并行场景Tree of Thoughts树状展开多分支回溯探索性最强成本爆炸解谜、搜索类问题面试高频追问ReWOO 的变量引用机制是什么答planner 一次性生成所有步骤用占位符#E1表示第一步的执行结果后续步骤直接引用占位符executor 按序执行并做变量替换最后 solver 汇总。全程只调用两次 LLM规划汇总token 消耗远低于 ReAct 的 N 次调用。代价是中途无法根据实际结果调整——所以它只适合结构确定的任务。任务分解的两个正交维度也值得记住分解粒度粗粒度里程碑 vs 细粒度动作和分解时机一次性全部分解 vs 递归按需分解。递归分解把大任务拆成子任务子任务执行时再拆更接近人类做法也是 Manus、Devin 这类长程 Agent 的实际策略。三、Plan-and-Execute 的工程要素一个生产可用的 planner 至少要处理四件事计划的结构化表示。不能是自然语言段落必须是结构化对象每个步骤有 id、描述、依赖depends_on、状态pending/running/done/failed、产出。有了依赖关系无依赖的步骤可以并行失败可以精确定位影响范围。执行器与规划器分离。planner 用强模型规划质量决定上限executor 可以用便宜模型或纯代码。executor 只看到当前步骤相关上下文而非全部历史——这是控制上下文膨胀的关键手段。重规划触发机制。三种标准触发条件步骤执行失败且重试无效执行结果与计划假设不符比如搜索竞品A的财报发现竞品A已被收购用户中途修改需求。重规划时把原计划已完成步骤失败原因喂给 planner生成修订计划已完成的工作要保留。终止与预算控制。最大步数、最大 token 预算、最大重规划次数三道保险防止 Agent 无限循环烧钱——这是面试官特别爱听的工程意识。四、可运行代码带依赖管理与重规划的迷你 Planner下面用纯 Python 标准库实现一个可运行的 Plan-Execute 框架DAG 依赖调度 失败重试 重规划钩子。真实项目里把fake_llm_plan和execute_step换成 LLM 调用即可骨架完全一致。import json from dataclasses import dataclass, field from enum import Enum class Status(Enum): PENDING pending DONE done FAILED failed dataclass class Step: id: str desc: str depends_on: list field(default_factorylist) status: Status Status.PENDING result: str retries: int 0 def fake_llm_plan(goal: str) - list: 模拟 planner LLM返回结构化计划真实场景换成 LLMJSON 输出。 return [ Step(s1, 搜索竞品A的公开资料), Step(s2, 搜索竞品B的公开资料), Step(s3, 提取两家竞品的定价与功能, depends_on[s1, s2]), Step(s4, 生成对比报告, depends_on[s3]), ] def execute_step(step: Step, context: dict) - str: 模拟 executors2 第一次执行会失败用于演示重试与重规划。 if step.id s2 and step.retries 0: raise RuntimeError(竞品B官网无法访问) return f[{step.desc}] 的执行结果 def replan(goal: str, steps: list, failed: Step) - list: 模拟重规划把失败步骤换成替代方案保留已完成的工作。 print(f 触发重规划{failed.desc} 失败原因已提交 planner) failed.desc 改用第三方数据库查询竞品B信息 failed.status Status.PENDING return steps def run(goal: str, max_rounds: int 10, max_retries: int 1): steps fake_llm_plan(goal) context {} for round_i in range(max_rounds): # 找出所有依赖已满足的待执行步骤真实场景可并行 ready [s for s in steps if s.status Status.PENDING and all(next(x for x in steps if x.id d).status Status.DONE for d in s.depends_on)] if not ready: break for step in ready: try: step.result execute_step(step, context) step.status Status.DONE context[step.id] step.result print(f [OK] {step.id}: {step.desc}) except Exception as e: step.retries 1 print(f [FAIL] {step.id}: {e} (第{step.retries}次)) if step.retries max_retries: step.status Status.FAILED steps replan(goal, steps, step) done all(s.status Status.DONE for s in steps) print(f任务{完成 if done else 未完成}共 {round_i1} 轮调度) return context if __name__ __main__: result run(调研竞品A和B并输出对比报告) print(json.dumps(result, ensure_asciiFalse, indent2))运行后可以看到完整过程s1/s2 并发就绪 → s2 失败重试 → 重试再失败触发重规划 → 替代方案执行成功 → 依赖满足后 s3、s4 顺序完成。这段代码覆盖了面试手撕 planner 的全部得分点DAG 依赖调度、失败重试、重规划、预算控制。五、规划质量的评估与提升评估规划是中间产物直接评估的常用维度是——计划可执行率每步是否对应可用工具、步骤冗余率、依赖正确率端到端则看任务成功率与平均步数。学术界有 PlanBench 等基准工业界更多用人工抽检 端到端 A/B。提升手段按性价比排序Few-shot 计划示例在 planner prompt 里放 2~3 个高质量计划范例是最便宜有效的手段结构化输出约束JSON Schema 强制输出步骤对象杜绝自然语言计划的解析失败工具清单注入规划时把可用工具及其能力描述给 planner避免规划出无法执行的步骤——计划与工具脱节是新手 Agent 最常见的失败模式计划评审plan critique让另一个 LLM 调用审查计划的完整性与可行性再执行成本换质量微调专用 planner积累了足够的任务优质计划数据后微调小模型做规划降本增效。六、面试答题框架与高频题设计一个能完成订机票订酒店生成行程单的 Agent推荐作答结构范式选择结构较确定Plan-and-Execute 优于纯 ReAct机票和酒店查询无依赖可并行行程单依赖前两者计划表示JSON 步骤对象 depends_on 字段DAG 调度异常路径航班无票→重规划改时间酒店与航班日期冲突→触发一致性校验步骤人机交互点支付前必须人工确认高风险动作卡点预算控制最大步数与重规划次数上限。其他高频题速答要点ReAct 和 Plan-and-Execute 怎么选——任务步数少、探索性强用 ReAct步骤可预估、要控成本用 PE实践常用混合全局 PE单步内部 ReAct。计划过时怎么办——答重规划三触发条件失败、假设不符、需求变更 保留已完成工作。怎么防止 Agent 死循环——步数/token/重规划次数三重预算 重复动作检测同一工具同参数连续调用 N 次强制终止。自检清单能说清 ReAct 的三个结构性缺陷吗能手写带依赖的任务调度吗知道 ReWOO 的变量引用机制吗能列出重规划的三个触发条件吗这四点齐了规划环节就能答出区分度。下一篇讲记忆系统短期记忆、长期记忆、向量化检索记忆的设计与代码实现。

本月热点