第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,都是反复测试、迭代出来的。别指望一次写对,多试几次,你会找到感觉的。