不是所有提取错误都一样。格式错误(数据存在,格式不对)1-2 次重试就能以 94% 的成功率修复。缺失数据错误(源文档里根本没有这个信息)3 次重试后 96% 仍然失败——而那 4% “修复”的案例大概率是幻觉。
不分类地对待所有错误,既浪费算力又编造数据。
错误分类学
| 错误类型 | 可重试? | 解决率 | 示例 |
|---|---|---|---|
| 格式 | 是 | 1-2 次重试 94% | “March 15” 而非 ISO 8601 |
| 结构 | 是 | 1-2 次重试 87% | 源文档中存在但缺失的必填字段 |
| 数据缺失 | 否 | 4%(大概率幻觉) | 一般咨询单上的 warranty_expiry |
| 模糊 | 一次 | 带消歧信息重试一次,然后带限定语接受 | 不明确的日期引用 |
诊断信号:发散的输出
如果对同一个字段的多次重试每次产出不同的值(先是 MIT,然后 Apache-2.0,再然后 BSD-3-Clause,都是 license 字段),那数据就不存在。模型每次都在发明一个新的合理答案,因为没有真实值可以收敛。
格式错误会收敛——每次重试离正确格式更近。缺失数据会发散——每次重试编造一个不同的值。
生产数据
在一个日处理 10,000 工单的系统中:
- 格式错误:占重试的 42%,94% 解决
- 结构错误:占重试的 18%,87% 解决
- 缺失数据错误:占重试的 40%,6% “解决”(大概率幻觉)
缺失数据的重试消耗了 40% 的重试算力预算,真实价值接近零。预分类可以消除这种浪费。
缺失数据的正确处理
不要重试。把字段从 required 改为 nullable(参见 K4.3.3)。接受 null 并附上 "not_found_in_source" 状态。升级紧迫度(“PO 号必须存在”)只会驱动模型在每次重试时编造。
两级策略
- 分类 — 错误是可重试的(格式/结构)还是不可重试的(数据缺失)?
- 路由 — 可重试 → 带具体错误反馈的重试循环。不可重试 → 接受 null 并附带结构化上下文。
错误分类是必不可少的第一步。没有它,系统要么在缺失数据上浪费重试(导致幻觉),要么跳过可修复的格式错误的重试(丢失数据)。
这些修不了缺失数据
升级模型(Haiku → Sonnet)混淆了能力和数据可用性。更强的模型也提取不了不存在的信息。
基于失败率的自适应重试次数适得其反。失败率超过 50% 的字段主要是源文档中不存在的(80% 的情况)。更多重试 = 更多幻觉。
一句话总结: 重试前先分类错误——格式错误在反馈下收敛到正确值,但缺失数据错误会发散为编造,对它们重试浪费了 40% 的算力同时产出幻觉输出。