快速工程 101
在这篇文章中,我们将探讨提示工程的基础知识。我们将解释大型语言模型 (LLM) 如何解释提示以生成输出,并提供提示和技巧,让您快速开始原型设计和实施 LLM。
大型语言模型 (LLM)(例如 GPT-3、ChatGPT、AI21 的 Jurassic 和 Cohere)的近期兴起彻底改变了人工智能所能实现的功能。这些模型经过大量文本训练,可以回答问题、生成营销内容、总结会议记录、编写代码等等 – 如果使用得当的话。
与 LLM 的交互与传统的 ML 模型有很大不同。我们向 LLM 提供文本提示作为指示,让它完成特定任务,并依靠其在大型数据集上的预训练来为我们提供准确的答案。
这是一个针对 LLM(在本例中为 GPT-3)的提示(非突出显示文本)示例,要求它将一个句子从英语翻译成土耳其语,并将 LLM 的输出以绿色突出显示。
这些说明称为提示。提示是 LLM 的输入,其目的是告诉 LLM 做什么或如何思考问题以获得最佳和最准确的任务输出。调整提示以获得 LLM 更具体/可用的响应称为提示工程,是一项关键技能;它是使用 LLM 的最大努力部分。
及时设计可能是一项艰巨的任务,但对于充分利用 LLM 至关重要。在本文中,我们将介绍创建提示的最佳实践,以便您可以开始构建有效的 LLM 应用程序。
在提示中包含直接指令
对于简单的任务(至少对于 GPT-3 来说很简单),最好的提示是清晰、直接和简洁的提示,它告诉 LLM 我们正在尝试解决的确切任务。让我们举一个简单的例子,要求 GPT-3(指令调整)将一个句子从英语翻译成西班牙语。我们的提示将由三个元素组成:
- 一个清晰、简洁、直接的指令:“翻译。 ”
- 我们要翻译的英语短语前面加上“ English: ”
- 为法学硕士 (LLM) 明确指定的回答空间,前面加上故意相似的前缀“西班牙语: ”
这三个元素都是直接指令集的一部分,并带有有序的答案区域。通过向 GPT-3 提供这个结构清晰的提示,它将能够识别要求它完成的任务并正确填写答案。
如有疑问,请直接询问。以下是使用 GPT-3 的翻译任务示例,其中提示包括直接指令“翻译”。后面跟着一个空白区域,供模型响应。
如果没有明确的指示,LLM 可能会表现得不稳定,更有可能给出我们意想不到的答案。让我们采用相同的提示,并删除英语句子前面的一个单词指令:“翻译”。我们可以看到,仅仅从提示中删除一个单词就会导致 GPT-3 完全误解任务,而是用西班牙语的通用客户支持回复来回答“如何重置密码”的问题。
如果没有直接指令(例如“翻译”),GPT-3 就会错误地解释该任务。
在提示中举例说明,以获得最佳回应
如果清晰直接的指示不足以一致准确地解决任务,通常最好给 LLM 一些例子。这可以简单到只给 LLM 一个任务示例,让模型自己解决其余问题。
让我们看一个英语到西班牙语翻译任务的例子。我们将用一个英语到西班牙语翻译的例子来代替指令“翻译”。我们应该以与最后一对完全相同的方式格式化示例,只是我们的示例中将填写西班牙语翻译,以告诉 LLM 我们正在尝试做什么。
少量学习有助于明确任务,尤其有助于理解语气、句法或风格等问题。在这里,一个翻译示例就足以让模型做出正确响应。
我们可以看到,通过给模型一个我们想要的示例,模型可以像我们直接给它一组指令一样弄清楚任务。在提示中包含示例称为少样本学习。这是 GPT-3 的一项突破性功能,它是其研究论文标题的主要焦点:“语言模型是少样本学习者”。GPT-3 的创建者知道少样本学习非常强大,它将成为人们与模型交互的主要方式之一。
通过使用少样本学习,我们可以让 LLM 理解我们的任务,而无需明确提供说明。当任务特定于某个领域或响应语言必须针对特定组织量身定制时,这尤其有用(例如,使用 P1、P2 和 P3 而不是高、中、低优先级)。
将提示指令与任务的最终目标保持一致
在设计提示时,我们需要站在法学硕士的角度并问:模型会认为我的任务的最终目标是什么?
例如,如果我们希望模型以友好的方式向客户做出单一回应,我们可能会写这样的提示:
“这是一位顾客和一位礼貌、乐于助人的客户支持服务人员之间的对话。”
这为模型提供了清晰直接的指令。但是,我们必须考虑 GPT-3 会认为这个任务实际上是什么。
GPT-3 会从字面上理解事情。在提示中说“这是一次对话”会让 GPT-3 生成一个完整的对话(最有可能的延续),而不仅仅是给出一个单一的回应
我们可以看到,GPT-3 认为任务是根据客户的初始输入创建完整的对话记录,而不是简单地对客户做出一次回应。GPT-3 不一定是错的,但它与最初的特定任务意图不一致。让我们将提示改为“以礼貌、乐于助人的客户服务人员的身份回复客户”。
将提示改为“回应……”更符合我们对 LLM 的最终目标。
从“这是一次对话……”到“回应……”的细微变化使 GPT-3 的响应与我们期望的结果保持一致。提示必须既直接又针对任务量身定制;如果不是,模型就会用它认为正确的任务来回应,而不管我们的意图如何。
使用角色来获取更具体的声音
在我们的上一个示例中,我们希望 GPT-3 以礼貌、乐于助人的客户服务人员的身份回应客户。术语“礼貌”和“乐于助人”的使用指导了模型的响应风格,促使它以某种角色做出响应。我们可以尝试使用这些术语,看看它如何影响模型的响应。让我们将“礼貌、乐于助人”改为“粗鲁”,并观察模型的响应。
指定你希望 GPT-3 模仿的语气或角色。要求 GPT-3 粗鲁地回应将导致粗鲁的回应。小心你的愿望。
GPT-3 是一种不道德的算法,它准确地回答了这个问题,尽管回答得有些模糊,但语气更符合“粗鲁”这个词。我们甚至可以让模型以名人或受欢迎的虚构人物的身份做出回应。这可以作为一种速记方式,为回答创造一种特定的语气,这对我们有利。
在提示中包含可接受的回答以保持一致性
形成提示的另一种方式是“完成这个句子”提示。在这种提示风格中,我们要求 LLM 用我们寻求的答案完成一个句子,这通常会导致更自然的语言。以下是通过 GPT-3 运行的示例提示,要求对电影评论的情感进行描述:
如果不指定输出格式,您可能会得到自然语言响应,这可能很难用于下游任务
从技术上讲,GPT-3 在这里回答正确。评论的情绪是他们不喜欢这部电影。但是,如果我们想通过提示工程缩小可能结果的范围,使我们的响应更像情绪分类器,我们可以稍微调整这个提示,并在提示的说明中直接给它一个可能的答案列表。在这种情况下,让我们引导 GPT-3 只用“积极”或“消极”来回应。
在我们的指令中包含可能的响应选项(在本例中是二元选择),会促使 GPT-3 仅使用两个选项中的一个来响应,而不是之前过于自然的响应
结果与二元分类器更加一致,其中 GPT-3 现在仅使用给定的两个选项进行响应。从这里我们可以更改标签名称,只要它们在语义上合适即可。
LLM 可以解读并分配语义上适当的标签,只要它们具有语义意义
我们可以使用少样本学习实现类似的结果吗?可能,但这个提示更简洁,我们不需要花时间举例子。
尝试不同的提示,找到最有效的方法
我们可以继续提供更多关于如何设计提示的技巧和窍门,但最好的方法是尝试相同基本提示的变体,看看哪种效果最好。例如:
- 当尝试小样本学习时,也可以尝试加入直接指令
- 重新表述直接指令集,使其更简洁或更不简洁(例如,以我们之前的例子,只说“翻译”,并扩展指令说“从英语翻译成西班牙语”。
- 尝试不同的角色关键词,看看它如何影响响应风格
- 在小样本学习中使用更少或更多的示例
归根结底,快速工程就是要找到正确的说明、示例和格式组合,以便从 LLM 获得最佳和最一致的回复。充分利用 Playground 找到适合您的提示结构,然后使用Humanloop等工具尝试大量示例,看看它在现实世界数据上的表现如何。
概括
我们已经了解了几个关于如何开始使用快速工程的技巧。简要回顾一下:
- 使用清晰、直接、简洁的指令
- 尝试“完成这个句子”提示以获得更自然的回答
- 使用任务的示例(少量学习)
- 将提示指令与明确的最终目标保持一致
- 使用角色关键词来改变回应的风格和语气
- 通过在提示中列出期望的回答来限制 LLM 的回答
- 尝试各种提示的变化,看看哪种最适合您!
继续使用这些新发现的技能开始工程提示,并记住,如果一开始你没有成功,请再次尝试(提示的不同变体)!