人工智能(AI)

2023最新AI提示工程系列:简介

>>>>>请访问:提示指令数据库<<<<<

提示工程是一门新兴学科,专注于提示词的设计和优化,目的是帮助用户将大型语言模型应用到各种场景和研究领域中。掌握提示工程的相关技能,可以帮助用户更好地理解大型语言模型的能力和局限性。

研究人员可以利用提示工程来提高大型语言模型处理复杂任务的能力,如问答和算术推理。开发人员可以通过提示工程设计出强大的工程技术,实现大型语言模型与其他工具的高效接轨。

提示工程不仅是关于提示词的设计和研发。它还包含了各种与大型语言模型交互和开发的技能和技术。提示工程在实现与大型语言模型的交互接入,理解其能力方面发挥重要作用。通过提示工程,用户可以提高大型语言模型的安全性,也可以赋能大型语言模型,例如利用领域知识和外部工具来增强其能力。

基于对大型语言模型的浓厚兴趣,我们编写了这份全新提示工程指南,介绍了相关的论文研究、学习指南、模型、讲座、参考资料、语言模型能力以及其他与提示工程相关的工具。

本指南介绍了提示词的基础知识,帮助用户了解如何通过提示词与大型语言模型进行交互,并提供相关指导建议。

除非特别说明,本指南中的所有示例都是基于 OpenAI 的大型语言模型 text-davinci-003 进行测试,使用该模型的默认配置,如 temperature=0.7 和 top-p=1 等。

模型设置

使用提示词时,您可以通过 API 或直接与大型语言模型进行交互。您可以通过配置一些参数来获得不同的提示结果。

Temperature:简单来说,temperature 参数值越小,模型返回的结果就越确定。如果把这个参数调高,大型语言模型可能会返回更随机的结果,也就是更多样化或更具创造性的输出。我们也可以通过增加其他可能 token 的权重来达到类似效果。在实际应用中,对于质量保证等任务,我们可以设置较低的 temperature 值,以使模型基于事实返回更真实简洁的结果。对于诗歌生成等创造性任务,适当提高 temperature 参数值。

Top_p:同样,使用 top_p(与 temperature 一起称为核采样技术),可以控制模型返回结果的确定性。如果需要准确事实的答案,就把参数值调低。如果想要更多样化的答案,就把参数值调高。

一般来说,改变其中一个参数就够了,不需要同时调整两个。

在我们看一些基础示例之前,请注意最终生成的结果可能会因使用的大型语言模型版本不同而有差异。

基本概念

基础提示词

您可以通过简单的提示词获取大量结果,但结果质量与您提供的信息量和完整度有关。提示词可以包含指令、问题等要传递给模型的信息,也可以包含上下文、输入或示例等详细信息,以更好地指导模型并获得更佳结果。

看一个简单示例:

提示词

The sky is

输出结果

blue.

如上示例,语言模型基于给定的上下文"The sky is"完成了续写。但是输出的结果可能出人意料,或超出我们的要求。

为实现更具体的目标,我们需要提供更多背景或说明信息,如:

提示词

完善以下句子:The sky is

输出结果

so beautiful today.

结果是不是更好了?这里我们明确要求模型去完善句子,因此输出结果与我们的输入完全匹配。提示工程就是研究如何设计出最佳提示词,指导语言模型高效完成任务。

以上示例基本展示了当前大语言模型的功能作用,它们可以用于执行各种高级任务,如文本概括、数学推理、代码生成等。

提示词格式

前文中的提示词还比较简单。标准提示词应遵循以下格式:

<问题>?

<指令>

这可以格式化为问答形式:

Q: <问题>?
A:

这种方式也称为零样本提示,即不提供示例直接提示语言模型给出回答。部分大型语言模型具有零样本提示能力,但取决于任务复杂度和知识范围。

目前业界广泛使用的还是更高效的小样本提示范式,即提供少量提示示例,如任务说明等。小样本提示通常遵循:

<问题>?<答案>

<问题>?<答案>

<问题>?<答案>

<问题>?

问答形式为:

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

注意,问答形式不是必须的,可以根据任务需要调整。例如,进行简单的分类任务并给出说明:

提示词

This is awesome! // Positive
This is bad! // Negative
Wow that movie was rad! // Positive

What a horrible show! //

输出结果

Negative

语言模型可以通过一些示例理解学习任务,小样本提示正可发挥上下文学习能力。

提示词要素

提示词通常由以下要素组成:

指令:要模型执行的具体任务或指令。

上下文:包含外部信息或额外上下文,引导语言模型更好地回应。

输入数据:用户输入的内容或问题。

输出指示:指定输出的类型或格式。

需要注意的是,提示词的格式取决于想让语言模型完成的任务类型,并不是所有要素都是必须的。后续指南中会提供更具体的示例。

提示词可以包含以上任一要素或多要素的组合,以指导语言模型更好地完成特定的任务。我们会在后续指南中看到,不同任务需要设置不同的提示词格式,组合使用各种要素。

设计提示的核心要点

考虑以下几点,以高效地构建设计提示:

从简出发

设计提示往往是迭代的,可能需要多次尝试才能达到理想的效果。选择像OpenAI或Cohere这样的简洁工具是开始的关键。建议您从基础的提示开始,然后逐渐引入更多的元素和背景,这样做可以更好地满足您的目标。在这个过程中,对提示进行版本管理非常有用。阅读本文时,您会发现提示的具体性、简明性和简练性往往能得到更好的回应。

对于那些涉及多个子任务的大任务,您可以考虑将它们拆分为较小、更简单的子任务,并逐步扩展以获得更好的效果。这种方法可以避免一开始就使提示设计变得过于复杂。

使用命令

模型可以通过命令来执行各种任务,例如“写入”、“分类”、“总结”、“翻译”和“排序”。为了有效地为各种任务设计提示,建议多做实验以确定哪种方法最佳。不同的关键字、上下文和数据可能会对不同的任务有不同的效果。通常,上下文越与任务相关,效果越好。未来的指南会更加详细地介绍如何进行采样和添加更多上下文。

大多数建议都倾向于将指令放在提示的开始部分,并使用像“###”这样的清晰分隔符来隔离指令和上下文。

示例:

提示词:

将以下文本译为西班牙文:

文本:“hello!”

输出结果:

¡Hola!

具体说明

明确地告诉模型您的预期,这样往往会得到更好的结果,尤其是当您有特定的输出格式或风格时。在提示中给出示例可以非常有效。

但同时,考虑提示的长度也是很重要的,因为过长的提示可能不会有效。包含太多不相关的信息可能不是最佳选择,重点是确保细节与当前任务相关。

举例说明,如果您想从某段文本中提取地名:

提示词:

从以下文本中标识地名。

期望格式: 地点:<逗号分隔的地点名称>

“有趣的发现让研究者感到兴奋,但仍然有许多未解之谜。来自里斯本神秘的香帕利莫德中心的神经免疫学家Henrique Veiga-Fernandes说......”

输出结果:

地点:里斯本,香帕利莫德中心

精确性为先

虽然提示的详细程度和格式可以提高效果,但避免过于复杂或模糊的描述也同样重要。简单、直接的指令往往更为有效。

例如,要求解释提示工程:

要求解释提示工程的基础知识。简明扼要,无需详述。

更好的提示方式:

请用2-3句话向中学生解释什么是提示工程。

强调期望行为

在构建提示时,不妨明确告诉模型您希望它做什么,而不是告诉它不要做什么。这种方法通常更具体,更容易让模型产生期望的响应。

以一个推荐电影的聊天机器人为例,首先是不太理想的版本:

提示词:

以下是向客户推荐电影的代理程序。不要询问兴趣。不要询问个人信息。

客户:请根据我的兴趣推荐电影。

代理:

输出结果:

那么,您喜欢什么风格的电影?动作片、喜剧片、浪漫片还是其他?

一个更具体的版本如下:

提示词:

这是一个根据全球流行趋势为用户推荐电影的聊天机器人。它不应该询问用户的兴趣或私人信息。

如果机器人不能推荐电影,它应回答:“很抱歉,今天我无法给您推荐电影。”

用户:给我推荐一部电影?

输出结果:

很抱歉,我没有您的兴趣相关信息。但这是一份目前全球最受欢迎的电影清单:[电影列表]。希望您能喜欢!

提示词示例

在之前的部分中,我们介绍了如何赋能大语言模型的基本用法。

在本部分,我们将给出更多示例,介绍如何使用提示词来完成不同的任务,以及其中涉及的重要概念。一般来说,通过示例学习概念是最好的方式。下面,我们将通过示例来说明如何使用精细的提示词来执行不同类型的任务。

文本概括

自然语言生成的一个标准任务是文本概括。文本概括可能涉及不同的风格和领域。事实上,语言模型最有前景的应用场景之一就是能够快速概括出易于理解的文章大意和相关概念。我们可以使用提示词来尝试一个简单的概括任务。

假设我想要了解抗生素的相关信息,我可以给出这样的提示:

提示词:

Explain antibiotics

A:

输出结果:

抗生素是一种用于治疗细菌感染的药物。它们通过杀死细菌或抑制其繁殖,从而允许身体的免疫系统抵抗感染。抗生素通常以药片、胶囊或液体溶液的形式口服,有时也以静脉注射的方式施用。它们对病毒感染无效,不适当使用可能导致抗生素耐药性。

在问答形式中,“A:”是一个明确的提示格式。在这个示例中,我用它来提示模型,我想要对该概念进行进一步的解释。在后面的示例中,我们会探讨它的具体用途。现在假设我们觉得模型给出了太多信息,想要进一步提炼它。我们可以指导模型用一句话为我们概括相关内容:

提示词:

抗生素是一种用于治疗细菌感染的药物。它们通过杀死细菌或抑制其繁殖,从而允许身体的免疫系统抵抗感染。抗生素通常以药片、胶囊或液体溶液的形式口服,有时也以静脉注射的方式施用。它们对病毒感染无效,不适当使用可能导致抗生素耐药性。

用一句话解释上面的信息:

输出结果:

抗生素是用于治疗细菌感染的药物,通过杀死细菌或阻止其繁殖,但它们对病毒无效,过度使用可能导致抗生素耐药性。

这个示例是模型在没有过多关注上文输出内容准确性的情况下,试图用一个句子来总结段落内容。关于上文准确性,我们可以通过指令或说明来进一步改善,这一点我们会在后续指南中进行探讨。到这里,你可以暂停并进行实验,看看是否能获得更好的结果。

信息提取

语言模型不仅可以通过训练来执行自然语言生成相关任务,还可以用于执行文本分类和其他各种自然语言处理(NLP)任务。

使用以下示例提示词从指定段落中提取信息:

提示词:

研究论文中的作者贡献声明和致谢中,应该清楚明确地说明作者在准备手稿和分析时是否以及在何种程度上使用了ChatGPT等AI技术。他们还应该指出使用了哪些LLM。这将提醒编辑和审稿人更仔细地审查手稿,以发现潜在的偏见、不准确性和不当的来源归属。同样,科学期刊也应该对其LLM的使用情况保持透明,例如在选择提交的手稿时。

指出上文中提到的基于大语言模型的产品:

输出结果:

上文中提到的基于大语言模型的产品是ChatGPT。

我们可以通过多种方式来改进上述结果,但当前的方式已经非常有用了。

现在应该很明显,你可以通过简单地指示语言模型执行不同的任务。AI研发人员也利用这种能力来构建强大的产品和体验。

问答

提高模型响应精确度的最佳方法之一是改进提示词的格式。如前所述,提示词可以通过指令、上下文、输入和输出指示来改进响应结果。虽然这些要素不是必需的,但如果你的指示越明确,响应的结果就会越好。下面的示例可以说明结构化提示词的重要性。

提示词:

基于以下语境回答问题。保持答案简短清晰。如果不确定答案,请回答“不确定答案”。

语境:Teplizumab的起源可以追溯到新泽西州的一家名为Ortho制药的药物公司。在那里,科学家生成了这种抗体的早期版本,代号为OKT3。 最初它来源于小鼠,这种分子能够与T细胞的表面结合,并限制它们的杀伤细胞潜能。1986年,它被批准用于帮助预防肾移植后的器官排异,这使其成为第一个被允许用于人体的治疗性抗体。

问题:OKT3最初是从哪里获得的?

答案:

输出结果:

小鼠。

文本分类

到目前为止,我们已经会使用简单的指令来执行任务了。作为提示工程师,你需要提供更好的指令。此外,你也会发现,对于更负责任的使用场景,仅提供指令是远远不够的。所以,你需要思考如何在提示词中包含相关语境和其他不同要素。同样,你还可以提供其他的信息,如输入数据和示例。

可以通过以下示例体验文本分类:

提示词:

将文本按中立、负面或正面进行分类。

文本:我觉得这次旅行还不错。

情感:

输出结果:

中立

我们给出了对文本进行分类的指令,语言模型做出了正确的响应,判断文本类型为'中立'。如果我们想要语言模型以指定格式做出响应,比如,我们想要它返回neutral而不是Neutral,那我们该怎么做呢?我们有多种方法可以实现这一点。此例中,我们主要关注绝对特性,因此提示词中包含的信息越多,响应结果就会越好。我们可以使用以下示例来纠正响应结果:

