提示回归测试:防止你的 AI 工作流中断

发布: (2026年2月24日 GMT+8 23:22)
10 分钟阅读
原文: Dev.to

I’m happy to translate the article for you, but I’ll need the full text you’d like translated. Could you please paste the content (excluding the source line you’ve already provided) here? Once I have the text, I’ll translate it into Simplified Chinese while preserving the original formatting, markdown syntax, and technical terms.

Source:

介绍

如果你发布代码,你已经在进行回归测试。当你修改某些东西时,你想知道 what broke(到底哪里出问题了)。提示工作流也应该得到同样的对待。

一旦一个提示成为 基础设施(代码审查提示、PRD‑到‑任务工作流、客服分类器、写作检查器等),你就会去微调它。而每当你微调它时,你就会遇到经典的惊讶:

  • “为什么它突然变得很冗长?”
  • “为什么它不再遵循 JSON 架构了?”
  • “为什么它遗漏了以前能捕捉到的边缘情况?”

这就是 prompt regression:你的 AI 工作流因为你更改了提示、模型、temperature、工具列表,甚至只是周围的上下文而漂移。

下面是一种实用的方法来防止这种情况发生:构建一小套 prompt regression tests。它并不花哨,却极其有效。

要测试的内容(以及不该测试的)

你的目标 不是 “每次都使用完全相同的文字”。你的目标是:

  • 结构保持有效 – JSON 能解析,必需字段存在。
  • 关键行为保持正确 – 它仍能捕获真实的 bug,提出恰当的澄清问题,遵守你的约束。
  • 失败模式保持可接受 – 当输入模糊时,它会提问;当答案未知时,它会说明。

因此除非必要,不要把整个输出快照为字符串。更倾向于使用 不变量

良好不变量的示例

  • 输出是符合固定模式的有效 JSON。
  • 当样本包含明显缺陷时,至少包含 N 条严重程度 ≥ “high” 的问题。
  • 提及禁止的内容(例如 “作为 AI …”,内部系统备注)。
  • 在 “summary” 部分生成项目符号列表,而不是段落。

第一步:创建一个小的“黄金集合”输入

开始使用 8–20 个测试用例。让它们有意保持多样性:

CategoryDescription
正常路径清晰的输入 → 清晰的输出。
边缘情况空字符串、类似 null 的占位符、缺失字段。
对抗性Prompt‑injection 尝试(“忽略之前的指令…”) 输入内部。
你见过的真实失败上周漏掉的 bug 放在这里。

示例 – 对于 “PRD → 任务” 的提示,包含:

  • 一个紧凑的 PRD。
  • 一个凌乱的 PRD。
  • 一个包含矛盾需求的 PRD。
  • 一个省略约束的 PRD(因此助理应当提问)。

第2步:明确定义评估标准(显式)

写下“好”的定义,保持简短。

Code‑review prompt rubric

  • 首先查找功能缺陷。
  • 出现安全问题时予以指出。
  • 除非影响 bug,否则不要挑剔风格。
  • 提供最小化、可操作的修复方案。

Writing‑linter prompt rubric

  • 强制执行语气规则(短句,避免填充词)。
  • 标记被动语态。
  • 提供替代方案(而非仅仅批评)。

技巧:你的测试将在可能的情况下机械地检查这些标准项。

第3步:将评分标准转化为检查

确定性检查(先做这些)

  • JSON 解析。
  • 模式验证。
  • 禁止短语。
  • 必需标题。
  • 最大长度。

如果你能将 ≈ 60 % 的期望转化为确定性检查,就能捕获大多数错误。

最小 Node.js 框架示例

import assert from "node:assert";

/* ---------- Helpers ---------- */
function mustParseJson(text) {
  try {
    return JSON.parse(text);
  } catch (e) {
    throw new Error("Output is not valid JSON");
  }
}

function assertHas(obj, path) {
  const parts = path.split(".");
  let cur = obj;
  for (const p of parts) {
    assert.ok(cur && p in cur, `Missing field: ${path}`);
    cur = cur[p];
  }
}

