少样本提示的意思是,在给模型真正的输入之前,先给它看几个完整的任务示例,每个示例都由一个输入和你想要的答案组成。模型读出其中的模式,然后照着做下去。有些东西很难用语言说清楚:两个类别之间的界线在哪里、输出的确切形式、你们团队的写作口吻。用示例来确定这些,是最快的办法。
少样本提示的原理
Brown 等人 2020 年的论文《Language Models are Few-Shot Learners》表明,GPT-3 只需要提示词中的几个示范,就能学会一项新任务,无需重新训练。这叫作上下文学习:模型本身没有任何改变,示例只影响这一个提示词的回复。下一次,示例必须重新放进去。
名称取决于示例的数量。零样本提示没有示例,单样本提示有一个,少样本提示有好几个,通常是两个到几个之间。
零样本与少样本对比
下面两个标签页用同样的指令要求做同一件事。唯一的区别是,第二个标签页在真正的工单之前加了四个带标签的示例。
类别:bug
用户重置了密码,但新密码在登录时被拒绝。这说明密码重置流程有问题,所以这很可能是认证系统中的一个 bug。
示例改变了两件事。第一是格式:零样本的回复加了一个加粗的标题和一段解释,而少样本的回复和示例保持一致,只给出一个词,脚本可以直接读取。第二是判断本身。把这条工单理解为“bug”是合理的,大多数人也会这么选。但这个团队把登录问题归到 account 下,第三个示例不用一句解释就说明了这一点。没有任何指令提到这条规则,是示例把它传达给了模型。
用几个示例
从两到五个开始。这对大多数格式和分类任务已经足够,还能让提示词保持简短。
- 一个示例能展示格式,但模型往往会模仿得过于贴近。如果唯一的示例是一段 30 字的价格调整总结,下一份总结可能也会写成 30 字,而且莫名其妙地围绕钱打转。
- 两三个不同的示例能让模型看出它们的共同点(模式)和不同点(细节)。
- 做分类时,每个标签至少放一个示例,再加上那些在没有示例时出错的边界情况。
- 超过几个之后,收益通常会变小,而每次请求都会变长,耗费 token 和时间。如果需要几十个示例才能做对,这个任务可能需要更清楚的指令,或者完全换一种方法。
挑选好的示例
模型会从示例的所有共同点中学习,而不只是你想教的那一点。
- 覆盖困难的情况。 简单的示例教不了多少东西。最有用的示例恰好落在边界上,比如上面那条登录工单。
- 让表面形式多样化。 混合长短不一的输入、不同的话题和不同的措辞。如果示例中所有的好评都很短,模型可能会把长度当作判断依据。
- 平衡各个标签,并打乱顺序。 模型往往会偏向示例中出现最多的标签,以及最后出现的那个标签。
- 检查每一个示例。 示例里的错误,就等于一条要求犯这个错误的指令。
- 使用真实的输入。 从你的真实数据中取出的示例,比编造的示例更贴近模型将要处理的内容。
保持格式完全一致
每个示例都应该使用相同的标签、分隔符和大小写,真正的输入也应该和示例的输入长得一模一样。在工单提示词中,每个示例都是先写“工单:”再写“标签:”,提示词最后以一个空着的“标签:”行结尾,这样接下来只有一种自然的写法。
示例较长时,用 <example> 标签这类清晰的标记把每个示例包起来,让模型能分清一个示例在哪里结束、下一个从哪里开始;见分隔符和 XML 标签。在 API 中,你也可以把示例作为对话中较早的轮次传入:一条用户消息放示例输入,接着一条助手消息放答案,每个示例重复一次。
少样本提示很适合做成可复用的提示词模板:指令和示例保持不变,只替换输入。下面的提示词会把一条提交信息改写成团队的风格。在输入框里填上你自己的提交信息,再关掉“示例”部分,看看风格有多少是靠示例传达的。
feat(search): make search box case-insensitive
所有规则都没有写出来:小写的类型、括号里的范围、祈使语气、结尾不加句号。示例展示了全部四条,回复也照着做了。关掉示例后,模型仍然会改进这条提交信息,但它只能猜一种风格,没有任何东西能让它的猜测和你的风格一致。
少样本示例不仅能演示答案,也能演示推理过程。思维链提示最初就是通过展示步骤的解题示例提出的。对于回答前会先在内部推理的模型,示例只放输入、答案和格式即可:写死的推理步骤可能会让它们偏离更好的路线,一些提供商也建议对这类模型先试试零样本。
常见问题
少样本提示是什么?
少样本提示是指在真正的输入之前,先在提示词中放入几个任务示例,每个示例都由一个输入和对应的正确输出组成。模型会延续这些示例建立的模式。它最适合自定义的类别、不常见的格式,以及那些演示比描述更容易说清楚的团队风格。
少样本提示应该放几个示例?
对大多数任务来说,两到五个是不错的起点。做分类时,每个标签至少放一个示例,再加上模型在没有示例时判断错的边界情况。超过几个之后,每多加一个示例,帮助通常越来越小,每次请求却越来越长。
单样本提示是什么?
单样本提示只给模型一个示例。它足以展示格式,但模型往往会过于贴近地模仿这个唯一的示例,包括它的长度、措辞,甚至话题。再加一个不同的示例,模型就能分辨出哪些特征是模式,哪些只是巧合。
模型会从我的示例中学习吗?
只对当前这次请求有效。示例是通过出现在上下文中来影响回复的;模型的权重不会改变,下一次对话也不会记得任何东西。这叫作上下文学习,也正因如此,少样本提示每次使用时都必须带上它的示例。
糟糕的示例会让输出变差吗?
会。模型会模仿示例的所有共同点,包括错误,以及你并不想要的长度和语气。如果大多数示例都是同一个标签,模型也会倾向于选这个标签。检查你的示例是否正确、多样、均衡。