跳到主要内容

拒绝审计:为什么单一拒绝率掩盖了一半的失败分布

· 阅读需 11 分钟
Tian Pan
Software Engineer

打开任何生产环境 LLM 功能的安全仪表盘,你都会看到拒绝率(refusal rate)被绘制成一条单线,并带有颜色标记:下降是坏事,上升是好事。这背后的隐含逻辑是:拒绝是系统对不该做的事情说“不”,因此拒绝率越高,产品就越安全。这种说法只反映了事实的一半,而缺失的另一半,正是已部署助手中大多数无形质量损伤的根源。

拒绝率是一个双面分布。右尾是安全团队痴迷的部分:模型同意编写恶意软件、伪造药物剂量或生成政策明确禁止的内容。左尾则是相反的失败——错误拒绝(false refusals),即模型因为某些表面特征与禁止类别模式匹配,从而拒绝了良性请求。客户询问如何对费用提出异议,却收到“我无法提供财务建议”的样板回复。护士询问药物相互作用,却被引导至“请咨询医疗保健专业人员”。开发者询问如何解析邮件头,却因为提示词中包含 “exploit” 一词而被拒绝。

这些失败不会导致系统崩溃。没有任何警报触发。用户咕哝一句,关掉标签页,而仪表盘上的指标向上跳动,安全团队将其解读为进步。与此同时,产品正在朝着一个无人衡量的方向变得对用户不友好。

本文将探讨如何审计左尾——如何埋点、如何采样、由谁负责校准,以及为什么大多数团队在发现高价值用户流失之前,都会低估这种失败模式。

指标是单调的,但失败不是

当团队绘制拒绝率随时间变化的图表并将其趋势线视为安全信号时,他们默认了一个假设,即底层分布是单向的:每一次拒绝都是正确避开了一次伤害。只要你的系统包含任何模式匹配层——无论是审核分类器、带有类别列表的系统提示词、经过微调的拒绝头,还是否决输出的下游过滤器——这个假设就会破灭。

催生了过度拒绝研究方向的 OR-Bench 论文对 32 个主流 LLM 进行了测量,发现安全得分与过度拒绝率之间的 Spearman 秩相关系数高达 0.89。换句话说,对有害提示词拒绝得最彻底的模型,对良性提示词的拒绝也最多,且两者结合得如此紧密,以至于改善其中一个几乎总是会削弱另一个。该基准测试本身包含 80,000 个在表面特征上看起来有害、但在检查后显然是良性的提示词,大多数生产级模型在其中相当大比例的提示词上都失败了。

这里的结论并不是“模型过于谨慎”。而是绘制单一拒绝率的仪表盘无法区分“经过良好校准的拒绝”与“过度触发”。它们产生的数据点完全相同。你无法从聚合的拒绝量中判断出系统是变得更安全了、更有用了,还是在两个维度上都变糟了。

生产环境中的错误拒绝究竟是什么样

教科书般的例子是医疗或财务的模式匹配:包含触发关键词的良性问题被引导至法律免责声明模板。这种情况确实存在,但很容易被发现。更具破坏性的错误拒绝是那些团队从未注意到的,因为它们在孤立观察时看起来很合理。

在实际审计中出现的一些模式:

  • 无视职业身份的拒绝。 临床医生询问中毒案例的过量阈值,却收到了提供给询问如何伤害他人的陌生人的相同样板回复。模型没有关于提问者身份的信号,而安全政策是假设请求者处于最坏情况而编写的。
  • 表面特征触发。 包含 “kill”(Unix 进程)、“exploit”(数据库查询利用)、“attack”(国际象棋攻势)的提示词触发了在对抗性数据集上训练的拒绝头,这些数据集过度加权了这些 token。
  • 上下文失忆式拒绝。 多轮对话已经确定用户是一名正在调试自己基础设施的安全研究员。但下一条消息被拒绝了,因为拒绝分类器孤立地只看到了那一轮对话。
  • 复合门控拒绝。 模型本可以回答,但 API 网关上的下游安全过滤器替换成了拒绝。模型日志显示没有拒绝;用户却看到了拒绝。在模型层衡量拒绝率的团队读取到的是干净的信号,而系统层面的拒绝率实际上要糟糕得多。
  • 语气审查式拒绝。 模型做出了回答,但添加了如此多的警告和免责声明,以至于在功能上相当于拒绝。由于没有标准的拒绝用语,这些根本不会被计入拒绝率,但用户得到的却是毫无用处的响应。

该研究系列中总结的一项 MIT 研究发现,某个前沿模型对受教育程度较低的非英语母语者的提问拒绝率为 11%,而对照组用户仅为 3.6% — 这是一种 3 倍的差距,由问题措辞的表面特征驱动,而非请求本身。所有这些都不会体现在单一的拒绝率指标中。

如何审计左尾

有效的审计将拒绝视为具有两种失效模式的分类问题,并分别对每种模式进行评分。具体而言:

按表层类别与真实的政策违规进行分层。 第一步是标记每一次拒绝是由于提示词确实违反了政策,还是仅仅看起来像违规。这需要一个采样流水线,从生产流量中提取拒绝案例,进行匿名化处理,并将其发送给审核人员,由他们根据政策文件进行评分。在所有拒绝案例中进行随机采样会稀释信号,因为大多数拒绝会聚集在少数高频类别中。应按类别进行分层——金融、医疗、法律、安全、内容审核、越狱尝试——并对长尾部分进行过采样。