/* ---------- Main check ---------- */
export function runChecks(outputText) {
  const out = mustParseJson(outputText);

  // Required fields
  assertHas(out, "summary");
  assertHas(out, "issues");
  assert.ok(Array.isArray(out.issues), "issues must be an array");

  // Forbidden phrases
  const forbidden = [/as an ai/i, /system prompt/i];
  for (const re of forbidden) {
    assert.ok(!re.test(outputText), `Forbidden phrase: ${re}`);
  }

  return true;
}

模糊检查(保持范围)

模糊检查是人们卡住的地方。不要过度设计它们。

模式

  1. 关键字期望 – 如果输入包含明显的 SQL 注入字符串,审查应提及 “injection” 或 “parameterized”。
  2. 评分区间 – 进行二次检查(或轻量启发式)对输出在评分项上进行 1–5 打分。
  3. 差异容忍度 – 比较类别,而非全文(例如,“发现 3 条高严重性问题”,而不是精确句子)。

如果你确实想要基于 LLM 的评分,请将其视为使用严格评分标准和低温度的 评审

第4步:锁定你的提示接口

大多数提示回归是由于在未意识到的情况下更改了输入。创建一个与代码一起进行版本控制的单一 prompt‑interface 对象:

  • 模型名称
  • 温度
  • 系统消息
  • 用户提示模板
  • 工具定义(如有)
  • 输出模式

然后在任何这些更改时运行测试。

简易约定

prompt/v1/system.md
prompt/v1/user.md
prompt/v1/schema.json
tests/fixtures/*.json

这使得提示的更改可以像代码一样进行审查。

第5步:在 CI 中运行测试(真的)

如果你的工作流很重要,请将其放入 CI。两种务实的选项:

选项 A – “离线优先” 测试(快速、低成本)

  • 仅进行确定性的检查。
  • 只进行少量真实模型调用(或不调用)。

当你主要关注 格式防护栏 时,这非常适用。

选项 B – “实时模型” 测试(逼真)

  • 运行 10–30 次真实调用。
  • 使用小额预算上限。
  • 仅在出现有意义的回归时失败。

常见做法是允许一定的小容差:

检查失败类型
JSON 必须能够解析硬性失败
必需字段存在硬性失败
评分表得分低于阈值软性失败(警告),除非显著下降

这可以防止不稳定的失败,同时仍能捕捉真实的漂移。

具体示例:测试代码审查提示

(原始示例的其余部分继续在此处——根据需要插入您自己的详细测试用例、CI 配置和示例运行输出。)

捕获边界错误的审查提示

固定输入(小且有意缺陷):

  • 时区转换错误
  • 缺少空值检查
  • 可疑的字符串拼接到 SQL

你的测试可以断言:

  • 至少有一个问题提到时区或日期运算
  • 至少有一个问题提到 null/undefined 处理
  • 至少有一个问题提到注入风险
  • 问题包含 severityconfidence 字段

你并不是在检查确切的措辞。你在检查工作流仍然能够完成你所依赖的任务。

隐藏的优势:你可以安全地重构提示

一旦拥有哪怕是一个小的测试套件,提示的编辑就不再令人害怕。你可以:

  • 收紧指令
  • 减少冗长
  • 更改格式
  • 切换模型
  • 添加工具

…而无需猜测。

你将在几分钟内知道你的“微小改进”是否意外删除了你关心的那个行为。

快速入门检查清单

如果你想在接下来的一小时内完成此操作:

  1. 挑选一个你每周使用的提示。
  2. 编写 10 条 fixture(复制/粘贴真实案例)。
  3. 编写 5 条不变条件(JSON/模式/禁用短语/必需标题)。
  4. 添加一个模糊检查(关键词期望)。
  5. 在下次提示微调前后运行它。

提示也是工程。请像对待重要工作一样对待它。

征求反馈

如果您已经有提示测试,我很想了解您发现的最有价值的不变式。

0 浏览
Back to Blog

相关文章

阅读更多 »

没人想负责的 Systemd Bug

TL;DR:存在一个命名空间 bug,影响 Ubuntu 20.04、22.04 和 24.04 服务器,导致随机服务故障。自 2021 年起已在系统中报告……