人工智能实践(语言智能)
第3讲:提示词

3.1 Zero-shot 与 Few-shot

零样本与少样本提示的范式基础、指令跟随、示例选择与顺序敏感性,以及格式化的隐性影响

从 GPT-3 到指令跟随

现代提示范式起源于 GPT-3(Brown et al., NeurIPS 2020)的惊人发现:一个 175B 参数的语言模型,仅通过在上下文窗口中直接提供任务指令和可选的输入-输出示例,无需任何梯度更新,即可完成多种 NLP 任务。这一观察把**上下文学习(In-Context Learning, ICL)**确立为微调的可行替代方案,并直接催生了"提示工程"这一领域。

按照示例数量,ICL 分为三档:

范式示例数典型用途
Zero-shot0依赖模型的指令跟随能力,适合简单、通用任务
One-shot1给出一个示例以确立任务形式与输出格式
Few-shot2–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)识别出三种系统性偏差:

bias{majority label,recency,common token}\text{bias} \in \{\text{majority label}, \text{recency}, \text{common token}\}

仅仅改变 Few-shot 示例的排列,GPT-3 在 SST-2 上的准确率就能从 54% 波动到 93%。Lu et al.(ACL 2022)进一步证明:

  • 示例排序效应在所有模型规模上都持续存在
  • 最佳排序不可跨模型迁移——在 GPT-3 上最优的顺序,到了 LLaMA 上可能最差

一个简单可操作的缓解策略是基于熵选择排序:对候选排序分别生成预测,保留让模型预测分布最平衡(熵最高)的一种。

脆弱性二:格式比语义更重要

Min et al.(EMNLP 2022)的发现至今仍令人震惊——在分类任务中,把 Few-shot 示例的标签随机打乱几乎不影响性能。真正驱动 ICL 有效性的是三个表层因素:

  1. 标签空间规范(告诉模型"答案只能是 positive / negative")
  2. 输入文本分布(示例来自任务相同的输入域)
  3. 整体格式(示例的模板结构)

Sclar et al.(ICLR 2024)把这个现象量化到了极致:保持语义不变的格式变化(分隔符、空白、换行)在 LLaMA-2-13B 上可导致 高达 76 个准确率点 的性能差异。他们的建议是:

单一格式评估是不可靠的。Sclar 等人提出 FormatSpread:对每个 prompt 枚举多个等价格式,报告性能区间而非单点值。否则论文里的 SOTA 可能只是某个侥幸格式。

示例选择的三种思路

面对 Few-shot 的脆弱性,学界给出了三类示例选择策略:

思路:用 embedding 检索与当前 query 最相似的 kk 个训练样本作为示例。

# 伪代码
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 SelectorFormat 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 节)