你有没有过这种时刻:agent 跑了一整晚,日志干净,一切正常,第二天早上客户回信问,你为什么要 CC 一个我不认识的人。
打开 diff 一看,收件人字段少了一个字母,多了一个小数点。
别急着怀疑模型脑子坏了。它可能只是被盖了个戳。
Anthropic 前阵子说,以后 Claude 的输出会嵌不可见水印,用 Google DeepMind 的 SynthID-Text。文本水印不是新东西,但这次不一样——欧盟 AI 法案第 50 条第 2 款压着,标记合成文本不是可选项,是合规项。要求写得挺全:有效、可互操作、鲁棒、可靠,四个词排在一块儿,念着像口号,落到工程上每一条都能让人加班。
问题在于,SynthID-Text 不是往输出末尾贴个隐藏标签。
它改的是模型生成下一个 token 的流程本身。
【灯光渐暗,token 分布直方图上多了一根看不见的偏置】
模型层面那点事,先放一放。我知道你更关心 agent 那层——毕竟你那个半夜发邮件的自动化流程不会自己去读论文。你只想知道,为什么它昨天还把邮件发给张三,今天发给张二。
因为被推了一下的那些 token,不只是词汇问题。
在 agent 执行的时候,采样出来的 token 决定调用哪个工具、传什么参数。Andrea Siposova 那篇九月中旬发的文章管这个叫 sampling drift,说白了就一句:采样路径被水印改了,采样出来的动作也跟着歪。
你可能觉得,改一两个字能有多大事。关键看改在哪儿。
SynthID-Text 用的是锦标赛采样,它的脾气是:模型越不确定下一个 token 该选谁,水印越容易在那里动手脚。JSON 里的括号、键名、函数名,模型闭着眼都能猜对,水印插不进去。查询词、数字、路径、收件人——这些地方模型本来就摇摆,水印在那里一推一个准。
所以你的 agent 不会把 get_weather 写成 get_wether。
但会把 [email protected] 推成 [email protected]。
(友情提示:改键名不如改参数值,改参数值不如改收件人,改收件人不如直接让整封邮件静默躺在草稿箱里。水印的破坏力,沿着"模型有多不确定"这条曲线分布,而收件人字段正好坐在曲线的波峰上。)
然后你肯定会说,论文里不是写"无失真"吗?无失真不就意味着输出分布跟原来一模一样?
这里有个特别容易滑过去的细节。
无失真保证的是:水印随机性在期望意义上被边缘化之后,token 分布跟原始分布一致。但固定一个密钥、跑一次具体生成的时候,token 选择该变还是变。
把一万次生成平均起来看,水印什么都没干。单独看你那次生成,它可能干了很多。
这两句话都是真的,这就是最让人睡不着的地方。
Dathathri 那帮人在 Gemini 上试了近两千万条回复,没测出可测量的质量下降。但"质量下降"和"行为不变"是两个东西。你那个收件人字段从头到尾格式完美、语气得体、评分满分,中间被换了字母的事,质量指标一个都抓不着。
真正让这篇文章值得读的还不是工具调用那部分,是拒绝行为。
实验设计是这样的:200 条 HarmBench 有害请求,加 100 条 JailbreakBench 良性对照,一组裸提示,一组加固定提示注入——把对抗指令当成检索内容塞进去,声称安全过滤器已关闭,要求模型遵从。然后看水印开和不开,同一个请求的判定会不会变。
裸提示下,水印对拒绝率的影响不算大,churn 也就 6%、7% 那个量级,看着像噪声。加上注入之后,gemma-3-27b 的 churn 跳到 23.5%,净遵从变化从 −1.0 变成 +12.5 个百分点。
翻译一下:水印本身没有让模型变笨。
但它让模型在对抗输入下更容易松口。
原本该拒绝的请求,现在不拒绝了。而 agent 一旦有了工具调用能力,拒绝变遵从就不只是"多说了一句话",而是"多执行了一个动作"。
我前面把水印说得有点吓人,得往回找补一句:大部分模型在大部分配置下,净准确率变化不大,工具调用被判定的平均 churn 也就 6.5%,有些组合四舍五入看不出来。phi-4 和 Qwen3-4B 在注入下变化很小,乍看挺稳。
但这里有个特别安静的坑。这两个模型在评估里本身就倾向过度拒绝,连良性对照都拒。它们"稳定"是因为它们本来就在另一个方向上错着,不是水印对它们友好。
(郑重声明:以上"稳定"二字,不代表安全行为没有被改变,只代表改变方向恰好和水印无关,和模型自己的脾气有关。这两件事不是一回事,但在聚合报表上长得一模一样。)
净指标还有一个更麻烦的毛病:互相抵消。
有的任务被水印改坏了,有的被改好了,平均下来准确率没动。但 agent 不是跑平均分的,它是跑你那次具体调用的。你那个收件人字段被改的那一次,在总表里可能被另一次误打误撞改对的操作给抹平了。
所以文章建议看配对不一致率,也就是同一个输入、同一个种子、水印开和不开,判定是不是同一个。这个数字才是你真正该盯的。
还有一个更让人抓头的发现:效应依赖密钥。
同一批提示、同一个模型、同一个注入技术,换一个水印密钥,攻击成功率可能涨、可能跌,涨跌幅度还不一样。研究密钥在两个 Gemma 模型上属于提高幅度最大的那几个密钥之一。Llama-3.1-8B 上,研究密钥让攻击成功率涨了 3.5 个百分点,另外十个密钥平均涨 4.4 个百分点,单拎出来看范围从 −4.5 到 +14.5。
这不是 bug,这是采样过程的统计性质。但对你来说,它长得特别像 bug——尤其是当你没法选密钥的时候。
而提供方托管的模型,密钥和配置本来就在模型侧。你在上面盖 agent,采样过程在人家手里,你可能永远不知道今晚用的是哪个密钥。
文章最后一句话说得很干脆:来源追溯和行为稳定性是不同属性。
改成大白话:你的水印能不能被检测出来,和你 agent 明天早上发的邮件有没有发错人,是两件事。
监管要的是第一件。你要的是第二件。
(友情提示:下次在 agent 配置里打开水印开关之前,先跑一遍带提示注入的配对测试。如果没跑,就当自己灰度发布了一个新模型,只是没人写 release note 告诉你。评论区扣个"已踩坑",我看看有多少人跟我一样,在收件人字段上栽过跟头 🫠)
