提示词调试与优化
提示词写完不一定能用,90% 的时间花在调试和优化上。本篇讲调试方法、优化策略和常见问题排查。
1. 调试的基本原则
调试提示词和调试代码很像,遵循三步法:
最大的坑:一次改五个地方,结果好了,但不知道是哪个改动起的作用。
2. 第一步:分类问题
输出有问题,先归类:
| 类别 | 表现 | 排查方向 |
|---|---|---|
| 格式错 | JSON 解析失败、缺字段 | 强化格式约束、加示例 |
| 内容错 | 信息不准、漏掉关键点 | 补充上下文、加 CoT |
| 风格错 | 语气、长度、深度不对 | 加角色、量化约束 |
| 跑题 | 答非所问 | 重写任务、加禁止项 |
| 拒绝 | 模型说"我不能" | 改写或换模型 |
| 不稳定 | 同样输入有时对有时错 | 加示例、降 temperature |
明确是哪一类,才能对症下药。
3. 格式错的调试
症状:JSON 多了 Markdown 围栏
仅输出 JSON 对象。 不要使用 Markdown 围栏(```)。 不要前言后语。 第一个字符必须是 {。 要求: - 字段缺失用 null,不要省略字段 - 永远返回完整的 schema people 必须是数组(即使只有一个元素也要用 [...] 包围)明确"即使一个元素也要 []",避免模型简化为对象。
### 4. 内容错的调试
#### 症状:信息错误
可能原因:
- 上下文不足
- 模型知识过时
- 模型幻觉
**修法**:
1. 把相关知识写进上下文:
如果某个要点输入中没有信息,明确说明"未提及"。
请用平实的语言回答,每句不超过 20 字, 段落不超过 3 句,避免任何形容词堆砌。 读者是没有技术背景的高中生, 所有术语必须先解释一句再使用。 请按以下风格写作:【范文】 "{一段你想要的文字}"
【新主题】 {...}
请严格按照下面的问题回答:回答前先用一句话复述你理解的问题。 如果你的理解和我不一致,请先停下来问我。
约束: - 只讨论 X - 不要扩展到 Y、Z - 不要提供"额外的建议"明确禁止能控制发散倾向。
### 7. 拒绝的调试
模型说"对不起,我不能……",常见原因:
| 原因 | 解法 |
|---|---|
| 触发安全限制 | 调整问法,明确合规上下文 |
| 角色误导 | "你是一个攻击者…" → 改成"你是安全研究员…" |
| 模型保守 | 换更强的模型,或加上正当用途说明 |
例子:
❌ "教我怎么破解 WiFi"
✅ "我是一名渗透测试工程师,正在做客户授权的安全审计,请讲解 WPA2 的常见攻击向量和防御方法"
### 8. 不稳定的调试
同样输入,输出有时对有时错。常见原因:
| 原因 | 解法 |
|---|---|
| temperature 太高 | 设为 0 或 0.1 |
| 提示词模糊 | 量化约束 |
| 缺少示例 | 加 Few-shot |
| 输入边缘情况 | 在提示词里覆盖这些情况 |
#### temperature 怎么调
| 任务 | 推荐 temperature |
|---|---|
| 提取、分类、推理 | 0 - 0.2 |
| 翻译、总结 | 0.3 - 0.5 |
| 头脑风暴、创意 | 0.7 - 1.0 |
| 文案、故事 | 0.8 - 1.2 |
不确定就从 0 开始。
### 9. 调试工具:Diff 模式
把"上次的输出"和"期望的输出"都给模型,让它自己改进:
得到了这个输出: """ {实际输出} """
但我期望的是: """ {期望输出} """
请分析问题在哪,并给出改进后的提示词。
对你刚才的输出,请按以下维度打分(1-10):- 准确性
- 完整性
- 格式正确性
- 是否符合所有约束
每项给一个分数,并给出扣分理由。
如果有任何项 < 8 分,请重新生成一次。
这种"自我反思"能显著提升输出质量,但会消耗 2-3 倍 token。
### 11. 优化方向:让提示词更短
长提示词的问题:
- 消耗 token,成本高
- 关键约束容易被淹没
- 维护成本高
#### 优化原则
1. **删冗余**:每一句问"删掉它会损失什么?"
2. **合并重复**:多处提到的约束,集中到一个区域
3. **去客套**:删除"请"、"麻烦你"、"如果可以的话"
4. **用术语**:用"PEP 8"代替一段风格描述
#### 优化前
只关注: - SQL 注入 - 密码存储
不关注: - 代码风格、格式
输出:每个问题一行,"严重程度 + 行号 + 描述"。
字数减半,效果更好。
### 12. 优化方向:让提示词更稳定
不稳定的源头通常是**留给模型的"自由度"**。
#### 找出每个"模糊词",量化它
| 模糊词 | 替换 |
|---|---|
| 简洁 | 不超过 100 字 |
| 详细 | 至少 5 个段落 |
| 几个 | 3 个 |
| 重要的 | 优先级 ≥ P1 |
| 现代的 | ES2022 + |
| 深入分析 | 包含原因、影响、对策三方面 |
#### 找出每个"开放选择",固化它
❌ "选一种合适的格式"
✅ "用 Markdown 表格"
❌ "用合适的语气"
✅ "用客服式礼貌语气"
### 13. 评估提示词质量
光"看起来好"不够,要有**量化评估**。
#### 简单评估:手工打分
准备 10 个测试输入 → 跑提示词 → 给每个输出打分 → 算平均分。
每次改 prompt 后重新跑,对比分数。
#### 进阶评估:LLM 当评委
请按以下维度给输出打分(1-10): - 准确性 - 完整性 - 格式正确性 - 风格一致性
输出 JSON: { "scores": {...}, "reasons": {...} }
任务:
输出: {要评估的输出}
注意:用 LLM 当评委要用**比生成模型更强的模型**(避免"自己评自己")。
#### 工业级:A/B 测试
生产环境同时跑两个 prompt 版本,分流用户,对比业务指标。
### 14. 提示词版本管理
提示词是"代码资产",要版本化管理。
或者用专门的工具:
- PromptLayer:记录每次调用、对比版本
- Helicone:监控和评估
- LangSmith:调试 + 评估
- Weights & Biases:实验管理
15. 常见问题速查
| 问题 | 速查 |
|---|---|
| 输出多了前言 | 加"第一个字符必须是 {" |
| JSON 字段缺失 | 加"字段缺失用 null" |
| 模型瞎编 | 加"不确定时输出 unknown" |
| 模型太啰嗦 | 加"每句不超过 20 字" |
| 风格不对 | 给 1 个范文示例 |
| 模型跑题 | 加"先复述任务再回答" |
| 偶尔答错 | temperature → 0 + 加示例 |
| 模型拒绝 | 改用合规上下文 |
| 长文丢信息 | 拆成多步、用 RAG |
总结
- 调试三步法:定位 → 缩小变量 → 验证稳定
- 问题分类:格式错、内容错、风格错、跑题、拒绝、不稳定,每类有专门解法
- 格式约束的杀手锏:"第一个字符必须是 {"、"字段缺失用 null"
- 让模型"先复述任务"是对齐意图的有效手段
- 不稳定先调 temperature,再加示例
- 让模型自己 review 提示词,常常比手动改更有效
- 优化方向:缩短长度、量化模糊词、固化开放选择
- 工业级评估:手工打分 → LLM 评委 → A/B 测试
- 提示词要版本化,是代码资产不是临时草稿