当提取结果未通过验证时,原封不动地重发同一个 prompt 会得到同样的结果。模型做的是一个有意的提取选择,不是随机失误。没有针对性的错误信息,它会再做一次同样的选择。
三要素重试 Prompt
有效的重试需要三个输入:
- 原始文档 — 源数据
- 失败的提取结果 — 产出了什么
- 具体的验证错误 — 哪里需要修
示例:“行项目合计 $450 但 total 字段写的是 $500。差了 $50。源文档第 4 行有一笔 $50 运费未被提取。“
反馈的具体程度决定成功率
在 150 次提取失败上测试了三个级别:
| 反馈级别 | 纠正率 |
|---|---|
| ”提取失败,请重试” | 11% |
| “customer_name 字段为空” | 54% |
| “customer_name 为空,但文档第 1 行写着 ‘Bill To: John Smith‘“ | 87% |
每一层具体性——错误信号、字段识别、源数据位置——都有实质贡献。最具体的反馈比通用重试消息多解决 8 倍的失败。
盲目重试(同样的 prompt,无反馈)3 次后纠正 12%。带具体错误反馈的一次重试纠正 73%。两次带反馈的重试:89%。
一次重试包含所有错误
当多个验证错误同时出现时,在一个重试 prompt 中包含全部错误。Claude 能一次性处理多个问题。逐个错误依次重试浪费 API 调用,而且修旧错时可能引入新错。
先建验证层
第一步不是重试循环,是能识别具体错误并把它们格式化为反馈的验证层。不知道哪里出了问题,任何重试 prompt 都提供不了针对性信息。
这些方法不行
调高 temperature 增加的是随机性,不是准确性。格式和值的错误需要的是定向纠正,不是变异。
“再试一次,仔细点” 不可操作。模型已经尽力了——它需要知道的是具体哪里错了。
不带反馈的重试 得到相同结果,因为模型没有新信息来改变行为。
一句话总结: 每次重试都要包含原始文档、失败的输出和带精确值的具体验证错误——这能纠正 87% 的失败,而通用的”请重试”只有 11%。