跳到主要内容

Prompt 变异测试:找出哪些系统提示词指令真正起作用

· 阅读需 12 分钟
Tian Pan
Software Engineer

有一种特定的工程债(Engineering debt)永远不会出现在你的指标中。每当有人在系统提示词(System prompt)中添加一个句子来修复一个偶发的投诉——比如 “绝不讨论竞争对手的产品” 或 “始终以正式的口吻回复” ——而随后又没有人验证模型是否真的执行了它,这种债务就会累积。几个月后,提示词增加到 800 个 Token。它听起来很有权威感,包含的内容包罗万象。但也许其中三分之一根本没起作用。

提示词变异测试(Prompt mutation testing)就是找出那三分之一无效指令的实践。该技术借鉴了软件工程中经典的变异测试:系统地在代码中引入微小、刻意的错误,以确定你的测试套件是否真的能捕获它们。在这里,你向系统提示词中引入刻意的扰动——删除一个分句、抵触一条规则、用近义词替换关键关键词——并衡量模型的输出实际发生了多大变化。那些在扰动下幸存且不影响行为的指令是装饰性的。而那些一旦被触碰就会导致出错的指令则是承重的(Load-bearing)。

这两者之间的差距并非仅停留在学术层面。当系统提示词超过大约 500-600 个 Token 时,模型开始表现出指令遵循能力退化(Instruction-following degradation)——这种现象表现为在多轮对话中,初期的合规性逐渐减弱,模型在初期回合遵循指令的字面意思,但到第 15 个回合时就失去了实质内容。通过提示词审计移除真正装饰性的指令,可以缩小影响范围并减少模型在每次生成时必须解决的歧义。

什么是承重指令

幼稚的答案是:如果移除一条指令会改变输出,那么这条指令就是承重的。这虽然正确但不完整。指令失效至少有三种截然不同的模式,每种模式的测试方法也不同。

执行失败 (Enforcement failure):模型从一开始就根本没有遵循该指令。这是最常见的情况。在 700 个 Token 的系统提示词中,放置一条类似 “避免使用被动语态” 的指令可能产生零测量效果,因为模型在散文风格上的微调默认设置比埋藏在其他 20 条指令中的单个低显著性分句更强大。关于提示词敏感性的研究表明,细微的提示词变化会导致高达 76 个准确度点的性能差异——但这种差异集中在语义中心内容上,而非外围的风格规则。

衰减失败 (Attenuation failure):指令在短会话中有效,但在对话压力下会退化。随着上下文的增加,旧指令相对于最近的对话内容会失去影响力。其机制是注意力稀释(Attention dilution):在 100K 个 Token 时,模型要在数十亿个 Token 对之间分配注意力,你的系统提示词正与用户自那以后所说的所有内容竞争。在 3 轮测试中产生 95% 合规性的指令,到第 25 轮时可能下降到 60%。仅在单轮交互上运行的变异测试将完全漏掉这一类失效。

冲突失败 (Conflict failure):指令在独立测试时执行良好,但当它与另一条指令冲突时会被默默降低优先级。增量编写的系统提示词会累积这些潜在冲突。“始终保持简洁”(第一季度添加)和 “始终逐步解释你的推理”(第三季度添加)并没有明确矛盾,但它们的作用方向相反。模型通过选择在语境中更显著的指令来化解张力——这意味着任何一条指令都无法被可靠地执行。

了解你正在处理哪种失效模式,决定了你该如何修复。

构建扰动测试框架

系统提示词的变异测试框架包含三个组件:扰动生成器、评估套件和合规性评分器。

扰动生成器。对于系统提示词中的每条指令,你会生成一组变体:

  • 删除 (Deletion):完全移除该指令。
  • 否定 (Negation):将核心指令替换为其对立面(“从不”→“始终”,“正式”→“随意”)。
  • 稀释 (Dilution):用较弱的近义词替换强词(“必须”→“应该”,“从不”→“尽量不要”)。
  • 位移 (Displacement):将指令从当前位置移动到提示词的另一端(开头对比结尾)。位置非常重要——首因效应(Primacy effect)和近因效应(Recency effect)意味着提示词开头和结尾的指令比中间的指令被遵循得更一致。

变体的数量随提示词长度线性增长,而非组合式增长,因为你一次只测试一个扰动。一个包含 40 条指令的提示词会生成大约 160 个测试变体,这在 CI 中每晚运行是可行的。

评估套件。每个扰动都需要一组专门设计的测试用例来触发被测指令。通用的测试套件是行不通的——如果你正在测试 “始终用英语回答” 的指令,你需要那些在没有约束的情况下可能会产生非英语输出的测试输入。设计这些输入是过程中最难的部分,也是最受益于人类判断的部分。对于每条指令,编写 5-10 个针对该规则的对抗性输入。

合规性评分器。你需要一种方法来比较原始提示词的输出与每个变体的输出,并分类目标行为是否存在。对于行为规则(语气、格式、语言),使用带有严格规定细则的 LLM 即评审员(LLM-as-judge)效果很好。对于结构化规则(输出格式、长度限制),确定性正则表达式(Regex)或架构验证(Schema validation)更可靠。这种选择至关重要——LLM 评审员会引入自身的噪声,使用错误率为 15% 的评审员来测试效果细微的指令会产生嘈杂的信号。

解读变异矩阵

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates