你写了个带 5 个 few-shot 例子的 prompt,想教模型你要的输出风格。其中 2 个很好:精准、具体、正是你想要的语气。另外 3 个是从旧草稿复制来的,一般:啰嗦、泛泛、调子稍偏。你以为模型会从那 2 个好的学。它没有。它输出的是 5 个例子的平均,偏向那 3 个一般的多数。有时更糟:它学会了那 3 个一般例子的坏习惯,却忽略了那 2 个好例子的亮点。
最快的修法: 直接删掉那几个一般的例子,别想着用更多指令去”压过”它们。把例子砍到你今天愿意原样发出去的那 2-3 个,把它们的长度、语气、结构统一,再把输入跟真实请求最像的那个放在最后。模型从 3 个一致的例子里学得比从 5 个参差的快,而且 Anthropic 和 OpenAI 的指南都收敛到大约 3-5 个精选例子是甜区(截至 2026 年 6 月)。
为什么会这样:模型不会给你的例子打分。in-context learning 把 prompt 里每个示例都当同等权威,然后按所有示例的统计模式去靠。质量混杂的 few-shot 是”我给了例子它还是不会”最常见的原因之一——例子不全都好。而且有两种已知偏差会放大伤害:recency bias(离真实输入最近的那个例子拉得最狠)和 majority-label bias(出现得最多的那种模式胜出)。关于 in-context 例子排序的研究发现,仅仅是换哪些例子、按什么顺序放,准确率就能波动多达约 30%。
常见原因
1. 老例子从没重新评估过
例子是几个月前你刚摸索任务时加的。这期间你对”好输出”的标准提高了。老例子已经不代表当前的 bar。
怎么判断: 把每个例子当今天的输出来读。今天能直接发吗?不行就是在拖模型。
2. 长度方差教会”不一致”
例 1 80 词、例 2 200 词、例 3 50 词。模型推断长度是变量,于是输出也忽长忽短——哪怕你想要稳定长度。
怎么判断: 数每个例子输出的词数。最长的超过最短的约 2 倍,就是不一致。
3. 语气在例子间漂
例 1 正式、例 2 随意、例 3 带 emoji。模型挑一个(往往是最后那个)或者混着来,都不是你要的。
怎么判断: 例子连读一遍。自己脑子里 code-switch 了,模型也会。
4. 有一个例子带细微错误
5 个例子里有一个有 typo、事实错、或格式 glitch。模型学会复制这个错误类别。
怎么判断: 每个例子当成最终输出审一遍。源里的错会下毒。
5. 例子全是边缘 case、不是常见 case
你挑了刁钻例子去 stress test prompt。现在模型以为每个输入都是 edge case,常规输入被过度处理。这正是 majority-label bias 在跟你作对:5 个里有 4 个是怪输入,“按怪的处理”就成了默认。
怎么判断: 例子里大约 80% 是 routine 输入还是 80% 是怪输入?应该反映真实输入分布。
6. 输出结构在例子间变
例 1 用 bullet、例 2 用编号、例 3 用 prose。模型在格式间随机切。
怎么判断: 例子之间输出结构不同。挑一个。
7. 例子来自别的任务类型
prompt 现在用在新场景,例子还是旧场景的。模型带过来不适用的模式。
怎么判断: 例子的输入分布跟当前不符,有”跑题”感。
你属于哪一类
| 你观察到的症状 | 最可能的原因 | 去看 |
|---|---|---|
| 输出没毛病但很泛,永远不如你最好的那个例子锐利 | 一般例子把好例子平均下去了 | 第 1-2 步 |
| 输出长度忽长忽短 | 例子间长度方差 | 第 3 步 |
| 语气在正式和随意之间反复横跳 | 例子间语气漂 | 第 1 步、第 6 步 |
| 输出格式交替(这次 bullet 下次 prose) | 例子间结构在变 | 第 4 步 |
| 模型对简单输入过度解释 / 过度处理 | 例子偏向边缘 case | 原因 5、第 1 步 |
| 某一个特定错误反复出现 | 有个被下毒的例子 | 原因 4、第 1 步 |
| 最匹配的那个例子好像没”赢” | 顺序/recency 问题,最好的没放最后 | 第 5 步 |
最短修复路径
第 1 步:审例子、重打分
对每个例子按 5 个维度打 1-5 分:
- 匹配当前的输出 bar
- 长度跟目标一致
- 语气跟目标一致
- 没错误
- 结构跟目标格式一致
任一维度低于 4 分的踢掉。别想用加反例去”中和”一个弱例子,那只会加噪声。
第 2 步:踢掉的换成精选的
2 个顶级例子胜过 5 个参差例子。模型从小而一致的集合里学得比从大而杂的快,而且例子数量很快就到收益递减:大的提升来自头 2-3 个示例,之后再加例子基本只增加 token 成本、准确率不成比例。目标是 3-5 个高质量例子。
Input: [routine case]
Output: [exemplary output]
Input: [common variation]
Output: [exemplary output]
Input: [tricky case worth covering]
Output: [exemplary output]
3 个例子常常就够。
第 3 步:长度归一
目标输出 ~100 词时,每个例子输出大约 80-120 词。不要 30 词的紧挨着 200 词的。
第 4 步:结构归一
挑一个输出格式,所有例子统一:bullets、numbered list、prose、JSON 都行,看任务。混着用会教不一致。
第 5 步:按相似度排例子顺序
recency bias 真实存在、也有据可查:放在最后(离真实输入最近)的那个例子塑形最强。把输入形状最接近真实输入的那个例子放最后,并且别用一个异常值收尾。
Examples 1-2: general case
Example 3 (放最后): 输入跟 live input 最接近的例子
---
Live input: [user's real input]
如果你的例子带标签或类别(比如 positive/negative、accept/reject),让各标签大致均衡,别把同一种标签都堆在结尾——这样能同时避开 majority-label bias 和 recency bias。
第 6 步:把每个例子包起来并标注
在 API 上,给每个例子清晰的边界,让模型把它们当示例、而不是指令来读。Anthropic 的 prompt 工程指南建议把每个例子包在 <example> 标签里(整块再包一层 <examples> 标签);在每个例子上方加 1 行说明,告诉模型该从它身上学哪个维度。
<examples>
<example>
Note: concise, formal
Input: ...
Output: ...
</example>
<example>
Note: handles a missing field
Input: ...
Output: ...
</example>
</examples>
第 7 步:A/B 测例子集合
用集合 A(5 个混杂)生 20 条输出、用集合 B(3 个精选)生 20 条。对着你的评分标准盲打分。精选集合通常赢。这也是判断某个临界例子值不值那个名额最干净的办法。
怎么确认修好了
- 拿 10-20 条新输入跑一遍精选后的 prompt,检查整批输出的长度、语气、结构都落在你的目标范围内,而不是只挑好看的几条看。
- 把之前产出过偏调子或长度不对的那 2-3 条输入重跑一遍,现在应该都落在目标上。
- 如果你做了第 7 步的 A/B 测,精选集合对着评分标准的 win rate 应该明显更高;如果没有,问题可能出在 prompt 的指令、而不是例子。
哪些情况可能不是你操作错了
有些任务方差本来就大——比如开放创作,跨风格的例子是故意的。那种场景里”质量混杂”是 OK 的,只要是有意为之。bug 是你没打算让它方差时才出现的。
容易误判的情况
“模型就是不擅长这个任务”。多数时候模型没问题、是例子噪声大。在判模型差之前先 curate。“仅排序就能波动约 30%“这个结论提醒你:通常你能控制的变量是 prompt,不是模型。
预防建议
- 给 few-shot 例子定期排查(季度是个合理默认),过时的踢掉或更新。
- 3-5 个高质量例子优于更大的混杂集合。
- 例子间长度、语气、结构归一。
- 例子覆盖不同场景时,每个加一行说明。
- 标签 / 类别保持大致均衡,别用异常值收尾。
- 上线新例子集合前先 A/B 测,量 win rate。
- 把例子池当 production code——加版本控制,改动走 review。
FAQ
- few-shot 例子该用真实输出还是合成的? 关键是达到目标质量,而不是来源。合成的只要够到 bar 一样有效,很多团队会让模型自己起草候选例子、再人工精修。
- 例子顺序真的有影响吗? 有。recency bias 让最后一个例子影响最大,而 in-context 例子排序的研究显示,仅靠顺序和选择,准确率就能动多达约 30%。把最好、最相关的例子放最后。
- 多少个例子算太多? 过了大约 3-5 个通常就收益递减:token 成本继续涨、准确率却趋平,而且例子越多越可能混进一个弱的或冲突的。只在真有失败 case 需要时才加例子。
- 能不能加个反例来纠正坏习惯? 一般不行。删掉教会这个习惯的那个例子,比加一个”别这样”的示范更可靠——后者反而会让模型搞不清该模仿哪个模式。
- 例子看起来都挺好,输出还是偏,怎么办? 做第 7 步的 A/B 测。如果一个精选、一致的集合仍然表现差,问题多半在指令、成功标准、或者 style 和 format 的冲突上,而不在例子。
相关阅读
- 没给例子导致输出漂移
- Few-shot 例子太多反而压垮模型
- 语气混杂的 instruction
- 互相冲突的指令削弱输出
- AI 输出风格漂移
- Style 和 format 互相打架
- Prompt 是从别的任务复制来的
- 最后一句覆盖前面的指令
- Prompt 缺少 context 层级
- 没定义成功标准
标签: #Prompt 工程 #排查 #llm-output #few-shot #examples #in-context-learning