"AI 水印"这个词被用得太宽了。有人说的是复制粘贴后夹带的零宽字符,有人说的是 Google 那套嵌在词元概率里的 SynthID,还有人说的是图片文件里写着"由 XX 生成"的那行元数据。这三样东西的嵌入位置不同、检测难度不同、能不能删掉更是天差地别,混在一起谈只会得出错误结论——比如"我把不可见字符清干净了,所以这段文本已经查不出是 AI 写的了",这个推论是错的。

按嵌入的层次划分,目前实际存在的 AI 水印大致分四类:编辑层的隐形字符、生成过程中的统计采样水印、文件容器里的元数据凭证,以及图像像素域的水印。下面逐个说清楚。

一、隐形字符:编辑层的标记,删了就是删了

"AI 水印是什么?三种类型和它们各自的真实强度" — visual 1
一、隐形字符:编辑层的标记,删了就是删了

这类水印靠 Unicode 里那些"有码点但不显形"的字符实现。最常见的载体有三组:

  • 零宽系列:U+200B 零宽空格、U+200C 零宽不连字、U+200D 零宽连字、U+FEFF(BOM,做字节序标记的老用法已废弃,但仍到处出现)
  • 标签字符:U+E0001 和 U+E0020–U+E007F。这一段是 Unicode 里最经典的隐写载体,因为 U+E0020 到 U+E007E 与 ASCII 的可打印字符一一对应,把一段明文整体加上 0xE0000 的偏移就成了一串完全不显示的字符,直接跟在正文后面,肉眼零痕迹
  • 变体选择符:U+FE00–U+FE0F 和 U+E0100–U+E01EF,本职工作是指定同一个汉字或符号用哪种字形,但同样可以被拿来编码任意数据

编码方式没什么玄机。用两种零宽字符分别代表 0 和 1,每 8 个一组还原成一个字节,就能把一串标识符藏进正文;用标签字符则更直接,几乎是明文平移。

关键在于:这些字符属于文本的编辑层,不是生成层。它是在模型输出之后、由某个程序插进去的,跟模型怎么选词毫无关系。所以它的性质很干脆——

  • 能不能检出:能,而且是确定性的。逐码点扫描,落在这些区间里的字符一个都跑不掉
  • 能不能移除:能,删掉对应码点即可
  • 移除后能不能验证:能。再扫一遍,计数归零就是干净的

唯一的坑是不能无脑删。U+200C 和 U+200D 在阿拉伯语、波斯语、印地语的正字法里是必需的,删了会改变词形;emoji 的组合序列(比如彩虹旗、家庭组合、肤色变体)也依赖 U+200D 和变体选择符连接,删了会把一个 emoji 拆成好几个。所以清理工具应该区分语境,而不是把整个区间一刀切。这部分的细节我在零宽字符与隐形字符:怎么发现、怎么清除里展开讲了。

二、统计采样水印:藏在概率分布里,看不见也删不掉

"AI 水印是什么?三种类型和它们各自的真实强度" — visual 2
二、统计采样水印:藏在概率分布里,看不见也删不掉

这才是学术意义上真正的"文本水印",代表是 Google 的 SynthID-Text,以及更早的 Kirchenbauer 等人提出的绿名单/红名单方案。

原理大致是这样:语言模型每生成一个词元,都会先算出全词表上的一个概率分布,然后从中采样。水印方案在采样这一步动手脚——用一个由前文和密钥决定的伪随机函数,把词表切成"偏好"和"不偏好"两组,然后让采样在统计上略微倾向前者。单看任何一个词都完全正常,因为被偏好的词本来也在合理候选里;但文本一长,这种偏向就会累积成一个统计信号。检测时用同样的密钥重算一遍每个位置的分组,统计命中率,命中率显著高于随机水平就判定为带水印。

