查看原文
其他

「提示工程系列」转译(2):实用提示工程-成功提示 LLM 的提示和技巧

ai汤源 AI范儿 2023-08-21

题图|论文截图

正文|Cameron R. Wolfe@Deep(Learning)Focus
常见的几种提示案例


论述题记

由于LLM文本到文本的生成格式,大型语言模型 (LLM) 能够使用单个模型解决各种各样的任务(LLM的泛化能力)。这种能力最初得到证明是通过使用 GPT-2 和 GPT-3 [5、6] 等模型的零学习和少样本学习的可以习得。更进一步,当经过微调以符合人类偏好和指令时,LLM 变得更加引人注目,可以支持更多流行的生成应用程序,例如编码助手、信息搜索对话代理和基于聊天的搜索体验。
由于GPT使能的全新应用,使得LLM在研究社区和流行文化中迅速成名。在这次崛起中,我们还见证了一个新的互补领域的发展:提示工程(Prompt Engineering)。提示工程在更高层次上LLM交互, 通过
 i) 将文本(即提示)作为输入 ;

ii) 产生文本输出,

我们可以从中提取有用的东西(例如,分类、摘要、翻译等),这种方式很灵活性也很有用。然而,与此同时,我们必须确定如何正确构建输入提示,以便 LLM 最大可能生成我们想要的输出。

提示工程是一门经验科学,主要研究如何使用不同的提示策略来优化 LLM 输出性能(*译者注:如果把GPT预训练体作为一个文本知识的大金矿,那prompt工程就是研究如何更快更有效的挖出矿)。尽管存在多种方法,但我们将通过本概述来了解提示的一般机制,以及一些基本的(但非常有效!)提示技术,如零/少样本学习和指令提示。

在此过程中,我们将学习可以立即采用的实用技巧和要点,以成为更有效的提示工程师和 LLM 从业者。
理解LLM|由于本文侧重于提示,因此不会过多解释语言模型的历史或机制。为了更好地全面了解语言模型(这是深入理解提示的重要先决条件),我写了各种可用的概述。下面列出了这些概述(按重要性排序):
  • 语言建模基础知识(GPT 和 GPT-2) 
  • 语言模型规模的重要性 (GPT-3) 
  • 通用和垂直LLMs
  • PaLM, T5 (第一和第二部分), LLaMA (第一和第二部分)

一图了解什么是提示

“语言模型可以使用其通用的文本到文本格式解决各种任务-来自论文 [1]”

鉴于目前对 LLM 的炒作,我们可能会问自己:LLM 有什么本质上的优势使得它们如此强大?尽管这个问题没有单一的答案(例如,模型规模、大量预训练数据、人工反馈等),LLM 的一个主要优势是它们通用的文本到文本生成格式。这些模型是 next-token prediction 的专家,通过适当调整和利用此技能可以解决许多不同的任务!

要完成一个任务,我们需要做的就是 

i) 向包含相关信息的模型提供文本输入,

 ii) 从模型返回的文本中提取输出。

这种统一的方法可以用于翻译、摘要、问答、分类等。

然而,事情并不(相当)那么简单。也就是说,提供给 LLM 的提示(即输入文本)的措辞和结构会显著影响模型输出的准确性。换句话说,提示工程是一件大事。

什么是提示工程?

“Prompt engineering is a relatively new discipline for developing and optimizing prompts to efficiently use LMs for a wide variety of applications and research topics.” - from [2]

“提示工程是一门相对较新的学科,用于开发和优化提示以有效地将 LM 用于各种应用和研究主题。” - 摘自论文[2]

鉴于正确制作我们提示的内容对于通过 LLM 取得有用的结果很重要,提示工程在最近几个月引起了很多兴趣。然而,这是一门经验科学——发现最佳提示通常是基于启发式的,需要进行实验。我们可以通过随着时间的推移,跟踪和控制我们的提示并测试不同的想法,以查看哪些有效,来发现更好的提示方法。

指令式提示LLM”

