How is text watermark work?

文字水印技术原理如何实现?

前言

Anthropic 近期公告称,未来的模型都会使用 SynthID-Text 为文字添加水印:Claude 的文字水印如何工作🔗,官方声明:

  • 采用的水印方法不会对输出质量或内容产生任何实际影响
  • 读者无法区分带水印和不带水印的文字
  • 文字中没有添加任何内容,也没有隐藏字符
  • 水印不需要额外的 Token,也不会增加成本
  • 水印不包含任何识别信息,无法追溯到特定个人、组织或聊天记录
  • 这并非 Claude 专属。自 8 月 2 日起,欧盟要求服务其市场的 AI 供应商对 AI 生成的内容进行水印标记。其他主要模型开发商也已签署相同行为准则,将实施各自的水印方案

所以我想研究一下 LLM 文字水印是如何实现的,以及对用户有什么影响?

红绿名单

如何添加水印?

LLM 是一台续词机,每一个 Token 的回应都是由概率决定的。要从生成后的文字反推是否加上水印,可以通过统计特征在生成过程中植入。根据 A Watermark for Large Language Models🔗 提出的一种方法,可以通过改变模型「偏好选择哪些词的概率」来嵌入水印,也就是把每次生成的 Token 清单分类成两组名单:

  • 🟢 绿名单:模型会稍微偏好选择,提高其概率
  • 🔴 红名单:模型不会特别鼓励选择,降低其概率

水印不是固定某些字永远是绿色或红色,而是会根据当下前后文动态生成;这样对于不知道密钥的人看起来像随机,但知道密钥的人却可以重现规则。

(秘密密钥 + 前后词汇 + 伪随机生成函数 = 种子),种子用于影响下一个词汇的概率,进而把水印写入结果内容

通过设置一个只有模型和检测器知道的秘密密钥,在准备生成下一个 Token 时,把「前文」与「密钥」交给伪随机函数生成随机种子,用来决定这次 Token 选择时哪些是「绿色」、哪些是「红色」。

用户提示词

LLM 生成下一个 Token

根据密钥与前文决定绿名单

稍微提高绿名单 Token 的概率

模型选出 Token

加入文字成为新的前文

最终生成带水印的文字

软水印与硬水印

水印的实现方式分为两种,差别在于对红名单 Token 的限制程度:

硬水印(Hard Watermark)

  • 机制:完全禁止模型选择红名单中的 Token
  • 优点:生成的文本中绿名单命中率理论上为 100%,检测非常容易
  • 缺点:严重影响文本质量。低熵(高可预测性)的序列会被迫选错词,例如「法国首都是」后面几乎一定接「巴黎」,但如果「巴黎」恰好在红名单中,模型只能输出不自然的结果

软水印(Soft Watermark)

  • 机制:不禁止红名单,而是让模型对绿名单 Token「稍微偏好」
  • 优点:同样使用 Z 检验,绿名单命中率会高于 50% 但低于 100%,需要较多文本才能达到统计显著性。在高熵位置(多个候选词概率相近)水印会生效,在低熵位置(某个词明显占主导)偏置几乎没有影响,因此能保持文本自然度
  • 缺点:需要手动调整合适参数
比较项目硬水印软水印
红名单 Token完全禁止允许
检测强度最强较低(需较长文本)
最短检测文本长度很短较长(取决于文本熵)
文本质量影响严重劣化影响极小
低熵处理强迫选择不自然的替代词自适应,水印影响小
实际可部署性差好

如何判断水印存在?

  • 文章共有 T 个 Token
  • 其中有 S 个 Token 落在绿名单
  • 绿名单占词表比例是 γ(典型值 0.5)

如果没有水印,我们可以预期绿名单命中率大约就是 γ。例如文章长度:1,000 Token,而绿名单比例:50%,正常随机生成的文字要出现 65% 或 75% 的绿名单比例,概率很低,因此可以判断可能被添加过水印。

