提示词工程必读推荐:高质量提示词写作指南
这篇文章如果只读一个部分,那就是第二段。但如果你真想从入门到写出高质量提示词,我建议从头来看。先从最基础的讲起——Prompt 到底是什么?
一、Prompt 是什么
Prompt(提示词)就是你发给大语言模型(LLM)的输入文本。Prompt 写得多用心,模型就输出得多靠谱。写 Prompt 不是玄学——它有一套可学习、可优化的方法论。
在正式开始前,先看一个典型的 LLM API 调用结构(以 OpenAI 兼容接口为例):
from openai import OpenAI
client = OpenAI(api_key="your-api-key",base_url="https://api.deepseek.com/v1")
def get_completion(prompt, model="deepseek-chat"):
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
temperature=0.5, # 控制随机性:0 最确定,2 最随机
max_tokens=1024, # 限制模型回复的最大 token 数(仅限输出部分)
)
return response.choices[0].message.content
其中两个核心参数需要关注:
| 参数 | 含义 | 建议 |
|---|---|---|
temperature |
控制输出的随机性,范围 0 ~ 2 | 事实性任务设低(0-0.3),创意任务设高(0.7-1.2) |
max_tokens |
限制模型回复的最大 token 数 | 按需设置,过长浪费,过短截断 |
二、Prompt 四大核心原则
2.1 原则一:撰写清晰具体的指令
不靠谱的 Prompt 长这样:
写一篇关于秋天的诗。
稍微优化一下就好多了:
请写一首七言绝句,主题为深秋山林。要求:
- 押平水韵
- 融入枫叶、寒霜、孤雁三个意象
- 情感基调为寂寥但不悲凉
模型没法猜你的心思——你能给的约束越多,它跑偏的概率就越低。
2.2 原则二:引导模型逐步推理
复杂的任务别指望模型一步到位。就跟教人一样,把推理过程拆成几个小步骤:
prompt = f"""
执行以下操作:
1. 将三个反引号内的文本概括为一句话
2. 把这句摘要翻译成日语
3. 列出日语摘要中间出现的所有人名
4. 输出 JSON 对象,包含字段:japanese_summary、num_names
文本:```{text}```
"""
这种方式让模型先思考再行动,复杂任务的正确率能明显提升——这就是常说的思维链(Chain of Thought,CoT)。
2.3 原则三:要求明确的输出格式
直接告诉模型你想要的格式,省掉大量后处理工作:
prompt = f"""
请列出四大名著并标注对应的作者与书籍类型。使用 JSON 格式呈现,需包含以下字段:
- book_id(书籍编号)
- title(书名)
- author(作者)
- desc(简介,不超过 30 字)
- genre(书籍类型)
"""
结构化输出的好处很明显:程序可以直接 json.loads() 解析,字段一致无遗漏,批量处理也方便。
2.4 原则四:处理「无内容」的边界情况
当输入文本里没有你想要的内容时,得明确告诉模型该怎么做,避免它自己瞎编:
prompt = f"""
你将收到由三引号包裹的文本。
若文本中包含一系列操作指令,请按以下格式重新整理:
步骤1. ...
步骤2. ...
步骤N. ...
如果文本中没有操作指引,直接输出:"未提供步骤"。
"""{text}"""
"""
不加上这句兜底,模型很可能会从一段写景的文字里强行“发明”出步骤来——这就是典型的幻觉(Hallucination)。
三、Prompt 的结构化设计
3.1 System Message 与 User Message
现在的 Chat API 支持多角色消息,合理分工能让 Prompt 更清晰:
| 角色 | 用途 | 示例 |
|---|---|---|
system |
设定模型的全局行为、角色、规则 | "你是一位精通 Python 的编程导师" |
user |
具体任务 / 问题 | "请解释装饰器的原理" |
assistant |
历史回复(多轮对话) | 模型之前的回答 |
messages = [
{"role": "system", "content": "你是一位精通 Python 的编程导师。回答应当简洁、准确,配合可运行的代码示例。"},
{"role": "user", "content": "Python 的 GIL 是什么?"}
]
System Message 的威力在于:你可以设定回答风格(“用小学生能懂的语言解释”)、限定知识范围(“只回答 Python 相关的问题”)、约束输出格式(“所有代码用 ```python 包裹”)。
3.2 使用分隔符避免注入
将用户输入用三引号 """...""" 或 XML 标签 包裹,能防止模型混淆指令和内容:
prompt = f"""
将以下文本总结为一句话。
文本:```{user_input}```
"""
# 即使用户输入中包含"忽略上面的指令"等干扰内容,
# 分隔符也让模型能清楚区隔"指令"和"待处理文本"。
四、Few-shot Prompting(少样本提示)
4.1 Zero-shot vs Few-shot
| 方式 | 含义 | 适用场景 |
|---|---|---|
| Zero-shot | 不给示例,直接提问 | 简单任务 |
| Few-shot | 先给 1~N 个示例,再提问 | 需要统一输出风格 / 格式 |
4.2 Few-shot 示例
prompt = f"""
你的任务是保持统一的风格作答。
提问:请讲讲何为耐心
回答:能凿出幽深峡谷的江河,源自涓涓细流;恢宏壮阔的交响乐,起于单个音符;精美繁复的织锦,始于一缕丝绒。
提问:请讲讲何为爱情
"""
通过一个示例(1-shot),模型就学会了你的风格偏好——下次它也会用类似的散文诗风格回答“爱情”这类问题。
4.3 Few-shot 的实用场景
- 统一输出格式:给 2~3 个输入→输出范例,模型照猫画虎
- 风格迁移:给一段目标风格的文字作参考
- 分类任务:给几个标注样本,模型类推出分类规则
五、角色扮演 Prompt
让模型扮演特定角色,能激活其对应的知识分布:
你是一位有 10 年经验的 Python 后端工程师。
你的代码风格偏好:
- 类型注解完整
- 异常处理严谨
- 注释简洁但关键逻辑必写
请 review 以下代码...
几个好用的角色模板:
- 「你是一位精通 XX 的技术专家」
- 「你是一位耐心的小学老师,擅长用比喻解释概念」
- 「你是一个代码审查机器人,只关注安全漏洞和性能问题」
六、控制输出长度的策略
除了 max_tokens 参数截断,还可以在 Prompt 中直接引导:
| 策略 | Prompt 示例 |
|---|---|
| 字数限制 | 「用不超过 100 字回答」 |
| 句数限制 | 「用 3 句话总结」 |
| 要点限制 | 「列出最重要的 5 个要点」 |
| 格式约束 | 「每条建议不超过一行」 |
七、常见陷阱与应对
| 陷阱 | 表现 | 应对 |
|---|---|---|
| 幻觉 | 模型编造不存在的事实 | 加「如果不确定,请说不知道」 |
| 忽略指令 | 输出格式不对、遗漏步骤 | 把关键约束放在 Prompt 最前面和最后面 |
| 输出截断 | max_tokens 不足导致回答不完整 |
加长 max_tokens,或拆分任务 |
| 格式不稳定 | 有时返回 JSON,有时返回纯文本 | Few-shot 给格式范例 + system message 强调 |
| 话题漂移 | 多轮对话中逐渐偏离主题 | 在新一轮开头重申关键约束 |
解决「忽略指令」的实用技巧
模型对 Prompt 开头和结尾的内容最敏感。所以,如果你有重要的格式要求,写在 Prompt 的最前面和最后面各一次:
你必须返回合法的 JSON,不要输出其他内容。
...(任务描述)...
再次强调:只返回 JSON,不要有任何解释文字。
八、迭代优化 Prompt 的方法
Prompt Engineering 本质上就是一个实验循环:
写初版 Prompt → 观察输出 → 定位问题 → 修改 Prompt → 再测试
具体步骤:
- 先写一个简单版本,不要一开始就过度设计
- 用 3~5 个不同输入测试,覆盖正常 + 边界情况
- 定位问题:是格式错了?内容跑了?还是漏了步骤?
- 增量修改:一次只改一个变量,方便归因
- 保留每个版本:好的 Prompt 是改出来的,旧版本可能是未来的参考
九、Python f-string 构建 Prompt
Python 的 f-string 是构建动态 Prompt 的利器,支持多行和变量嵌套:
text = "需要处理的文本内容"
prompt = f"""
你将收到由三引号包裹的文本。
请完成以下任务:
1. 总结为一句话
2. 翻译为英文
```{text}```
"""
f-string 的优势很直观:{变量} 直接嵌入,比 + 拼接和 % 格式化更清晰;"""...""" 三引号保留换行,Prompt 结构一目了然;{{}} 可转义为字面量花括号(当需要在 Prompt 中展示 JSON 时很有用)。
十、Prompt 模板速查
总结类
用 3 句话总结以下内容,每句不超过 30 字:
```{text}```
翻译类
将以下文本翻译为英文,保持原文语气和专业术语:
```{text}```
代码解释类
解释以下 Python 代码的功能和原理,适合有一定基础的开发者阅读:
```python
{code}
```
提取结构化信息类
从以下文本中提取所有人名、地名、时间,以 JSON 格式返回:
字段:people(数组)、places(数组)、times(数组)
如果某字段没有匹配项,返回空数组。
```{text}```
分步骤指令类
请将以下操作步骤按顺序整理为编号列表:
```{text}```
如果没有步骤,输出:"未提供步骤"。
十一、小结
- 清晰 > 精简:详细的指令 + 完整上下文 > 一句话提问
- 引导推理:复杂任务分解为步骤,用「逐步思考」激活思维链
- 控制输出:明确格式(JSON)+ 兜底规则(边界处理)
- 善用角色:System Message 设定全局行为,User Message 提出具体任务
- 分隔符保平安:用
"""..."""包裹用户输入,防止指令混淆 - Few-shot 统一风格:给 1~3 个范例,模型跟上你的偏好
- 迭代优化:好 Prompt 是试出来的,保持版本,一次改一个变量
Prompt Engineering 不是魔法——它是用结构化思维把需求翻译成模型能稳定执行的语言。