提示词:

将文本按中立、负面或正面进行分类。

文本:我觉得这次假期还不错。

情感:neutral

文本:我觉得这个食物还不错。

情感:

输出结果:

neutral

完美!这次模型返回了neutral,这正是我们想要的特定标签。提示词中的示例使得模型可以给出更具体的响应。有时给出具体的指令十分重要,可以通过以下示例感受这一点:

提示词:

将文本按nutral、负面或正面进行分类。

文本:我觉得这次假期还不错。

情感:

输出结果:

Neutral

这时候你知道给出具体指令的重要性了吧?

对话

我们可以通过提供提示词指导大型语言模型应如何回答,从而进行更有趣的实验。这在构建客服聊天机器人等对话系统时特别有用。

例如,可以创建一个对话系统,它能根据提问给出技术性和科学性的回答。我们可以通过明确的指令告诉模型应当如何表现。这种应用场景有时也被称为“角色提示”。

提示词:

下面是与一位AI研究助理的对话,助理的语气应该专业、技术性强。

人类:你好,你是谁? AI:你好!我是一位AI研究助理,今天有什么可以帮助您的? 人类:你能告诉我黑洞的形成过程吗?

输出结果:

可以的!黑洞是时空中的一个区域,引力非常强大,以至于甚至光都无法逃脱。它们是当一个质量极大的恒星死亡并坍缩成奇点时形成的,奇点密度无限大。奇点极强的引力吸引了周围的所有物质和辐射,形成了黑洞。

我们的AI助理给出的回答非常技术对吧?下面,我们让它给出更容易理解的答案。

提示词:

下面是与一位AI研究助理的对话。助理的回答应该容易被小学生理解。

人类:你好,你是谁?
AI:你好!我是一位AI研究助理,今天有什么可以帮助您的? 人类:你能告诉我黑洞的形成过程吗?

输出结果:

好的!当一个质量极大的恒星耗尽燃料内坍时,就会形成黑洞。恒星的引力如此之大,以至于甚至光都无法逃脱它的拉力。这就在时空中形成了一个被称为黑洞的强引力点。

我想我们取得了一些进展,你可以继续改进它。如果给模型提供更多示例,可能会获得更好的结果。

代码生成

大型语言模型的另一个有效应用领域是代码生成。Copilot就是一个很好的例子。你可以通过一些有效的提示词来执行代码生成任务。让我们看下面的例子:

提示词:

/询问用户姓名并说“你好”/

输出结果:

let name = prompt("你的名字是什么?"); console.log(你好,${name}!);

你看,我们甚至不需要指定编程语言。

来,我们再稍微升级一下。下面的例子将展示提示词会让大型语言模型变得多么强大。

提示词:

表departments, 列 = [DepartmentId, DepartmentName]
表students, 列 = [DepartmentId, StudentId, StudentName]
用MySQL查询所有计算机科学专业的学生

输出结果:

SELECT StudentId, StudentName FROM students WHERE DepartmentId IN (SELECT DepartmentId FROM departments WHERE DepartmentName = '计算机科学');

很厉害吧。在这个例子中,我们提供了关于数据库架构的信息,要求它生成有效的MySQL查询语句。

推理

目前,推理任务对大型语言模型来说是最大的挑战。推理任务最令人兴奋的地方在于它可以促使各种复杂的应用从大型语言模型中诞生。

目前,数学推理任务已经有了一定进步。执行推理任务对当前的大型语言模型还存在一定困难,因此需要更高级的提示词工程技术。我们会在后面的指南中介绍这些高级技术。现在,我们用几个基本例子来展示算术功能:

提示词:

9000 * 9000 equals?

输出结果:

81,000,000

来,我们增加难度:

提示词:

这个组中的奇数加起来是偶数:15, 32, 5, 13, 82, 7, 1。

输出结果:

这个组中的奇数加起来是奇数:119。

这不对!我们试着通过提示词改进它:

提示词:

这个组中的奇数加起来是偶数:15, 32, 5, 13, 82, 7, 1。用步骤来解决这个问题。首先,识别奇数,将它们相加,指出结果是奇数还是偶数。

输出结果:

奇数:15, 5, 13, 7, 1
总和:41
41 是一个奇数。

好多了吧?顺便说一句,我尝试过几次,有时还是会失败。如果可以用示例说明,可能会获得更准确的结果。

我们后面还会在本章节中介绍更多常见的应用示例。

在后面的章节中,我们将介绍更高级的提示工程概念和技术,以完成更困难的任务。