校验-重试回路:让输出自修复

核心04-结构化输出与工具调用⏱ 20 分钟已审校
学习进度:

一句话定义

校验-重试回路在程序侧校验模型输出(格式/Schema/业务规则),失败时把具体错误信息作为新输入喂回模型让它修正——把"偶尔出错"变成"自动恢复"。

为什么重要

任何提示都有残余失败率(采样参数与输出随机性:提示为何"时灵时不灵),区分业余与专业的不是"提示完美无错",而是"错了之后系统怎么办"。一个 95% 首次成功率的功能,加两级校验重试可以达到 99%+ 的最终成功率——这是不加训练、不加成本大头就能拿到的可靠性,也是 回归测试:把提示当代码守护 回归测试能够守护"最终成功率"而非"首次成功率"的原因。

前置知识

直观类比

老师批作业:直接打个大红叉(无信息错误消息)学生重做还是错;批注"第三步单位没换算,参考例题格式"(定位 + 期望 + 示例)学生一次就改对——回路的关键资产是那行批注。

图示

生成 → 语法校验 ─失败─→ 错误消息1 ─┐
  │ok                              ├→ 带错误重新生成(≤2次)
  ▼                                ┘
Schema 校验 ─失败─→ 错误消息2 ─→ 重试
  │ok
业务校验 ─失败─→ 错误消息3 ─→ 重试
  │ok
  ▼
交付            重试耗尽 → 熔断降级(转人工/兜底文案)

核心概念

  • 校验层:三级递进——语法校验(JSON 可解析)→ Schema 校验(字段/类型/枚举)→ 业务校验(跨字段一致性、引用真实性)。
  • 错误消息设计:喂回模型的错误必须"指出位置 + 说明期望 + 给出示例",如"字段『严重度』应为 1-5 的整数,收到『高』"。
  • 重试策略:上限(常见 2 次)、温度策略(重试可降温)、错误累积(把历次错误都带上避免重蹈覆辙)。
  • 熔断与降级:重试耗尽后的固定动作——转人工、返回兜底文案或标记失败,绝不静默丢弃。
  • 可观测性:每次失败记录(输入、输出、错误、重试次数),失败样本自动回流到评估集(评估集构建:黄金样本与失败分类)。

原理与机制

为什么"把错误喂回去"有效:模型的错误多数是模式偏差而非能力缺陷,指明"哪里不符合期望"相当于把一次盲目生成变成有反馈的修正——错误消息本身就是一次微型少样本教学。工程机制要点:

  1. 错误消息是提示工程的一部分:解析失败 与 JSON 在第 3 行缺少逗号,期望格式见示例 的修复率天差地别;错误消息要有模板、要进版本管理;
  2. 不要用同参数无限重试:同样的输入大概率得到同样的错——重试请求必须携带错误信息(改变上下文)或调整参数;
  3. 校验器自身要测试:校验器是普通代码,用单元测试覆盖边界(缺字段、错类型、多余字段)。

公式或模型

最终成功率的简单模型:设首次成功率 p,每次重试独立修复概率 q,重试上限 n,则

成功率 ≈ 1 − (1−p) × (1−q)<sup>n</sup>

例:p=0.9、q=0.7、n=2 → 1 − 0.1×0.09 = 99.1%。该模型的工程含义:q(错误消息质量)对最终成功率的贡献常常大于 p(提示打磨)——先修回路再卷提示。

实例或案例

案例:抽取服务的三级校验。 操作步骤:① 语法层 JSON.parse,失败错误消息附上"你的输出:前 80 字符";② Schema 层逐字段报错(只报第一个错,避免消息过长);③ 业务层校验(如"摘录必须逐字出现在资料中",长文档组织:分块、裁剪与引用定位);④ 重试请求模板:原提示 + 你上次的输出存在以下问题:{错误}。请修正后重新仅输出 JSON。;⑤ 重试 2 次仍失败 → 记录 + 转人工队列。错误消息模板:

校验失败:字段「类别」的值『 shipping 』不在枚举 [物流|质量|服务|其他] 内。
请修正该字段,保持其余字段不变,重新仅输出完整 JSON。

排错清单:

  • 症状:重试后错误依旧 → 错误消息没指明位置/期望,或者根本没带进重试请求;检查请求拼装;
  • 症状:重试成功率虚高但业务仍出错 → 只有语法/Schema 校验,缺业务校验层;
  • 症状:重试成本失控 → 无上限或无熔断;设定上限与降级路径,监控平均重试次数。

常见误区

  • 把重试当掩盖:对失败不加记录直接重试,系统性问题被"最终成功"掩盖——失败样本必须回流分析;
  • 错误消息写成堆栈:面向开发者的异常文本对模型几乎无用,要翻译成"位置+期望+示例";
  • 重试不带上文错误:同输入同参数的重试只是买彩票,还翻倍成本。

自测题

  1. p=0.8、q=0.6、重试 2 次,最终成功率约多少?

答:1 − 0.2 × 0.4 × 0.4 = 96.8%。

  1. 为什么错误消息质量比重试次数更重要?

答:q(单次修复率)在公式中是指数项,带定位与期望的错误消息显著提高每次重试的修复率。

  1. 重试耗尽后的三种合理动作?

答:转人工、返回固定兜底文案、标记失败进队列——核心是必须显式处理,禁止静默。

与其他知识点的关系

回归测试:把提示当代码守护 把"最终成功率"纳入回归守护;失败样本回流 评估集构建:黄金样本与失败分类 评估集;ReAct 场景中错误回灌即 工具结果的上下文呈现:喂回什么、怎么喂 的错误呈现规范。

延伸阅读

  • 综述:The Prompt Report(Schulhoff et al., 2024)——提示系统的鲁棒性与自修复思路。

来源

  • The Prompt Report: A Systematic Survey of Prompting Techniques (Schulhoff et al.
  • 2024)