2023 年 7 月,OpenAI 悄悄下架了它的 AI 文本检测器。上线时它号称能识别 AI 写的内容,结果用户发现:只要把句子稍微改写一下,它就从“AI 生成”变成“人类写作”。OpenAI 在公告里承认,检测器的准确率不高,尤其是在短文本和改写过的内容面前。这件事让很多人沮丧——但另一条技术路线正在悄悄成熟:不是等 AI 写完再去猜,而是在生成的那一刻就把标记埋进去。这就是大模型水印。

我最早以为,给 AI 文本加水印,就像在图片里藏隐形水印——把某个词换成同义词,或者在标点符号里做手脚。后来看了 Kirchenbauer 等人 2023 年的论文,我才发现完全不是这么回事。水印不是改内容,而是改概率。
水印不是藏字,是改概率
想象模型生成下一个词的时候,手里有一张词表,每个词有一个分数。正常情况下,它按分数抽签,分数高的被选中概率大。水印的做法很粗暴:用前面已经生成的词算出一个随机种子,把词表随机分成两半,一半叫“绿组”,一半叫“红组”,然后把绿组所有词的分数统一加一个正数 δ。于是模型抽签时,绿词更容易被选中。整个过程,模型不知道自己在“加水印”,它只是在按一个被微调的分布做生成。
生成时具体分四步:
- 生成第 t 个词之前,取前 n 个已生成 token 的哈希值作为随机种子。
- 用种子将词表分成绿组和红组,比例通常 50:50。
- 给绿组所有词的 logit 加上一个常数 δ,然后照常做 softmax 采样。
- 重复直到生成结束。
这带来一个关键性质:你看到的是完全正常的文本。绿词和红词在语法上没有任何区别,唯一的区别是它们的出现概率被偏移了。对读者来说,水印是不可见的;对检测者来说,水印是统计信号。
检测:用统计眼光看文本
检测过程同样分四步:
- 拿到一段文本,用相同的哈希规则为每个位置算出对应的绿组。
- 统计实际落在绿组里的 token 数量。
- 计算 z-score,衡量绿词比例偏离正常水平的程度。
- 如果 z-score 超过预设阈值,判定为水印生成。
为什么能区分?因为人类写句子时,每个词落在绿组的概率就是 50%。而水印生成文本中,绿词比例可能高达 70% 甚至更高。你用二项分布算一下,这么长的文本里出现这种偏差的概率几乎为零。
你可以把它理解成抛硬币:人类写作像一枚均匀硬币,正反面各半;水印文本像一枚被做了手脚的硬币,正面概率被调到了 0.7。抛 100 次,正面 70 次,你很难相信这是运气。
水印并不免费:质量与强度的权衡
任何水印都会影响生成质量。δ 越大,绿词被选中的概率越高,水印检测越可靠,但文本也越偏离模型原本的分布——它可能让某些不太自然的词出现得更频繁。所以部署时要在检测强度和文本质量之间做权衡。Kirchenbauer 的论文里,他们用自动指标和人工评估衡量了 δ 对文本质量的影响,结论是:当 δ 不太大时,质量损失几乎察觉不到。
改一改就没了?水印的软肋
但你可能马上想到一个问题:如果我把 AI 生成的文本改写一下,把几个绿词换掉,水印是不是就消失了?是的。这是所有基于统计的水印方案都绕不开的软肋。Kirchenbauer 的论文里专门做了攻击实验:同义词替换、随机删除、改写,甚至把文本翻译成另一种语言再翻回来。结果发现,水印对攻击的鲁棒性相当有限,少量修改就能让统计检测的置信度大幅下滑。
原因很直观:水印是埋在整个词序列里的统计信号。你每换一个词,就相当于在信号里注入一次噪声。改写得越多,信噪比越低,直到统计检验再也无法区分。
SynthID:让扰动学会“伪装”
Google DeepMind 的 SynthID 文本水印 试图把这根软肋磨钝一点。它不再用固定 δ,而是训练一个小的神经网络,根据当前上下文生成一个“扰动向量”,加在原始 logits 上。这个扰动向量不是简单地抬举一组词,而是经过优化,让水印的统计模式更难被无意的改写破坏,同时又不显著影响文本质量。
换句话说,Kirchenbauer 的水印是往信号里加一个固定的正弦波,SynthID 是加一段经过设计的“噪声”,这段噪声在普通改写中更不容易被抹掉。
| 对比项 | Kirchenbauer 水印 | SynthID 文本水印 |
|---|---|---|
| 核心扰动 | 绿名单 logits 加固定 δ | 神经网络生成自适应扰动 |
| 检测方式 | 统计绿词比例 | 训练检测器识别扰动模式 |
| 训练成本 | 无需训练,推理时直接加 | 需要额外训练水印网络 |
| 鲁棒性 | 对轻微改写敏感 | 对改写、截断更稳健 |
| 可解释性 | 机制透明,容易审计 | 扰动是黑盒,审计更难 |
不过 SynthID 也远非万能。论文里明确说,当文本被大幅度改写、翻译或融合多段来源时,水印依然会失效。这是水印的物理极限:任何统计信号在足够大的噪声下都会淹没。
水印能追踪来源,但别指望它证明一切
所以,水印到底能做什么?我梳理一下:
- 能:在长文本生成场景下,以较高置信度判断某段文本是否来自特定的水印模型。
- 不能:在短文本(如一句话)下可靠工作,因为样本太少。
- 不能:区分“谁”生成的,只能区分“是否来自某个带水印的模型实例”。
- 不能:防住专业攻击者。如果攻击者知道水印算法,可以训练一个去噪模型,或者在采样后做全局改写来抹掉水印。
我最早以为水印是一种密码学签名,你看到内容就能验证作者。后来才意识到,水印更像是一种“统计指纹”:它不隐藏具体信息,而是改变生成过程的随机性。这让它在对抗聪明攻击者时很脆弱,但也让它在大规模部署中很实用——因为大多数用户不会去刻意破坏水印。
水印能被人类看见吗?
看不见。水印不是文字层面的标记,而是概率层面的偏移。人眼无法分辨,但统计检验可以。
水印和显式声明有什么不同?
显式声明(如“AI 生成”)是内容之外的一句话,可以被删掉或裁剪。水印是嵌入在内容本身的统计特征,删掉它就得改写内容本身。
如果模型是开源的,攻击者直接去掉水印怎么办?
只要攻击者拿到模型权重,理论上可以微调掉水印。所以水印部署通常需要配合模型安全和访问控制,而不是单靠算法。
水印的意义,在于把“检测 AI 内容”这个不可能的任务,变成了一个在统计学上可操作的问题。
回到开头的问题:大模型水印能追踪来源吗?能,但有边界。它在长文本、高熵场景下表现良好,在短文本、强改写场景下会失效。它防不住专业的攻击者,但能拦住绝大多数无心之失。就像纸币上的水印,它从来不是为了让专业造假者束手无策,而是为了让验钞变得足够简单、足够廉价。至于水印算法、部署方式和对抗攻击的赛跑,才刚刚开始。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/214.html