少样本提示Few-shot

USER:
计算以下结果:

0提示:
Add 2+2:

单次提示:
Add 3+3: 6
Add 2+2:

少量提示:
Add 3+3: 6
Add 5+5: 10
Add 2+2:

少样本提示超越了零样本提示,通过在提示中添加模型期望的“示例”;如上所述。除了任务描述,我们还提供了几个正确的输入-输出对的例子。通过将这个上下文添加到提示中,我们可以为语言模型提供更具体的关于期望输出的细节。这种技术在GPT-3中流行起来,语言模型首次被证明在上下文学习中具有很高的能力。简单地说,模型可以从这些示例中学习,并随着提供的示例越来越多,准确性也会提高。

角色提示和指令提示

精心制定指令是一种高效且节省代币的提示技术。然而,并非所有的语言模型都是好的指令执行者。例如,预训练(基础)的LLMs并不自然地具有遵循详细指令的能力。许多现代的LLM(例如,GPT-4)非常可控(即,擅长遵循详细的指令),使得指令提示成为与这些模型合作的最有效的技术之一,如下文所示。

SYSTEM:
你是一个设计用来回答用户问题的聊天机器人。首先,向用户提供信息。如果你没有所需的信息,通过输出字符串[搜索请求]后跟所需信息的简洁描述来搜索这些信息。

USER:
谁是2023年NBA最好的球队?

GPT:
[搜索请求] 2023年NBA最好的球队

提示的结构

存在各种各样的提示技术,但是这些技术都使用了(相对)常见的结构。

  • 格式:用于组织和构造提示的不同组件的文本标签。推荐Markdown格式
  • 上下文:可能对LLM有用的任何额外上下文(例如,从向量数据库检索的信息块)。
  • 示例:输入-输出示例,演示了正确解决所需问题的方法。
  • 指令:LLM预期行为的详细文本描述。
  • 输入数据:由LLM处理的输入数据。 值得注意的是,编写提示时并非所有这些组件都是必需的。本概述中探讨的几种技术只会使用上述组件的一部分,但是在必要时,每一种都可以用来为LLM提供额外的有用信息。

    USER:
    ## 指令
    给定一个用户提供的存储图像元数据的XML文档,以下条目将会出现:
    - source:描述文档来源的字符
    - url:存储图像网址的字符串
    - height:描述图像高度的整数
    - width:描述图像宽度的整数
    从文档中提取这些条目,并将它们作为保留原始键值对的python字典输出。
    如果上述任何字段不存在,就在python字典中留空。
    
    ## 示例
    {{重新格式化的例子}}
    
    ## 上下文
    {{检索到的额外上下文}}
    
    ## 输入数据
    <root>
    <source>upload</source>
    <url>www.myimgurl.com</url>
    <height>100</height>
    <width>200</width>
    </root>
    
    ## 输出数据
    
    GPT:
    {'source': 'upload', 'url': 'www.myimgurl.com', 'height': 100, 'width': 200}
    

思维链Chain-of-Thought

CoT的主要思想是,通过向LLM展示一些少量的示例,这些示例中解释了推理过程,LLM在回答提示时也会展示推理过程。这种推理解释通常会导致更准确的结果。在实践中,发现CoT提示大大提高了LLM在各种推理任务风格上的表现 CoT提示的各种变体: 鉴于CoT提示的实用性(即,它可以用来解决LLMs通常难以应对的复杂、多步骤的问题!),在提出这种技术后不久,就开发出了几种变体,如零样本CoT和最少到最多提示;请看下文。

USER:
哪种是回家的更快方式?
选项1:乘坐10分钟的公交车,然后乘坐40分钟的公交车,最后乘坐10分钟的火车。
选项2:乘坐90分钟的火车,然后骑45分钟的自行车,最后乘坐10分钟的公交车。
选项1将花费10+40+10 = 60分钟。
选项2将花费90+45+10=145分钟。
由于选项1需要60分钟,而选项2需要145分钟,所以选项1更快。

哪种是去工作的更快方式?
选项1:乘坐1000分钟的公交车,然后乘坐半小时的火车,最后骑10分钟的自行车。
选项2:乘坐800分钟的公交车,然后乘坐一个小时的火车,最后骑30分钟的自行车。

GPT:
选项1将花费1000+30+10 = 1040分钟。
选项2将花费800+60+30 = 890分钟。
由于选项2需要890分钟,而选项1需要1040分钟,所以选项2更快。
USER:
Q: think, machine
A: "think"的最后一个字母是"k"。"machine"的最后一个字母是"e"。所以"think, machine"是"ke"。

Q: learning, reasoning, generalization
A: "learning"的最后一个字母是"g"。"reasoning"的最后一个字母是"n"。"generalization"的最后一个字母是"n"。所以"learning, reasoning, generalization"是"ggn"。

Q: artificial, intelligence
A: "artificial"的最后一个字母是"l"。"intelligence"的最后一个字母是"e"。所以"artificial, intelligence"是"le"。

Q: transformer, language, vision
A: "transformer"的最后一个字母是"r"。"language"的最后一个字母是"e"。"vision"的最后一个字母是"n"。所以"transformer, language, vision"是"ren"。

