3.1 Zero-shot 与 Few-shot
零样本与少样本提示的范式基础、指令跟随、示例选择与顺序敏感性,以及格式化的隐性影响
从 GPT-3 到指令跟随
现代提示范式起源于 GPT-3(Brown et al., NeurIPS 2020)的惊人发现:一个 175B 参数的语言模型,仅通过在上下文窗口中直接提供任务指令和可选的输入-输出示例,无需任何梯度更新,即可完成多种 NLP 任务。这一观察把**上下文学习(In-Context Learning, ICL)**确立为微调的可行替代方案,并直接催生了"提示工程"这一领域。
按照示例数量,ICL 分为三档:
| 范式 | 示例数 | 典型用途 |
|---|---|---|
| Zero-shot | 0 | 依赖模型的指令跟随能力,适合简单、通用任务 |
| One-shot | 1 | 给出一个示例以确立任务形式与输出格式 |
| Few-shot | 2–32 | 通过多个示例降低格式偏差、给出隐式"任务定义" |
紧随其后的是**指令微调(Instruction Tuning)**革命。Wei et al.(ICLR 2022)的 FLAN 表明:在 60+ 个 NLP 任务上对 137B 模型做指令微调,可以在 25 个评估任务中的 20 个上超过 GPT-3 的零样本表现。这条路径最终孵化出 InstructGPT、ChatGPT 及其后续所有对齐模型——今天我们用的 Qwen3-Instruct、Claude、GPT-4o 都是这条谱系的后裔。
实践启示:对 Instruct 模型(如 Qwen3-Instruct)用 Zero-shot + 清晰指令往往足够;对基座模型(如 Qwen3-1.7B-Base),则需要 Few-shot 引导出任务格式。
脆弱性一:示例顺序敏感
ICL 并非稳定的接口。Zhao et al.(ICML 2021)识别出三种系统性偏差:
仅仅改变 Few-shot 示例的排列,GPT-3 在 SST-2 上的准确率就能从 54% 波动到 93%。Lu et al.(ACL 2022)进一步证明:
- 示例排序效应在所有模型规模上都持续存在
- 最佳排序不可跨模型迁移——在 GPT-3 上最优的顺序,到了 LLaMA 上可能最差
一个简单可操作的缓解策略是基于熵选择排序:对候选排序分别生成预测,保留让模型预测分布最平衡(熵最高)的一种。
脆弱性二:格式比语义更重要
Min et al.(EMNLP 2022)的发现至今仍令人震惊——在分类任务中,把 Few-shot 示例的标签随机打乱几乎不影响性能。真正驱动 ICL 有效性的是三个表层因素:
- 标签空间规范(告诉模型"答案只能是 positive / negative")
- 输入文本分布(示例来自任务相同的输入域)
- 整体格式(示例的模板结构)
Sclar et al.(ICLR 2024)把这个现象量化到了极致:保持语义不变的格式变化(分隔符、空白、换行)在 LLaMA-2-13B 上可导致 高达 76 个准确率点 的性能差异。他们的建议是:
单一格式评估是不可靠的。Sclar 等人提出 FormatSpread:对每个 prompt 枚举多个等价格式,报告性能区间而非单点值。否则论文里的 SOTA 可能只是某个侥幸格式。
示例选择的三种思路
面对 Few-shot 的脆弱性,学界给出了三类示例选择策略:
思路:用 embedding 检索与当前 query 最相似的 个训练样本作为示例。
# 伪代码
def select_demos(query, train_pool, k=4):
q_emb = embed(query)
scored = [(cosine(q_emb, embed(x)), x) for x in train_pool]
return sorted(scored, reverse=True)[:k]适用场景:任务分布不均、有较大训练池。代表方法:LM-BFF(Gao et al., ACL 2021)。
思路:优先覆盖训练集的多种模式,避免示例互相冗余。
- 用 k-means 对训练集聚类,每个簇挑一个代表样本
- 或使用 Determinantal Point Process (DPP) 在相似度与多样性之间做权衡
适用场景:任务定义模糊、需要示例"撑起"任务边界。
思路:跑多个候选示例组合,保留让模型在验证集上预测熵最低(最有把握)的一组。
- 代价高(需要多次前向),但效果稳定
- 可与 Self-Consistency 结合做集成
适用场景:推理类任务、少量精标数据。
一张图看 ICL 的调用链
图中 Demo Selector 与 Format Normalizer 是 DSPy 等框架接管、实现自动化的两个关键节点——第 3.4 节我们会看到这条 pipeline 如何被参数化并编译优化。
本节小结
| 要点 | 结论 |
|---|---|
| Zero-shot 适用范围 | Instruct 模型 + 简单任务 |
| Few-shot 敏感因素 | 示例选择、排列顺序、格式化 |
| Min et al. 的"反常识" | 随机标签几乎不影响 ICL,格式 > 语义 |
| 工程建议 | 用 apply_chat_template,避免手搓字符串;用 FormatSpread 做多格式评估 |
| 下一步 | 面对复杂推理,Few-shot 不够——需要 Chain-of-Thought(3.2 节) |