Claude 的文本水印不藏在某个词里,而藏在大量选词的统计分布中
Anthropic 已开始为 Claude 生成文本打水印,官方公告见 Anthropic: Claude Text Watermark。公告之后,GitHub 上很快出现了一个名为 watermarks-remover 的去水印 Skill,目前已有 1.6 万+ Star。
纯文本没有像素,复制到记事本后看起来干干净净。Claude 的水印藏在哪儿?这个去水印 Skill 又在做什么?往下拆。
先分清三种“文字水印”
提到水印,容易先想到图片角落的半透明 Logo。图片有像素,视频有画面,这些地方都能藏信息;纯文字没有对应载体。所以需要先拆分:日常说的“文字水印”至少包含三种完全不同的机制。
第一种是隐藏 Unicode 字符:零宽空格、特殊空白符、文字方向控制符等。它们不占宽度,人眼看不见,但程序检查 Unicode 编码时可以逐个识别。
比如把零宽空格用转义形式写出来:
正常文本:Claude很好用
带标记文本:Claude\u200B很好用
第二行看起来和第一行一样,但“Claude”后面藏了一个 U+200B(零宽空格)。约定 U+200B 表示 0、U+200C 表示 1,往文本里塞几十个这样的字符,就能悄悄编码一串编号。读者看到的还是原文,机器读到的则是另一层信息。
Claude Code 之前也被发现过类似思路。部分版本会根据中转域名和系统时区修改系统提示词里的日期,比如命中中国时区后:
正常:Today's date is 2026-06-30.
标记后:Todayʹs date is 2026/06/30.
撇号被替换成相近的 Unicode 字符,日期连接符也从短横变成斜杠。肉眼不容易注意,但程序读取编码后,可以直接识别请求命中了什么环境。这和零宽字符是同一种思路:差异藏进正常文字,机器一眼能认出来。
第二种是文件元数据。手机照片像素里只是桌子和咖啡杯,但“照片详情”可能带着拍摄设备、拍摄时间和位置,这些内容写在 EXIF 里。删掉位置信息后照片不变,裁掉一半图片元数据也不一定消失。PDF、DOCX 同理:正文可以是“项目方案”几个字,文件属性里却带着作者、创建软件、创建时间和最后修改时间;C2PA 则更像一份电子履历,记录文件由什么工具生成、后续经过哪些处理。这类元数据像贴在文件上的行李牌:原文件转发出去会跟着走,但只复制正文到记事本,信息通常就留在原文件里了。
Claude 这次用的是第三种,统计型文字水印。它不增加字符,也不往文件里塞用户编号,而是把水印放在模型选择 Token 的随机性里。
Claude 的水印体现在选词概率上
大模型每写一个词,都要给候选 Token 计算概率。假设 Claude 已经写到“今天的天空看起来有些……”,候选结果可能如下:
- 阴沉:31%
- 灰蒙蒙:28%
- 昏暗:24%
- 甜的:接近 0%
“甜的”不可能出现,上下文根本接不上;但“阴沉”“灰蒙蒙”“昏暗”都成立,换掉其中一个也不改变句子含义。如果模型永远只选概率最高的候选,相同 Prompt 的输出会变得机械,所以在合理候选中通常会保留一点随机性。同一个问题问两次措辞不完全一样,就是因为存在采样。
水印盯上的正是这部分空间。
没有水印时,模型按普通随机过程选下一个 Token。加入水印后,Claude 把前文和一把私有密钥结合起来,生成一个可重复验证的随机信号,再用它影响本次选择。
一个便于理解的简化模型是:候选词被临时分成两组,水印给其中一组轻轻加一点分,让模型更容易从这一组里选词。注意只是轻轻推一下。它不会为了盖章把“阴沉”换成人类几乎不用的生僻词,遇到只有一个正确答案的位置,也没有多少操作空间。这也是 Anthropic 敢说水印不会明显影响质量的原因。
Anthropic 官方披露,实际使用的是 Google DeepMind 发表的 SynthID-Text 方案的一个版本。真实算法比候选词分组复杂,但设计思路一致:模型在多个合理候选之间做选择时,密钥悄悄改变随机性的来源。
单次选词说明不了问题。一次选中“阴沉”可能是普通随机,也可能是水印在起作用。水印靠数量积累,就像抛硬币:一次正面很正常,一千次里出现八百次正面,就很难解释成运气。一篇长文章里,模型要做成百上千次 Token 选择,如果大量选择反复吻合某把密钥产生的统计规律,水印就会浮现出来。
所以文字水印不藏在某一个词里,它藏在大量词语共同形成的分布中。
检测器验证的是统计吻合度
拿到一段待检测文本后,检测器会沿着文字重新走一遍:读取前文,结合私有密钥计算每个位置原本对应的选择规律,再检查实际出现的 Token 有多少次吻合。吻合越多,由 Claude 参与生成的概率越高。
它给不出“这篇文章百分之百由 Claude 写成”的结论,能回答的只是这段文字在多大程度上符合 Claude 水印的统计特征。
样本越短越难检测。事实性内容和代码也更难留下水印,因为正确选项往往很少:模型已经写出“2+2=”,总不能为了水印把答案写成 5。代码注释、说明文档和自然语言则不同,同一个意思有很多种写法,水印活动的空间更大。翻译也是一个典型场景:就算原文由用户自己写好,只要整篇译文由 Claude 重新组织措辞,就可能积累出足够强的水印信号。
这套机制和常见的 AI 文风检测不是一回事。GPTZero 一类工具分析措辞、句式、文本分布,猜测文字像不像 AI;水印检测器验证的是模型主动植入的信号,还需要对应密钥。一个在猜文风,一个在核对暗号。
watermarks-remover 的处理分三层
理解了原理,就能看清 watermarks-remover 在处理什么。
隐藏 Unicode 字符最好处理:程序逐个检查字符编码,发现零宽字符、异常空格或方向控制符直接删除。这部分可以确定性完成。
图片、PDF、DOCX 里的 C2PA、EXIF、XMP 元数据也有固定位置。工具找到对应元数据后,再从文件结构中剥离。
真正麻烦的是 Claude 的统计型水印。你没法打开文章,指着某个词说“水印就在这里”。单个词都正常,问题出在整篇文章的选择规律上。
watermarks-remover 给出的方案很直接:让另一个模型把文章重新写一遍,通过逐句改写、调整语序、替换连接词,打散原来的 Token 分布。原文如果来自 Claude,最好不要再用 Claude 重写,否则刚洗完一遍,又可能盖上一层新的 Claude 水印。
思路可以概括为一句话:既然你把水印藏在选词规律里,我就换一个模型,把整篇文章重新选一遍词。有点蛮干,但确实对路。
代价也明显:改写范围越大,原选词规律越容易被打散,但语气可能变、细节可能丢、技术含义也可能被改偏。
OpenAI 与 Anthropic 的取舍差异
统计型文字水印不是 Anthropic 首创,OpenAI 很早就做出来了。已知短板是:这套方案能扛局部改写,很难扛全文翻译或换模型重写;误报也麻烦,放到互联网海量文本中,即使概率很低也可能误伤一批人。OpenAI 还自己调研过,接近 30% 的用户表示,如果 ChatGPT 加水印而竞争对手不加,他们会减少使用 ChatGPT,所以 OpenAI 一直没上线。
Anthropic 选择先上线,理由包括欧盟法规;加上很难稳定判断用户所在地区,干脆准备全球统一加。
监管希望内容带有机器可读标记,动机可以理解:AI 内容越来越多,平台确实需要溯源方式。但对一个研究、观点和初稿都由自己完成、只让 Claude 帮忙润色的人来说,问题会变成:检测标签只显示“这篇文本有 Claude 参与”,阅读者不会自动区分“参与”和“代写”。技术上两者差得很远,现实里可能只差一个标签。
参考资料: