Stanford大学公开课 - 提示词工程指南
CS146S: The Modern Software Developer
https://themodernsoftware.dev/
提示词工程指南
提示词工程是一门较新的学科,旨在开发并优化提示词,以便在各类应用场景与研究课题中高效使用语言模型(LM)。掌握提示词工程技能,有助于更好地理解大语言模型(LLM)的能力与局限。
研究人员运用提示词工程,提升大语言模型在各类常见及复杂任务上的表现,例如问答、算术推理等。开发人员则借助提示词工程,设计可靠且高效的提示技术,实现大语言模型与其他工具的对接。
提示词工程并非仅设计与编写提示词,它涵盖了一系列用于与大语言模型交互、基于大语言模型进行开发的技能与方法。掌握这一技能,对对接、构建大语言模型,以及理解其能力至关重要。你可以通过提示词工程提升大语言模型的安全性,还能打造全新功能,例如为大语言模型融入领域知识与外部工具。
鉴于业界对基于大语言模型进行开发的高度关注,我们推出了这份全新的提示词工程指南。其中收录了提示词工程领域的最新论文、进阶提示技术、学习教程、针对特定模型的提示指南、讲座、参考文献、大语言模型新能力,以及相关工具。
简介
提示词工程是一门相对新兴的学科,致力于开发和优化提示词,以便高效地应用和基于大语言模型(LLMs)构建各类应用与使用场景。
提示词工程相关技能有助于更好地理解大语言模型的能力与局限性。研究人员利用提示词工程提升大语言模型的安全性,以及在问答、算术推理等众多常见且复杂任务上的性能。开发人员则通过提示词工程设计稳定高效的提示技术,实现大语言模型与其他工具的交互。
本全面指南涵盖提示词工程的理论与实践内容,以及如何运用最优提示词技术与大语言模型交互并进行相关开发。
除非另有说明,所有示例均通过 OpenAI Playground 在 gpt-3.5-turbo 模型上测试,模型采用默认配置,即 temperature=1、top_p=1。这些提示词同样适用于其他与 gpt-3.5-turbo 能力相近的模型,但模型输出结果可能存在差异。
大语言模型(LLM)参数设置
在设计与测试提示词时,你通常会通过 API 与大语言模型交互。你可以配置若干参数,以获得不同的提示词效果。调整这些设置对提升回复的可靠性与理想程度至关重要,往往需要一定的实验才能找到适合你场景的最佳参数。以下是使用不同大语言模型服务时常见的参数设置:
温度(Temperature)
简单来说,temperature 数值越低,结果越具确定性,模型总会选择概率最高的下一个词元。提高温度会增加随机性,鼓励生成更多样、更有创意的输出。本质上是提升了其他可能词元的权重。
在实际应用中,事实类问答等任务适合用较低温度,以获得更准确、简洁的回答;诗歌创作或其他创意类任务则适合提高温度。
Top P(核采样)
这是一种与温度配合使用的采样技术,也叫核采样,可以控制模型的确定性。
- 想要精确、事实准确的答案,就调低 Top P;
- 想要更多样化的回复,就调高 Top P。
使用 Top P 意味着模型只考虑累计概率达到top_p的词元。因此,较低的top_p会让模型只选最确定的词,较高的top_p则会让模型考虑更多可能性(包括概率较低的词),从而生成更多样的结果。
通用建议:只调整温度或 Top P 其中一个,不要同时调整。
最大长度(Max Length)
你可以通过调整 max length 控制模型生成的词元数量。设定最大长度有助于避免过长或无关的回复,并控制成本。
停止序列(Stop Sequences)stop sequence 是一段会让模型停止生成词元的字符串。设置停止序列是控制回复长度与结构的另一种方式。例如,你可以把“11”设为停止序列,让模型生成不超过 10 条的列表。
频率惩罚(Frequency Penalty)frequency penalty 会根据某个词元在提示词与回复中已出现的次数,按比例对其施加惩罚。频率惩罚越高,单词重复出现的概率越低。该设置通过对高频出现的词元加重惩罚,减少回复中的重复现象。
存在惩罚(Presence Penalty)presence penalty 同样对重复词元施加惩罚,但与频率惩罚不同:所有重复词元受到的惩罚相同——出现 2 次和出现 10 次的词惩罚力度一样。该设置用于防止模型频繁重复短语。
- 想要多样化、创意性文本,可提高存在惩罚;
- 想要模型保持专注,可降低存在惩罚。
与温度和 Top P 类似,通用建议:只调整频率惩罚或存在惩罚其中一个,不要同时调整。
在开始基础示例前,请记住:你得到的结果可能会因所用大语言模型的版本不同而有所差异。
提示词基础
向大语言模型发送提示词
简单的提示词就能实现很多功能,但结果质量取决于你提供的信息多少以及提示词设计得是否精良。一个提示词可以包含指令、问题,还能加入上下文、输入内容或示例等细节。用好这些元素能更有效地引导模型,提升输出质量。
我们先看一个最简单的提示词示例:
提示词
1 | |
输出:
1 | |
如果你在使用 OpenAI Playground 或其他大语言模型调试平台,可以按照下面截图的方式输入提示词:
下面是 OpenAI Playground 入门教程:
需要注意:使用 gpt-3.5-turbo、gpt-4 这类 OpenAI 对话模型时,提示词可以用三种角色来组织:system(系统)、user(用户)和 assistant(助手)。系统消息不是必需的,但能统一设定助手的整体行为。上面的例子只用到了用户消息,可直接向模型提问。
为简洁起见,除非特别说明,本指南所有示例都只使用 user 消息来提示 gpt-3.5-turbo。例子中的 assistant 消息对应模型的回复。你也可以自定义助手消息,提供期望行为的示例。
关于对话模型的更多用法可参考这里。
从上面的例子可以看到,语言模型会根据上下文 "The sky is" 生成通顺的续文。但这个结果可能不符合你的实际需求,甚至偏离预期。
这个简单例子恰恰说明:必须提供更明确的上下文与指令,告诉模型你具体想做什么。而这正是提示词工程的核心。
我们稍微优化一下:
提示词:
1 | |
输出:
1 | |
效果是不是更好了?你明确让模型“补全句子”,模型就严格按指令执行。
这种通过设计优质提示词来引导模型完成任务的方法,就是本指南所讲的提示词工程。
上面的例子只是现代大语言模型能力的冰山一角。如今的 LLM 可以完成文本摘要、数学推理、代码生成等各种高级任务。
提示词格式
你已经试过最简单的提示词。标准提示词格式如下:
1 | |
或
1 | |
也可以改成常见问答(QA)格式(很多问答数据集都用这种):
1 | |
这种直接提问、不提供任何示例的方式,称为零样本提示(zero-shot prompting)。部分大语言模型支持零样本提示,但效果取决于任务复杂度、知识领域以及模型的训练任务偏向。
一个具体示例:
提示词
1 | |
在较新的模型中,Q: 也可以省略,模型能自动识别这是问答任务。提示词可简化为:
提示词
1 | |
在标准格式基础上,一种常用且高效的技巧是少样本提示(few-shot prompting),即提供少量示例。格式如下:
1 | |
对应 QA 格式:
1 | |
注意:并非必须用 QA 格式,提示词格式取决于任务。比如做简单分类时可以这样给示例:
提示词:
1 | |
输出:
1 | |
少样本提示支持上下文学习(in-context learning),即模型通过少量演示就能学会任务。我们会在后续章节详细介绍零样本与少样本提示。