第4章:Prompt Engineering基础
说实话,很多人刚开始接触大模型时,都觉得这东西像个黑盒子。你输入一句话,它给你吐出一段文字。但为什么有时候它回答得特别好,有时候又胡说八道?
我个人的经验是——问题不在模型,在你怎么问。这就是Prompt Engineering要解决的事。
4.1 什么是Prompt?
Prompt,说白了就是你给模型的输入指令。你想想看,你跟一个实习生交代任务,说得越清楚,他干得越好。大模型也一样。
一个完整的Prompt可以包含三部分:
- 指令:你要模型做什么
- 上下文:背景信息或参考材料
- 格式要求:输出应该长什么样
举个例子:
❌ 差的Prompt:「写一封邮件」
✅ 好的Prompt:「请帮我写一封商务邮件,主题是向客户确认下周二的会议时间。语气要礼貌专业,结尾附上我的联系方式。」
我在项目中遇到过最典型的翻车案例——让模型生成产品描述,结果它写了一篇散文。为什么?因为我只说了「描述一下这个产品」,没告诉它要结构化输出。
4.2 System / User / Assistant 角色
这是很多初学者容易忽略的点。大模型的API里,消息是按角色分的。我习惯把它们理解成一场对话中的三个角色:
| 角色 | 作用 | 谁在用 |
|---|---|---|
| System | 设定模型的行为和边界 | 开发者 |
| User | 用户输入的问题或指令 | 终端用户 |
| Assistant | 模型的回复 | 模型自己 |
System Message 有多重要?
我举个例子。你做一个客服机器人,如果不设System Message,模型可能跟用户聊起星座运势。但如果你在System里写:
{
"role": "system",
"content": "你是一个专业的电商客服。只回答与订单、物流、退换货相关的问题。不要闲聊,不要提供非业务信息。"
}
模型就会老老实实待在框框里。嗯,这里要注意——System Message 的优先级最高,它像一道防火墙。
我的小技巧:在System Message里,我通常会加上「如果用户问的问题超出范围,请礼貌地引导回正题」。这样模型不会生硬地拒绝用户。
4.3 温度与Top-P参数
这两个参数,我刚开始接触时也觉得玄乎。后来发现,它们就是控制模型「疯不疯」的旋钮。
Temperature(温度)
取值范围0到2。数值越低,模型越保守;数值越高,模型越放飞自我。
- 0.1 - 0.3:适合事实性回答、代码生成、翻译。我写代码时基本用0.1。
- 0.5 - 0.7:适合日常对话、文案写作。有点创意但不会跑偏。
- 0.8 - 1.0:适合头脑风暴、诗歌创作。模型会给你惊喜,也可能给你惊吓。
我曾经踩过的坑:做一个法律咨询机器人,把温度设成了0.8。结果模型给用户编造了一条根本不存在的法律条文。从那以后,凡是涉及事实的,温度我绝不超过0.2。
Top-P(核采样)
这个参数很多人搞混。它控制的是模型从「概率最高的前P%的词汇」中选词。比如Top-P=0.9,模型只考虑概率排在前90%的词。
我个人的习惯是:温度和Top-P不要同时调。要么固定温度调Top-P,要么固定Top-P调温度。两个一起动,效果很难预测。
| 场景 | 推荐Temperature | 推荐Top-P |
|---|---|---|
| 代码生成 | 0.1 - 0.2 | 0.9 - 1.0 |
| 客服对话 | 0.3 - 0.5 | 0.9 |
| 创意写作 | 0.7 - 0.9 | 0.95 |
| 翻译任务 | 0.0 - 0.1 | 1.0 |
4.4 Max Tokens 设置
这个参数最简单,但也最容易出问题。Max Tokens 控制模型最多输出多少个token(注意不是字数)。
一个token大约等于0.75个英文单词,或者1个中文汉字。所以如果你设Max Tokens=100,模型最多输出约100个汉字。
为什么这个参数重要?
你想想看,如果你让模型写一篇2000字的文章,但Max Tokens只设了500。模型写到一半就停了,给你一个不完整的句子。我见过太多人抱怨「模型回答不完整」,结果一看代码,Max Tokens设得太低。
我建议的做法是:
- 先估算你需要的输出长度,然后乘以1.5作为安全余量
- 如果模型经常截断,逐步增加Max Tokens
- 注意API的调用成本——Max Tokens越大,每次调用越贵
避坑指南:我曾经做一个文档生成功能,设了Max Tokens=4096。结果模型每次都在第4095个token处截断,最后一句永远不完整。后来我改成8192,问题解决了。但账单也翻倍了……嗯,这就是trade-off。
4.5 把这些参数串起来
一个典型的API调用长这样:
{
"model": "gpt-4",
"messages": [
{"role": "system", "content": "你是一个专业的Python导师。用简单易懂的方式解释概念。"},
{"role": "user", "content": "请解释什么是装饰器?"}
],
"temperature": 0.3,
"top_p": 0.9,
"max_tokens": 500
}
你看,每个参数都有它的位置。System Message定基调,User Message提问题,Temperature控风格,Max Tokens管长度。少了哪一个,效果都可能打折扣。
最后说一句——Prompt Engineering不是玄学,是工程。我见过最好的Prompt,都是反复测试、迭代出来的。别指望一次写对,多试几次,你会找到感觉的。