Appearance
计划如何被验证并修正:Replanning、Structured Plan、Validation 与 Evaluator
前置:开放任务怎么拆:Task Decomposition、ReAct 与 Plan-and-Execute
核心问题:模型给出的 Plan 为什么不能直接执行,哪些结构和业务条件必须先验证,什么变化才值得触发 replanning?
某 Tool 返回“不支持该参数”后,planner 可以换方案;已发送的通知仍保留在 execution record,不能通过新 plan 假装没发生。{id:"test", depends on:["patch"], success:"exit code==0"} 比“然后跑一下测试”更适合编译成图。
Replanning
Replanning 应基于失败/新信息只修改未完成部分,并保留已完成节点和副作用记录;全量重规划可能重复工作。Replanning 在 observation 使原计划假设失效时更新剩余计划,而不是每一步都重新规划。Runtime 应保留已完成事实和副作用记录,只允许 Planner 修改未执行部分;新 Plan 仍需 validation,并记录 plan version 以解释轨迹变化。
它不应回写已经发生的事实,也不能让模型随意“忘记”已完成副作用。
Structured Plan
StructuredPlan 应包含 node id、objective、dependencies、capability、completion criteria;Runtime 在执行前检查重复 ID、缺失依赖、循环和未知工具。
自然语言计划可以给人看,但 Runtime 不能靠解析模糊句子调度。
Plan Validation
Planner 是非确定性的,但“这个 Plan 能不能进入执行层”应该尽量由确定性 Validator 判断。
典型检查包括:
text
node id 是否唯一
依赖是否存在 / 是否成环
引用的 Tool/Capability 是否可解析
参数是否满足已知 schema
明显的权限/资源前置条件是否成立
输出是否能供下游依赖使用例如 Planner 生成 B depends_on C、C depends_on B,不需要再问一次模型“有没有问题”,Graph Validator 可以直接拒绝。
Validation 失败后再决定是返回 Planner 修复,还是提示用户补信息;不要让非法 Plan 先执行一半才发现结构错误。
Evaluator / Optimizer
Evaluator 和 Optimizer 解决的是“计划已经有了,但质量还不够”的情况。
text
Plan v1
→ Evaluator 按 rubric 找出缺口
→ Optimizer 只针对缺口修改
→ Plan v2关键不是多调用一次模型,而是 Evaluation 必须输出可执行的反馈,例如“step-3 缺少 dependency”或“completion criterion 无法验证”,而不是一句“计划不够好”。
这种循环一定要有 max_iterations 和接受阈值。否则 Agent 很容易陷入“继续批评 → 再生成 → 再批评”的无界自我优化。
Structured Plan 的价值是让程序能验证
Plan 不应该只有自然语言步骤。最小结构可以包含:
text
node_id
action/capability
inputs/artifact refs
depends_on
completion criteria
risk/approval metadataPlanner 提议结构,PlanValidator 检查未知 Tool、缺失依赖、cycle、权限/预算等确定性规则;通过后才进入 GraphCompiler。模型不需要承担可以由程序明确判断的合法性检查。
Replan 必须由新事实触发
合理 trigger 包括 Tool 返回新约束、依赖失败、资源不可用、用户修改目标或 evaluator 发现证据不足。不要每一 Turn 都重新生成整份 plan,否则 plan identity 和已完成节点很难保持。
Replan 时保留已完成且仍有效的 artifact/result,只替换受影响子图,并记录 plan_version + reason。这样 Scheduler 可以区分“执行失败”和“计划被有意修改”。
自测
- 执行到一半出现新 Observation 与原计划冲突。什么情况下应局部 replan,什么情况下应该让整个计划失效重建?
- Structured Plan 通过 JSON schema 但 dependency 指向不存在节点。谁负责 semantic validation,Evaluator 又不该替代什么?