提示词的基本原理适用于所有模型。本指南涵盖 OpenAI 模型特有的内容,包括 ChatGPT 应用和 API,以及它们的行为在哪些地方应当改变你的写法。
模型名称和限制经常变化,因此本指南描述的是历代模型中保持稳定的行为。当前的模型列表请查看 OpenAI 的文档。
需要不同提示词的两类模型
OpenAI 提供通用聊天模型和推理模型。这种区别比模型名称更重要。
| 通用聊天模型 | 推理模型 | |
|---|---|---|
| 工作方式 | 直接回答 | 回答前在内部思考 |
| 最佳提示词风格 | 明确的分步指令 | 目标、约束和成功标准 |
| “一步一步地思考” | 可能有帮助 | 没必要;可能有害 |
| 示例 | 常常有用 | 先不加示例试试 |
| 成本与延迟 | 较低 | 较高,可通过推理强度调节 |
一种有用的思路:向聊天模型交代任务,就像对一位需要流程的称职新手;向推理模型交代任务,就像对一位需要目标的资深同事。
消息角色
API 接收带角色的消息。应用作者的指令放在系统消息里,较新的 OpenAI API 称之为 developer 消息。用户输入放在用户消息里。模型会优先遵循 developer 指令。
把常驻规则、角色和输出格式放进 developer 消息。把任务及其数据放进用户消息。参阅系统提示词与角色提示词。
在 ChatGPT 应用中,自定义指令和项目指令起的是系统消息的作用。
要字面、要明确
近期的 OpenAI 模型会紧密而字面地遵循指令。由此有两点:
- 它们做的是你说的,而不是你暗示的。 如果你除了要求的修复之外还想要建议,就两者都要提。
- 通常一句清晰的话就能纠正一种行为。 无需大写,也无需重复。过度强调可能导致某条规则被过度应用。
用 Markdown 和分隔符组织结构
OpenAI 模型能很好地处理用 Markdown 标题和列表组织的指令,也能很好地处理用 XML 风格标签包裹的文档和输入。
## Task
Summarize the incident report for the on-call team.
## Requirements
- 5 bullet points.
- Include root cause, customer impact, and fix.
## Output format
A markdown list. No introduction.
<report>
{{report}}
</report>
长上下文
当提示词包含大型文档时,把指令同时放在开头和结尾。如果只能放一次,就放在文档之前。这遵循的是 OpenAI 自己关于长上下文提示词的建议。
结构化输出(Structured Outputs)
对于代码要解析的内容,使用 API 的 Structured Outputs 功能,并采用严格模式的 JSON Schema。响应将被约束在该 schema 之内,从而消除一整类解析失败。
- 给字段起好名字并写好描述:模型会读取 schema。
- 对固定取值集合使用枚举。
- 如果想要解释,把推理字段放在结果字段之前。
- 仍要验证:响应可能在输出上限处被截断,或被拒绝。
更多内容参阅结构化输出提示词。
函数调用
工具由名称、描述和参数 schema 定义。描述就是模型用来决定何时调用该工具的提示词,所以要写明它做什么、何时使用、返回什么。严格模式会把参数约束在 schema 之内。参阅面向 AI 智能体的提示词。
推理强度
推理模型提供一个设置,用来控制花多少精力思考。简单的提取和分类用低强度,多步分析和困难的代码用较高强度。调整这个设置,比在提示词里添加推理指令更有效。
token 计数是精确的
OpenAI 公开了它的分词器,因此你可以离线统计提示词的 token 数,在发送之前就知道输入成本。PromptFlowEngine 对 OpenAI 模型使用这些分词器,并把结果标注为精确。可以在工作区检查提示词,也可以参阅 token 优化。
提示词缓存会自动应用于超过最小长度的重复提示词前缀,所以请把稳定的内容放在前面,把可变的内容放在最后。
在 ChatGPT 应用中使用提示词
- 上下文只给一次。 对于常驻偏好,使用自定义指令或项目,而不是反复输入。
- 话题变化时开启新对话。 旧指令会在长对话中残留。
- 附上材料。 上传文件,而不是描述它。
- 要求给出格式。 表格、清单或字数上限。
- 检查记忆。 如果已保存的记忆以你不想要的方式引导回答,请查看或停用它们。
- 不要粘贴密钥。 聊天里的密钥和客户数据已经脱离了你的控制。
PromptFlowEngine Chrome 扩展可以在 ChatGPT 内部工作:它会分析提示词输入框里的草稿,重构松散的请求,并在草稿含有凭据时发出警告。
使用 OpenAI 模型的常见错误
| 错误 | 后果 | 修正 |
|---|---|---|
| 对推理模型给出分步指令 | 更慢,但没有更好 | 说明目标和约束 |
| 只用文字要求返回 JSON | 偶尔出现无效输出 | 使用 Structured Outputs |
| 指令被埋在长文档下面 | 指令被低估 | 在文档之后重复一遍 |
| 对每条规则都加强调 | 规则被过度应用 | 用平实的陈述;解释原因 |
| 按字符数估算 token | 预算失准 | 用分词器计数 |
优化 ChatGPT 提示词
- 在第一行说明任务。
- 添加受众、约束和输出格式。
- 用标签包裹粘贴的材料。
- 删除冗词和重复。
- 用真实输入测试并比较版本。
PromptFlowEngine 提示词优化器会完成第 3 和第 4 步,并验证没有丢失任何要求。
可以与 Claude 提示词指南和 Gemini 提示词指南对照阅读。