> 一个在模板自带文字上每篇必中的检测器,基线假阳性率是 100%

Research Tools Beginner 2026-10-11 18:09 2026-10-11
#scanning #false-positive #detection #tooling #prompt-injection

一个扫描 PDF 里可疑内容(隐藏文字、注入、分数操纵)的工具,噪声大到淹没真信号。 把假阳性逐类列出来之后,根因是四种,而最后一种最说明问题:

// TABLE_OF_CONTENTS

结论先行

一个扫描 PDF 里可疑内容(隐藏文字、注入、分数操纵)的工具,噪声大到淹没真信号。 把假阳性逐类列出来之后,根因是四种,而最后一种最说明问题:

命中的东西 被报成 真实情况
结果表里的 10/10、6 / 65 / 21 "Score manipulation: pre-set high score" 就是实验数字
单词内部的 dan(redundant / nonredan… / Daniel / Dana) "Jailbreak pattern" 子串匹配没加词边界
图表里的白色文字标签(百分比、"day 22") "Hidden text" 浅色背景上的正常标注
会议模板自带的第 1 页页脚(提示审稿人阅读指南的那行) 命中 每一篇都会中

最后一条意味着这个检测器的基线假阳性率是 100%: 在一份完全空白、只套了模板的文档上,它也会报一条。

为什么

三条可推广的东西。

一、检测器必须先在"空输入"上跑一次。 这里的空输入是"只有模板、没有内容的文档"。 任何在空输入上仍然报警的检测器,它的每一条输出都要先减掉这个基线。 这是最便宜的一次测试,而且几乎没人做。

二、子串匹配在短 token 上一定会炸。 dan 是三个字母,它出现在 redundant、abundant、人名里。 短关键词必须加词边界(\bdan\b),或者干脆不用关键词。 判断标准很简单:这个词有多短,它就有多大概率是别的词的一部分。

三、同一个特征在不同上下文里含义相反。 "和背景同色的文字"在正文里是隐藏文本的信号,在图表里是正常标注; "一串整齐的高分"在元数据里可疑,在结果表里是数据。 所以检测器要么知道自己在文档的哪个区域(正文 / 表格 / 图 / 页眉页脚), 要么就不该报这两类。

而噪声的代价不是"多看几条":它会让真信号被跳过。 一个报 200 条的扫描器和一个什么都不报的扫描器,使用上是等价的—— 两者都不会被读。见 测不出失败的门禁比没有门禁更糟——它在制造信心。

怎么用

  1. 先在空白模板上跑一遍,把命中的全部内置成已知文本白名单。 会议模板、期刊样式、公司文档模板自带的那些行,一次性加进去。
  2. 给每条规则记一个在"干净语料"上的假阳性率,并把高于阈值的规则默认关掉。
  3. 短关键词加词边界;或者改成按行/按块匹配,而不是按子串。
  4. 让规则知道区域。 实现上通常就是先做一次版面分割, 然后只在允许的区域里跑对应规则。
  5. 报告里把规则命中数按规则分组列出来,这样"某条规则贡献了 90% 的噪声" 一眼就能看见。见 检查工具的噪声按「来源文件」折叠,不按条目截断。

出处