当观察到绿名单命中率偏离预期时,需要通过统计检验来判断这是随机波动,还是水印的迹象。

  • Z-score(检验统计量) 代表观察值距离平均值有多远,以标准差为单位:
  • P-value(显著性 p 值) 代表在没有水印的前提下,观察到当前结果或更极端结果的概率。数值介于 0 到 1 之间,越小越有统计显著性。

以文章长度 1,000 Token,γ = 0.5 为例:

情况绿名单命中数 (S)命中率Z-scoreP-value判断
无水印(预期)50050%0.001.00正常
实际检测65065%+3.16< 0.001可疑
实际检测75075%+6.32< 0.0001极度可疑

SynthID-Text

如何添加水印?

同样是在文字生成时通过统计特征嵌入偏好,但相比于强硬地根据种子分类来改变下一个文字的选择概率,SynthID-Text 拆分为两个主要步骤:

  • 选名单(AI 负责):AI 挑出一批最通顺合理的候选字,决定谁有资格参加淘汰赛(AI 的概率决定了「参赛门票」的数量)。假设淘汰赛总共有 10 个名额:
    • A(70%)拿走 7 个位子
    • B(20%)拿走 2 个位子
    • C(10%)拿走 1 个位子
  • 决定冠军(g-value 负责):进入淘汰赛后,AI 原本的概率就不管用了。g-value 会根据「前文 + 秘密密钥」的组合,给每一个参赛字发放一个 0 到 1 之间的随机分数。比赛时,纯粹就是比谁的 g-value 高,谁就晋级。

核心 Tournament Sampling 算法运作流程如下:

  1. 生成随机种子:根据「前数个 Token」与「秘密密钥」通过哈希函数生成随机种子
  2. 计算 g-value:使用 m 个伪随机函数 g₁, g₂, …, gₘ 为词表中的每个候选 Token 赋予分数
  3. 锦标赛采样:
    • 从 LLM 分布中采样 2m 个候选 Token(可能重复)
    • 第 1 轮:将候选 Token 两两配对,根据 g₁ 分数较高者胜出
    • 第 2 轮:胜者再两两配对,根据 g₂ 分数较高者胜出
    • 重复直到第 m 轮,最后胜出的 Token 即为下一个生成的 Token
  4. 重复流程:对每个生成的 Token 重复上述步骤

SynthID-Text 不会改变输出质量的原因,是因为它不强硬干涉 AI 的选择结果,而是在 AI 决定后才进行淘汰赛,并在过程中暗藏水印。

检测机制

SynthID-Text 的检测仅需文本、密钥与随机种子生成器。检测器会计算文本中所有 Token 的 g-value,通过分数函数判断是否含有水印。检测器提供三种状态:

状态含义
Watermarked高置信度判定文本含有水印
Not Watermarked高置信度判定文本不含水印
Uncertain无法确定,需更多文本或人工判断

限制与挑战

检测效果取决于文本的「自由度」。当模型在低熵场景(如事实回答、代码)生成时,词语选择空间受限,水印嵌入效果较弱。此外,翻译或大幅改写也会降低检测置信度。

在检测范围上,每个 AI 供应商使用不同的密钥与算法,Claude 的检测 API 无法检测 GPT 或 Gemini 的输出。水印只能回答「这段文字是否由 Claude 生成」,无法确认是否完全由人类原创。

总结

SynthID-Text 方法一直让我想到佛罗伦萨共和国的「皮袋抽签」这个故事:只有事先安排好的「高概率字 / 自己人」能获得门票进入锦标赛,看起来是随机的 g-value 分数在进行 PK,但实际上分布还是依照 AI 给出的统计在走。

文字水印背后有法规要求,或是在某些情境下具备查证用途。我认为创作者不用太焦虑或反感自己的作品被打上水印。之所以会有抵触情绪,是因为 AI 生成内容时常充斥着「图省事、廉价、没创意」的问题,但同样的问题也曾在计算机绘图辅助、摄影、工业化⋯⋯等背景下发生过。究竟是应该抵触 AI 产出,还是花时间着重在创作质量本身?而质量又是否存在单一的一把尺可以衡量?

延伸阅读