少样本提示(Few-shot):示例怎么选、放几个、如何避免副作用
有些要求很难用文字描述清楚:一种特定的写作风格、一种复杂的分类规则、一种自定义的输出格式。这时,与其写一大段说明,不如直接给模型看几个例子。 这种在提示词中提供少量输入输出示例的方法,被称为少样本提示(Few-shot Prompting)。它简单有效,但如果使用不当,也会带来意想不到的副作用。
为什么示例有效
大语言模型具有很强的“上下文学习”能力:它能从提示中给出的几个例子中归纳出规律,并应用到新的输入上,而无需重新训练。示例同时传达了多种信息:
- 任务是什么:输入和输出之间是什么关系;
- 输出格式:结构、长度、标点、字段;
- 风格与语气:正式还是口语,简洁还是详细;
- 判断标准:在边界情况下应该如何处理。
零样本、单样本与少样本
- 零样本:只有任务描述,没有示例。适合模型已经很熟悉的常见任务;
- 单样本:提供一个示例。能明确格式,但模型可能过度模仿这个示例的具体内容;
- 少样本:提供多个示例,通常为两到五个。能更好地传达规律,减少对单个示例的过度模仿。
对于当前能力较强的模型,很多常见任务在零样本下已经表现良好。少样本提示在以下情况中价值最大:自定义的格式和风格、特殊的分类规则、需要处理大量边界情况的任务。
示例选择的原则
1. 代表性
示例应该覆盖任务中最常见的情况,反映真实输入的特点。
2. 多样性
示例之间要有足够的差异,覆盖不同的类别、长度、难度。如果所有示例都很相似,模型可能只学会处理这一类情况。
3. 包含边界情况
如果任务中存在容易判断错误的情况,例如既像 A 类又像 B 类的输入,或者应该拒绝处理的输入,在示例中展示正确的处理方式。
4. 质量要高
示例的输出必须是你真正想要的结果。示例中的任何错误、不一致或瑕疵,都可能被模型学习和放大。
5. 类别平衡
在分类任务中,如果示例中某一类别过多,模型可能倾向于预测这个类别。尽量保持各类别示例数量均衡。
数量与顺序
数量
通常两到五个示例就能取得不错的效果。示例过多会占用大量上下文、增加成本,而且边际收益递减。示例的质量和多样性比数量更重要。
顺序
研究和实践都发现,示例的顺序可能影响模型输出,排在最后的示例往往影响更大。可以尝试打乱顺序测试结果是否稳定,避免把同一类别的示例全部放在一起。
常见副作用
过度模仿
模型可能照搬示例中的具体内容,比如在生成产品描述时,总是使用示例中出现过的某个形容词。解决方法:增加示例的多样性,并在说明中强调“参考格式和风格,不要照搬内容”。
格式固化
如果所有示例的输出长度都差不多,模型可能对所有输入都输出相近的长度,即使有些输入应该得到更长或更短的回答。
偏差引入
示例中隐含的偏差,例如对某些群体的刻板描述,会被模型学习。
进阶用法:动态示例检索
当任务类型多样时,固定的几个示例很难覆盖所有情况。动态示例检索的做法是:
- 准备一个包含大量高质量示例的示例库;
- 当新输入到来时,从示例库中检索与之最相似的几个示例;
- 把检索到的示例放入提示中。
这样每个输入都能得到最相关的示例指导,效果往往优于固定示例。检索方法与 RAG 类似,可参考文本向量入门。
少样本与微调的关系
如果需要大量示例才能让模型稳定地完成任务,或者示例占用的上下文导致成本过高,可以考虑把这些示例整理成训练数据进行微调,参见微调还是提示词。
小结
少样本提示通过示例向模型传达任务规律、格式和风格,是提示工程中最实用的技巧之一。选择有代表性、多样、高质量、类别平衡的示例,控制数量并注意顺序,警惕过度模仿等副作用。任务复杂时可以采用动态示例检索。结合结构化提示词写法,能显著提升输出的稳定性。