提示的组成部分|关于如何创建提示有多种选择。但是,大多数提示由相同的几个(可选)组件组成:

  • 输入数据:这是 LLM 预期处理的实际数据(例如,被翻译或分类的句子、被总结的文档等)。

  • 示例:向 LLM 展示正确行为的最佳方法之一是在提示中提供一些输入输出对的具体示例。

  • 指令:与其在提示中显示正确行为的具体示例,不如通过指令文字描述要做什么;如上图。

  • 指示器:以固定且可预测的结构向 LLM 提供输入是有帮助的,因此我们可以使用指示器将提示的不同部分分开;见下图。

  • 上下文:除了上述组件之外,我们可能希望以某种方式为 LLM 提供额外的“上下文”或信息。

“指示器可用于以多种方式构建提示

一般提示|根据所使用的模型和我们试图解决的任务,提示工程的细节有很大差异。但是,有一些普遍接受的提示工程原则可以牢记 [1、3]。

  • 从简单开始:从简单的提示开始,然后在跟踪经验结果的同时慢慢修改提示。
  • 直接了当:如果我们希望 LLM 符合特定的风格或格式,我们应该明确而直接地说明这一点。准确说明您想要的内容可以传达信息。
  • 细节化:歧义是每个提示工程师的敌人。我们应该使提示详细而具体,但不要过火并提供太长的输入(即,提示的长度是有限制的!)。
  • 范例是强大的:如果描述我们想要的东西很困难,那么为几个不同的输入提供正确输出或行为的具体例子可能会很有用。

“语言模型的上下文窗口的可视化

上下文窗口|当我们考虑不同的提示技巧和方法时,我们需要记住,我们只能在提示中包含有限的信息。所有 LLM 都有一个预定义的上下文窗口,它对一次可以处理的token总数(即文本序列中的单词或子单词)设置了限制。上下文窗口大小因模型而异,但目前正在大力推动增加上下文窗口大小。例如,GPT-4 有一个 32K 令牌的上下文窗口,比 OpenAI 的任何先前模型大 4 倍。

常见提示技巧

“零样本和少样本学习的出现-来自论文[4\5\6]

尽管由于 ChatGPT 等模型应用的流行,LLM最近出现了爆炸式增长,但提示作为与LLM的交互方式已经存在有一段时间了。最初,像 GPT [4] 这样的模型被微调以解决下游任务。随着 GPT-2 [5] 的提出,我们看到研究人员开始使用零样本学习来使用单个基础模型解决多个下游任务。最后,GPT-3 向我们展示了语言模型随着规模的增长变得非常擅长小样本学习。在本节中,我们将逐步介绍这些想法,以更好地了解零样本学习和少样本学习的工作原理,并提供一些更复杂的提示技术的详细信息。

▩零样本学习(Zero-Shot Learning )

“零样本学习-来自论文[6]

零样本学习背后的想法非常简单。我们只是将正在解决的任务的描述和相关的输入数据提供给 LLM,然后让它生成结果;往上看。由于他们观察到的大量预训练数据,LLM 通常很有能力以这种方式完成任务。也就是说,他们可以利用他们的知识库来解决(相对)大量的任务;请参阅下面的示例(使用 GPT-3.5 生成)。


“用GPT-3.5进行零样本学习

零样本学习已被 GPT-2 等模型广泛探索,并在某些情况下表现良好。但是,如果零样本学习不能解决我们的任务,我们该怎么办?在许多情况下,我们可以通过提供更具体指令和具体的示例来极大地提高 LLM 的表现。特别是,我们可以开始向提示中添加所需输出的示例,从而允许模型从提示中看到的数据来复制模式进行输出。

▩少样本学习(Few-Shot Learning)

除了任务描述之外,我们还可以使用高质量的输入输出示例来增强我们的提示。这种技术构成了小样本学习的基础,它试图通过提供正确行为的明确示例来提高 LLM 的性能。如果使用得当并应用于正确的模型,小样本学习将非常有效,正如 GPT-3 [6] 等 LLM 的突破性能力所证明的那样;见下图。

