当详尽的文字指令还是出不稳定的结果——格式不统一、凭空编造字段、边界判断错误——升级路径不是更多文字、不是更强调语气、不是换模型。是 few-shot 示例。
展示本质上比描述更精确。
数据
| 方法 | 格式合规率 | 幻觉率 |
|---|---|---|
| 仅文字指令 | 64% | 28% |
| 文字 + 2 个示例 | 91% | 8% |
| 文字 + 4 个示例 | 93% | 6% |
从 0 到 2 个示例的跳跃是巨大的。从 2 到 4 是温和的。超过 4 个,收益递减。最优区间是 2-4 个精心挑选的示例。
一个针对 null 处理的示例——展示”找不到字段 → null”而不是编造——把幻觉率从 31% 降到了 4%。一个有针对性的示例,87% 的降幅。
Few-shot 的三重价值
格式一致性。 文字说”输出为 JSON,包含这些字段”,合规率 64%。一个展示精确 JSON 结构的示例,合规率 91%。Claude 从示例中做模式匹配比把文字规格翻译成结构更可靠。
模糊判断校准。 空 catch 块是 bug 还是有意的恢复逻辑?文字没法定义每个边界情况。一个示例展示”auth 上下文中的空 catch → 标记为 HIGH”和”恢复上下文中的空 catch → 跳过”,就教会了判断模式。纯文字升级准确率:35%。加 4 个示例(2 个升级 + 2 个处理)后:89%。
防止幻觉。 当源数据中缺少某个字段时,Claude 可能编造一个看似合理的值。一个示例展示正确行为——“源数据没有付款条款 → 输出:null”——表明缺失本身就是有效答案。没有任何文字指令能达到在上下文中看到 null 输出的效果。
什么时候升级到 few-shot
触发条件是:文字指令已经试过了但结果不稳定。升级路径:
- 写清晰的文字指令
- 在代表性输入上测试
- 如果结果不一致 → 加 2-4 个 few-shot 示例
- 示例瞄准具体的失败模式(格式、判断、幻觉)
文字指令管用就不要先上 few-shot。文字已经失败了就不要再加更多文字。升级是单向的:文字 → 示例,不是文字 → 更多文字。
Claude 是泛化,不是记忆
Few-shot 示例教的是判断模式,不是死板模板。两个精选示例就能让模型正确泛化到未见过的输入。Claude 不需要每种可能的情况都有示例——它从小集合中学习决策逻辑,然后广泛应用。
所以 2-4 个全面的示例优于 8 个以上的窄示例。每个示例应该教不同的技能(格式、边界判断、null 处理),而不是用不同数据重复同一课。
与结构化输出结合
在 CI 流水线中,CLAUDE.md 里的 few-shot 示例负责内容和判断校准,--json-schema 负责结构保障。两者互补:schema 确保字段名和类型正确;示例确保字段值正确且不是编的。
这些替代方案不行
加重文字语气。 “格式至关重要,必须严格遵循”不会提高合规率。Claude 需要看到格式,不是被告知格式很重要。
置信度阈值。 LLM 自报的置信度校准很差——在难题上过度自信,在简单题上反而不确定。任何阈值设置都修不了这个问题。
换模型。 如果文字指令出不稳定的结果,换模型只是挪了问题。示例在 prompt 层面修复校准。
重复执行。 每次 API 调用是独立的。Claude 不会从之前的调用中学习,也不会跨运行积累经验。
一句话总结: 当文字指令产出不一致的结果时,加 2-4 个 few-shot 示例——它们能修复格式合规率(64% → 91%)、判断准确率(35% → 89%)和幻觉率(31% → 4%),更多文字做不到。