本文遵循CC BY-NC-ND 2.0协议,转载请标明本贴地址。
本文主要分为以下几个板块
Prompt工程-介绍
Prompt工程-基础Prompt搭建
Prompt工程-进阶Prompt搭建
Prompt工程-对抗性Prompt搭建
Prompt工程-其他主题
1. Prompt工程-介绍
本指南涵盖了Prompt的基础知识,提供关于如何使用提示来互动和指导大型语言模型(LLM)的粗略概念。
除非另有说明,所有的例子都是使用text-davinci-003(GPT-3)(使用OpenAI的Playground)测试的。案例使用默认的配置,例如temperatur和top-p参数分别为0.7与1。本文所有的输入与输出都为英文,中文翻译仅用于辅助理解,并非实际输入输出,因此在出现输入的位置,本文将保留英语原文作为参考。
本章节主题包括:
基础Prompt
有关大型语言模型的参数设置
标准Prompt
Prompt所包含的元素
基础Prompt
你可以通过大型语言模型生成很多类型的内容,但是生成内容的质量取决于你提供给他多少信息。一个提示可以包含你给模型的指令或问题等,也可以包括更多细节如输入(指引输出的文字)或例子。
下面是一个例子:
输入:
大海是
The sky is
输出:
大海是指由大量咸水组成的水体,具体来说是海水。广义上的海洋是指由地球海洋咸水水域组成的部分,一般把它看作一整个世界洋,或是由若干个大洋组成的水体。
blue
The sky is blue on a clear day. On a cloudy day, the sky may be gray or white.
正如你所看到的,语言模型输出了一个字符串,该输出是语言模型根据上下文预测得到的。这一输出通常是合理的,就像上面这个例子一样,但有可能是出乎我们意料的,或者与我们想要完成的任务相去甚远。
这例子也说明了提供更多背景知识或说明我们具体想要实现什么是十分必要的。
因此我们对上面这个输入Prompt做一些提升:
输入:
请将这个句子补充完整:大海是
Complete the sentence: The sky is
输出:
大海是我的故乡,让我感到心旷神怡。
The sky is so beautiful today.
是不是与之前的结果相去甚远?我们通过告诉模型要将这个句子补充完整,成功让其产生的结果更加精准,因为它通过联系上下文后遵循了我们的指令("将这个句子补充完整")。这种指示模型执行任务的方法就是所谓的Prompt工程。
这里有一些提示,对于你的Prompt工程有帮助。
- 你可以尝试其他简单的任务,使用简单的命令来指示模型,如 "写"、"分类"、"总结"、"翻译"、"排序 "等等。
- 请记住,你还需要进行大量的实验,以便看到什么是最有效的。用不同的关键词、背景知识和数据尝试不同的指令,看看什么对你的特定用例和任务最有效。通常情况下,上下文与你要执行的任务越具体、越相关,就越好。我们将在接下来的教程中涉及采样和添加更多背景知识的重要性。
我们将在本指南中涵盖更多这些能力,但也涵盖一些其他你可能感兴趣的领域,如进阶Prompt技术和围绕Prompt工程的研究课题。
简单介绍大型语言模型的参数设置
在处理提示时,你将通过API或直接与LLM进行交互。你可以配置一些参数来让你的Prompt获得不同的结果。
- Temperature - 简而言之,Temperature越低,生成结果就越确定,即LLM总是会挑选可能性最高的下一个词(token)。提高Temperature可能会导致更多的随机性,鼓励更多不同或创造性的输出,调高这个参数本质上是在增加其他可能的词的权重,让LLM有更大的概率生成其它词。在应用方面,当我们想生成一些基于事实的高质量内容时可以使用较低的Temperature,以鼓励更多基于事实的简明的结果。对于诗歌生成或其他创造性任务,提高Temperature可能产生更加优秀的结果。
- Top_p - 同样地, top_p,这种带有temperature的采样技术称为核采样nucleus sampling,可以控制模型在生成内容时的确定性。如果你正在寻找准确的、符合事实的答案,那就把这个参数调低。如果你在寻找更多样化的反应,就增加到一个更高的值。
- Top_k - 有些大型语言模型中提供这个参数,与Top_p类似
一般的建议是对于上述3个参数,一次性最多改变其中的一个。
- Frequency penalty - 根据目前同一词(token)在文中出现频率惩罚相同的词(token)再次生成的力度。这个值越高,生成词句的变化越多,降低相同词出现的概率。
- Presence penalty - 与Frequency penalty类似,但是是根据目前同一词(token)在文中是否出现过来惩罚相同的词(token)再次生成的力度。这个值越高,越可能生成新的话题。
在开始讲一些基本的例子之前,请注意你生成的结果可能会因你使用的LLM的种类版本而与本文有所不同。
标准Prompt
我们已经在上文尝试了一个非常简单的Prompt。一个标准的Prompt应该具有以下的格式:
<问题>?
你可以在此之上为它添加一个名为“QA格式”的格式,这是很多问答类数据集的格式,添加后如下:
Q: <问题>?
A:
一种流行的、有效的Prompt技术被称为 "few-shot prompting",这种技术通过给LLM输入几组样例,并提示LLM模仿学习样例,从而输出我们想要的目标内容。基于上述的标准格式,在这里我们提供一个案例来演示这一种Prompt技术。Few-shot prompt可以采用以下格式。
<问题>?
<答案>
<问题>?
<答案>
<问题>?
<答案>
<问题>?
当你使用QA格式时,他们会看起来像这样:
Q: <问题>?
A: <答案>
Q: <问题>?
A: <答案>
Q: <问题>?
A: <答案>
Q: <问题>?
A:
请记住,这种技术并没有强制要求使用QA格式。格式应该取决于目标任务的类型。例如,你可以通过给出示如下范任务案例,来让他执行一个简单的分类任务,如下所示。
这真是太棒了!// 积极的
这很糟糕!// 负面的
哇,那部电影真不错!// 积极的
多么可怕的表演!//
输出:
负面的
This is awesome! // Positive
This is bad! // Negative
Wow that movie was rad! // Positive
What a horrible show! //
输出:
Negative
通过少量的提示就使语境学习成为可能,这是语言模型学习任务的能力,只需要给几个例子,它就能完成类似的任务。我们可以在接下来的教程中看到更多类似的行为。
Prompt所包含的元素
随着我们涵盖越来越多的例子和Prompt工程可能的应用,你会注意到,有一些元素构成了提示。
一个提示可以包含以下任何组成部分:
- 指令 - 你希望模型执行的具体任务或指令
- 背景 - 可以涉及外部信息或额外的背景,可以引导模型做出更好的反应
- 输入数据 - 是我们感兴趣的输入或问题,希望为其寻找回答
- 输出指标 - 表示输出的类型或格式
并非所有的组成部分都是Prompt必需的,格式取决于任务目标。我们将在接下来的教程中谈到更多的具体例子。