反思规划与停止条件

本节目标

你将能把“让模型多想几次”改造成带外部反馈、错误分类、预算和终态的受控循环;还能区分预先计划与滚动计划,并验证计划是否仍基于当前观察。

反思必须有反馈信号

**反思(reflection)**不是同一模型再生成一次,而是根据可定位的反馈修订产物。可靠反馈可以来自:

  • 编译器或类型检查错误;
  • 单元测试失败及失败用例;
  • JSON Schema 校验;
  • 引用不存在或证据不支持主张;
  • 固定量表的人工或模型评审。

最小循环是:

生成 -> 检查 -> 分类失败 -> 定向修订 -> 再检查

没有独立判据时,再次采样可能把正确部分改坏。模型评审适合文风、完整性等主观目标,但应固定量表、保留评语并用人工标注样本校准。确定性检查器适合语法、结构、存在性和执行结果。

Anthropic 所称 evaluator–optimizer 工作流同样要求一个模型生成、另一个依据明确标准提供反馈,再循环改进。这里的“另一个”不自动意味着独立事实来源;若两者共享相同缺失信息,仍可能一起出错。

计划不是愿望清单

可执行计划至少包含:

{
  "step_id": "S2",
  "depends_on": ["S1"],
  "action": "query_inventory",
  "expected_output": "inventory-result-v1",
  "done_when": "status is ok and item_id matches request"
}

字段阅读:

  • step_id 为计划步骤提供稳定、可引用的标识。

  • depends_on 明确执行前必须已完成的步骤,避免把数据依赖误做成并行。

  • action 应映射到允许的工具或业务动作,而不是执行模型生成的任意字符串。

  • expected_output 描述下游可验证的产物合同或版本。

  • done_when 将完成条件写成可由程序或审核者检查的断言。

  • 预先计划适合目标明确、依赖稳定的任务。开始时拆分,执行中只在事实变化时修订。

  • 滚动计划适合工具观察逐步出现的环境。每次只承诺下一段,避免远期步骤基于猜测。

ReAct 原始论文研究把推理与动作交错,使模型可依据环境观察调整后续动作;Plan-and-Solve 研究先生成计划再执行。它们是研究范式,不表示生产系统必须暴露模型的私有思维过程。工程日志应记录简洁决策理由、选中动作、参数摘要和观察,而不是依赖不可验证的长篇“思维链”。

先写停止条件,再写循环

每个循环至少有:

条件示例终态或动作
成功断言5 个测试全部通过success
不可恢复错误权限明确拒绝failed
同类错误重复相同错误签名连续两次human_review
步数预算达到 8 步budget_exhausted
重试预算瞬时失败已重试 2 次degraded 或 failed
时间/成本预算截止时间或费用上限保存状态并退出
人工请求缺少业务判断awaiting_input

“最多两轮”不是普遍真理,但“直到满意”为无限循环留下了入口。预算应来自任务风险与收益,并在离线评测中调整。

错误分类决定下一步

不要把所有失败都交给“反思”:

  • invalid_input:请求澄清或拒绝,不重试。
  • permission_denied:停止并报告,不通过换提示绕过。
  • transient:有限重试与退避。
  • deterministic_validation:依据具体错误定向修订。
  • policy_rejected:正常业务终态,不重试。
  • unknown:保留证据,转人工或安全降级。

若工具已经产生副作用但响应超时,不能直接重试。先用幂等键查询回执,判断动作是否已提交。

状态机例子:生成并验证 Python 函数

状态字段包括 spec_digest、candidate_path、test_report、revision_count、last_error_signature 和预算。流程如下:

  1. 根据固定规格生成候选文件。
  2. 在隔离环境运行语法和单元测试。
  3. 若全部通过,保存测试报告并完成。
  4. 若失败,将结构化失败信息交给修订步骤。
  5. 若同一错误重复或达到预算,停止并交给人,而不是继续改写。

完成判据是测试环境中的结果,不是模型声称“代码现在正确”。测试也可能不完整,因此发布前还要评审覆盖面和安全边界。

计划失效与重规划

每次工具观察后问:

  1. 观察是否与计划假设一致?
  2. 后续步骤依赖的数据版本是否改变?
  3. 已获审批是否仍绑定相同动作和参数?
  4. 预算是否足以继续?

若动作参数发生变化,旧审批应失效。若关键依赖改变,只重规划受影响步骤,并记录新旧计划版本,避免把所有历史清空后“从头猜”。

常见错误与排查

  • 生成者与评审者共享盲点:补充工具证据、人工标注或不同类型的确定性检查。
  • 修订请求太宽泛:传入具体失败断言和允许修改的范围。
  • 计划完成等同任务完成:用环境结果或验收测试确认。
  • 无限重试瞬时错误:设置次数、总时长和熔断条件。
  • 旧观察留在上下文:状态保存最新事实及来源版本,明确废弃过时结果。
  • 只记录最终文本:保存动作、参数摘要、观察、检查结果和终态。

练习

为“生成一个函数并通过 5 个测试”画状态机,并提交:

  1. 生成、测试、分类、修订、完成、失败、人工接管节点;
  2. 最大步骤、最大修订、总时间三个预算;
  3. 三种不可重试错误和一种可重试错误;
  4. 两个会使旧计划失效的观察;
  5. 一个证明“模型自评通过但环境失败”的测试样本。

掌握检查

  • 能指出每次反思使用的反馈来自哪里。
  • 能区分预先计划与滚动计划。
  • 能为循环写成功、失败、预算和人工接管出口。
  • 能区分可修订、可重试和不可恢复错误。
  • 能用环境状态而不是模型声明判断完成。

下一步

进入 工具、记忆与状态边界,把循环中的动作和持久数据分清。

参考资料