原文出处:Prompt Engineering Fundamentals 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。
(这是原课程第 4 课译文的下篇,从"提示词的构成"讲到课后作业;模型原理与编造问题见上篇。译文按资料库规范不保留图片。)
提示词的构成
前面我们弄清了提示工程为什么重要,现在来看看提示词是怎么构成的,才好评估各种技巧,把提示词设计得更有效。
基础提示词
从最简单的提示词开始:只发一段文本给模型,不带任何其他语境。举个例子,我们把美国国歌的第一句发给 OpenAI 的 Completion API,它立刻把后面的内容"补全"了出来,这就是基础的预测行为。
| 提示词(输入) | 补全(输出) |
|---|---|
| Oh say can you see | 听上去你是在起头唱美国国歌《星条旗永不落》(The Star-Spangled Banner)。完整歌词是…… |
复杂提示词
现在给这条基础提示词加上语境和指令。Chat Completion API 允许我们把复杂提示词组织成一组"消息":
- 输入/输出配对,分别对应用户的输入和助手(assistant)的回答。
- 系统消息(system message),为助手的行为或性格设定语境。
请求就变成下面这个样子,其中的令牌化(tokenization)会有效地从语境和对话中提取相关信息。这时候,改动系统语境对补全质量的影响,可能与用户输入的影响相当。
python
response = client.responses.create(
model="gpt-5-mini",
input=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
指令提示词
上面的例子里,用户提示词是一个简单的文本问句,可以理解为一次信息查询。用指令(instruction)提示词,我们可以借这段文字把任务说得更具体,给 AI 更明确的指引。看例子:
| 提示词(输入) | 补全(输出) | 指令类型 |
|---|---|---|
| Write a description of the Civil War(写一段关于美国内战的描述) | 返回了一个简单段落 | 简单 |
| Write a description of the Civil War. Provide key dates and events and describe their significance(写一段关于美国内战的描述,给出关键日期和事件,并说明其意义) | 返回一个段落,后面跟着关键事件日期和说明的清单 | 复杂 |
| Write a description of the Civil War in 1 paragraph. Provide 3 bullet points with key dates and their significance. Provide 3 more bullet points with key historical figures and their contributions. Return the output as a JSON file(用 1 个段落写美国内战的描述。给 3 个要点列出关键日期及其意义,再给 3 个要点列出关键历史人物及其贡献。输出为 JSON 格式) | 返回更详细的内容,以 JSON 格式排布在文本框里,可以复制存成文件并做校验 | 复杂,带格式 |
主要内容
上面的例子里,提示词仍然相当开放,由 LLM 自己决定预训练数据里哪部分相关。换成"主要内容"(primary content)的设计模式,输入文本被分成两部分:
- 一条指令(要做什么动作)
- 相关内容(影响这个动作的材料)
下例的指令是"用 2 句话总结这段内容":
| 提示词(输入) | 补全(输出) |
|---|---|
| Jupiter is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets in the Solar System combined. Jupiter is one of the brightest objects visible to the naked eye in the night sky, and has been known to ancient civilizations since before recorded history. It is named after the Roman god Jupiter.[19] When viewed from Earth, Jupiter can be bright enough for its reflected light to cast visible shadows,[20] and is on average the third-brightest natural object in the night sky after the Moon and Venus. 用简短的 2 句话总结这段内容(木星是距太阳第五远的行星,也是太阳系中最大的一颗。它是气态巨行星,质量约为太阳的千分之一,却超过太阳系其余所有行星质量总和的两倍半。木星是夜空中肉眼可见的最亮天体之一,早在有文字记载之前就被古代文明所知。它以罗马神朱庇特命名。从地球上看,木星足够明亮,其反射的光甚至能投下可见的影子,平均而言它是夜空中仅次于月亮和金星的第三亮自然天体。) |
木星是距太阳第五远的行星,也是太阳系中最大的一颗,以夜空中最亮天体之一著称。它以罗马神朱庇特命名,是一颗气态巨行星,质量超过太阳系其余所有行星总和的两倍半。 |
主要内容这一段可以用不同方式来配合指令,让指令更有效:
- 示例(Examples):不用明说模型该做什么,给它几个照着做的例子,让它自己归纳规律。
- 线索(Cues):在指令后面接一个"话头",把补全引向更相关的方向。
- 模板(Templates):带占位符(变量)的可复用"提示词配方",填入数据就能用于具体场景。
我们逐个看实际效果。
使用示例
这种做法是用主要内容给模型"喂"几个针对该指令的期望输出例子,让它归纳出目标输出的规律。按给的例子数量,可分为零样本提示(zero-shot prompting)、单样本提示(one-shot)、少样本提示(few-shot)等。
这时提示词由三部分组成:
- 任务描述
- 期望输出的几个例子
- 一个新例子的开头(它同时充当了隐含的任务描述)
| 学习方式 | 提示词(输入) | 补全(输出) |
|---|---|---|
| 零样本(zero-shot) | "The Sun is Shining". Translate to Spanish | "El Sol está brillando". |
| 单样本(one-shot) | "The Sun is Shining" => "El Sol está brillando". "It's a Cold and Windy Day" => |
"Es un día frío y ventoso". |
| 少样本(few-shot) | 球员跑完各个垒包 => 棒球 球员发出 ace 球 => 网球 球员打出 6 分球 => 板球 球员完成一记扣篮 => |
篮球 |
注意:零样本那条必须明确下指令("Translate to Spanish"),而单样本那条里这个指令就被例子隐含了,不用明说。少样本的例子则说明:给更多例子,模型不用额外指令就能归纳得更准。
提示线索
使用主要内容的另一种技巧,是给模型"线索"而不是示例。这时我们相当于往正确方向推它一把:用一个片段起头,这个片段本身就长着我们想要的回答格式,模型会顺着这个话头往下写。
| 线索数量 | 提示词(输入) | 补全(输出) |
|---|---|---|
| 0 | 木星简介段落(见上文,英文原文) 总结这段内容 |
木星是太阳系中最大的行星,距太阳排第五。它是气态巨行星,质量约为太阳的千分之一,但比其他所有行星加起来还重。古代文明很早就知道木星,它在夜空中肉眼易见。 |
| 1 | 木星简介段落(同上) 总结这段内容 What we learned is that Jupiter(我们学到的是:木星) |
接续写作 "is the fifth planet from the Sun and the largest in the Solar System...",即"是距太阳第五远的行星,也是太阳系中最大的一颗……",之后内容与上面总结类似。 |
| 2 | 木星简介段落(同上) 总结这段内容 Top 3 Facts We Learned:(我们学到的 3 个要点:) |
1. 木星是距太阳第五远的行星,也是太阳系中最大的。 2. 它是气态巨行星,质量约为太阳的千分之一…… 3. 木星自古就被肉眼可见…… |
也就是说,同样一句总结指令,只要预先给出回答的"头",模型就会照着这个格式和语气把内容续写完。
提示词模板
提示词模板是一份预先定义好的提示词配方,可以存下来按需复用,规模化地带来更一致的用户体验。最简单的形态就是一组提示词示例,比如 OpenAI 官方给的这份,既提供了可交互的提示词组件(用户消息和系统消息),也给出了 API 调用的请求格式,方便复用。
复杂一点的形态像 LangChain 的这个例子,模板里含占位符,可以用来自不同来源的数据(用户输入、系统语境、外部数据源等)替换,动态生成提示词。这样我们就能建一个可复用提示词的库,用程序化方式在规模化场景下保持一致的用户体验。
模板真正的价值在于:可以为垂直应用领域创建并发布"提示词库"(prompt libraries)。这类模板针对应用场景做过优化,带着领域语境和示例,让目标用户得到的回答更贴题、更准确。Prompts For Edu 仓库就是个好例子:它整理了一套教育领域的提示词库,重点覆盖教案设计、课程规划、学生辅导这类关键任务。
辅助内容
如果我们把提示词构成看作"指令(任务)+ 对象(主要内容)",那么辅助内容(secondary content)就是我们额外提供的语境,用来在某个方向上影响输出。它可以是调参说明、格式要求、主题分类等,帮模型把回答"校准"到用户想要的目标或预期上。
举个例子:假设有一份课程目录,里面列了教学大纲里所有可选课程的详细元数据(名称、描述、级别、标签、讲师等):
- 我们可以定义指令:"总结 2023 年秋季的课程目录"
- 用主要内容给出期望输出的几个例子
- 用辅助内容点出我们最在意的 5 个标签
这样,模型会照例子的格式给出总结;而结果涉及多个标签时,它会优先处理辅助内容里指定的那 5 个。
提示词最佳实践
既然知道了提示词怎么构成,就可以想想怎么按最佳实践来设计它们。这可以拆成两部分:摆正心态,用对技巧。
提示工程心态
提示工程是个试错过程,记住三条宽泛的指导原则:
-
懂领域很重要。 回答的准确性和相关性,取决于应用或用户所在的领域。用你的直觉和领域专业知识去定制技巧。比如,在系统提示词里定义领域专属的"人设",或在用户提示词里用领域专属的模板;提供带上领域语境的辅助内容;用领域内熟悉的线索和示例,把模型引向惯用的表达方式。
-
懂模型很重要。 我们知道模型天生带随机性,但不同模型实现之间也有差异:用的训练数据集不同(预训练知识不同)、提供的能力不同(API 或 SDK 各异)、优化的内容类型不同(代码、图像还是文本)。摸清你手上模型的长处和短处,用这份认知去排任务的优先级,或建一套贴合该模型能力的定制模板。
-
迭代与验证很重要。 模型在快速演进,提示工程的技巧也在快速演进。作为领域专家,你的应用可能有自己的语境和评判标准,这些未必适用于更大的社区。用提示工程工具和技巧给提示词构建"启动加速",然后靠你自己的直觉和领域经验去迭代、验证结果。把心得记下来,沉淀成知识库(比如提示词库),让其他人拿它当新的基线,未来的迭代更快。
最佳实践
下面是 OpenAI 和 Azure OpenAI 的从业者推荐的常见最佳实践:
| 做法 | 原因 |
|---|---|
| 评估最新模型。 | 新一代模型往往功能和质量更好,但也可能更贵。先评估影响,再决定是否迁移。 |
| 把指令和内容分开。 | 看看你的模型/供应商是否定义了定界符(delimiters),用来区分指令、主要内容和辅助内容。这能帮模型更准确地把权重分配给令牌。 |
| 具体、明确。 | 把想要的语境、结果、长度、格式、风格等细节说充分。回答的质量和一致性都会更好。把有效的写法存进可复用的模板。 |
| 多描述、给例子。 | 模型可能更吃"又演示又讲解"这一套。先用零样本(zero-shot):只给指令、不给例子;再升级成少样本(few-shot),补几个期望输出的例子。还可以打比方。 |
| 用线索起头。 | 给几个引导性的词或短语当话头,让模型顺着往下写,推向你要的结果。 |
| 该重复就重复。 | 有时你需要对模型把话讲两遍:指令放在主要内容前后各说一次,或者指令配上线索一起用。多迭代、多验证,看哪种管用。 |
| 顺序有讲究。 | 呈现信息的先后顺序会影响输出,示例的先后也不例外,因为模型有近因偏置(recency bias)。多试几种排列,找最管用的。 |
| 给模型留台阶。 | 给模型一个兜底(fallback)回答:当它因故无法完成任务时,可以输出这个。这能减少模型编出虚假内容的概率。 |
和所有"最佳实践"一样,具体效果随模型、任务和领域而变。把它们当起点,迭代出你自己最顺手的打法。每当有新模型、新工具出现,都要重新审视你的提示工程流程,重点放在流程的可扩展性和回答质量上。
作业
恭喜!你学完了本课!是时候拿真实例子检验一下这些概念和技巧了。
作业用一个 Jupyter Notebook 完成,练习可以交互式地做。你也可以自己往 Notebook 里加 Markdown 和代码单元格,独立探索各种点子与技巧。
开始之前,先 fork 本仓库,然后任选一种方式:
- (推荐)启动 GitHub Codespaces
- (或者)把仓库克隆到本地设备,配合 Docker Desktop 使用
- (或者)用你熟悉的 Notebook 运行环境直接打开这个 Notebook
接下来配置环境变量:
- 把仓库根目录的
.env.copy复制为.env,填上AZURE_OPENAI_API_KEY、AZURE_OPENAI_ENDPOINT和AZURE_OPENAI_DEPLOYMENT的值。怎么获取可回看上篇"练习沙盒"一节的设置步骤链接。
然后打开 Jupyter Notebook:
- 选好运行内核。如果用前两种方式,直接选开发容器自带的默认 Python 3.10.x 内核即可。
这样就能跑练习了。注意这里没有标准答案,就是靠试错去摸索,攒下"什么模型配什么领域该怎么写"的直觉。
也因此,本课不设代码参考答案;Notebook 里有标题为"My Solution:"的 Markdown 单元格,给出一个示例输出供参考。
知识检查
按合理的最佳实践看,下面哪条是好提示词?
- Show me an image of red car(给我看一张红色汽车的照片)
- Show me an image of red car of make Volvo and model XC90 parked by a cliff with the sun setting(给我看一张红色汽车的照片:沃尔沃 XC90,停在悬崖边,落日背景)
- Show me an image of red car of make Volvo and model XC90(给我看一张红色汽车的照片:沃尔沃 XC90)
答案:2。它是最好的提示词:说清了"要什么",还给了具体细节(不是随便一辆车,而是指定品牌型号),还描述了整体场景。3 次之,因为它的描述也算充分。
挑战任务
试试在这条提示词上用"线索"技巧,把句子接下去:"Show me an image of red car of make Volvo and "。看它回什么,再想想你可以怎么改进。
学完了,继续前进
想进一步了解提示工程的其他概念?去持续学习页面找这个主题的其他好资源。
接着去第 5 课看进阶提示技巧!