FewShotPromptTemplate 少样本提示模版

什么是FewShot

Few-Shot(少样本)、One-Shot(单样本)和与 Zero-Shot(零样本)的概念都起源于机器学习。
在提示工程(Prompt Engineering)中,Few-Shot 和 Zero-Shot 学习的概念也被广泛应用。在 Few-Shot 学习中,模型会被给予几个示例,以帮助模型理解任务,并生成正确的响应,而 One-Shot 可以看作是一种最常见的 Few-Shot 。在 Zero-Shot 学习中,模型只根据任务的描述生成响应,不需要任何示例。
如下请看一个例子,认识一下One-Shot(单样本)和与 Zero-Shot(零样本)
在公园里有一个妈妈在教她的女儿拼图。小女孩一直找不到正确的位置,几次尝试后就显得有些沮丧。
妈妈说:“亲爱的,你需要耐心!”
女儿问:“妈妈,什么是耐心?”
妈妈指向旁边一个正在耐心给花园浇水的园丁说:“你看那位叔叔,他慢慢地给每一株植物浇水,从不急躁,这就是耐心,你也得慢慢来,一块一块地找到拼图的正确位置。”
这位妈妈通过实际的例子给女儿展示了什么是耐心,这是一种 One-Shot 学习。
如果她的女儿第一次听到“耐心”就明白什么含义,这就叫 Zero-Shot,表明这孩子的天赋不是一般的高,从知识积累和当前语境中就能够知道新词的含义。有时候我们把 Zero-Shot 翻译为“顿悟”,聪明的大模型,某些情况下也是能够做到的。

少样本示例的几篇论文

对于 Few-Shot Learning,一个重要的参考文献是 2016 年 Vinyals, O. 的论文《小样本学习的匹配网络》。这篇论文提出了一种新的学习模型——匹配网络(Matching Networks),专门针对单样本学习(One-Shot Learning)问题设计,而 One-Shot Learning 可以看作是一种最常见的 Few-Shot 学习的情况。
对于 Zero-Shot Learning,一个代表性的参考文献是 Palatucci, M. 在 2009 年提出的《基于语义输出编码的零样本学习(Zero-Shot Learning with semantic output codes)》,这篇论文提出了零次学习(Zero-Shot Learning)的概念,其中的学习系统可以根据类的语义描述来识别之前未见过的类。
OpenAI 在介绍 GPT-3 模型的重要论文《Language models are Few-Shot learners(语言模型是少样本学习者)》中,更是直接指出:GPT-3 模型,作为一个大型的自我监督学习模型,通过提升模型规模,实现了出色的 Few-Shot 学习性能。

Prompt 提示中的 Few-Shot 的作用和应用场景

Few-Shot 在 prompt 中的作用是通过少量样本引导模型对特定任务进行学习和执行,例如通过提供少量风格或主题示例,引导模型产出具有相似风格或主题的创作,这样可以让大模型更加理解问题,提高大模型的输出质量。
而 Zero-Shot 学习设置中,模型只根据任务的描述生成响应,不需要任何示例。

FewShotPromptTemplate 少样本提示类

FewShotPromptTemplate的继承至PromptTemplate,因此它的使用方式和PromptTemplate完全一样,只是在 FewShotPromptTemplate 上多了一些参数,例如 examples (示例)和 example_selector (示例选择器),这些参数可以在实例化模版对象的时增加示例,或者在运行时动态选择示例。

  1. # 引入累类
  2. from langchain import PromptTemplate
  3. from langchain.prompts import FewShotPromptTemplate
  4. # 定义示例
  5. examples = [
  6. {"title": "今日份的小确幸", "content": "早上的一杯咖啡,让忙碌的生活暂时按下暂停键。在这个小小的瞬间,找到了自己的小确幸。"},
  7. {"title": "一个人的西藏", "content": "独自一人踏上西藏之旅,每一步都是风景,每一刻都是故事。这里的蓝天白云,让我忘记了世界的喧嚣。"},
  8. {"title": "夏日防晒必备良品", "content": "分享我这个夏天最爱的防晒霜,轻薄不油腻,让我在炎炎夏日也能享受阳光而不畏惧。"}
  9. ]
  10. # 创建示例模版
  11. example_prompt = PromptTemplate(
  12. input_variables=["title", "content"], template="标题: {title}\n内容:{content}"
  13. )
  14. # print(example_prompt.format(**examples[0]))
  15. # 创建 FewShotPromptTemplate
  16. fewShotprompt = FewShotPromptTemplate(
  17. examples=examples,
  18. example_prompt=example_prompt,
  19. example_separator="\n\n",
  20. prefix="想要创作出具有小红书风格的内容,请参考以下示例:",
  21. suffix="根据上述示例,尝试创作一个{user_input}。",
  22. input_variables=["user_input"]
  23. )
  24. # 生成提示
  25. print(fewShotprompt.format(user_input="新的故事"))
  26. '''
  27. 代码执行后输出内容如下:
  28. 想要创作出具有小红书风格的内容,请参考以下示例:
  29. 标题: 今日份的小确幸
  30. 内容:早上的一杯咖啡,让忙碌的生活暂时按下暂停键。在这个小小的瞬间,找到了自己的小确幸。
  31. 标题: 一个人的西藏
  32. 内容:独自一人踏上西藏之旅,每一步都是风景,每一刻都是故事。这里的蓝天白云,让我忘记了世界的喧嚣。
  33. 标题: 夏日防晒必备良品
  34. 内容:分享我这个夏天最爱的防晒霜,轻薄不油腻,让我在炎炎夏日也能享受阳光而不畏惧。
  35. 根据上述示例,尝试创作一个新的故事。
  36. '''

上述例子是一个少样本的代码示例,LangChain 将示例单独用列表格式进行管理,然后用 PromptTemplate 生成示例提示,在代码示例中,FewShotPromptTemplate比PromptTemplate多出来的参数介绍如下:

参数名 参数说明
examples (Optional[List[dict]] = None) 要格式化的提示示例,是一个列表,具体看可以代码例子中的 examples ,它与example_selector 必须有一个存在。
example_selector (Any = None) 与examples参数起的作用一样,主要真多示例多的情况下,根据不同的规则调用合适的示例。
example_separator (str = ‘\n\n’) examples参数提供的示例列表,在被格式化后,两个提示示例之间分隔符,默认是两个换行符。
example_prompt (PromptTemplate [必需]) 一个PromptTemplate对象,用于格式化examples或example_selector中的变量,并输出提示示例。
prefix (str = ‘’) 在示例之前放置的提示模板字符串,这个前缀出现在所有格式化示例之前。
suffix (str [必需]) 在示例之后放置的提示模板字符串,这个后缀跟随所有格式化的示例。