优化、测试与安全

提示词测试与评估:如何衡量一个提示词

如何测试和评估 LLM 提示词。构建测试集,选择指标,结合静态检查、代码断言和模型评分器,并在 CI 中运行。

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

“我试的时候看起来不错”,这正是大多数提示词回归问题进入生产环境的方式。提示词测试与评估用证据取而代之:一组固定的输入、对正确输出的定义,以及每次提示词变更时都会运行的检查。

这两个术语有所重叠。评估是衡量一个提示词或其输出有多好。测试是自动运行这些度量,并在未达到阈值时失败。

你可以评估的两样东西

提示词本身。 就其写法而言,它是否清晰、完整、一致、安全?这是静态分析。它不需要调用模型,所以是即时的、免费的,而且每次结果都相同。

模型的输出。 给定这个提示词和这个输入,答案对吗?这需要调用模型,也需要一种判断结果的方法。

它们能发现不同的问题,好的流程两者并用。静态检查在每次按键和每次提交时运行。输出评估在某个变更可能影响行为时运行。

第 1 层:对提示词的静态检查

静态检查读取提示词文本,查找已知缺陷:

  • 没有说明目标,或没有输出格式。
  • 含糊的词语和没有数字的大小描述。
  • 相互矛盾或重复的指令。
  • 没有加分隔符的模板变量。
  • 注入措辞、凭据或个人数据。
  • token 数超出预算。

这就是 PromptFlowEngine 提示词评估所做的事。分数是 100 减去每个发现对应的固定扣分(严重 30、警告 10、提示 3),只要有严重问题,分数上限就是 50,八个维度中的每一个都采用相同的算法。由于公式是公开的,分数的任何变化都能追溯到某个具体发现。

静态分数并不告诉你模型的答案是否正确。它告诉你的是,提示词是否给了模型一个公平的机会。

第 2 层:测试集

测试集是带有预期的输入列表。从小处着手。

用例类型 原因
典型输入 确认主路径可用
边界情况 空输入、超长、语言错误、格式错误
对抗性输入 试图覆盖指令的尝试
过去的失败 发现的每个缺陷都变成永久性测试

精心挑选的二十个用例胜过两百个近似重复的用例。尽可能从真实流量中提取,并去除个人数据。

第 3 层:判断输出是否通过

使用能判断该属性的最便宜的方法。

代码断言。 确定性的,而且免费。尽可能使用。

  • 能解析为 JSON 并符合 schema。
  • 包含或不包含某个字符串。
  • 长度在范围内。
  • 标签等于预期标签。
  • 数值答案在容差范围内。

与参考答案比较。 用精确匹配或相似度度量与已知的好答案比较。适合提取和分类,对开放式写作较弱。

模型评分。 由第二个模型按评分标准对输出做出判断。用于代码无法检查的特质:对来源的忠实度、语气、完整性。

You are grading an answer against a source document.

Does the answer contain any claim not supported by the source?
Reply with a JSON object: {"unsupported_claims": [string], "pass": boolean}.

<source>{{source}}</source>
<answer>{{answer}}</answer>

模型评分器本身也是提示词,有自己的失效模式。让每个评分标准只含一个问题,先要求给出证据再给出结论,并在信任评分器之前,用一批人工判断的样本检验它。

人工审阅。 参考标准,也是最昂贵的。用它来校准自动方法,并审阅生产输出的样本。

值得跟踪的指标

指标 它告诉你什么
通过率 满足预期的测试用例所占比例
格式有效率 能被解析的输出所占比例
忠实度 有所提供上下文支持的答案所占比例
拒答准确率 该拒绝的拒绝,该回答的回答
一致性 同一输入多次运行结果的一致程度
token 与延迟 你所获得质量的成本

报告通过率时要同时给出用例数量。10 个用例上的“90%”就是一次失败。

处理非确定性

同样的提示词和输入可能产生不同的输出。要把这一点考虑进去:

  • 对需要一致性的任务,把温度设低。
  • 每个用例运行多次,报告通过率,而不是单次结果。
  • 对属性做断言(“提到了退款期限”),而不是对确切文本做断言。
  • 固定模型版本,并在其变化时重新运行测试套件。

CI 中的回归测试

只有自动运行,测试才能保护你。

每次提交时: 静态检查。它们很快,而且不需要 API 密钥。当某个提示词文件的分数低于最低要求、超过 token 上限,或包含诸如泄露密钥之类的严重发现时,提示词测试门禁会使拉取请求失败。

- run: promptflow check "prompts/**/*.md" --min-score 70 --max-tokens 1500

提示词或模型变更时: 带通过率阈值的输出测试集。

按计划定期: 针对线上模型运行完整测试集,以发现提供商一侧的变化。

PromptFlowEngine 涵盖其中的第一项。它不会针对模型运行提示词;输出评估需要你自己的测试运行器和模型访问权限。

比较两个版本

在几个草稿之间做选择时,用相同的输入进行比较,并查看发生了什么变化,而不只是总数:哪些用例从通过变成了失败,token 如何变化,是否引入了新问题。工作区中的比较视图会报告两个提示词之间在质量、token 和成本上的差异,并列出每个版本解决或引入的发现。

一个可以起步的最小流程

  1. 运行静态检查并修复警告。
  2. 编写 20 个带预期的测试用例。
  3. 为格式和必需内容添加代码断言。
  4. 记录基线通过率。
  5. 用静态检查来把关拉取请求。
  6. 每当提示词或模型变化时,重新运行测试集。

关于如何利用这些结果改进提示词,参阅提示词优化。关于如何让版本和结果井然有序,参阅提示词管理。