文章目录
- 前言
- 一、文本摘要
- 二、信息抽取
- 三、问答
- 四、文本分类
- 五、对话
- 六、代码生成
- 七、推理
- 总结
前言
随着ChatGPT的大火,提示工程在大模型中的重要性不言而喻,本文参考国外Prompt Engineering Guide完成国内中文版本的《提示工程指南》,希望能够和大家一起交流,分享及发现提示工程的美妙之处。文章所有内容可以在ChatGPT_Prompt_Chinese中找到。
在之前的指南中,我们介绍并给出了Prompt的基本示例。
在本指南中,我们将提供更多示例,展示Prompt如何使用,并介绍更高级指南中重要的关键概念。
通常,学习概念的最佳方法是通过示例进行。下面我们将涵盖几个示例,展示良好制作的Prompt如何用于执行各种有趣且不同的任务。
一、文本摘要
自然语言生成中的标准任务之一是文本摘要。文本摘要可以包含许多不同的风格和领域。事实上,语言模型最有前途的应用之一是将文章和概念总结成快速易读的摘要。让我们尝试使用Prompt进行基本的摘要任务。
假设我想了解有关抗生素的信息,我可以尝试使用如下Prompt:
Prompt:
解释抗生素是什么
A:
Output:
抗生素是指一类能够抑制或杀死细菌、真菌、病毒等微生物的药物。它们通过干扰微生物的生长和复制过程,达到治疗感染疾病的目的。抗生素广泛应用于医学领域,是治疗许多疾病的有效药物之一,但也需要根据医生的建议正确使用以避免滥用和耐药性的问题。
“A:” 是用于问答的明确提示格式。我在这里使用它告诉模型后面有一个期望的进一步信息。在这个示例中,不清楚如何使用它比不使用它更有用,但我们将在以后的示例中详细探讨。现在假设这是太多信息了,我们想进一步简化它。实际上,我们可以指示模型将其总结为一句话,如下所示:
Prompt:
抗生素是一种治疗细菌感染的药物,能够杀死或阻止细菌繁殖,协助人体免疫系统对抗感染,通常以口服、注射等方式使用,对病毒感染无效,不当使用会导致抗生素耐药性。请用一句话概括上述内容:
Output:
抗生素是一种能够杀死或阻止细菌繁殖的药物,常用于治疗细菌感染,但不适用于病毒感染,需避免滥用和耐药性。
上面的输出精度先不用太关注,我们会在后面的指南中详细讨论,模型试图将段落总结为一句话。您可以尝试更巧妙的指令,但我们将在以后的章节中介绍。现在可以暂停一下尝试一下,看看是否可以获得更好的结果。
二、信息抽取
虽然语言模型被训练用于执行自然语言生成和相关任务,但它也非常擅长执行分类和一系列其他自然语言处理(NLP)任务。
以下是一个从给定段落中提取信息的Prompt示例:
Prompt:
在研究论文中,作者贡献声明和致谢应明确而具体地说明作者在撰写和分析手稿时是否使用了 ChatGPT 等 AI 技术,以及使用了哪些 LLMs。这将提醒编辑和审稿人更仔细地审查手稿,以寻找潜在的偏见、不准确和不适当的来源引用。同样,科学期刊在选择投稿时应对其使用 LLMs 透明。请提及上面段落中提到的大型语言模型产品的名称:
Output:
上述段落中提到的大型语言模型产品名称为 ChatGPT。
我们可以通过多种方式来改进上述结果,但已经非常有用了。
现在应该很明显,您可以通过简单地指示模型来要求它执行不同的任务。这是一种强大的能力,AI 产品构建者已经利用它来构建强大的产品和体验。
段落来源: ChatGPT: five priorities for research
三、问答
获取模型特定答案的最佳方法之一是改进Prompt的格式。如前所述,Prompt可以结合指令、上下文、输入和输出指示符来获得改进的结果。虽然这些组件并不是必需的,但随着指令越具体,结果就越好,因此这成为了一个好的实践。以下是一个遵循更结构化Prompt的示例。
Prompt:
根据下面的背景回答问题,保持回答简短明了。如果不确定答案,请回答“不确定”。背景:Teplizumab 起源于新泽西州的一家药品公司 Ortho Pharmaceutical。在那里,科学家们生成了一个名为 OKT3 的抗体的早期版本。分子最初来自小鼠,能够结合到 T 细胞的表面并限制其杀伤细胞的潜力。 1986年,它被批准用于帮助预防肾移植后器官排异,成为首个允许人类使用的治疗性抗体。问题:OKT3 最初来自哪里?回答:
Output:
OKT3 最初来自小鼠。
背景来自于Nature。
四、文本分类
到目前为止,我们使用简单的指令执行任务。作为一个提示工程师,您需要更好地提供更好的指令。但这还不是全部!您还会发现,对于更难的用例,仅提供指令是不够的。这就是您需要更多地考虑上下文和提示中可以使用的不同元素的地方。您可以提供的其他元素包括“输入数据”或“示例”。
让我们通过提供文本分类的示例来演示这一点。
Prompt:
将文本分类为中性、负面或积极。
文本:我认为食物还不错。
Output:
这段文本是中性情感。
这段回复和davinci-3
也是有点出入的,davinci-3
回复中性,chatgpt回复中性情感。假设我们真正需要的是模型按照我们想要的格式给出标签。因此,我们希望它返回“情感:中性”而不是“这段文本是中性情感”。我们如何实现这一点呢?有不同的方法可以做到这一点。在这里,我们关注的是具体性,因此我们可以尝试提供示例来指定正确的行为。让我们再试一次:
Prompt:
将文本分类为中性、负面或积极。文本1: 我认为度假还可以。
情感: 中性文本2: 我认为食物还不错。
情感:
Output:
情感:中性
太好了!这一次模型返回了“情感:中性“,这正是我寻找的具体标签。看来Prompt中提供的示例有助于模型在输出中变得更具体。为了强调为什么有时候具体性很重要,请看这个例子并找出问题:
Prompt:
将文本分类为中性、负面或积极。文本: 我认为度假还可以。
情感:
Output:
中性
这里有什么问题呢?
五、对话
也许你可以通过提示工程来实现更有趣的事情,告诉系统如何行动、它的意图和身份。当您构建对话系统时,这特别有用。
例如,让我们创建一个对话系统,它能够针对问题提供更多技术和科学方面的回答。请注意,我们通过指令明确告诉它如何行动
Prompt:
以下是与AI研究助手的对话。助手的语气是技术和科学的。人类:你好,你是谁?
AI:你好!我是一名AI研究助手。我今天能为您做些什么呢?
人类:你能告诉我黑洞的形成吗?
AI:
Output:
当一个恒星在死亡时,会形成一个非常密集的核心,这个核心被称为“恒星遗骸”,或者更常见的称为“中子星”。然而,如果这个核心质量过于巨大,中子星就会坍塌成为一个黑洞。黑洞是宇宙中最密集的物体之一,它的引力场是如此强大,甚至连光也无法逃脱它的吸引。
我们的AI研究助手听起来有些过于技术化了,对吗?好的,让我们更改这种行为,并指示系统提供更易懂的回答。
Prompt:
以下是与AI研究助手的对话。助手的回答应该是即使小学生也能理解的简单易懂的。人类:你好,你是谁?
AI:您好!我是一名AI研究助手。请问有什么我能为您提供帮助的吗?
人类:你能告诉我黑洞的形成吗?
AI:
Output:
AI:当一颗巨大的星星死亡时,它会塌缩成一个非常小又非常密集的东西,这个东西就叫做黑洞。它是宇宙中最黑暗的东西,它的引力非常强大,连光都无法逃脱。
我认为我们取得了一些进展。您可以继续改进它。我相信,如果您增加更多的示例,您可能会获得更好的结果。
六、代码生成
LLMs相当有效的一种应用是代码生成。Copilot就是一个很好的例子。您可以使用巧妙的Prompt来执行大量的代码生成任务。让我们看下面的一些示例。
首先,让我们尝试一个简单的程序来向用户打招呼。
Prompt:
/*
要求用户输入他们的姓名并说“你好”
*/
Output:
请写一个程序,要求用户输入他们的姓名并打印出“你好,姓名!”的问候语。示例代码:#include <iostream>
#include <string>using namespace std;int main() {string name;cout << "请输入您的姓名:" << endl;cin >> name;cout << "你好," << name << "!" << endl;return 0;
}
您可以看到,我们甚至不需要指定要使用的语言。
让我们稍微调整一下难度。我想向您展示设计提示时,LLMs可以变得多么强大。
Prompt:
"""
Table departments, columns = [DepartmentId, DepartmentName]
Table students, columns = [DepartmentId, StudentId, StudentName]
为计算机科学系的所有学生创建一个MySQL查询。
"""
Output:
以下是创建MySQL查询的语句,用于查找计算机科学系的所有学生:SELECT students.StudentId, students.StudentName
FROM students
INNER JOIN departments ON students.DepartmentId = departments.DepartmentId
WHERE departments.DepartmentName = '计算机科学系';此查询使用INNER JOIN将学生表和部门表连接起来,然后使用WHERE子句来筛选计算机科学系的学生。
这非常令人印象深刻。在这种情况下,我们提供了关于数据库架构的数据,并要求它生成有效的MySQL查询。
七、推理
对于LLM而言,也许最困难的任务之一是需要某种形式的推理。由于LLMs可以产生各种复杂的应用程序,因此我对推理领域最感兴趣。
在涉及数学能力的任务方面已经取得了一些进展。尽管如此,需要注意的是,当前的LLMs仍然难以执行推理任务,因此需要更先进的提示工程技术。我们将在下一篇指南中涵盖这些高级技术。现在,我们将介绍一些基本的示例,以展示算术能力。
Prompt:
请问9,000 * 9,000等于多少?
Output:
9,000乘以9,000等于81,000,000。
让我们尝试一些更难的东西。
Prompt:
这个组中的奇数相加得到一个偶数:15、32、5、13、82、7、1。A:
Output
这个组中的奇数相加得到一个偶数:128。解释:15 + 5 + 13 + 7 + 1 = 41
41是奇数。15 + 5 + 13 + 7 + 1 + 32 = 73
73是奇数。15 + 5 + 13 + 7 + 1 + 32 + 82 = 155
155是奇数。因此,最后一个数82是偶数。因此,15 + 5 + 13 + 7 + 1 + 32 + 82 = 128是偶数。
很明显这个回答是有误的,让我们尝试通过改进Prompt来改进它。
Prompt:
这道题的答案是一个偶数,其中需要对给出的一组数字进行加法运算。请将这组数字中的所有奇数相加,然后确定最终结果是奇数还是偶数。给出的数字是:15、32、5、13、82、7、1。请问,最后的结果是奇数还是偶数?答案是多少?
Output:
将给出的数字中的所有奇数相加,得到 15 + 5 + 13 + 7 + 1 = 41。由于奇数加奇数等于偶数,而偶数加奇数等于奇数,因此最终结果是奇数。答案为 41 是一个奇数。
好多了,对吧?顺便说一句,我试过几次,这个系统有时候会出错。如果您提供更好的指令,并结合实例,可能会有更准确的结果。
我们将继续在指南的这一部分包含更多常见应用的例子。
在即将推出的指南中,我们将介绍更高级的提示工程概念,以提高所有这些以及更难的任务的性能。
总结
这篇文章中,我们详细介绍了基础提示工程的一些例子,并分别给予不同的topic,分析了不同的案例,让大家更加深入的了解提示工程。