Menu

少样本提示(Few-Shot):示例与适用场景

少样本提示是在提示词中放入几个完整的示例,每个示例包含一个输入和你想要的答案,让模型照着这个模式来做。要教会模型一种它猜不到的格式、一组标签或一种团队风格,这是最快的办法。

下面的每条提示词都可以编辑:改好后,在 ChatGPT、Claude 或其他 AI 应用中打开。

少样本提示的意思是,在给模型真正的输入之前,先给它看几个完整的任务示例,每个示例都由一个输入和你想要的答案组成。模型读出其中的模式,然后照着做下去。有些东西很难用语言说清楚:两个类别之间的界线在哪里、输出的确切形式、你们团队的写作口吻。用示例来确定这些,是最快的办法。

少样本提示的原理

Brown 等人 2020 年的论文《Language Models are Few-Shot Learners》表明,GPT-3 只需要提示词中的几个示范,就能学会一项新任务,无需重新训练。这叫作上下文学习:模型本身没有任何改变,示例只影响这一个提示词的回复。下一次,示例必须重新放进去。

名称取决于示例的数量。零样本提示没有示例,单样本提示有一个,少样本提示有好几个,通常是两个到几个之间。

零样本与少样本对比

下面两个标签页用同样的指令要求做同一件事。唯一的区别是,第二个标签页在真正的工单之前加了四个带标签的示例。

把这条客服工单分类为 bug、billing、account 或 feature_request。 工单:我重置了密码,但新密码不能用,一直提示凭据无效。
Try it
Example replyReplies vary between models and runs.

类别:bug

用户重置了密码,但新密码在登录时被拒绝。这说明密码重置流程有问题,所以这很可能是认证系统中的一个 bug。

示例改变了两件事。第一是格式:零样本的回复加了一个加粗的标题和一段解释,而少样本的回复和示例保持一致,只给出一个词,脚本可以直接读取。第二是判断本身。把这条工单理解为“bug”是合理的,大多数人也会这么选。但这个团队把登录问题归到 account 下,第三个示例不用一句解释就说明了这一点。没有任何指令提到这条规则,是示例把它传达给了模型。

用几个示例

从两到五个开始。这对大多数格式和分类任务已经足够,还能让提示词保持简短。

  • 一个示例能展示格式,但模型往往会模仿得过于贴近。如果唯一的示例是一段 30 字的价格调整总结,下一份总结可能也会写成 30 字,而且莫名其妙地围绕钱打转。
  • 两三个不同的示例能让模型看出它们的共同点(模式)和不同点(细节)。
  • 做分类时,每个标签至少放一个示例,再加上那些在没有示例时出错的边界情况。
  • 超过几个之后,收益通常会变小,而每次请求都会变长,耗费 token 和时间。如果需要几十个示例才能做对,这个任务可能需要更清楚的指令,或者完全换一种方法。

挑选好的示例

模型会从示例的所有共同点中学习,而不只是你想教的那一点。

  • 覆盖困难的情况。 简单的示例教不了多少东西。最有用的示例恰好落在边界上,比如上面那条登录工单。
  • 让表面形式多样化。 混合长短不一的输入、不同的话题和不同的措辞。如果示例中所有的好评都很短,模型可能会把长度当作判断依据。
  • 平衡各个标签,并打乱顺序。 模型往往会偏向示例中出现最多的标签,以及最后出现的那个标签。
  • 检查每一个示例。 示例里的错误,就等于一条要求犯这个错误的指令。
  • 使用真实的输入。 从你的真实数据中取出的示例,比编造的示例更贴近模型将要处理的内容。

保持格式完全一致

每个示例都应该使用相同的标签、分隔符和大小写,真正的输入也应该和示例的输入长得一模一样。在工单提示词中,每个示例都是先写“工单:”再写“标签:”,提示词最后以一个空着的“标签:”行结尾,这样接下来只有一种自然的写法。

示例较长时,用 <example> 标签这类清晰的标记把每个示例包起来,让模型能分清一个示例在哪里结束、下一个从哪里开始;见分隔符和 XML 标签。在 API 中,你也可以把示例作为对话中较早的轮次传入:一条用户消息放示例输入,接着一条助手消息放答案,每个示例重复一次。

少样本提示很适合做成可复用的提示词模板:指令和示例保持不变,只替换输入。下面的提示词会把一条提交信息改写成团队的风格。在输入框里填上你自己的提交信息,再关掉“示例”部分,看看风格有多少是靠示例传达的。

符合团队风格的提交信息
Fill in
Parts
把这条提交信息改写成我们团队的风格。只回复改写后的提交信息。
改写前:报表页加了个导出 csv 的功能 改写后:feat(reports): add CSV export 改写前:因为安全警告升级了 lodash 改写后:chore(deps): update lodash to fix security advisory 改写前:修复了购物车为空时崩溃的问题!! 改写后:fix(cart): prevent crash when cart is empty 改写前:readme 里有错别字 改写后:docs(readme): fix typo
改写前:让搜索框不区分大小写 改写后:
Try it
Example replyReplies vary between models and runs.

feat(search): make search box case-insensitive

所有规则都没有写出来:小写的类型、括号里的范围、祈使语气、结尾不加句号。示例展示了全部四条,回复也照着做了。关掉示例后,模型仍然会改进这条提交信息,但它只能猜一种风格,没有任何东西能让它的猜测和你的风格一致。

少样本示例不仅能演示答案,也能演示推理过程。思维链提示最初就是通过展示步骤的解题示例提出的。对于回答前会先在内部推理的模型,示例只放输入、答案和格式即可:写死的推理步骤可能会让它们偏离更好的路线,一些提供商也建议对这类模型先试试零样本。

常见问题

少样本提示是什么?

少样本提示是指在真正的输入之前,先在提示词中放入几个任务示例,每个示例都由一个输入和对应的正确输出组成。模型会延续这些示例建立的模式。它最适合自定义的类别、不常见的格式,以及那些演示比描述更容易说清楚的团队风格。

少样本提示应该放几个示例?

对大多数任务来说,两到五个是不错的起点。做分类时,每个标签至少放一个示例,再加上模型在没有示例时判断错的边界情况。超过几个之后,每多加一个示例,帮助通常越来越小,每次请求却越来越长。

单样本提示是什么?

单样本提示只给模型一个示例。它足以展示格式,但模型往往会过于贴近地模仿这个唯一的示例,包括它的长度、措辞,甚至话题。再加一个不同的示例,模型就能分辨出哪些特征是模式,哪些只是巧合。

模型会从我的示例中学习吗?

只对当前这次请求有效。示例是通过出现在上下文中来影响回复的;模型的权重不会改变,下一次对话也不会记得任何东西。这叫作上下文学习,也正因如此,少样本提示每次使用时都必须带上它的示例。

糟糕的示例会让输出变差吗?

会。模型会模仿示例的所有共同点,包括错误,以及你并不想要的长度和语气。如果大多数示例都是同一个标签,模型也会倾向于选这个标签。检查你的示例是否正确、多样、均衡。

Coddy 编程语言插图

和 Coddy 一起学编程

开始