Q: foo,bar,baz,blip
A:

GPT:
"foo"的最后一个字母是"o"。"bar"的最后一个字母是"r"。"baz"的最后一个字母是"z"。"blip"的最后一个字母是"p"。所以"foo,bar,baz,blip"是"orzp"。

重要的是,根据魏等人的研究,“CoT只在与约100B参数的模型一起使用时才能提高性能”。较小的模型写出了不合逻辑的思维链,这导致了比标准提示更差的准确性。模型通常会以与模型大小成比例的方式从CoT提示中获得性能提升。

零样本思维链Zero-shot-CoT

零样本思维链(Zero-shot-CoT)提示法是CoT提示法的后续,它引入了一种极其简单的零样本提示法。他们发现,在一个问题的末尾添加类似于以下的内容来实现:

  • 让我们一步一步地思考
  • Let’s think step by step.
  • 请仔细深思并理智地解释你的答案。
  • Think carefully and logically, explaining your answer. LLMs 就能生成一个回答问题的思维链。从这个思维链中,他们能够提取出更准确的答案。

    USER:
    如果约翰有5个梨,然后吃了2个,又买了5个,然后给他的朋友3个,那么他还有多少个梨?
    
    让我们一步一步地思考。
    
    GPT:
    约翰开始有5个梨。
    他吃了2个,所以剩下5-2=3个梨。
    然后他又买了5个梨,所以总共有3+5=8个梨。
    最后他给了他的朋友3个梨,所以他还剩下8-3=5个梨。
    

Zero-shot-CoT在改善算术、常识和符号推理任务的结果方面也很有效。然而,不出所料,它通常不如CoT提示有效。Zero-shot-CoT的一个重要用例是在获取少量CoT提示的例子困难的情况下。

自我一致性

这种方法利用了一种与 CoT 提示类似的方法。使用相同的(CoT)提示对一个模型进行多次提示,以产生不同的输出。然后,如下图所示,通过对模型的输出结果进行多数表决,得出最终答案。我们发现,这种方法与 CoT 提示法有类似的优点,而且在处理难度较大的问题时,还能提高性能和可靠性。 事实证明,自我一致性可以提高算术、常识和符号推理任务的成绩。即使在常规CoT无效的情况下,自我一致性仍能提高成绩。

生成知识

生成知识方法背后的理念是,在生成最终回复之前,要求 LLM 生成有关给定问题/提示的潜在有用信息。

例如,你想写一篇关于某种动物(如灵熊)的小博文。在要求 LLM 撰写博文之前,您可以要求它生成一些关于灵熊的事实。这将有助于 LLM 撰写内容更丰富的博文。有两种简单的方法。

单一提示方法
第一种方法要求 LLM 生成知识,然后撰写博文,只需一个提示。

双重提示方法
在这种方法中,我们首先提示 LLM 生成有关熊的事实, 然后,我们将这些信息输入到另一个提示中,让他生成

我推荐第二种方法,因为它能更可靠地制作较长的内容。

最少到最多提示Least-to-Most

最少到最多提示 (LtM) 使 CoT 提示更进一步,首先将问题分解为子问题,然后解决每个问题。这是一种受现实世界儿童教育策略启发的技术。 与 CoT 提示一样,要解决的问题被分解为一组相互构建的子问题。第二步,将这些子问题一一解决。与思维链相反,先前子问题的解决方案被输入到尝试解决下一个问题的提示中。

USER:
Q: think, machine
A: "think"的最后一个字母是"k", "machine"的最后一个字母是"e", 将"k"和"e"连接起来得到"ke"。所以"think, machine"输出"ke"。

Q: think, machine, learning
A: "think"的最后一个字母是"k", "machine"的最后一个字母是"e", 将"k"和"e"连接起来得到"ke"。"learning"的最后一个字母是"g"。将"ke"和"g"连接起来得到"keg"。所以"think, machine, learning"是"keg"。

Q: transformer, language
A: "transformer"的最后一个字母是"r", "language"的最后一个字母是"e", 将"r"和"e"连接起来得到"re"。所以"transformer, language"是"re"。

Q: transformer, language, vision
A: "transformer"的最后一个字母是"r", "language"的最后一个字母是"e", 将"r"和"e"连接起来得到"re"。"vision"的最后一个字母是"n", 将"re"和"n"连接起来得到"ren"。所以"transformer, language, vision"是"ren"。

Q: Q: transformer, language, vision, come, baby
A: "transformer"的最后一个字母是"r", "language"的最后一个字母是"e", 将"r"和"e"连接起来得到"re"。"vision"的最后一个字母是"n", 将"re"和"n"连接起来得到"ren"。"come"的最后一个字母是"o", 将"ren"和"o"连接起来得到"reno"。"baby"的最后一个字母是"y", 将"reno"和"y"连接起来得到"renoy"。所以"transformer, language, vision, come, baby"是"renoy"。

Q:foo,bar,baz,blip,learn,prompting,world,shaking,event,dancefloor,prisma,giraffe
A:

