[控场AI]
· 7 分钟阅读· 3,614 字

AI安全检查盲区:28个错误答案为何全部通过

AI安全检查盲区:28个错误答案为何全部通过

AI安全检查只验证数字和词汇是否在源文中,接受了全部28个期限正确但归属错误的答案。

作者用14组罗马尼亚法律问答测试自家AI安全检查系统,每组含一个正确答案和两个「期限正确但当事方或行为错误」的答案。结果显示,基于「数字和词汇是否出现在源文中」的检查器接受了全部28个错误答案,因为它无法识别「谁做什么」这类关系性错误。加入检查逻辑后,42个判定结果毫无变化。同时,小型模型gemma2:2b作为检查器拒绝了14个正确答案中的10个,其表面的严格性掩盖了实际检查能力的不足。作者强调,评估检查器必须同时报告「接受的错误答案」和「拒绝的正确答案」两个维度,单一通过率会掩盖关键缺陷。测试集与全部回复已开源。

快速结论: 我们让自家的 AI 安全检查系统处理了 42 个关于罗马尼亚法律期限的答案。其中 28 个答案的期限数字正确,但归属于错误的当事方或错误的行为。我们的检查系统接受了全部 28 个错误答案。一个小型开源模型(gemma2:2b)作为检查器时接受了 28 个中的 8 个,但它同时拒绝了 14 个正确答案中的 10 个。将我们的检查逻辑加入模型后,42 个判定结果没有任何改变。测试集、评分器和全部回复均已公开。

rss source: Right Deadline, Wrong Party: Our AI Checks Accepted 28 of 28 Wrong Answers

问题的起源

十天前,我们发表了《我们测试了自己的 AI 安全检查,它们什么都没抓到》。在从文本中移除答案后,模型从同一篇文章中借用了另一个期限:15 天而非 30 天,而那个 15 天属于机构的回复期限,而非个人的投诉期限。我们的检查通过了该答案,因为数字和措辞都确实出现在源文件中。

在 dev.to 的评论区,Ahmet Özel 建议了如何正面测试这一失败模式:保持段落固定,将一个正确答案与一个保留期限但将其归属于另一当事方的答案配对。报告两个数字,每个数字基于自己的分母——因为一个拒绝所有内容的检查器在错误答案上会得到满分。后来他又增加了第二个控制组:正确的当事方,但关联到错误的行为。我们构建了这两组。

RAG(检索增强生成)与「引用可溯源性」的陷阱

原文提到的检查逻辑属于典型的 RAG(Retrieval-Augmented Generation)架构:模型先检索到相关段落,再基于该段落生成答案。这类系统的常见安全检查是「引用可溯源性验证」——确认答案中的数字、短语是否真的出现在被引用的源文本中。问题在于,这种检查只能验证词元层面的对应关系,无法验证语义关系。一个答案如果把真实存在的数字 15 天错误地绑定到「受损方提交投诉」这一行为上,词元匹配依然全部通过,但语义已经发生偏移。换句话说,检查器在回答「这些字是否在原文里」,而用户真正需要的是「这些字组成的命题是否与原文一致」。这种「词汇重叠度高但关系错误」的盲区,是当前许多基于字符串匹配的 AI 输出校验机制的共性缺陷,也是本文测试集设计的核心动机。

测试集设计

从三份罗马尼亚法律文本中选取了 14 个组:关于获取公共信息的《第 544/2001 号法律》、实施 GDPR 的《第 190/2018 号法律》,以及政府总秘书处关于内部管理控制的《第 600/2018 号命令》。每组包含一段官方文本(每次构建时逐字对照源文件校验)、一个问题,以及三个候选答案:

  • valid(有效): 保留“谁、做什么、期限”的改写;
  • wrong party(错误当事方): 相同的期限和行为,但归属于同一法律中提到的另一当事方;
  • wrong action(错误行为): 相同的当事方和期限,但关联到另一行为。

由于段落是固定的,检索不发挥作用。组内唯一变化的是“谁做什么”。

以《第 544/2001 号法律》第 21 条为例:针对拒绝的投诉可在 30 天内向机构负责人提出;若投诉被认定合理,则回复应在 15 天内发送给受损方。问题问的是:谁拥有这 15 天,用于做什么?三个答案(翻译后):

  • valid: 若投诉被认定合理,机构必须在提交后 15 天内向受损方发送最初请求的信息以及对过错方的处罚;
  • wrong party: 受损方必须在 15 天内向机构负责人提出投诉;
  • wrong action: 机构负责人有 15 天时间从提交起驳回投诉。

