我给大模型加了几个示例教它怎么抽取信息,本想让它更准,结果它从我那几个雷同的示例里学歪了规律、遇到没覆盖的情况就生搬硬套、甚至把示例里的具体值照抄了出来:一次 few-shot 示例选得不好把模型带偏、误以为给了例子就一定更准的深度复盘
那个"加了示例反而错得更离谱、还错得很一致"的现象,让我重新理解了 few-shot 示例。我做了个用 LLM 从文本里抽取信息的功能,为了让它更准、输出格式更规范,我加了几个 few-shot 示例(在 prompt 里给几个"输入→期望输出"的例子教它)。功能上,加了示例后格式确实更规整了。可准确率出了怪事:遇到和我示例类似的输入,它答得很好;可遇到示例没覆盖到的情况,它不仅答错,还错得很"一致"——生搬硬套我示例里的模式;更离谱的是,有几次它直接把我示例里的具体值照抄了出来(我示例里某字段填的是"张三",它对一个完全不同的输入也输出了"张三")。复盘这件事,我才真正想明白,后背发凉:问题出在我以为"给了示例,模型就一定更准",却忽略了"模型会从我给的示例里归纳规律,而我那几个示例选得不好——又单一、又雷同、还带着具体值,于是它归纳出了错误的、过度具体的规律"。few-shot 的本质是"用例子教模型该怎么做"——模型会从你给的几个例子里"找规律、归纳模式",然后套用到新输入上;所以你给什么样的例子,极大地决定了它归纳出什么样的规律;我的示例:覆盖的情况太单一(都是某一类输入)→ 它以为"所有输入都长这样",遇到别的就套错;几个示例太雷同 → 强化了那个狭隘的模式;示例里带着具体值("张三") → 它把"这个具体值"也当成了模式的一部分照抄;"给了示例"不等于"更准"——示例选得不好,反而会把模型带偏到一个错误的、狭隘的规律上,比不给示例还糟。根本原因是:模型会从 few-shot 示例里归纳规律,示例的代表性/多样性/正确性极大影响它归纳出的规律;我的示例单一雷同还带具体值,使模型归纳出错误且过度具体的规律(套错模式、照抄具体值);"给了示例"不等于"更准",选不好会带偏。问题的根,是 few-shot 示例选得不好——单一、雷同、带具体值,模型从中归纳出错误而狭隘的规律;根源是误以为给了例子就一定更准,忽视了示例的代表性决定模型学到什么。这篇就把这次"few-shot 带偏"的坑,从头到尾复盘一遍。
故障现场:示例太单一,模型学歪了规律
问题在于 few-shot 示例不具代表性、带偏了模型:
# 我的 prompt(几个 few-shot 示例, 但选得不好):
从下面的句子中抽取人名和金额, 输出JSON:
示例1: 输入"张三支付了100元" → {"name": "张三", "amount": 100}
示例2: 输入"张三转账了200元" → {"name": "张三", "amount": 200}
示例3: 输入"张三充值了50元" → {"name": "张三", "amount": 50}
现在处理: 输入"李四提现了300元" → ?
# 模型可能的输出(被示例带偏):
{"name": "张三", "amount": 300} # ✗ 把示例里的"张三"照抄了! 没真正去抽"李四"
# 示例哪里选得不好(导致模型归纳出错误规律):
1. 覆盖太单一: 三个示例的动作(支付/转账/充值)、人名(都是张三)太雷同;
→ 模型归纳出"name总是张三"这种【过度具体的错误规律】;
2. 带了具体值: 示例里反复出现"张三", 模型把这个具体值当成了模式的一部分 → 照抄;
3. 没有多样性: 没覆盖不同人名、不同动作、边界情况(没人名、多个金额、无金额等);
→ 遇到示例没覆盖的, 模型只能生搬硬套那个狭隘的模式。
# few-shot 的本质:
# - 它是"用例子教模型该怎么做"——模型从你给的例子里【归纳规律】, 套用到新输入;
# - 你给的例子, 就是它学习的"样本"; 样本有偏/单一/雷同 → 它归纳出的规律就有偏/狭隘;
# - "给了示例" ≠ "更准": 示例选得好才更准; 选不好会把模型带偏到错误规律(比不给还糟)。
★ 核心: 模型会从few-shot示例里归纳规律; 示例的【代表性、多样性、正确性】决定它学到什么;
示例单一/雷同/带具体值 → 归纳出错误而狭隘的规律(套错模式、照抄具体值);
示例要【多样、有代表性、正确无偏、覆盖边界、别让模型过度模仿具体内容】。
看着模型对"李四"的输入硬是输出了"张三",我又哭笑不得又恍然:"我以为多给几个例子、教教它,它就更准了……谁知道我那几个例子全是'张三'、动作也雷同,它就以为'哦,这类任务 name 就填张三',把我例子里的具体内容当成规律照搬了。例子没选好,反而把它教歪了。"这个坑最隐蔽的地方在于:它在和示例相似的输入上表现很好(甚至更好),给你"示例有效、模型更准了"的错觉;它只在"示例没覆盖到的情况"上才暴露带偏的问题;而且"加示例"这个动作看起来无比正确(谁不知道 few-shot 有用呢?),让人只想着"加",很少反思"加的示例选对了吗"。下面就来拆解,few-shot 示例到底该怎么选。
第一件事:搞懂 few-shot 与示例的代表性
我顺着这次事故,把 few-shot 示例的选择原则彻底理清了。
few-shot 怎么起作用? 示例该怎么选?
【核心: 模型从few-shot示例里归纳规律、套用到新输入; 示例的代表性/多样性/正确性决定它学到什么;
示例要多样有代表性、正确无偏、覆盖边界、用占位避免过度模仿具体值; "给示例"≠"更准", 选不好会带偏】
1. few-shot 的本质: 用例子教模型, 模型从例子里"归纳模式"
- 你在prompt里给几个"输入→输出"的例子, 模型从中学习"这类任务该怎么做"(格式、风格、逻辑);
- 它会"归纳"这些例子的共性, 套用到新输入——你给的例子就是它的"学习样本"。
2. 示例不好会怎样(样本偏差 → 学到错规律):
- 覆盖单一/雷同 → 归纳出过度狭隘的规律, 遇到没覆盖的就套错;
- 带具体值且重复 → 模型把"具体值"当模式照抄(如总输出"张三");
- 示例本身有错/有偏 → 模型学了错的, 偏见被放大;
- 数量太少且不典型 → 归纳不出正确规律; 太多又占上下文(同573)。
3. 怎么选好的示例:
① 多样、有代表性: 覆盖不同类型的输入(不同人名/格式/长度/语气), 别都是一类;
② 覆盖边界/特殊情况: 给一两个"没有目标信息""多个目标""异常输入"的例子, 教它怎么处理;
③ 正确无偏: 示例的输出必须正确, 别带你不想要的偏见(否则被放大);
④ 避免过度模仿具体值: 示例里的具体内容(人名/数字)要多样化, 或用占位/明确说明
"name是从输入抽取的, 不是固定值", 让它学"规则"而非"抄内容";
⑤ 数量适中: 通常2~5个有代表性的, 胜过一堆雷同的; 别贪多占上下文。
4. few-shot vs 其他方式:
- 任务简单/能说清规则 → 有时清晰的指令(zero-shot + 好的说明)比一堆示例更好;
- 格式/风格难用语言描述 → few-shot示范更有效(但要选好示例);
- 复杂任务 → few-shot + 思维链(CoT)示例; 或微调(大量数据);
- 关键: 示例是"教学样本", 选不好就是"教错了"。
5. 本质: 用"例子"去教/引导时, 例子的代表性极大地决定了被教出来的东西
- 学习者(模型, 也包括人)会从有限的例子里归纳一般规律;
- 例子有偏、单一、不典型 → 归纳出的规律就有偏、狭隘、错误;
- 想教对, 就要给"有代表性、覆盖面广、正确无偏"的例子。
一句话: 模型从few-shot示例归纳规律套用到新输入, 示例的代表性/多样性/正确性决定它学到什么; 示例要多样、
覆盖边界、正确无偏、避免过度模仿具体值、数量适中; "给示例"不等于"更准", 选不好的示例会把模型带偏。
这套认知,是整个坑的根。few-shot 的本质:模型从你给的例子里归纳模式、套用到新输入,例子就是它的学习样本。示例不好会怎样:覆盖单一→归纳狭隘套错;带具体值重复→照抄具体值;本身有偏→偏见放大;太少不典型→学不到正确规律。怎么选好:多样有代表性、覆盖边界/特殊情况、正确无偏、避免过度模仿具体值(多样化/占位/说明)、数量适中(2~5 个有代表性的胜过一堆雷同)。few-shot vs 其他:能说清规则用清晰指令、格式难描述用 few-shot 示范、复杂任务配 CoT,关键是选好示例。本质:用例子教/引导时,例子的代表性极大决定被教出来的东西——例子有偏单一就归纳出有偏狭隘的规律。一句话:模型从 few-shot 示例归纳规律套用到新输入,示例的代表性/多样性/正确性决定它学到什么;示例要多样、覆盖边界、正确无偏、避免过度模仿具体值、数量适中;"给示例"不等于"更准",选不好的示例会把模型带偏。
第二件事:正解——示例多样、覆盖边界、避免照抄
知道了示例会带偏,正解就清楚了:给多样、有代表性、覆盖边界、不诱导照抄的示例。
# 正解1: 示例多样化(不同人名/动作/格式), 别都是一类(本次的祸根)
从句子中抽取人名和金额, 输出JSON(name从输入中抽取, amount为数字):
示例1: 输入"张三支付了100元" → {"name": "张三", "amount": 100}
示例2: 输入"用户李四提现300元" → {"name": "李四", "amount": 300} ← 不同人名/动作/措辞
示例3: 输入"王五的账户入账88.5" → {"name": "王五", "amount": 88.5} ← 不同格式/小数
示例4: 输入"系统自动扣费20元" → {"name": null, "amount": 20} ← 边界: 没有人名!
示例5: 输入"今天天气不错" → {"name": null, "amount": null} ← 边界: 没有目标信息!
现在处理: 输入"赵六充值了500元" → ?
# 多样的示例让模型归纳出"从输入里抽取"的真规则, 而非"name总填张三"的假规律;
# 边界示例教它"没有就返回null", 而非硬套模式编一个。
# 正解2: 用明确的指令说清规则, 减少对示例具体值的依赖(zero/few-shot结合)
# - 明说: "name 必须是从输入文本中实际出现的人名; 若输入中没有人名, name 返回 null。"
# - 让它学"规则", 而非从示例里"抄具体内容"。
# 正解3: 覆盖边界和特殊情况(教它怎么处理"不正常"的输入)
# - 没有目标信息、有多个、格式异常、空输入 —— 各给一两个示例, 别只给"理想输入"。
# 正解4: 示例正确无偏, 别带不想要的倾向
# - 示例输出必须是你真正想要的标准答案; 若示例里碰巧都偏向某种结果, 模型会放大这个偏向。
# 正解5: 数量适中 + 评测验证
# - 通常2~5个有代表性的示例; 别堆一堆雷同的(占上下文又强化偏差, 同573/601);
# - 用一组【覆盖各种情况的真实测试集】评测加了示例后的准确率, 而非只看"和示例像"的输入。
# 反例(别这样):
# - 示例都是同一个人名/同一种格式(单一) → 带偏;
# - 示例里反复出现某具体值 → 被照抄;
# - 只给"完美输入"的示例, 不给边界 → 遇到边界生搬硬套。
# 核心: few-shot示例要多样、有代表性、覆盖边界、正确无偏、避免诱导照抄具体值; 配合清晰的规则说明;
# 数量适中; 用覆盖全面的测试集评测——让模型从示例里学到"真规则"而非"假模式"。
这套正解的关键,是让示例成为"能归纳出真规则"的好教材,而非"把模型教歪"的坏样本。示例多样化:不同人名/动作/格式,让模型归纳出"从输入抽取"的真规则,而非"name 总填张三"——这正是本次的祸根。覆盖边界:给"没有目标信息/有多个/异常输入"的示例,教它怎么处理不正常的输入。明确规则说明:让它学规则、别从示例抄具体值。正确无偏:示例输出必须是标准答案,别带不想要的倾向。数量适中 + 评测:2~5 个有代表性的、用覆盖全面的测试集验证,而非只看"和示例像"的输入。
第三件事:其他几个"被样本/范例带偏"的坑
顺着这次 few-shot,我把"从有偏的样本/范例里归纳出错误规律"的几类坑也一并理了:
几类"被样本/范例带偏"的坑(核心都是"从不具代表性的样本归纳出错规律"):
坑1: 训练数据有偏 → 模型有偏(ML通病)——训练样本不均衡/有偏见, 模型学到并放大;
正解: 平衡、清洗、去偏训练数据。
坑2: 用少量个例下结论(以偏概全)——拿几个特例当普遍规律(同556"没观察到≠没有");
正解: 用有代表性、足够大的样本; 警惕幸存者偏差。
坑3: prompt里的示例顺序/标签分布带偏——few-shot示例的顺序、类别分布也会影响模型倾向;
正解: 打散顺序、平衡各类别的示例数量。
坑4: 测试用例只覆盖happy path——测试样本不全, 通过了也不代表对(同556);
正解: 测试覆盖边界、异常、各种分支。
坑5: 拿"个人经验"当"普遍真理"——自己遇到的几个case, 当成所有情况都这样;
正解: 意识到自己样本的局限, 别过度泛化。
坑6: 言传身教给的"坏榜样"——教人/带新人时给的例子若不当, 对方也会学歪(对模型对人都成立)。
共同的根: 无论是模型还是人, 都会"从看到的样本/例子里归纳出一般规律"; 而归纳出的规律是否正确,
极大地取决于"样本是否有代表性、是否全面、是否无偏"; 用【单一、雷同、有偏、不全】的样本去归纳,
必然得到【狭隘、偏颇、错误】的规律——想得到对的规律, 就要给对的、有代表性的、覆盖全面的样本。
这些坑看似不同,根却是同一个:无论是模型还是人,都会"从看到的样本/例子里归纳出一般规律";而归纳出的规律是否正确,极大取决于"样本是否有代表性、全面、无偏";用单一、雷同、有偏、不全的样本去归纳,必然得到狭隘、偏颇、错误的规律。认清这个根("想归纳出对的规律,要给有代表性、覆盖全面、无偏的样本"),才不会用坏样本把自己或模型教歪。
第四件事:坏示例 vs 好示例 / 选择要点——两张对照表
我把 few-shot 坏示例和好示例的对比、以及选择要点,整理成对照表,贴在了团队的提示工程规范里:
| 维度 | 坏示例(带偏) | 好示例(教对) |
|---|---|---|
| 覆盖面 | 单一,都是一类 | 多样,覆盖不同类型 |
| 边界情况 | 只给理想输入 | 含没目标/多个/异常 |
| 具体值 | 反复出现同一值(被照抄) | 多样化,或说明非固定 |
| 正确性 | 可能有错/有偏 | 正确、无偏 |
| 数量 | 一堆雷同的 | 2~5 个有代表性的 |
| 效果 | 套错模式、照抄、带偏 | 归纳出真规则、泛化好 |
| 选示例要点 | 怎么做 |
|---|---|
| 多样性 | 不同输入类型/格式/措辞 |
| 覆盖边界 | 给"无目标/多个/空"的例子 |
| 避免照抄 | 具体值多样化 + 规则说明 |
| 正确无偏 | 输出是标准答案,无倾向 |
| 数量适中 | 少而精,别堆雷同 |
| 评测验证 | 用覆盖全面的测试集 |
这两张表的核心,第一张是坏示例(单一、雷同、带具体值、有偏)会把模型带偏到错误规律,好示例(多样、覆盖边界、无偏)才能让它归纳出真规则、泛化好;第二张是选示例要"多样、覆盖边界、避免照抄、正确无偏、少而精、评测验证"。记住一条:加 few-shot 示例时,问自己"模型从这几个示例,会归纳出什么规律?这个规律对吗?能泛化到示例没覆盖的情况吗?"
第五件事:关于 few-shot 示例的几组容易想当然的认知
这次事故也让我厘清了几组关于 few-shot 的、容易想当然的概念:
| 直觉以为 | 实际上 |
|---|---|
| 给了示例模型就一定更准 | 示例选不好会带偏,比不给还糟 |
| 示例越多越好 | 雷同的多反而强化偏差,还占上下文 |
| 示例随便给几个就行 | 代表性/多样性极大影响归纳出的规律 |
| 示例里的具体值无所谓 | 反复的具体值会被当模式照抄 |
| 只给理想输入的示例够了 | 不给边界,模型不会处理特殊情况 |
| 和示例像的输入答对就说明有效 | 要看示例没覆盖的输入是否也对 |
| 示例的偏见模型会自动忽略 | 会被学到并放大 |
这张表里,我栽的是第一行和第四行:以为"给了示例就更准",又"示例里反复用张三这个具体值不当回事",结果模型把张三当模式照抄、被带偏了。厘清这些,核心是一个意识:few-shot 示例是"教模型的样本",模型会从中归纳规律——你给什么样的样本,它就归纳出什么样的规律(包括你不想要的偏差和具体值);所以"给示例"只是手段,"给有代表性、多样、正确、覆盖边界的示例"才是关键;选不好的示例,会把模型教歪。
第六件事:写 few-shot 示例时,我现在的自检习惯
现在每当我要给 LLM 写 few-shot 示例,我都会先按这张图问自己:
这张图的精髓,是"先想模型会从示例归纳出什么规律、是真规则还是假模式、覆盖边界、评测泛化"。核心一问:模型从这几个示例会归纳出什么?是真规则就覆盖边界、正确无偏、评测泛化;是假模式就多样化示例。这套习惯,让我从"随手给几个示例"变成了"设计能归纳出真规则的示例"——核心始终是:模型从 few-shot 示例归纳规律套用到新输入,示例的代表性/多样性/正确性决定它学到什么;示例要多样、覆盖边界、正确无偏、避免照抄具体值;给示例不等于更准,选不好会带偏。
我立下的几条规矩
这场"示例选不好把模型带偏"的事故,换来了我做提示工程时,刻进骨子里的几条铁律:
- 模型会从 few-shot 示例里归纳规律、套用到新输入;示例就是它的学习样本。
- "给了示例"不等于"更准";示例选不好会把模型带偏到错误规律,可能比不给还糟。
- 示例要多样、有代表性,别都是一类(单一/雷同会归纳出狭隘错误的规律)。
- 覆盖边界和特殊情况(没目标/多个/异常/空输入),教它怎么处理不正常的输入。
- 避免示例里反复出现具体值(会被当模式照抄);具体值多样化或加规则说明"从输入抽取非固定值"。
- 示例必须正确无偏;偏见会被模型学到并放大。
- 数量适中(2~5 个有代表性的胜过一堆雷同);用覆盖全面的测试集评测泛化,而非只看像示例的输入。
附:一个"few-shot 示例自检清单"
借这次的坑,我把"什么样的 few-shot 示例是好的"做成了一份可执行的自检清单,贴在团队的提示工程 wiki 上,写完示例对照过一遍再用。
# few-shot 示例自检清单(写完示例逐项打勾)
CHECKLIST = """
[ ] 多样性: 示例覆盖了不同类型的输入吗?(不同人名/格式/长度/措辞, 别都是一类)
[ ] 边界: 给了"没有目标信息""有多个""异常/空输入"的示例吗?(教它处理不正常情况)
[ ] 防照抄: 示例里的具体值(人名/数字)多样化了吗?或有规则说明"从输入抽取, 非固定值"?
[ ] 正确性: 每个示例的输出都是标准正确答案吗?有没有夹带不想要的偏见/倾向?
[ ] 数量: 是2~5个有代表性的, 而非一堆雷同的?(别占满上下文)
[ ] 泛化测试: 用"示例没覆盖到"的真实输入测过吗?它们也答对了吗?
"""
# 一个简单的"示例多样性"检查(防止示例太雷同)
def check_diversity(examples):
warnings = []
# 检查输出里是否有反复出现的具体值(可能被照抄)
from collections import Counter
name_counts = Counter(ex["output"].get("name") for ex in examples if ex["output"].get("name"))
for name, cnt in name_counts.items():
if cnt >= len(examples) * 0.6: # 某个具体值在示例里占比过高
warnings.append(f"具体值 '{name}' 在示例中出现 {cnt} 次, 可能被模型照抄, 建议多样化")
# 检查是否覆盖了"空/无目标"的边界
if not any(ex["output"].get("name") is None for ex in examples):
warnings.append("没有'无目标信息'的边界示例, 模型可能不会处理这种情况")
return warnings
# 用法: 写完示例, 跑一下自检, 把"会带偏"的隐患在使用前发现
for w in check_diversity(my_examples):
print("⚠️", w)
这份清单和小检查的价值,在于把"示例选得好不好"这件容易凭感觉、容易忽视的事,变成了一份可逐项核对、甚至能自动检查的标准。它强迫我在用示例之前,先回答那个最关键的问题——"模型从这几个示例,会不会归纳出我不想要的、狭隘的规律?"。把"挑好样本"这件决定成败的事,从"随手一给"提升成"有意识地设计和检查"。
写在最后
回头看,这场由"few-shot 示例选得不好"引发的、模型被带偏照抄的事故,真正教给我的,远不止"示例要多样、覆盖边界"这一个技巧。它让我对"当我们用'例子/范例/样本'去教或引导一个学习者(模型, 也包括人)时, 学习者会从这些有限的例子里'归纳'出一般规律; 而它归纳出的规律是对是错、是宽是窄, 几乎完全取决于我们给的那些例子'有没有代表性'——例子选歪了, 教出来的就是歪的",有了一次刻骨的体会。我栽跟头,是因为我只想着"给例子"这个动作本身(以为给了就好),而完全没在意"给的是什么样的例子"——我那几个例子, 人名全是"张三"、动作雷同、还反复出现具体值;于是模型忠实地从这堆有偏的样本里, 归纳出了一个有偏的规律("这类任务 name 就填张三")——它没学错, 它只是太老实地学到了我例子里真实呈现的(错误的)模式;"用例子教" 的力量是双向的: 例子对, 它学对; 例子歪, 它学歪——而我给了它歪例子, 还怪它学歪。这让我领悟到一个关于"样本、归纳与示范"的深刻认知:"从例子中归纳"是模型(和人)学习的基本方式, 而"例子的代表性"决定了归纳出的规律的质量——你用什么样的样本喂它, 它就长成什么样; 用单一、偏颇、不全面的样本去教, 必然教出狭隘、有偏、不能泛化的认知;这条规律, 对机器学习、对提示工程、对"言传身教带新人"、对"用案例做决策"、对"自己从经验中总结规律"——全都成立: 你看到/给出的"样本"如果不具代表性, 你(或被你教的人/模型)归纳出的"规律"就必然失真;所以"想教对/学对, 先确保样本对(有代表性、多样、无偏)"——选样本/选例子, 本身就是一件需要用心设计的、决定成败的事。这给了我一种"用例子教/学"时的清醒:每当我要用"例子"去教别人/模型、或自己从"有限的样本"中总结规律时,要先审视"这些例子/样本, 有代表性吗?够多样吗?覆盖各种情况吗?有没有把我不想要的偏见/具体细节也带进去?"——因为从中归纳出的规律, 只会和样本一样好; 想要正确而能泛化的规律, 必须从有代表性的样本里来;"认清归纳的质量取决于样本的代表性、用心挑选有代表性且无偏的例子/样本",是教对、学对、总结对的关键。认清学习者从例子归纳规律、样本的代表性决定归纳出规律的质量、选样本本身就是决定成败的事——这,是我用一次 few-shot 带偏的事故,换来的、关于 AI、也关于如何用例子教与学的、最朴素也最深刻的领悟。如果这篇复盘,能让你下次给 LLM 写 few-shot 示例时,先想一想"它会从我这几个例子归纳出什么规律"、把例子选得多样而有代表性,那我对着那个把"李四"答成"张三"的模型哭笑不得的这段时间,就值了。
—— 别看了 · 2026