它和隐形字符的区别,是本质性的:

  • 嵌在哪:嵌在词的选择里。文本的每一个字符都是正常字符,没有任何多余码点
  • 能不能检出:只有持有密钥的一方能检测。你我在本地扫描文本,扫不出任何东西——因为确实没有东西可扫
  • 能不能移除:没有确定的移除方法。删字符没用,因为没有多余字符。只有大幅改写才能削弱信号:换词、拆句合句、调整语序、翻译再译回来。改动幅度越大信号越弱,但这是一个概率上的削弱,不是清除
  • 移除后能不能验证:不能。没有公开可用的检测器,你无法确认自己改到什么程度了

这三条必须说清楚,因为市面上不少工具含糊其辞地暗示"能去除 AI 水印"。对隐形字符来说这个说法成立,对统计采样水印来说不成立。任何声称能保证清除 SynthID-Text 或保证通过 AI 检测的说法,都没有技术依据。

另外要区分两件事:统计水印检测和"AI 生成内容检测器"(那些靠困惑度、句长分布之类特征做判断的服务)不是一回事。后者是概率猜测,误判率不低,人写的规整文本被判成 AI 的情况很常见。

三、文件元数据:最容易忽略,也最容易清理

图片、PDF、Office 文档都是容器格式,正文之外还带着一堆结构化字段。AI 生成的文件常见的标记有几种:

  • C2PA 内容凭证:以加密签名的清单形式记录内容来源和编辑历史,可以嵌在文件里,也可以做成外部记录。它设计上就是可验证的——签名对应发行方证书
  • EXIF / XMP:图片的拍摄参数、软件名、创建时间。AI 生成图常在 Software 或 XMP 的相关字段里写上生成器名称,有的还把完整提示词写进 UserComment 或 PNG 的 tEXt 块
  • 文档属性:Office 文件的 docProps 里有作者、公司、最后修改者、编辑总时长;PDF 有 Producer、Creator 和 XMP 包

这类标记有个共同点:它们和内容本身是分离的。删掉不影响一个像素、一个字符。

  • 能不能检出:能,读文件结构就行
  • 能不能移除:能,重写容器、剥离元数据块即可
  • 移除后能不能验证:能,重新读一遍字段确认为空

值得留意的是,元数据泄露的往往不只是"这是 AI 做的"。手机拍的照片可能带 GPS 坐标,Word 文档可能带你公司的域账号名和文件在硬盘上的原始路径,PDF 可能带排版软件的授权信息。发布前清理元数据,与其说是去水印,不如说是基本的信息卫生。

四、像素域水印:删不掉,别指望工具

最后一类是嵌在图像内容本身的水印,SynthID 的图像版本属于此类。它把标识信息编码进像素的细微扰动里,肉眼看不出差别,但对常见的图像处理有相当强的鲁棒性——压缩、裁剪、缩放、加滤镜、截图之后信号往往还在。

  • 能不能检出:只有官方检测端能判定
  • 能不能移除:普通工具做不到。清除元数据完全不影响它,因为它压根不在元数据里
  • 移除后能不能验证:无从验证

需要明确:图片元数据清理工具处理的是 EXIF、XMP、C2PA 这些容器字段,不触碰像素。如果一张图带了像素域水印,清完元数据它依然带着。反过来说也成立——一张图元数据干干净净,不代表它没有像素水印。

把四类放在一起看

类型 嵌在哪 本地能否检出 能否移除 移除可验证
隐形字符 文本编辑层
统计采样 词元选择概率 不能 只能削弱 不能
文件元数据 容器字段
像素域 图像像素 不能 不能 不能

规律很清楚:信息嵌得离内容越远,越容易被彻底清除且能验证;嵌得越深,越无从下手。隐形字符和元数据是"贴上去的标签",统计水印和像素水印是"揉进面里的盐"。

对普通使用者来说,实际能做也值得做的是前两类中确定的那部分:知道自己发出去的文件里有什么,并在必要时把不想公开的东西清掉。这是知情权的问题——你有权知道一份文档里除了正文还写了什么,也有权决定哪些信息随文件一起流出去。至于统计水印和像素水印,诚实的说法是:现有的公开手段处理不了,任何相反的承诺都不必相信。