安全过滤器怎么测?先验证测试本身可靠
MIT 许可的 enki-harness 用恶意与无害近似样本、恒定放行或拦截的对照,以及规则消融来检验过滤器和测试框架。新增模型评判功能会重复提交样本并报告拦截率,避免单次回答掩盖波动。
AI 深度解读
安全过滤器通过了自己写的测试,离「可靠」还有多远?enki-harness 作者给出的答案是:先证明测试能识破一个糟糕的过滤器,再讨论分数。他用新增的 hb judge 反复测试产品里的审核步骤,发现自家固定、无害的提示词也会被误拦,频率约为 1/40。
这篇值得程序员读的地方,不是又多了一个测试工具,而是它展示了怎样用对照、重复运行和预先声明的失败条件,检查那些看起来已经通过验证的 AI 功能。
测试全绿,可能只是题目出得太顺手
作者认为,自己写过滤器,再自己写测试,很容易只覆盖已经想到的情况。enki-harness 是一个免费、采用 MIT 许可证的测试框架,试图补齐几类容易漏掉的验证:
- Twins:每个应该拦截的案例,都配一个措辞近似、但应该放行的无害案例,检查过滤器是否误伤。
- Controls:加入始终放行、始终拦截的简陋替身。如果它们也能过关,测试框架就有问题。
- Rules off:逐条以及两两关闭规则,寻找不起作用的规则,以及相互抵消的组合。
- Attacker slice:用不同于常规案例生成器的另一个生成器,构造 leet 字符替换、插空格、拉长字符等变体。
- Falsifier:运行前写下什么结果能推翻自己的判断,并记录时间,避免看到结果后再改口径。
先让验证关卡全部通过,再给总分。
这里的「关卡」是在检查测量方法是否可信。一个始终拦截的过滤器,可能抓住全部危险输入,却也拒绝了全部正常请求;只有正例命中率,很容易把这种东西评成高分。
工具本体只用 Python 标准库,运行它无需通过 pip 安装依赖。它既能提供仅限 localhost 的本地网页,也能作为 MCP server 接入编程助手。原文给出的调用表达是 test my filter in filters/swear.py with enki-harness。作者还称,一条注册命令可接入 Claude Code、VS Code/Copilot、Cursor、Codex、Claude Desktop 和 Windsurf,并先备份配置,但没有贴出具体命令。
模型过滤器要测拦截频率,单次通过不够
这次新增的 add-on #1「hb judge」,针对的是由 AI 模型执行的过滤步骤。它会把每个案例发送多次,报告拦截率,减少单次幸运回答造成的误判。
作者通过 Ollama 在本地运行 Llama Guard 3 8B,无需 API key,没有按次调用费用,测试内容也不离开机器。这里的「免费」指调用费用,本地硬件和运行时间仍然需要自己承担。
他测试的是自家产品图片功能中的提示词审核:输入全是团队写好的固定句子,描述普通成年人的肖像,没有任何用户文本。重复运行后,这些句子仍会随机被拦,约每 40 次出现 1 次;被拦的句子会变,也没有连续两次拦住同一句。
作者原本准备花一个晚上修改措辞,后来发现,已经上线使用的普通卡通风格提示词也有相近的误拦频率,于是放弃了这个修复方向。他们只移除了这个功能中针对自家固定文本的审核,生成后图片上的检查继续保留。
先确认不稳定发生在哪一层,再决定要不要改提示词。
测试过程还暴露了两个工程问题。首次运行时,本地模型仍在加载,必须通过的对照案例失败,整轮结果因此作废;工具随后加入预热调用。另一个问题是,400 次调用长时间没有输出,看起来像卡死,于是现在每 25 次调用打印一次进度。
我的判断
我认同它把误伤案例、无效替身和重复运行放在分数前面。对于 AI 功能,测试脚本跑完和测量结果有效,是两件需要分别确认的事。
但作者把噪声归因于模型,证据还不够完整。原文没有给出完整逐行结果、采样参数、每条提示词的重复次数,也没有交代随机性来自模型本身还是推理配置。现有描述支持「审核结果存在波动」,尚不足以彻底排除措辞的影响,更不能把约 1/40 当成 Llama Guard 3 8B 的通用误报率。
移除审核也有严格前提:该步骤只检查团队控制的固定文本。如果换成用户自由输入,就不能照搬。与继续改写提示词相比,作者的做法有重复测试作为依据;但他们没有提供改写前后的对照实验,所以「改写不会解决问题」仍是针对这次观察的经验判断。
开源权重的实际优势是便于本地重复测量和查看结果。封闭 API 同样可以做重复实验,只是调用成本与可控制范围不同,原文没有提供两者的成本对照数据。
能拿来做什么
- 给现有过滤测试补上成对案例:一个必须拦截,一个措辞接近但必须放行,同时观察漏拦和误拦。
- 如果 Node 服务调用模型做审核,对同一批输入重复运行并记录逐条结果,先确认波动范围,再修改提示词。
- 在本地模型测试流程里加入预热、对照案例和进度输出;对照失败时让本轮结果作废,避免把加载失败算成模型表现。
- 检查图片生成流程里每道审核接收什么输入。对于完全由团队控制的固定文本,可以评估该步骤是否重复,但应单独确认生成后图片检查仍然有效。