“用GPT-3.5进行少样本学习-来自论文[3]

然而,学习如何正确利用 LLM 的少样本学习能力可能很复杂。我们应该在提示中包含哪些示例?是否有正确的方法来构建提示?对提示的更改是否会显著影响 LLM?

大多数 LLM 对提示的构建方式很敏感,这使得提示工程既困难又重要。尽管最近的模型(如 GPT-4)似乎对提示 [2] 中的小扰动不太敏感,但研究社区 [7] 为我们提供了一些正确使用小样本学习的技巧,这些技巧仍然有助于理解:

  • 样本排序很重要,少样本示例序列改动可以极大地改变 LLM 性能。包括更多的小样本示例并不能解决这个问题。
  • 小样本示例中标签的分布很重要,应该与实际数据分布相匹配。令人惊讶的是,标签的正确性并不那么重要。
  • LLM 倾向于重复最后的少数样本示例(即新近度偏差recency bias)。
  • 提示中包含的范例应该是多样的并且是随机排序的。

最佳数据采样|选择多样化、随机排序且与测试示例相关的示例是最好的。然而,除了这些基本直觉之外,还进行了大量研究来确定如何为提示选择最佳范例。例如,可以通过多样性选择 [8]、基于不确定性的选择 [9],甚至是基于与测试示例的相似性的选择 [10] 来选择很少显示的学习样本。

少样本学习与微调|在继续之前,我想解决一个值得注意的困惑点。少样本学习不是微调。Few-shot learning 在提示中向 LLM 提供示例,然后可以将其用作生成正确输出的相关上下文。这个过程被称为“情境学习in-context learning”;如上图。模型的参数不会被小样本学习修改。相反,微调会在选定的数据集上显式训练模型(即,通过反向传播更新其权重)。

▩指令提示

“使用指令调优语言模型作为编码助手-来自论文[15]

Few-shot learning 非常强大,但它有一个明显的缺点:范例会消耗大量tokens。鉴于 LLM 的上下文窗口是有限的,我们可能希望探索不消耗那么多token的提示方法。例如,我们能否以文字方式向 LLM 解释正确的行为?简短的回答是肯定的!这种技术仅包括书面说明作为提示的一部分,称为指令提示,它在特定类型的 LLM 中表现最佳。

指令微调和对齐|语言模型的最新发展主要集中在提高指令遵循能力上。预训练的 LLM 不擅长遵循开箱即用的指令。然而,教这些模型如何遵循指令可以让它们更好地完成用户想要的东西(即改善人类对齐)。LLM 之后的指令为各种有用的应用程序提供支持,从信息搜索对话代理(例如,ChatGPT)到编码助手(例如,Codex [13]);见下图。

“LLM中的指令微调-来自论文[13/14]

正如在之前的帖子中广泛讨论的那样,创建 LLM 的第一步是使用语言建模目标对大型、未标记的文本语料库进行模型预训练。在此过程中,模型获得信息并学会准确地执行下一个token预测。然而,模型的输出并不总是有趣、引人注目或有用,而且模型通常很难遵守复杂的指令。为了鼓励这种行为,我们需要做些基本的预训练以外的事。

创建指令遵循LLM|有几种不同的方法可以教LLM如何遵循指示。例如,我们可以执行指令调整 [12],或者通过包含指令的对话示例对 LLM 进行微调。几个著名的模型采用这种方法,例如 LLaMA(及其变体)[15]、所有 FLAN 模型 [12]、OPT-IML [16] 等。或者,我们可以使用由监督微调 (SFT) 和人类反馈强化学习 (RLHF) 组成的三步法;见下图。这种方法导向了令人难以置信的模型的创建,例如 ChatGPT、GPT-4、Sparrow [17] 等。

“根据人类反馈调整LLM-来自论文[13]