增加“我们是否应该拒绝”的审查。 这是安全团队已经在执行的“我们是否遗漏了伤害”审查的逆向过程。审核员阅读提示词,忽略模型的实际行为,并判断一个校准良好的助手是否应该提供帮助。此审查结果与模型实际行为之间的分歧构成了“误报拒绝率”(false-refusal rate),这一指标应当与“正当拒绝率”(true-refusal rate)并列显示在仪表盘上。

将拒绝视为双轴指标。 仪表盘至少需要两个数字:正当拒绝率(对真正违规的提示词的正确拒绝)和误报拒绝率(对良性提示词的错误拒绝)。一个提升了前者但恶化了后者的安全版本发布并不一定是好事;这应该是你自觉做出的权衡。

按用户影响进行样本加权。 并非所有的误报拒绝都是等价的。在核心用户的高频工作流中发生的误报拒绝,其代价远高于对路人用户的单次查询的误报拒绝。应根据用户价值或会话重要性对样本进行加权,从而使审计信号由那些真正导致流失的案例主导。

在不同模型版本间进行回放。 保留一个不应被拒绝的固定提示词语料库,并针对每个候选模型和提示词变更进行回放。如果该语料库的误报拒绝率发生重大变化,即使其他所有评估项都显示正常,这也是一种回归(regression)。应将其视为测试套件:如果一个候选版本增加了语料库中的误报拒绝,那么在发布之前,需要做出明确的“接受回归”决策。

组织层面的失效模式

即使团队对分布的两侧都进行了监测,修复工作也往往会遇到结构性问题:没有人负责全局校准。每个产品团队只修补自己的一块。客户支持团队削减拒绝分类器,因为法律声明导致用户满意度(CSAT)骤降。医疗团队收紧分类器,因为合规部门标记了一个险些发生的违规。开发工具团队重写系统提示词,以允许安全研究词汇。每一个变更在局部都是正确的,但在全局上却是不连贯的。

结果就是模型在不同界面上的拒绝表现不一致——有时同一个用户在处理实质上相同的问题时,在一个产品上得到了帮助,在另一个产品上却被拒绝。这在两方面都很糟糕。首先,用户体验极差。其次,这使得拒绝率指标变成了各团队自行的指标,意味着没有人对系统层面的信号负责。

结构性的解决方法是将拒绝校准视为共享的平台关注点,而不是每个产品各自的事情。这意味着需要有一套集中的政策和明确的类别定义、一个每个团队发布前都必须通过的共享评估语料库,以及一个汇总各界面的单一拒绝率仪表盘。仍然允许各团队进行补丁修复,但必须根据共享政策进行审查,而不是单方面落地。这是枯燥的组织层面的答案,但也是在五个产品团队基于同一模型进行发布时,唯一行之有效的方案。

拒绝质量取决于政策的具体化程度

更深层次的观察是,拒绝质量的校准上限取决于政策的具体化程度。如果政策只是简单地说“不要提供医疗建议”,那么每一个良性的医疗问题都像是在掷硬币——模型没有原则性的方法来区分临床医生的特定案例咨询与普通人的自我诊断尝试,因为政策没有定义这种区别。

在降低误报拒绝率方面取得进展的团队通常都有一个共同模式:他们将政策从“禁止做 X”改写为“当满足 [特定条件] 时协助 X,当满足 [其他特定条件] 时拒绝”。这些条件通常基于角色(临床医生 vs. 普通用户)、基于语境(研究 vs. 行动)或基于范围(通用信息 vs. 个性化建议)。一旦政策变得具体,拒绝分类器就有据可依,评估语料库也能够编码这些边界。

这比单纯的禁令列表工作量更大,并将许多困难的产品决策推回给编写政策的团队。这是一个特性(feature),而不是缺陷(bug)。模糊的政策产生的模型会根据表面匹配进行拒绝;具体的政策产生的模型则可以根据实际的产品应用场景进行校准。

本季度该做什么

如果你发布了一个基于 LLM 的产品,并且你将拒绝率作为一个单一指标进行追踪,那么接下来的实际步骤很简单:

  1. 抽取上周拒绝案例的分层样本。让一名非安全评审员将其标记为“应当拒绝”或“应当提供帮助”。这一比例即为你的初始误报拒绝率(false-refusal rate)。
  2. 构建一个包含 200–500 个提示词的固定语料库,这些提示词是你的助手绝对不应拒绝的。在每次发布时重新运行测试。观察误报拒绝率与正报拒绝率(true-refusal rate)的趋势对比。
  3. 审计你的安全策略中禁止类的规则。将排名前三的规则改写为带有明确“何时提供帮助”条件的规范。再次运行评估。
  4. 在你的团队和高管查看的任何仪表盘上,将误报拒绝率与正报拒绝率并列显示。如果只显示一个数字,优化将会是片面的。
  5. 确定谁负责系统层面的拒绝校准。如果答案是“没人负责”或“每个团队各管一摊”,那么你面临的是组织问题,而不是模型问题。

模型在拒绝一个良性问题时并没有失败。是构建安全栈的团队在衡量一个掩盖了一半成本的指标时,在无意识中接受了一项权衡。审计修复了这个问题——不是通过让模型变得更宽松,而是通过让双方的失败都变得可见。

References:Let's stay in touch and Follow me for more thoughts and updates