Press "Enter" to skip to content

Prompt 工程指南(二)—— 基础入门篇

这是 Prompt 提示工程系列的第二篇:


LLMs 设置

在处理提示时,可以通过 API 或直接与 LLMs 进行交互。你可以配置一些参数以获得不同的提示结果。

  • temperature(温度) —— 简言之,温度越低,结果越具确定性,因为总是选择概率最高的下一个词。提高温度可能导致更多的随机性,鼓励产生更多样化或富有创意的输出。我们本质上是增加了其他可能词的权重。在应用层面,我们可能希望对基于事实的问答任务使用较低的温度值,以鼓励更加准确和简洁的回答。对于诗歌生成或其他创意任务,提高温度值可能会更有益
  • top_p —— 类似地,通过 top_p 调节名为 nucleus sampling 的温度抽样技术,你可以控制模型在生成回应时的确定性。如果你需要准确和事实性的答案,请保持较低的 top_p 值,如果你希望获得更多样化的回应,请增加到较高的 top_p 值。

一般建议是更改其中一个即可,而不是两者都更改。另外,还要注意的是生成结果可能因使用的 LLM 版本而有所不同。

提示基础

基本提示

虽然很简单的提示就可以实现很多功能,但生成结果的质量取决于提示包含的信息量以及制作质量。提示可以包含诸如传递给模型(LLMs)的指令、问题、上下文、输入或示例等详细信息。你可以充分使用这些元素更好地指导模型,从而获得更好的结果。

让我们从一个简单提示的基本示例开始:

提示:

The sky is

输出:

image-20230327180527674

绿色背景的文字就是生成的响应(下同)。这个 Prompt 的中文提示在 OpenAI Playground 中效果不是很好,所以使用英文进行演示。

如你所见,语言模型输出的字符串延续是有意义的,因为它考虑了上下文“天空是”。不过这个输出可能出乎意料,或者与我们想要完成的任务相距甚远。

这个基本示例还强调了提供更多上下文或关于我们具体想要实现什么的指示的必要性。

让我们尝试改进一下:

提示:

Complete the sentence: 
The sky is

输出:

image-20230327180828339

这样更好了吗?嗯,我们告诉模型完成句子,所以结果看起来好多了,因为它完全按照我们告诉它的要求做了(完成句子)。这种设计最佳提示以指导模型执行任务的方法就是所谓的提示工程

上面的例子是一个基本的说明,展示了如今LLMs的可能性。如今的LLMs能够执行各种高级任务,从文本摘要到数学推理再到代码生成。

提示格式

我们已经尝试了一个非常简单的提示,标准提示具有以下格式:

<问题>?

或者

<指令>

这可以格式化为问答(QA)格式,这在许多 QA 数据集中是标准的,如下所示:

Q: <问题>?
A:

这样的提示也被称为零样本(zero-shot)提示,即直接提示模型响应,而不提供有关希望实现的任务的任何示例或演示。一些大语言模型确实具有执行零样本提示的能力,但这取决于手头任务的复杂性和知识。

考虑到上面的标准格式,一种流行且有效的提示技术被称为少样本(few-shot)提示,即我们提供示例。少样本提示可以按如下方式格式化:

<问题>?
<答案>
<问题>?
<答案>
<问题>?
<答案>
<问题>?

QA 格式版本如下所示:

Q: <问题>?
A:<答案>
Q: <问题>?
A:<答案>
Q: <问题>?
A:<答案>
Q: <问题>?
A:

请注意,不一定要使用 QA 格式。提示格式取决于手头的任务。例如,你可以执行一个简单的分类任务,并给出任务的示例,如下所示:

提示:

这电影太棒了!// 正面
太烂了!// 负面
哇,那部电影真的很棒!// 正面
真是糟糕透顶的表演!//

输出:

image-20230327183119970

可以看到,少样本提示能够实现上下文学习,即语言模型在给定几个示例的情况下学习任务的能力。

提示的元素

当我们介绍越来越多可以通过提示工程实现的示例和应用后,你会注意到提示是由某些元素组成的。

提示可以包含以下任何组件:

  • 指令 —— 希望模型执行的特定任务或指令
  • 上下文 —— 可以包含外部信息或额外的上下文,以引导模型更好地进行响应
  • 输入数据 —— 我们感兴趣并希望找到响应的输入或问题
  • 输出指示符 —— 指示输出的类型或格式

并非所有组件都需要用于提示,格式取决于手头的任务。在接下来的提示工程指南中,我们将介绍更多具体示例。

设计提示的一般技巧

在设计提示时,请记住以下这些技巧:

从简单开始

当你开始设计提示时,请记住这实际上是一个需要大量实验才能获得最佳结果的迭代过程。使用像 ChatGPTCohere 这样的简单游乐场是一个很好的起点。

你可以从简单的提示开始,为了寻求更好的结果,不断添加更多的元素和上下文。因此,沿途对提示进行版本迭代至关重要。在我们阅读指南时,你会看到许多示例,其中具体性简单性简洁性通常会带来更好的结果。

当你有一个涉及许多不同子任务的大任务时,你可以尝试将任务分解为更简单的子任务,并在获得更好的结果时继续构建。这样可以避免在提示设计过程开始时添加太多复杂性。

指令

通过使用诸如“编写”、“分类”、“总结”、“翻译”、“排序”等指令,你可以为各种简单任务设计有效的提示,以指导模型实现你想要达到的目标。

请记住,你还需要进行大量实验以了解哪种方法效果最好。尝试使用不同关键词、上下文和数据的不同指令,看看哪种方法最适合你的特定用例和任务。通常情况下,上下文与你试图执行的任务越相关,效果越好。在接下来的教程中,我们将讨论采样和添加更多上下文的重要性。

有些人建议将指令放在提示的开头,还建议使用“###”之类的明确分隔符来分隔指令和上下文。

例如:

提示:

### 指令 ###
将下面的语言翻译成中文:
Text: "hello!"

输出:

image-20230327184635511

具体性

对于希望模型执行的指令和任务要非常具体。提示越具描述性和详细性,结果越好。当你有一个期望的结果或生成风格时,这一点尤为重要。并没有特定的关键词可以带来更好的结果。更重要的是具有良好的格式和描述性提示。实际上,在提示中提供示例可以非常有效地获得特定格式的所需输出。

这一点在 ChatGPT 提示的艺术中也重点介绍了。

不过,也不要过于具体,在设计提示时,你还应该考虑提示的长度,因为 OpenAI 对这方面有限制,应该如何具体和详细是需要考虑的问题。包含太多不必要的细节并不一定是好方法,细节应该与任务相关,并有助于完成手头的任务。这是你需要进行大量实验的地方。我们鼓励大量实验和迭代,以优化你的应用程序提示。

举一个例子,我们来看一个从一段文本中提取特定信息的简单提示。

提示:

从以下文本中提取地名。
期望的格式:
地点:<以顿号分隔的地点名称列表>
输入:"尽管这些发展对研究人员来说是鼓舞人心的,但仍有许多谜团。"我们经常在大脑和我们在外围看到的效果之间有一个黑盒子,"说,一个神经免疫学家在北京的协和医院。"如果我们想在治疗背景下使用它,我们实际上需要了解这个机制。""

输出:

image-20230327190005462

避免不精确

如果提示过于详细或者包含过多改进格式,很容易陷入想要让提示过于聪明并可能创建不精确描述的陷阱,更直接往往更好。这里的类比与有效沟通非常相似 —— 越直接,信息传达越有效。

这一点在 ChatGPT 提示的艺术中也有介绍。

例如,你可能对学习提示工程的概念感兴趣,可以尝试这样的提示:

解释提示工程的概念,保持精简,只有几句话,不要太过描述。

上述提示中并不清楚要使用多少句子以及什么样的风格。尽管如此,你仍然可以使用上述提示获得相当好的响应,但更好的提示应该非常具体、简洁且直接。例如:

用2-3句话向一名高中生解释提示工程的概念。

做还是不做?

在设计提示时,另一个常见的技巧是避免说明不要做什么,而是说明要做什么。这鼓励更多的具体性,并关注导致模型产生良好响应的细节。

以下是一个关于电影推荐聊天机器人无法实现我不希望它做的事情的例子,因为我编写了说明 —— 关注不要做什么。

提示:

以下是一个向客户推荐电影的代理,不要询问兴趣,不要询问个人信息。
客户:请根据我的兴趣推荐一部电影。
代理:

输出:

image-20230327213522000

以下是更好的提示:

提示:

以下是一个向客户推荐电影的代理,代理负责根据全球热门趋势推荐一部电影。它应避免向用户询问他们的喜好,并避免询问个人信息。如果代理没有电影可以推荐,它应该回答“抱歉,今天找不到可以推荐的电影”。
客户:请根据我的兴趣推荐一部电影。
代理:

输出:

image-20230327213717354

上述示例中的一些是从 OpenAI API 提示工程最佳实践文章中提取的。

小结

简单总结下提示工程的技巧:

  • 从简单开始、不断迭代
  • 通过明确的指令告诉模型要做什么
  • 尽可能具体描述任务和细节
  • 清晰明确,直截了当,不要拖泥带水
  • 多说要做什么,少说不做什么(需要特别说明的除外)