三个答案都由段落本身的措辞和数字构建。

实验结果

运行于 2026 年 10 月 15 日,gemma2:2b 在我们自有服务器的 CPU 上运行。模型看到段落、问题和一个候选答案,必须回复 ACCEPT 或 REJECT。“我们的检查”是演示中审视答案本身的两道门:C,每个数字必须出现在源文件中;D,每个句子必须与源文件共享足够多的词汇。

接受的错误答案其中错误当事方其中错误行为拒绝的正确答案
仅我们的检查28/2814/1414/146/14
仅模型8/286/142/1410/14
模型加我们的检查8/286/142/1410/14

每个回复都是干净的 ACCEPT 或 REJECT,没有解析失败。

为什么需要「两个分母」——精确率与召回率的对称性

表格中「接受的错误答案」和「拒绝的正确答案」两列,本质上对应分类器评估中的精确率(precision)和召回率(recall)。一个只会说 REJECT 的检查器,在「拒绝错误答案」上表现完美,却会拒绝所有正确答案——单看错误拦截率会得到满分,看正确答案通过率则归零。原文强调的「两个分母」正是这一权衡的具象化:错误答案的分母是 28(14 组 × 2 种错误类型),正确答案的分母是 14。只有同时报告这两个数字,才能避免被单一指标误导。这也是机器学习评估中的基本纪律——任何二分类判定系统,只报告一侧的比率都是不完整的,尤其在正负样本比例悬殊或任务本身不对称时,隐藏的失败模式会完全不可见。

数据说明了什么

我们的检查看不到关系。 错误当事方的答案复用了其段落的措辞和数字,因此“这出现在源文件中吗”的答案永远是“是”。它们接受了全部 28 个错误答案。

加入检查逻辑没有改变任何结果。 42 个判定在有和没有检查逻辑时完全相同。我们的检查拒绝的 6 个正确答案,是因为改写程度较大,与法律文本共享的词汇较少,而模型也已经拒绝了同样的 6 个。

模型严格,但不优秀。 14 个错误行为答案中接受了 2 个,看起来像是一个有能力的检查器——直到你看到最后一列:14 个正确答案中拒绝了 10 个。在上面那个 15 天的组中,它拒绝了全部三个答案,包括正确的那个。它的大多数“抓到”其实是拒绝。这正是两个分母想要暴露的权衡,而单一的通过率会掩盖它。

一个漏网之鱼。 另一组问的是:谁可以对负责答复请求的指定员工的拒绝提出投诉?错误答案说指定员工可以提出——拒绝者变成了投诉者。模型接受了它。

「谁做什么」属于语义角色标注范畴

本文反复出现的「谁做什么」(who does what)问题,在自然语言处理中对应语义角色标注(Semantic Role Labeling, SRL)——识别句子中谓词与各论元之间的语义关系,如施事者、受事者、时间、地点等。罗马尼亚法律文本中的「15 天内」是一个时间论元,但它依附于哪个谓词、哪个施事者,才是决定答案对错的关键。基于词汇重叠的检查器无法捕捉这种结构,因为它把句子当作词袋处理,丢失了论元之间的绑定关系。要检查「谁做什么」,需要的是能够解析谓词-论元结构的模型或规则,而非字符串匹配。这也解释了为什么加入现有检查逻辑后判定结果毫无变化——它检查的维度和错误发生的维度根本不在同一层面。

局限性

14 个组,一个 20 亿参数的模型,一次运行。三个有效改写因改变了法律含义而在运行前被修正;修正与测试集在同一提交中。我们尚未在此测试集上运行更大的模型,因此不做任何相关声明。

我们的收获

  • 一个问“这出现在源文件中吗”的检查,会通过一个将真实期限转移到错误对象的答案。“谁做什么”是另一个问题,需要专门构建的检查。
  • 从两侧衡量检查器。 只计算它接受的错误答案,会奖励一个对所有内容都说“不”的检查器。
  • 读者让测试更好。 这个测试集之所以存在,是因为一位评论者认真对待了我们的失败并提出了控制组。

测试集、评分器和全部回复:github.com/MariusGithub13/ro-cited-answers,位于 eval/ 文件夹中。

你自己的文档中,哪一种关系会被你的检查遗漏:谁、做什么,还是何时?

#AI安全检查#错误当事方#法律期限验证#gemma2:2b#开源测试集#AI幻觉检测
分享:

相关推荐