生产环境中的零样本与少样本:示例何时有用,何时有害
关于少样本提示,最常见的建议是:加入示例,质量就会提升。这个建议经常是错的,错到你不能不加以实测就随意信任它。在实践中,示例数量与模型性能之间的关系是非单调的——在某个点达到峰值之后就会下降,有时候下降幅度相当大。
2025 年的一项实证研究追踪了 12 个 LLM 在多项任务中的表现,发现 Gemma 7B 在漏洞识别任务中,随着示例数量超过最优值,准确率从 77.9% 跌至 39.9%。LLaMA-2 70B 在同类任务中从 68.6% 跌至 21.0%。在代码翻译基准测试中,功能正确性通常在 5 到 25 个示例之间达到峰值,之后便开始下降。这并非个别模型的特例——研究人员将其命名为"少样本崩溃"(few-shot collapse),这一现象普遍存在。
如果你正在上线一个 LLM 功能,并且默认基于直觉而非实测来决定是否使用少样本,那你很可能已经处于这条曲线的错误一侧。
为什么示例会帮倒忙:机制分析
理解少样本提示何时失效,需要理解模型实际上是如何利用这些示例的。直觉上的模型——示例是在教模型它不知道的输入-输出映射——大体上是错的。一个广为人知的发现是:随机替换少样本示例中的正确标签,对性能的影响微乎其微。模型并没有按照你想象的方式使用标签信息,而是在捕捉分布信号:输出应该采用什么格式,合适的长度是多少,属于哪种词汇风格。
这意味着示例会将模型锚定在错误的分布上。如果你的三个示例都使用正式语言,模型就会使用正式语言,即使随意的语气更适合用户。如果你的示例恰好省略了数字前的美元符号,模型就会在所有地方省略它——包括你需要它的地方。如果所有示例都属于分类任务中的同一类别,多数标签偏差就会起作用,模型会过度预测该标签。
至少存在三种不同的失效模式:
近因偏差(Recency bias)。 模型对出现在提示末尾的示例赋予过高权重。在分类任务中,有研究表明仅调换示例顺序就能使某些基准测试的准确率相差超过 10 个百分点——相同的示例,相同的任务,不同的顺序。
多数标签偏差(Majority label bias)。 当某个类别在示例中出现更频繁时,模型会系统性地过度预测该类别。在二元分类中,如果你的示例恰好以 3:1 的比例偏向某一类,这个问题很容易被忽视。
分布锚定偏差(Distribution anchor bias)。 当示例共享某个偶然特征——格式风格、领域词汇、句子长度——模型就会假定该特征是规范性的,并将其应用于所有输入,即便是那些并不适合的输入。
更深层的问 题在于:示例变成了一种约束,而不仅仅是提示。随着示例数量增加,模型越来越倾向于模式匹配这些示例,而不是从底层任务描述中进行泛化。这就是少样本崩溃的机制所在。
零样本何时是正确的默认选择
零样本提示在生产环境中被低估了。当团队假设"越多越好"时,它的具体优势往往被忽视。
更低的 token 开销。 每个示例根据长度会增加 50-200 个 token。在高请求量下,这种成本会不断累积。如果你每天处理 1000 万个请求,而你的示例每个增加 200 个 token,你就在为可能毫无帮助的东西燃烧算力。
更好的跨模型稳定性。 零样本性能对模型版本变更的敏感度较低。当你从一个模型切换到另一个——或者当模型提供商悄悄更新权重时——零样本提示发生回退的可能性更小。适用于某个模型的少样本提示,可能因为新模型对示例分布有不同的敏感性而意外失效。
更简单的维护。 当你的任务领域发生变化时,零样本提示只需更新指令。少样本提示则需要同时更新指令和示例集。示例集往往滞后,这意味着你的提示在用指令要求模型处理新分布的同时,还在隐式地教模型旧分布。
零样本是预训练数据中常见任务的正确起点:通用情感分析、结构良好文档上的问答、标准类别的简单分类、常见文档类型的摘要生成。这些任务不需要示例,因为模型在训练期间已经见过数千个类似示例。额外添加示例只会将输出分布约束到你 的特定示例,而非更广泛的已学分布。
静态少样本何时有意义
静态少样本——选取 2-5 个示例并在所有请求中保持固定——在特定条件窗口内效果良好。
任务应该是真正不寻常的。如果你处理的是特定领域的事务(按类型分类监管文件、使用自定义分类法标注医疗记录、从非常规文档格式中提取结构化字段),示例会有所帮助,因为模型在预训练期间没有见过太多类似任务。示例帮助它校准到你特定的模式(schema)。
示例应当是高质量的,且能代表你实际的输入分布。你用 20 分钟写出的合成示例,几乎总是比从生产数据中抽取的真实示例要差。这种差距大到足以影响结果。
任务复杂度应该适中。简单任务从示例中获益甚少。非常复杂的任务会让静态的 3 个示例集不堪重负——这些示例无法覆盖足够的变化量。
最关键的是:你应该已经实测验证了示例确实有帮助。正确的做法是:在具有代表性的验证集上建立零样本基准,然后依次测试 1、2、3、4 个示例,观察性能在哪里达到峰值,在哪里开始趋于平缓或下降。大多数团队跳过了这一步,直接凭直觉决定"我们放入 4 个示例"。
动态示例检索:生产级方法
当静态少样本不够用时,下一步是动态示例选择:对于每个传入请求,从示例池中检索最相关的示例,而不是使用相同的固定集。
核心思路是:不同的输入受益于不同的示例。关于合同法的用户查询应该调用法律领域的示例;关于医疗编码的查询应该调用临床领域的示例。对两者使用相同的三个通用示例是次优的。基于语义相似度的检索——将传入查询和示例池都进行嵌入,然后选择最近邻——持续优于固定示例集。
在生物医学 NER 基准测试中,基于 TF-IDF 的动态选择相比静态少样本在 5-shot 设置下将 F1 分数提升了 7.3%。SBERT(sentence-BERT)嵌入对于具有复杂语义结构的任务表现更好。基于图的检索方法将示例池索引为结构化图,并按查询检索相关子图,适用于示例之间存在关系需要保留的场景。
架构直截了当:
- 精心整理一个高质量标注示例池(50-500 个,取决于你需要的领域覆盖度)。
- 用固定的嵌入模型对每个示例进行嵌入。
- 在推理时,对传入请求进行嵌入,按余弦相似度检索前 k 个示例,并将其插入提示中。
- 追踪哪些示例集与高质量输出相关,以便随时间改进示例池。
重要提示:动态检索将质量上限从"你的 3 个固定示例有多好"转移到"你的示例检索有多好"。如果你的示例池稀疏,或者你的嵌入无法捕捉相关的语义区别,动态检索的表现会不如静态。你增加了基础设施复杂性,却换来了性能倒退。在将性能提升归因于选择机制之前,单独验证检索质量。
校准以消除偏差
即使示 例选择得当,少样本提示也会引入影响可靠性的校准问题。上下文校准(Contextual calibration)是一种实用的缓解方法。
方法如下:用空输入("N/A"或空查询)运行你的提示,观察输出分布,并测量模型的基准偏差。如果它在空输入上 70% 的时间预测类别 A,那么它对 A 有强烈的先验偏好,这会扭曲它在真实输入上的输出。你可以用这个偏差估计来在推理时调整预测分数。
批量校准进一步扩展了这个思路:收集一批具有代表性的输入,计算批次中的聚合偏差,并应用校正。这种方法几乎不需要额外的推理算力——你每批次计算一次校正,然后对 logits 或预测分数应用简单的线性变换。
这些校准技术不能消除糟糕示例选择的问题,但它们使模型对静态示例引入的偏差更具鲁棒性。
实践中的决策框架
这个决策不是一次性的架构选择,而是一个测量协议。
从零样本开始。 首先构建你的评估集——一批真实输入的代表性样本,带有真实标签或质量评估。测量零样本性能并锁定基准。这是不可妥协的。跳过这一步的团队最终只能靠感觉判断少样本是否"有效",而不是它是否真正有效。
逐步测试静态少样本。 添加 1 个示例,测量。添加 2 个,测量。添加 3 个,测量。观察曲线走势。大多数任务的甜蜜点在 1 到 4 个示例之间。如果在 4 个示例时仍然看到收益,你可能已经进入了值得探索动态检索的领域。
在分布外输入上进行测试。 你的示例来自输入空间的 某个切片。确保你的少样本变体在该切片之外的输入上不会退化。位置偏差和多数标签偏差往往在分布外输入上表现得最为明显。
如果需要动态检索,独立测量检索质量。 基于相似度的示例集是否真的包含语义相关的示例?它们的格式是否一致?它们是否代表实际的任务模式(schema)?不分解检索质量与生成质量就进行端到端调试,既缓慢又令人困惑。
在生产中持续监控。 随着用户群和任务分布的演变,静态示例集会逐渐过时。如果你的用户开始提出你的示例未覆盖的问题,少样本性能会悄然下降——模型会退回到对偶然相似示例的模式匹配,而不是语义上正确的示例。随时间追踪输出质量,与用户参与度指标分开追踪,是在用户投诉之前发现这一问题的唯一方法。
结论
零样本还是少样本,这是一个实证问题,不是规则。生产安全的方法是:先用零样本,只有在实测证明有帮助之后才使用静态少样本,当任务多样性超出静态示例能覆盖的范围时再使用动态检索。
要避免的失效模式是"积累式提示工程"——数周内不断增加示例,因为每次添加在非正式测试中看起来都有帮助,最终得到一个在你自己写的示例上表现良好、但在真实分布的长尾上表现糟糕的脆弱提示。从一开始就要测量,保持一个代表真实用户的验证集,在检查峰值性能和分布外情况之前不要上线。
少样本提示是一种工具,不是默认选项。在它有帮助的时候使用它。并且要实测它是否真的有帮助。
- https://shuntaro-okuma.medium.com/when-more-examples-make-your-llm-worse-discovering-few-shot-collapse-d3c97ff9eb01
- https://arxiv.org/html/2509.13196v1
- https://arxiv.org/html/2510.16809v1
- https://arxiv.org/pdf/2102.09690
- https://arxiv.org/html/2309.17249v3
- https://arxiv.org/abs/2508.06504
- https://arxiv.org/html/2501.02844v2
- https://arxiv.org/html/2404.11018v2
- https://aclanthology.org/2024.findings-naacl.115/
- https://www.promptingguide.ai/techniques/fewshot
- https://blog.langchain.com/few-shot-prompting-to-improve-tool-calling-performance/
- https://cleanlab.ai/blog/learn/reliable-fewshot-prompts/