提示示例

前面我们已经介绍了如何为大语言模型(LLMs)设置提示,并给出了一些基本示例。

接下来,我们将提供更多关于如何使用提示来实现不同任务的示例,并在此过程中介绍关键概念。通常,通过示例学习概念是最好的方法。下面我们将介绍如何使用精心设计的提示来执行不同类型任务的几个示例。

主题:

文本摘要

自然语言生成的典型任务之一是文本摘要。文本摘要可以包括许多不同的形式和领域。实际上,语言模型最有前景的应用之一是将文章和概念总结成简洁易读的摘要。让我们尝试使用提示实现简单的摘要任务。

假设我对抗生素感兴趣,我可以尝试这样的提示:

提示:

解释抗生素
A:

输出:

image-20230327214945438

“ A:”是问答中使用的明确提示格式。在这里,我用它来告诉模型预期会有更多内容。在这个例子中,使用与不使用它的效果如何并不明显,但我们将在后面的例子中讨论。现在,我们假设生成结果包含过多的信息,希望进一步总结 —— 我们可以指示模型将其总结成一句话,如下所示:

提示:

抗生素是抗菌药物,它可以抑制或杀死细菌,以治疗感染。它们可以用于治疗细菌感染,比如肺炎、鼻窦炎、尿路感染、皮肤感染等。抗生素的作用机制是破坏细菌的细胞壁,从而阻止细菌的生长和繁殖。
用一句话解释以上内容:

输出:

image-20230327215237830

在不过多关注上述输出的准确性的情况下,模型尝试将段落总结为一句话。你可以用更巧妙的指示,但我们会在后面讨论这个问题。请随时暂停并尝试实验,看看是否能获得更好的结果。

信息提取

虽然语言模型经过训练可执行自然语言生成和相关任务,但它也非常擅长执行分类和其他一系列自然语言处理(NLP)任务。

以下是一个从给定段落中提取信息的提示示例。

提示:

在研究论文的作者贡献声明和致谢中,应清楚且具体地说明作者在准备手稿和分析过程中是否使用了 AI 技术,如 ChatGPT,并且使用了哪些 LLMs。这将提醒编辑和审稿人更仔细地审查稿件,以防止潜在的偏见、不准确和不当的来源归因。同样,科学期刊在使用 LLMs 时,例如在选择提交的手稿时,也应该保持透明度。
请提取在上面的段落中提到的基于大语言模型的产品:

输出:

image-20230327215833414

我们有很多方法可以改进上述结果,但这已经非常有用。

到现在为止,你应该明白,只需简单指示模型要做什么,就可以让它执行不同的任务。这是一个强大的功能,AI 产品开发人员已经在使用它来构建强大的产品和用户体验。

段落来源:ChatGPT:五个研究优先事项

回答问题

要让模型对特定答案作出更好的回应的最佳方法之一是改进提示的格式。如前所述,提示可以结合指令、上下文、输入和输出指示符来获得改进的结果。虽然这些组件并非必需,但在指示方面越具体,获得的结果就越好。以下是一个示例,说明如何遵循更结构化的提示。

提示:

根据以下上下文回答问题,保持答案简短且简洁,如果不确定答案,请回答“不确定答案”。
上下文:Teplizumab 源于一个名为 Ortho Pharmaceutical 的新泽西州药品公司。在那里,科学家们生成了一种名为 OKT3 的抗体的早期版本。这种分子最初来源于小鼠,能够结合到 T 细胞的表面并限制它们的细胞杀伤潜力。1986年,它被批准用于预防肾移植术后器官排斥,成为第一个获准用于人类的治疗性抗体。
问题:OKT3 最初是从哪里获得的?
答案:

输出:

image-20230327220304136

上下文来源于 Nature

文本分类

到目前为止,我们使用了简单的指令来执行任务。作为一个提示工程师,你需要在提供更好的指令方面做得更好。但这还不够!你还会发现,对于更困难的用例,仅提供指令是不够的。这时,你需要更多地考虑上下文和提示中可以使用的不同元素。你还可以提供的其他元素是输入数据或示例。

让我们尝试通过提供一个文本分类的例子来演示这一点。

提示:

将文本分类为 neutral、negative 或 positive。
文本:我认为食物还可以。
情感:

输出:

image-20230327235225230

我们给出了对文本进行分类的指令,模型给出了 neutral 的答案,这是正确的。这样做没有错,但是假设我们真正需要的是让模型以我们想要的确切格式给出标签。所以我们不希望它返回 neutral 而是 Neutral。我们如何实现这一点?有不同的方法可以做到这一点。在这里,我们关心的是特异性,所以提示中提供的信息越多,结果越好。我们可以尝试提供示例以指定正确的行为。让我们再试一次:

