原文出处:Prompt Engineering - Introduction 原作者:DAIR.AI · Elvis Saravia · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与 DAIR.AI 所有。
提示词导论
提示工程(prompt engineering)是一门比较新的学科,研究如何开发和优化提示词(prompt),把语言模型(LM)高效地用在各种应用和研究课题上。掌握提示工程能帮我们弄清大语言模型(LLM)的能力边界和局限。研究者用它扩大 LLM 在问答、算术推理等常见与复杂任务上的能力;开发者用它设计与 LLM 及其他工具对接的、稳健有效的提示技巧。
本指南讲解标准提示词的基础,让你对"怎么用提示词与大语言模型交互、给它下指令"有一个整体印象。
除非特别说明,所有示例都在 OpenAI 的 playground(网页试验场)里用 text-davinci-003 测过,采用默认配置,比如 temperature=0.7、top-p=1。
本篇目录:
- 基本提示词
- 关于 LLM 设置参数
- 标准提示词格式
- 提示词的组成要素
- 设计提示词的通用技巧
基本提示词
用提示词已经能做成不少事,但结果质量取决于你提供了多少信息。一条提示词可以包含传给模型的 instruction(指令)或 question(问题),也可以带上 inputs(输入数据)、examples(示例)这类细节。
下面是一个最简单的提示词:
提示词
The sky is
输出 ``` blue
The sky is blue on a clear day. On a cloudy day, the sky may be gray or white. ```
提示词只给了半句话"The sky is"(天空是),模型顺着上下文往下续写,补出了一段语义通顺的文字。
可以看到,给定 "The sky is" 这个上下文,语言模型输出的是一段说得通的延续文字。这个输出可能出乎意料,也可能离你要完成的任务很远。
这个基础例子同时凸显了一件事:要想拿到想要的结果,你得提供更多上下文、说明你到底要做什么。
试着改进一点:
提示词 ``` Complete the sentence:
The sky is ```
输出
so beautiful today.
开头加了 "Complete the sentence:"(把句子补全),模型就从漫无边际的续写变成照着要求补句子。
好点了吗?因为我们告诉模型去补全句子,结果就贴合要求多了,它完全照我们说的做("complete the sentence",补全句子)。这种为让模型完成任务而设计最优提示词的做法,就是提示工程。
上面的例子简单展示了今天的 LLM 能做什么。现在的 LLM 可以处理各种高级任务,从文本摘要到数学推理再到代码生成。
关于 LLM 设置参数
操作提示词时,你通过 API 或直接跟 LLM 交互。有几个参数可以配置,调一调,结果就不一样。
温度(Temperature):简单说,温度越低,结果越确定,模型总会选概率最高的下一个令牌(token,模型处理文本的最小单位,约等于一个词或词根)。把温度调高,随机性变大,更容易得到多样、有创造性的输出,相当于给其他候选令牌更大的权重。应用上,事实类问答适合低温度,回答更讲事实、更简练;写诗等创意任务适合调高温度。
Top_p:类似地,top_p 是一种配合温度使用的采样技术,叫核采样(nucleus sampling),可以控制模型生成回答时有多确定。要精确、符合事实的答案,把这个值调低;要更多样的回答,调高。
通常的建议是:两个参数只动一个,别两个都改。
开始看示例之前请注意,结果会随你使用的 LLM 版本不同而变化。
标准提示词格式
上面我们试过一条很简单的提示词。标准提示词的格式如下:
<Question>?
很多问答(QA)数据集采用 QA 格式,可以写成:
Q: <Question>?
A:
有了上面的标准格式,一种流行且有效的提示技巧是少样本提示(few-shot prompting):在提示词里给出示范例子。少样本提示可以这样组织:
```
```
前几组是示范用的问答对,最后只留问题不写答案,让模型照着例子的路子作答。
你也可以猜到,它的 QA 格式版本长这样:
```
Q:
Q:
Q:
Q:
注意,不必非用 QA 格式,格式取决于手头的任务。比如做一个简单的分类任务,可以用几个示范例子把任务演示出来:
提示词
This is awesome! // Positive
This is bad! // Negative
Wow that movie was rad! // Positive
What a horrible show! //
每行是一句话加 // 分隔的情感标签。前三行示范"好话标 Positive、坏话标 Negative",第四行只给了句子,模型照格式补出 Negative。
输出
Negative
少样本提示让模型具备上下文内学习(in-context learning)能力:只看几个例子就能学会任务。后面的指南会看到更多实际用法。
提示词的组成要素
随着我们覆盖越来越多的示例和应用,你会注意到提示词由若干要素构成。
一条提示词可以包含下面任意几种成分:
指令(Instruction):你想让模型完成的具体任务或指令
上下文(Context):外部信息或补充背景,引导模型给出更好的回答
输入数据(Input Data):我们想获得回答的输入或问题
输出指示(Output Indicator):说明输出的类型或格式
这些成分不必样样齐备,格式看任务而定。后面的指南会给出更具体的例子。
设计提示词的通用技巧
设计提示词时,记住下面几条经验:
从简单开始
刚上手设计提示词时就要明白:这是个迭代过程,要大量试验才能拿到最优结果。从 OpenAI 或 Cohere 的 playground 这类简单工具起步就很好。
先写简单提示词,为了拿到更好的结果,再逐步添加要素和上下文。正因如此,给提示词的每次修改留下版本记录非常重要。读下去你会看到很多例子说明:具体、简单、简短的提示词往往效果更好。
任务很大、包含很多子任务时,可以先把它拆成更简单的子任务,逐个做好再往上搭。这样一开始就不会给提示词设计堆进太多复杂度。
指令
对各类简单任务,你可以用命令式动词来指示模型该做什么,比如 "Write"(写)、"Classify"(分类)、"Summarize"(摘要)、"Translate"(翻译)、"Order"(排序)。
记住,什么写法最有效,还得靠大量试验。换不同的关键词、上下文、数据,试不同的指令,看哪种最适合你的场景和任务。通常,上下文跟你要做的任务越相关、越具体,效果越好。采样和补充上下文的重要性,后面的指南会讲。
也有人建议把指令放在提示词开头,并用 "###" 这类清晰的分隔符把指令和上下文分开。
比如:
提示词 ```
Instruction
Translate the text below to Spanish:
Text: "hello!" ```
输出
¡Hola!
用 "### Instruction ###" 标出指令,要求把 "hello!" 翻译成西班牙语,模型输出 ¡Hola!(西班牙语的"你好")。
具体
对你要模型做的指令和任务,说得非常具体。提示词越有描述性、越细致,结果越好。当你心中有想要的产出或风格时,这一点尤其重要。没有什么特定的令牌或关键词能保证好结果,重要的是格式清晰、描述到位。想要特定格式的输出,在提示词里放示例非常有效。
设计提示词时还要考虑长度,提示词不能无限长。具体到什么程度、细致到什么程度,需要拿捏。堆太多不必要的细节未必是好办法,细节应当相关、对任务有贡献。这块得大量试验。我们鼓励做大量实验和迭代,为你的应用场景优化提示词。
举个例子,试一条简单提示词,从一段文字里抽取特定信息:
提示词 ``` Extract the name of places in the following text.
Desired format:
Place:
Input: "Although these developments are encouraging to researchers, much is still a mystery. “We often have a black box between the brain and the effect we see in the periphery,” says Henrique Veiga-Fernandes, a neuroimmunologist at the Champalimaud Centre for the Unknown in Lisbon. “If we want to use it in the therapeutic context, we need to understand the mechanism." ```
这条提示词要求从输入文本里抽取地名,并按 "Place: 逗号分隔列表" 的格式输出。
输出
Place: Champalimaud Centre for the Unknown, Lisbon
模型按要求找出了里斯本的昌帕利莫未知中心(Champalimaud Centre for the Unknown,一家神经免疫研究所)。
输入文本来自这篇 Nature 文章。
别含糊
前面说要细致、要改进格式,于是容易掉进另一个坑:在提示词上自作聪明,写出含糊的描述。很多时候,明确、直给反而更好。道理和有效沟通一样:话说得越直白,信息传得越准。
比如你想了解提示工程这个概念,可能这么写:
Explain the concept of prompt engineering. Keep the explanation short, only a few sentences, and don't be too descriptive.
上面这条没说清要写几句话、用什么风格。这样的提示词也能拿到还行的回答,但更好的写法是具体、简短、直奔主题,比如:
Use 2-3 sentences to explain the concept of prompt engineering to a high school student.
这条把句数(2-3 句)和听众(高中生)都钉死了。
说要做什么,别说不做什么
设计提示词的另一条常见经验:别强调不要做什么,要说应该做什么。这逼着你把笔墨集中在让模型答好的细节上,表述也更具体。
下面这个电影推荐聊天机器人的例子,恰恰在我不要它做的事上翻车了,原因就是指令把重点写在了"不要做什么"上。
提示词 ``` The following is an agent that recommends movies to a customer. DO NOT ASK FOR INTERESTS. DO NOT ASK FOR PERSONAL INFORMATION.
Customer: Please recommend a movie based on my interests. Agent: ```
指令大写强调"不要询问兴趣、不要询问个人信息",结果 Agent 还是回头问用户想看什么类型,正撞在禁令上。
输出
Sure, I can recommend a movie based on your interests. What kind of movie would you like to watch? Do you prefer action, comedy, romance, or something else?
换一种写法:
提示词 ``` The following is an agent that recommends movies to a customer. The agent is responsible to recommend a movie from the top global trending movies. It should refrain from asking users for their preferences and avoid asking for personal information. If the agent doesn't have a movie to recommend, it should respond "Sorry, couldn't find a movie to recommend today.".
Customer: Please recommend a movie based on my interests. Agent: ```
新指令先讲清楚该干什么(从全球热门榜里挑一部、没有可推荐时怎么回复),再补不该干什么。
输出
Sorry, I don't have any information about your interests. However, here's a list of the top global trending movies right now: [list of movies]. I hope you find something you like!
模型按指令行动了:坦承不知道用户兴趣,直接给出热门片单,没有追问。
上面部分例子借鉴自《使用 OpenAI API 做提示工程的最佳实践》一文。