技巧

提示词优化:一种迭代方法

提示词优化是通过度量来改进提示词。一个可重复的 LLM 提示词优化循环,包括精修、测试集,以及何时停止。

译自英文原文。代码、提示词和模型输出保留英文。

提示词优化,是针对既定目标改进提示词的过程:更好的回答、更少的 token、更低的延迟,或更一致的格式。它与瞎折腾的区别在于度量。你先决定“更好”意味着什么,改动一处,再检查。

决定你要优化什么

一个提示词可以沿多个维度优化,而这些维度相互拉扯。

目标 度量方式 常见代价
质量 测试集上的通过率 token
一致性 同样的输入,同样形态的输出 灵活性
成本 每次调用的输入和输出 token 上下文、示例
延迟 到首个和末个 token 的时间 推理深度
安全 对注入和泄露的抵抗力 部分可用性

选定一个主要目标,并为其他目标设定上限,例如“在不超过 800 个输入 token 的前提下提高通过率”。

优化循环

1. 先修复静态问题

有些缺陷不需要模型就能发现:没有目标、含糊的词、没有数字的大小、冲突的指令、没有输出格式、重复的句子、未加分隔的变量。在花钱调用模型之前先把它们清理掉。PromptFlowEngine 提示词分析器会逐条列出,并附上建议的修正。

2. 建立测试集

收集 20 到 50 个代表真实使用的输入。包括:

  • 典型情形。
  • 边缘情形:空输入、超长、混合语言、格式错误。
  • 对抗性情形:试图改变指令的文字。
  • 过去的失败。每个 bug 都变成一个测试。

对每个输入,写下正确输出必须包含或满足的内容。

3. 建立基线

用当前提示词运行每一个输入并记录结果。这个数字是每次改动的比较对象。没有它,你就无法区分改进和噪声。

4. 阅读失败案例

把它们分组。十个失败通常只有两三个原因。找出规律:是不是总是长输入、总是某一类、总是同一个缺失的字段?

5. 形成一个假设,做一处改动

“模型添加了说明,因为提示词没有说只返回 JSON。”做这一处改动,不要动别的。

6. 重新运行整个测试集

检查失败是否已修复,同样重要的是,检查之前通过的是否现在失败了。修好一个情形却破坏了另外两个,就是回归。

7. 保留或回退,然后重复

记录你改了什么、为什么改。版本管理参阅提示词管理。

通常有效的精修手法

症状 精修
输出篇幅不一 把表示大小的词换成数字
输出形态不一 添加明确的格式或 schema
忽略某条规则 把它从段落移到列表里;消除冲突
过于泛泛 添加受众和领域背景
在边缘情形下出错 为该情形添加规则或示例
编造事实 提供来源,并要求缺失时写“未说明”
啰嗦 给出字数上限,并说明可省略什么

通常无效的精修手法

  • 给每一行都加强调(大写、“非常重要”)。
  • 在多个地方重复同一条指令。
  • 每遇到一个失败就追加一条特殊情形规则,却不检查冲突。
  • 改动并非原因所在的措辞。

针对 token 优化

当质量可以接受后,在不改变行为的前提下降低成本:

  1. 删除问候语、客套话和冗词。
  2. 删除重复和近似重复的句子。
  3. 砍掉对测试集中任何答案都没有影响的上下文。
  4. 减少示例数量并重新测试。
  5. 把提示词中稳定的部分放在前面,以便服务商的缓存生效。

步骤 1 和 2 是机械的,可以放心地自动化。PromptFlowEngine 提示词优化器会完成它们,然后验证原有的每个句子、要求和受保护的片段是否仍然存在,因此更短的提示词所要求的,与更长的完全一致。详情参阅 token 优化。

自动化优化

有些工具会自动搜索更好的提示词:让模型提出变体,并在你的测试集上打分。它们能找到人容易错过的改进。它们要发挥作用需要三样东西:好的测试集、可靠的打分函数,以及对胜出提示词的审查,因为优化器会利用指标的任何弱点。

让聊天模型“改进这个提示词”时也要有类似的警惕。它会产出读起来更好的东西,也可能丢掉某条约束或添加某个假设。请把结果与原文做差异比较,并确认每条要求都还在。

何时停止

当提示词在测试集上达到目标,且进一步的改动只让结果在噪声范围内波动时,就停下来。过了这一点,更多的提升将来自更好的上下文、不同的技巧(如提示词链),或者换一个模型。

基于规则的分数能告诉你什么,不能告诉你什么

静态的质量分数,例如来自提示词评估的分数,衡量的是提示词本身的写法:清晰度、完整性、一致性和安全性。它快速且可复现,适用于每一次编辑和每一次提交。它并不衡量模型对该提示词的实际表现。用它来保持提示词的健全,用测试集来确认输出。二者都在提示词测试与评估中介绍。