提示:

将文本分类为 neutral、negative 或 positive。
文本:我认为度假还可以。
情感:Neutral
文本:我认为食物还可以。
情感:

输出:

image-20230327235323948

完美!这次模型返回了 Neutral,这是我正在寻找的具体标签。看来提示中提供的示例有助于模型在输出中保持特异性。

聊天对话

通过提示工程,你可以实现的更有趣的事情之一是指导大语言模型系统的行为、意图和身份。当你构建诸如客户服务聊天机器人之类的对话系统时,这尤其有用。

例如,让我们创建一个能够对问题生成更技术性和科学性回答的对话系统。注意我们是如何通过指令明确指挥它的行为。这有时被称为角色提示

这一点在 ChatGPT 提示的艺术扮演技巧部分也有介绍。

提示:

以下是与 AI 研究助手的对话。助手的语气是技术性和科学性的。
人类:你好,你是谁?
AI:你好!我是一个 AI 研究助手。今天我能帮你什么?
人类:你能告诉我关于黑洞的创建吗?
AI:

输出:

image-20230328000546925

我们的 AI 研究助手听起来有点太技术了,对吧?好吧,让我们改变这种行为,并指导系统给出更易懂的答案。

提示:

以下是与 AI 研究助手的对话。助手的回答应该易于理解,甚至小学生也能理解。
人类:你好,你是谁?
AI:你好!我是一个 AI 研究助手。今天我能帮你什么?
人类:你能告诉我关于黑洞的创建吗?
AI:

输出:

image-20230328000708928

我认为我们取得了一些进展。你可以继续改进它,我相信,如果你添加更多示例,可能会得到更好的结果。

代码生成

大语言模型在代码生成方面非常有效,其中 Github Copilot 就是一个很好的例子。通过巧妙的提示,你可以执行大量的代码生成任务。让我们看几个例子。

实际上,Github Copilot 就是微软和 OpenAI 合作的产物。

首先,让我们尝试一个简单的程序,向用户问候。

提示:

/**
* 询问用户的名字,然后说你好
*/

输出:

image-20230328000928659

可以看到,我们甚至不需要指定要使用的语言。

让我们换个层次。我想向你展示一下,在设计提示时,大语言模型能够更加强大。

提示:

"""
数据表 departments,列 = [DepartmentId, DepartmentName]
数据表 students,列 = [DepartmentId, StudentId, StudentName]
为计算机科学系的所有学生创建一个 MySQL 查询
"""

输出:

image-20230328001412920

这非常令人印象深刻。在这种情况下,我们提供了关于数据库模式的数据,并要求它生成一个有效的 MySQL 查询。

推理任务

对于当今的大语言模型来说,可能最困难的任务之一就是需要一定形式推理的任务。由于可以从大语言模型中产生各种复杂应用,所以我对推理领域很感兴趣。

在涉及数学能力的任务方面,大语言模型已经有了一些改进。不过,需要注意的是,目前的大语言模型在执行推理任务方面存在困难,因此需要更高级的提示工程技术。我们将在下一篇教程中介绍这些高级技术。现在,我们将介绍一些基本示例以展示大语言模型的算术能力。

提示:

9000 乘以 9000 是多少?

输出:

image-20230328001756881

让我们试试更难的。

提示:

这组数中的奇数相加得到一个偶数:15, 32, 5, 13, 82, 7, 1。
A:

输出

image-20230328001943311

这是错误的!让我们通过改进提示来改进这个问题。

提示:

这组数中的奇数相加得到一个偶数:15, 32, 5, 13, 82, 7, 1。
通过将问题分解为若干步骤来解决。首先,找出奇数,将它们相加,并指出结果是奇数还是偶数。

输出:

image-20230328002130749

这就对了,对吧?顺便说一下,重试几次,系统有时会失败,所以稳定性上不是那么好。不过可以看到,如果你能提供更好的指示并结合示例,有助于获得更准确的结果,还有就是这里也应用了前面提到的技巧 —— 将复杂的问题进行拆解。

下篇教程中,我们将介绍更多提示工程的高级概念和技巧,以提高大语言模型在更难任务上的表现。


最后,欢迎大家加入免费的 AI&ChatGPT 研习社与大家一起讨论 AI&ChatGPT 的最新动态,免费领取最新 AI 相关的学习资源:

img

你还可以微信扫码关注我的微信公众号获取极客书房最新动态:

img
发表回复