提示工程的工作原理
由于 OpenAI 模型的训练方式,有一些特定的提示格式效果特别好,并能带来更有用的模型输出。 OpenAI 官方提示工程指南通常是获取提示编写技巧的最佳起点。
下面我们介绍一些我们认为效果不错的提示格式,但也欢迎探索不同格式,它们可能更适合你的任务。
经验法则和示例
注意:"{text input here}" 是实际文本/上下文的占位符
1. 使用最新模型
为获得最佳结果,我们通常建议使用最新、最强大的模型。较新的模型往往更容易进行提示工程。
注意:为推理模型编写提示与为 GPT 模型编写提示时,有一些差异需要考虑。更多详情请见此处。
2. 将指令放在提示开头,并使用 ### 或 """ 分隔指令和上下文
效果较差 ❌:
将下面的文本总结为要点列表,列出最重要的内容。
{text input here}更好 ✅:
将下面的文本总结为要点列表,列出最重要的内容。
文本:"""
{text input here}
"""3. 尽可能具体、描述清楚且详细地说明所需的上下文、结果、长度、格式、风格等
具体说明上下文、结果、长度、格式、风格等
效果较差 ❌:
写一首关于 OpenAI 的诗。 更好 ✅:
以 {famous poet} 的风格,写一首关于 OpenAI 的简短励志诗,重点关注近期 DALL-E 产品发布(DALL-E 是一种文本转图像的机器学习模型)4. 通过示例阐明所需的输出格式
效果较差 ❌:
提取下面文本中提到的实体。提取以下 4 类实体:公司名称、人物姓名、具体主题和主题。
文本:{text}展示并说明——当向模型展示具体格式要求时,它们响应得更好。这也使以编程方式可靠地解析多个输出变得更容易。
更好 ✅:
提取下面文本中提到的重要实体。先提取所有公司名称,然后提取所有人物姓名,再提取符合内容的具体主题,最后提取总体主题
期望格式:
公司名称:<comma_separated_list_of_company_names>
人物姓名:-||-
具体主题:-||-
总体主题:-||-
文本:{text}5. 从零样本开始,然后少样本;如果都不起作用,再进行微调
✅ 零样本
从下面的文本中提取关键词。
文本:{text}
关键词:✅ 少样本 - 提供几个示例
从下面对应的文本中提取关键词。
文本 1:Stripe 提供 API,网页开发者可用其将支付处理集成到自己的网站和移动应用中。
关键词 1:Stripe、支付处理、API、网页开发者、网站、移动应用
##
文本 2:OpenAI 训练了先进的语言模型,它们非常擅长理解和生成文本。我们的 API 提供对这些模型的访问,可用于解决几乎任何涉及语言处理的任务。
关键词 2:OpenAI、语言模型、文本处理、API。
##
文本 3:{text}
关键词 3:✅ 微调:点击此处查看微调最佳实践。
6. 减少“空泛”和不精确的描述
效果较差 ❌:
此产品的描述应相当简短,只需几句话,不要太长。更好 ✅:
用一个 3 到 5 句话的段落来描述此产品。7. 与其只说不要做什么,不如说明应该做什么
效果较差 ❌:
以下是智能体与客户之间的对话。不要询问用户名或密码。不要重复。
客户:我无法登录我的账户。
智能体:更好 ✅:
以下是智能体与客户之间的对话。智能体将尝试诊断问题并建议解决方案,同时避免询问任何与个人身份信息(PII)相关的问题。不要询问个人身份信息,例如用户名或密码,而是将用户引导至帮助文章 www.samplewebsite.com/help/faq
客户:我无法登录我的账户。
智能体:8. 代码生成专用 - 使用“引导词”将模型引向特定模式
效果较差 ❌:
# 编写一个简单的 Python 函数,要求:
# 1. 让我输入一个以英里为单位的数字
# 2. 将英里转换为公里在下面的代码示例中,添加“import”会提示模型应开始用 Python 编写。(同样,“SELECT” 是 SQL 语句开头的一个好提示。)
更好 ✅:
# 编写一个简单的 Python 函数,要求:
# 1. 让我输入一个以英里为单位的数字
# 2. 将英里转换为公里
import9. 使用“生成任意内容”功能
开发者可以使用'生成任意内容'功能来描述任务或期望的自然语言输出,并获得量身定制的提示。
了解更多关于使用'生成任意内容'功能的信息。
参数
通常,我们发现 `model` 和 `temperature` 是最常用于改变模型输出的参数。
`model` - 性能更高的模型通常更昂贵,延迟也可能更高。
`temperature` - 衡量模型输出较低概率 Token 的频率。
temperature越高,输出就越随机(通常也越有创意)。不过,这并不等同于“真实性”。对于大多数事实性用例,例如数据提取和真实问答,temperature设为 0 最佳。`max_completion_tokens`(最大长度)- 不控制输出长度,而是 Token 生成的硬性截断上限。理想情况下,你不会经常触及此限制,因为模型会在它认为已完成时停止,或在遇到你定义的停止序列时停止。
`stop`(停止序列)- 一组字符(Token),生成它们时会使文本生成停止。
有关其他参数说明,请参阅 API 参考。