制定有用的说明|如果我们可以访问经过训练以遵循指令的 LLM,我们可以通过向模型提供有用且信息丰富的说明来完成很多工作。以下是使用指令提示的一些关键技巧和想法:

  • 就像我们提示的其余部分一样,说明应该具体而详细。

  • 我们应该避免在提示中告诉 LLM 不要做某事。相反,我们应该专注于告诉LLM该做什么。

  • 使用带有指示符的输入结构可以清楚地识别提示中的指令是有帮助的;见下图。

“指令提示的不同格式

角色提示|与指令提示无关的另一种有趣的提示技术是角色提示,它为模型分配一个“角色”或人格化。此角色通过文本片段在提示中分配,例如:

  • 你是一位著名而才华横溢的数学家。

  • 你是医生。

  • 你是音乐专家。

有趣的是,最近的LLM能够在整个对话过程中很好地承担和维持这些角色 [18];见下图。

“使用LaMDA进行角色提示-来自论文[18]

更进一步,角色提示不仅仅是一个有趣的把戏。为 LLM 提供角色实际上可以提高性能(例如,提示 GPT-3 为“出色的数学家”的角色可以提高基于算术问题的性能)。但是,角色提示只能在某些情况下提高性能。

“When assigning a role to the AI, we are giving it some context. This context helps the AI understand the question better. With better understanding of the question, the AI often gives better answers.” - from learnprompting.org
“在为 AI 分配角色时,我们会为其提供一些背景信息。此上下文有助于 AI 更好地理解问题。随着对问题的更好理解,人工智能通常会给出更好的答案。” - 来自 learnprompting.org

现实世界中的指令提示|用指令提示 LLM 是一个非常强大的工具,我们可以将其用于各种应用程序。要了解如何利用这项技术,我们可以看看最近发布的 ChatGPT 插件,其中包括一个开源信息检索 API。在此 API 内部,提供了两个特定模块,用于从文档中提取元数据和过滤个人身份信息 (PII-personally identifiable information)。有趣的是,这些服务完全基于 LLM,并使用如下所示的提示。

“ChatGPT 信息检索 API 中的元数据提取和 PII 检测提示

在这些提示中,为 LLM 提供了有关如何执行其所需任务的具体和详细指令。指令的一些值得注意的方面是:

  • 明确说明所需的输出格式(json 或 true/false)。

  • 该指令使用结构化格式(即项目符号分隔列表)来描述重要信息。

  • LLM 的任务(即识别 PII 或提取元数据)在提示中明确说明。

有趣的是,这些提示告诉模型在多种情况下不该做什么,而这通常是不被建议的。

鉴于 LLM 的局限性,相信 LLM 能够准确执行 PII 检测等关键任务可能不是最好的主意。尽管如此,这种方法展示了指令提示的不可思议的潜力。无需编写整个程序或服务,我们可能只需编写提示即可快速解决大量任务。

论述要点-Takeaways

“Writing a really great prompt for a chatbot persona is an amazingly high-leverage skill and an early example of programming in a little bit of natural language” - Sam Altman

“为聊天机器人角色编写非常棒的提示是一项惊人的高杠杆技能,也是使用一点点自然语言进行编程的早期示例”——Sam Altman

我们从这个论文概述中学到的是,我们应该知道构建正确的提示(即提示工程)是在实践中成功利用 LLM 的很大一部分。由于其文本到文本的生成结构,语言模型具备非常通用的能力,可用于完成各种任务。但是,我们必须为这些模型提供详细且适当的上下文,以便它们能够正常运行。尽管最佳提示技术因模型和任务而异,但我们可以利用许多更高层次的要点来最大限度地提高成功的机会。

从零样本到少样本学习|鉴于其广泛的预训练(以及如今的微调)数据集,LLM 包含大量信息并且能够开箱即用地解决各种任务。为此,我们只为模型提供任务描述和相关输入数据,然后模型就有望生成正确的输出。然而,由于提供给模型的上下文有限,零样本学习只能表现得很好。为了提高零样本学习的性能,我们应该通过在提示中插入范例来利用少样本学习。