ChatGPT:
"foo"的最后一个字母是"o", "bar"的最后一个字母是"r", 将"o"和"r"连接起来得到"or"。"baz"的最后一个字母是"z", 将"or"和"z"连接起来得到"orz"。"blip"的最后一个字母是"p", 将"orz"和"p"连接起来得到"orzp"。"learn"的最后一个字母是"n", 将"orzp"和"n"连接起来得到"orzpn"。"prompting"的最后一个字母是"g", 将"orzpn"和"g"连接起来得到"orzpng"。"world"的最后一个字母是"d", 将"orzpng"和"d"连接起来得到"orzpngd"。"shaking"的最后一个字母是"g", 将"orzpngd"和"g"连接起来得到"orzpngdg"。"event"的最后一个字母是"t", 将"orzpngdg"和"t"连接起来得到"orzpngdgt"。"dancefloor"的最后一个字母是"r", 将"orzpngdgt"和"r"连接起来得到"orzpngdgtr"。"prisma"的最后一个字母是"a", 将"orzpngdgtr"和"a"连接起来得到"orzpngdgtra"。"giraffe"的最后一个字母是"e", 将"orzpngdgtra"和"e"连接起来得到"orzpngdgtrae"。所以"foo,bar,baz,blip,learn,prompting,world,shaking,event,dancefloor,prisma,giraffe"是"orzpngdgtrae"。

LtM带来了多项改进:

  • 相比于Chain of Thought,精度有所提高
  • 在比提示中的问题更难的问题上,泛化能力增强
  • 在组合泛化性能上有显著提升,特别是在SCAN基准测试3中 使用text-davinci-002(论文中使用的模型)进行标准提示,只有6%的成功SCAN问题得到解决,而使用最少到最多提示,成功率达到了令人印象深刻的76%。在使用code-davinci-002时,最少到最多提示的成功率更是达到了99.7%。这些结果更具有显著意义。

思维树Tree of Thought

解决复杂任务可能需要大量的规划,战略性的前瞻,回溯,甚至并行探索许多可行的解决方案。像CoT提示这样的技术采用从左到右的连续生成方法,使用下一个Token预测来一次性输出解决方案。尽管在某些情况下这种方法非常有效,但它无法解决需要战略规划和探索的任务。但是,这就是思维树提示的用武之地!与CoT提示类似,思维树提示将问题分解成更小的部分(即,一系列的思维),但进一步结合了并行探索多个解决方案路径的能力,形成一棵树而不是单一的链条!

思想树问题解决框架

ToT提示的实现方式会根据我们试图解决的问题有所不同,但任何ToT提示的实例都必须具体定义四个标准的问题解决组件,如下所述。

24点游戏 创意写作 5x5字谜游戏
输入 4个数字: (4 9 10 13) 4个随机句子 10个提示: (h1.presented;…)
输出 一个等于24的等式: (13 - 9)x(10 - 4)= 24 以4个句子结束的4段文章 5x5 字母: SHOWN;WIRRA;AVAIL;…
思路 3个中间等式: (13 - 9 = 4(剩下4, 4, 10); 10 - 4 = 6(剩下4, 6); 4 x 6 = 24) 一个简短的写作计划: 1. 介绍一本有联系的书 填写线索的词语: (h1.shown;v5.naled;…)
TOT步骤 3 1 5-10(可变)

输入、输出、思考示例以 : 之后内容表示。

思维分解

与CoT提示不同,ToT明确地将问题分解为中间步骤或思维,这些思维组合在一起形成对基础问题的解决方案。根据问题的不同,这种分解可以采取各种不同的形式,例如输出几个词或一个等式的单行。如上所示,对于其中考虑的三个独立任务,思维的定义各不相同。

思维生成

一旦我们确定了什么构成一个思维,我们需要确定在ToT提示期间应如何生成思维。作者提出了两种基本的思维生成技术:

  • 采样:使用相同的提示独立生成几个思维
  • 提议:使用“提议提示”顺序生成几个思维

当思维空间丰富时,采样方法效果最好,因为几个独立生成的思维不太可能是重复的。如果思维空间更受限制,那么可以使用提议技术生成几个思维,同时避免重复。

状态评估

一旦我们定义了我们的思考方式并选择了它们将如何产生,我们需要定义一个启发式方法来评估某些思考链的质量。否则,我们无法知道我们是否正在朝着最终解决方案的方向进步。给定已经产生的几个思考,作者使用LLM来推理每个思考的质量。特别是,他们遵循两种不同的策略:

  • 价值:独立地为每个状态分配一个标量值(即,从1-10的评分)或分类(即,确定,可能,或不可能达到解决方案)。
  • 投票:比较不同的解决方案并选择最有前途的那一个。 尽管这两种方法都可以工作得很好,但是当一个问题的成功解决方案很难直接评价时(例如,创意写作任务),投票是最好的。在这两种情况下,可以多次提示LLM,类似于自我一致性,以获得对每个状态更可靠的评估。

搜索算法

ToT提示的最后一个组成部分是用于探索解决方案空间的搜索算法。尽管可以使用许多潜在的搜索算法,作者主要关注两种基本算法——广度优先搜索和深度优先搜索。