跳到主要内容

生产环境中的零样本与少样本:示例何时有用,何时有害

· 阅读需 11 分钟
Tian Pan
Software Engineer

关于少样本提示,最常见的建议是:加入示例,质量就会提升。这个建议经常是错的,错到你不能不加以实测就随意信任它。在实践中,示例数量与模型性能之间的关系是非单调的——在某个点达到峰值之后就会下降,有时候下降幅度相当大。

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)嵌入对于具有复杂语义结构的任务表现更好。基于图的检索方法将示例池索引为结构化图,并按查询检索相关子图,适用于示例之间存在关系需要保留的场景。

架构直截了当:

  1. 精心整理一个高质量标注示例池(50-500 个,取决于你需要的领域覆盖度)。
  2. 用固定的嵌入模型对每个示例进行嵌入。
  3. 在推理时,对传入请求进行嵌入,按余弦相似度检索前 k 个示例,并将其插入提示中。
  4. 追踪哪些示例集与高质量输出相关,以便随时间改进示例池。

重要提示:动态检索将质量上限从"你的 3 个固定示例有多好"转移到"你的示例检索有多好"。如果你的示例池稀疏,或者你的嵌入无法捕捉相关的语义区别,动态检索的表现会不如静态。你增加了基础设施复杂性,却换来了性能倒退。在将性能提升归因于选择机制之前,单独验证检索质量。

校准以消除偏差

即使示例选择得当,少样本提示也会引入影响可靠性的校准问题。上下文校准(Contextual calibration)是一种实用的缓解方法。

方法如下:用空输入("N/A"或空查询)运行你的提示,观察输出分布,并测量模型的基准偏差。如果它在空输入上 70% 的时间预测类别 A,那么它对 A 有强烈的先验偏好,这会扭曲它在真实输入上的输出。你可以用这个偏差估计来在推理时调整预测分数。

批量校准进一步扩展了这个思路:收集一批具有代表性的输入,计算批次中的聚合偏差,并应用校正。这种方法几乎不需要额外的推理算力——你每批次计算一次校正,然后对 logits 或预测分数应用简单的线性变换。

这些校准技术不能消除糟糕示例选择的问题,但它们使模型对静态示例引入的偏差更具鲁棒性。

实践中的决策框架

这个决策不是一次性的架构选择,而是一个测量协议。

从零样本开始。 首先构建你的评估集——一批真实输入的代表性样本,带有真实标签或质量评估。测量零样本性能并锁定基准。这是不可妥协的。跳过这一步的团队最终只能靠感觉判断少样本是否"有效",而不是它是否真正有效。

逐步测试静态少样本。 添加 1 个示例,测量。添加 2 个,测量。添加 3 个,测量。观察曲线走势。大多数任务的甜蜜点在 1 到 4 个示例之间。如果在 4 个示例时仍然看到收益,你可能已经进入了值得探索动态检索的领域。

在分布外输入上进行测试。 你的示例来自输入空间的某个切片。确保你的少样本变体在该切片之外的输入上不会退化。位置偏差和多数标签偏差往往在分布外输入上表现得最为明显。

如果需要动态检索,独立测量检索质量。 基于相似度的示例集是否真的包含语义相关的示例?它们的格式是否一致?它们是否代表实际的任务模式(schema)?不分解检索质量与生成质量就进行端到端调试,既缓慢又令人困惑。

在生产中持续监控。 随着用户群和任务分布的演变,静态示例集会逐渐过时。如果你的用户开始提出你的示例未覆盖的问题,少样本性能会悄然下降——模型会退回到对偶然相似示例的模式匹配,而不是语义上正确的示例。随时间追踪输出质量,与用户参与度指标分开追踪,是在用户投诉之前发现这一问题的唯一方法。

结论

零样本还是少样本,这是一个实证问题,不是规则。生产安全的方法是:先用零样本,只有在实测证明有帮助之后才使用静态少样本,当任务多样性超出静态示例能覆盖的范围时再使用动态检索。

要避免的失效模式是"积累式提示工程"——数周内不断增加示例,因为每次添加在非正式测试中看起来都有帮助,最终得到一个在你自己写的示例上表现良好、但在真实分布的长尾上表现糟糕的脆弱提示。从一开始就要测量,保持一个代表真实用户的验证集,在检查峰值性能和分布外情况之前不要上线。

少样本提示是一种工具,不是默认选项。在它有帮助的时候使用它。并且要实测它是否真的有帮助。

References:Let's stay in touch and Follow me for more thoughts and updates