指令遵循LLM|尽管它表现良好,但小样本学习通常会消耗大量令牌,考虑到大多数 LLM 的上下文窗口有限,这是一个问题。为了解决这个问题,我们可以采用一种指令提示方法,该方法提供 LLM 所需行为的精确文本描述,而不是通过正确输出的具体示例来捕获此行为。指令提示功能强大,但它需要经过微调(例如,通过指令调整或 RLHF)的特定形式的 LLM 才能正常工作。预训练的 LLM 不擅长按照开箱即用的说明进行操作。

技巧和窍门|提示工程带有各种可以采用的技巧和最佳实践。通常,此类技术会随着每个新模型的发布而变化(例如,与之前的模型 [2] 相比,GPT-4 在处理非结构化提示方面要好得多),但一些原则在相当长一段时间内仍然适用。首先,我们应该始终从简单提示开始,然后慢慢增加复杂性。在开发提示时,我们的目标应该是具体和详细,同时避免过于冗长(由于上下文窗口有限)。最后,为了真正最大化 LLM 性能,我们通常需要利用少样本学习、指令提示或更复杂的方法。

附录:Bibliography

[1] Raffel, Colin, et al. "Exploring the limits of transfer learning with a unified text-to-text transformer." The Journal of Machine Learning Research 21.1 (2020): 5485-5551.
[2] Saravia, Elvis, et al. “Prompt Engineering Guide”, https://github.com/dair-ai/Prompt-Engineering-Guide (2022).
[3] Weng, Lilian. (Mar 2023). Prompt Engineering. Lil’Log. https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/.
[4] Radford, Alec, et al. "Improving language understanding by generative pre-training." (2018). 
[5] Radford, Alec, et al. "Language Models are Unsupervised Multitask Learners."
[6] Brown, Tom, et al. "Language models are few-shot learners." Advances in neural information processing systems 33 (2020): 1877-1901.
[7] Tony Z. Zhao, Eric Wallace, Shi Feng, Dan Klein, and Sameer Singh. 2021. Calibrate before use: Improving few-shot performance of language models. ICML.
[8] Su, Hongjin, et al. "Selective annotation makes language models better few-shot learners." arXiv preprint arXiv:2209.01975 (2022).
[9] Diao, Shizhe, et al. "Active Prompting with Chain-of-Thought for Large Language Models." arXiv preprint arXiv:2302.12246 (2023).
[10] Liu, Jiachang, et al. "What Makes Good In-Context Examples for GPT-$3 $?." arXiv preprint arXiv:2101.06804 (2021).
[11] Wei, Jason, et al. "Chain of thought prompting elicits reasoning in large language models." arXiv preprint arXiv:2201.11903 (2022).
[12] Wei, Jason, et al. "Finetuned language models are zero-shot learners." arXiv preprint arXiv:2109.01652 (2021).
[13] Chen, Mark, et al. "Evaluating large language models trained on code." arXiv preprint arXiv:2107.03374 (2021).
[14] Ouyang, Long, et al. "Training language models to follow instructions with human feedback." Advances in Neural Information Processing Systems 35 (2022): 27730-27744.
[15] Touvron, Hugo, et al. "Llama: Open and efficient foundation language models." arXiv preprint arXiv:2302.13971 (2023).
[16] Iyer, Srinivasan, et al. "OPT-IML: Scaling Language Model Instruction Meta Learning through the Lens of Generalization." arXiv preprint arXiv:2212.12017 (2022).
[17] Glaese, Amelia, et al. "Improving alignment of dialogue agents via targeted human judgements." arXiv preprint arXiv:2209.14375 (2022).
[18] Thoppilan, Romal, et al. "Lamda: Language models for dialog applications." arXiv preprint arXiv:2201.08239 (2022).

参考


-CAMERON R. WOLFE:Practical Prompt Engineering

https://cameronrwolfe.substack.com/p/practical-prompt-engineering-part

END


扫码加群,

立变AI🍚!


AI范儿读者群


👇关注、标星哦~

那些prompt了我的,

是否也prompt了你...

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存