从一段可疑文本说起
假设你运营一个内容平台,需要判断一篇匿名投稿是否由大模型生成。直接调用某个检测分类器看似可行,但分类器可能被新模型绕过,也可能在改写后失效。更麻烦的是,你无法访问生成该文本的模型内部状态,只能拿到最终文本。
Kirchenbauer 等人提出的水印方法给出另一种思路:在模型生成时就嵌入一个可验证的信号,检测时不需要访问模型,只需一个公开的统计检验。这个方法的论文《A Watermark for Large Language Models》发表于 ICML 2023,作者来自马里兰大学等机构。其核心机制是“红绿列表偏置”:生成每个 token 前,用哈希函数把词汇表随机分成红绿两组,然后给绿色 token 的 logits 加上一个正值,使采样时更倾向于选择绿色 token。检测时,统计文本中绿色 token 的比例,如果显著高于随机期望,就判定为带水印。
这个方案的关键在于,水印信号是嵌入在生成过程中的,而不是事后在文本上叠加。因此,它不依赖任何外部检测器,也不需要对文本做语法或语义分析。但它的可靠性并非无条件:文本熵、改写攻击、翻译都会影响检测效果。下面我们以一个具体场景——内容平台审核 AI 生成文章——贯穿全文,逐步拆解这个方法的工作原理、实现细节和失效边界。
基线方案为何不够
在讨论水印之前,先看看常见的检测思路。一种做法是训练一个二分类器,输入文本,输出“机器生成”或“人类撰写”的概率。这类方法在训练分布上表现不错,但面对新模型或经过改写的文本时,准确率会明显下降,因为分类器学到的是表面特征,比如重复用词、句式模板,而这些特征很容易被改写破坏。
另一种做法是使用统计异常检测,比如计算困惑度(perplexity)。人类文本通常有较高的困惑度,而模型生成的文本往往更“流畅”,困惑度较低。但困惑度阈值很难设定,而且人类也可能写出低困惑度的文本,模型也可能在高温采样下生成高困惑度文本。更关键的是,困惑度检测无法区分“一段由模型生成但经过人类润色的文本”和“人类原创文本”,因为润色会改变困惑度。
水印方法试图从根本上解决这个问题:它不依赖文本的统计特征,而是依赖生成时嵌入的、可验证的随机信号。只要生成方和水印检测方共享一个密钥(比如一个随机种子),检测方就能从文本中提取信号,而无需知道模型参数。这个思路把“检测”从“事后分析”变成了“事前约定”,可靠性更高,但也引入了新的约束:生成方必须配合嵌入水印,且水印不能显著降低文本质量。
红绿列表:生成时如何嵌入信号
红绿列表偏置的直觉很简单:在生成每个 token 之前,用一个哈希函数把词汇表分成两个集合——绿色列表和红色列表。哈希函数的输入是前一个 token(或前几个 token)和密钥,这样分组是确定性的,检测方可以复现。然后,在采样时,给绿色 token 的 logits 加上一个正的偏置 δ,使得绿色 token 被选中的概率更高。
具体来说,假设模型在位置 t 的原始 logits 为 l_t(v),其中 v 是词汇表中的 token。水印生成时,对每个候选 token v,如果 v 在绿色列表中,就将其 logits 加上 δ,否则保持不变。然后基于修改后的 logits 做 softmax 采样。这样,绿色 token 的概率被抬高,红色 token 的概率被压低。
这个偏置 δ 的大小决定了水印的强度。δ 越大,绿色 token 被选中的概率越高,水印信号越强,但文本质量下降也越明显,因为模型可能被迫选择不是最优的 token。Kirchenbauer 等人的论文中,他们使用 OPT 系列模型(多亿参数)进行实验,发现当 δ 取适当值时,文本质量几乎不受影响,但具体数值没有在摘要中给出。
检测时,检测方拿到一段文本,用相同的哈希函数和密钥,把每个 token 标记为绿色或红色。然后统计绿色 token 的比例。如果文本是水印生成的,这个比例会显著高于 0.5(假设红绿分组是均匀的)。如果文本是人类写的,比例应该接近 0.5。
这个机制的巧妙之处在于,哈希函数的输入是前一个 token,因此水印信号是上下文相关的,不会出现固定的“水印词表”。同时,检测不需要访问模型,只需要密钥和哈希函数。
检测统计量:p 值与误报率
检测的核心是一个统计检验。假设文本长度为 T,其中绿色 token 的数量为 G。在零假设下(文本没有水印),每个 token 是绿色还是红色是随机的,概率各为 0.5,因此 G 服从二项分布 Binomial(T, 0.5)。如果 G 显著大于 T/2,就拒绝零假设,判定为带水印。
Kirchenbauer 等人提出使用 z 统计量:
z = (G - γT) / sqrt(T γ (1-γ))
其中 γ 是绿色 token 的期望比例。在零假设下,γ = 0.5,z 近似服从标准正态分布。检测方可以设定一个阈值,比如 z > 4 时判定为水印,对应的 p 值约为 3e-5。这个 p 值表示误报率——即人类文本被误判为水印的概率。
论文中强调,水印检测可以提供可解释的 p 值,这是它相对于黑盒分类器的一个优势。分类器只能给出一个分数,无法提供严格的统计保证。而水印检测可以明确地说:“在零假设下,观察到这个绿色比例的 p 值是 1e-5”,这让误报率可控。
但这里有一个关键点:z 统计量的有效性依赖于文本长度 T。如果 T 太短,比如只有 10 个 token,那么即使绿色比例很高,z 值也可能不够大,无法达到显著水平。因此,水印检测需要足够长的文本才能可靠工作。Kirchenbauer 等人的论文中,他们分析了检测所需的 token 数量,但具体数字没有在摘要中给出。
另外,检测阈值的选择需要在误报率和漏报率之间权衡。阈值越高,误报率越低,但可能漏掉一些水印文本(尤其是被改写后信号变弱的)。实际部署时,需要根据应用场景设定可接受的误报率。
硬水印与软水印:两种实现方式
红绿列表偏置有两种实现方式:硬水印和软水印。
硬水印(hard watermark)在生成时强制只从绿色列表中采样,红色 token 被完全禁止。这样,生成的文本中 100% 的 token 都是绿色的,检测时 z 值会非常大,几乎不可能误报。但硬水印的代价是文本质量严重下降,因为模型被迫放弃所有红色 token,即使它们是最优选择。在低熵文本(比如数学公式、代码、专有名词)中,红色 token 可能包含唯一正确的答案,强制排除会导致生成失败。
软水印(soft watermark)则是本文主要讨论的方式:给绿色 token 加一个正的偏置,但不完全禁止红色 token。这样,绿色 token 被优先选择,但红色 token 仍有可能被选中,尤其是在绿色 token 概率很低的情况下。软水印对文本质量的影响较小,但水印信号也较弱,检测需要更长的文本。
Kirchenbauer 等人的论文中,他们主要分析软水印,因为硬水印在实际中不可用。他们通过调整 δ 来控制水印强度和文本质量之间的平衡。
下面用一个表格来对比硬水印和软水印:
| 特性 | 硬水印 | 软水印 |
|---|---|---|
| 采样方式 | 强制只从绿色列表采样 | 偏置绿色 token,但允许红色 token |
| 文本质量 | 严重下降,可能生成错误文本 | 影响较小,可通过 δ 调节 |
| 检测强度 | 极强,几乎无漏报 | 较弱,需要更长文本或更大 δ |
| 适用场景 | 低要求文本,如简单模板 | 大多数生成任务,如文章、对话 |
| 低熵文本 | 可能失败,因为红色 token 可能是唯一正确选项 | 仍可能生成正确文本,但水印信号弱 |
| 实现复杂度 | 简单,但需处理无绿色可用的情况 | 简单,只需加偏置 |
从工程角度,软水印更实用,因为它在质量和可检测性之间提供了可调的平衡点。
文本质量影响:偏置的代价
软水印通过偏置 logits 来嵌入信号,这必然会对生成文本的质量产生影响。影响的程度取决于 δ 的大小和文本的熵。
熵(entropy)衡量的是下一个 token 的不确定性。在高熵文本中,比如创意写作,每个位置都有多个合理的候选 token,模型本身就不确定选哪个,因此偏置绿色 token 不会显著改变文本的语义。但在低熵文本中,比如“1+1=”,下一个 token 几乎确定是“2”,如果“2”恰好在红色列表中,模型被迫选择绿色 token(比如“3”),就会生成错误内容。
Kirchenbauer 等人的论文中,他们用困惑度(perplexity)来衡量文本质量。困惑度越低,说明文本越流畅。他们发现,在适当的 δ 下,水印文本的困惑度几乎与未加水印的文本相同,说明质量损失很小。但具体数值没有在摘要中给出。
在内容平台场景中,如果模型生成的是一篇新闻稿,高熵部分(如开头、过渡句)可以嵌入较强水印,而低熵部分(如数字、专有名词)则可能被迫选择错误 token。因此,实际部署时,可能需要根据文本类型调整 δ,或者对低熵位置降低偏置。
另外,文本质量影响还体现在生成速度上。由于每个 token 生成前都要计算哈希并修改 logits,这会增加一些计算开销,但通常可以忽略不计,因为哈希计算比模型前向传播快得多。
鲁棒性:改写、翻译与低熵文本
水印的鲁棒性是指它在文本被修改后仍能被检测的能力。Kirchenbauer 等人的后续研究《On the Reliability of Watermarks for Large Language Models》(ICLR 2024)专门研究了这个问题。他们发现,水印在人类改写和机器改写后仍然可检测,但需要更长的文本。例如,经过强人类改写后,在误报率设为 1e-5 时,平均需要观察 800 个 token 才能检测出水印。
改写攻击的原理是:改写会改变一部分 token,但会保留一些 n-gram 甚至更长的片段。这些保留的片段仍然带有水印信号,因此只要观察足够多的 token,统计检验就能累积到显著水平。
翻译攻击则更棘手,因为翻译会改变所有 token,水印信号可能完全丢失。Kirchenbauer 等人的论文中,他们没有直接研究翻译,但可以推断,如果翻译后文本的 token 与原文完全不同,水印就无法检测。不过,如果翻译是逐句的,某些句子的 token 可能被保留,或者翻译模型本身也带有水印(如果使用同一个水印方案),那么检测仍有可能。
低熵文本的鲁棒性更差。在低熵文本中,模型几乎没有选择余地,因此水印信号很弱。Kuditipudi 等人的论文《Robust Distortion-free Watermarks for Language Models》(TMLR)中,他们用 Alpaca-7B 模型做案例研究,发现对于典型的用户指令(低熵响应),只有约 25% 的响应(中位长度约 100 token)能在 p ≤ 0.01 下被检测出来。这说明低熵文本中水印检测的可靠性较低。
另一个相关的攻击是“拼接攻击”:把一段水印文本嵌入到一篇长的人类文档中。Kirchenbauer 等人的 ICLR 2024 论文提出了一些对短片段敏感的检测方案,但具体细节没有在摘要中给出。
工程实现:密钥管理与检测流程
在实际部署中,水印系统需要解决几个工程问题。
首先是密钥管理。水印检测需要密钥,如果密钥泄露,攻击者就能移除水印或伪造水印。因此,密钥必须保密,并且定期轮换。在内容平台场景中,平台可以持有密钥,对生成的文本打水印,检测时用同一密钥验证。但如果平台需要第三方验证,就需要共享密钥或使用公钥机制,这超出了本文范围。
其次是哈希函数的选择。哈希函数必须快速且确定性,通常使用 HMAC 或 SHA-256。输入是前一个 token 的 ID 和密钥,输出是一个哈希值,用于决定每个 token 是绿色还是红色。为了减少哈希冲突,可以使用词汇表大小的模运算。
检测流程可以用一个流程图表示:
flowchart TD
A[获取文本] --> B[分割成 token]
B --> C[用密钥和哈希计算每个 token 的颜色]
C --> D[统计绿色 token 数量 G]
D --> E[计算 z 统计量]
E --> F{ z > 阈值? }
F -- 是 --> G[判定为水印]
F -- 否 --> H[判定为人类文本]
在实现中,检测方需要与生成方共享相同的 tokenizer,因为哈希的输入是 token ID。如果 tokenizer 不同,检测就会失败。此外,检测方还需要知道生成时使用的密钥和哈希函数的具体参数(比如是否使用前一个 token 还是前 n 个 token)。
权衡与替代方案
水印方法并非唯一的选择。下面对比几种常见的检测方案:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 水印(红绿列表) | 可验证、误报率可控、不依赖模型 | 需要生成方配合、低熵文本失效、改写后需长文本 | 平台自产内容检测 |
| 分类器 | 无需生成方配合、可检测任意模型 | 黑盒、误报率不可控、易被改写绕过 | 第三方检测 |
| 困惑度检测 | 简单、无需训练 | 阈值难设、易被改写影响 | 快速筛查 |
| 无失真水印(Kuditipudi 等) | 不改变文本分布、对改写鲁棒 | 实现复杂、检测需要对齐随机序列 | 高保真场景 |
水印的核心优势是“可验证性”:它提供了统计保证,而不是概率猜测。但它的代价是必须控制生成过程,因此只适用于那些由平台或可信模型生成的文本。对于外部模型生成的文本,水印无法检测。
无失真水印(distortion-free watermark)是另一种思路,它通过把随机数序列映射到采样结果,而不改变文本分布。Kuditipudi 等人的论文显示,这种方法在 OPT-1.3B 和 LLaMA-7B 上,即使 40%~50% 的 token 被随机编辑,仍能从 35 个 token 中可靠检测(p ≤ 0.01)。但它在低熵响应上检测困难,且实现更复杂。
何时失效:边界条件
水印方法在以下情况下会失效或可靠性下降:
- 文本过短:如果文本只有几十个 token,统计检验可能无法达到显著水平。
- 低熵文本:如代码、数学、专有名词,模型几乎没有选择空间,水印信号弱。
- 完全改写:如果文本被彻底改写,所有 token 都被替换,水印信号消失。
- 翻译:翻译通常改变所有 token,导致水印无法检测。
- 密钥泄露:攻击者知道密钥后,可以移除或伪造水印。
- tokenizer 不匹配:检测方和生成方使用不同的 tokenizer,导致哈希输入不一致。
在内容平台场景中,这些边界意味着水印不能作为唯一的检测手段。它更适合作为一种“辅助证据”,与人工审核或其他检测方法结合使用。
未解决的问题
水印技术仍在发展中。目前的一个开放问题是:如何让水印对翻译和完全改写更鲁棒?一些研究尝试在语义层面嵌入水印,比如基于句子或段落级别的信号,但这会增加实现复杂度。另一个问题是水印的公平性:如果水印导致某些文本(如低熵文本)被误判,如何避免对特定群体的偏见?
此外,水印的标准化也是一个挑战。目前不同模型使用不同的水印方案,检测方需要知道每个模型的密钥和参数。如果未来出现统一的水印标准,检测将变得更加容易。
对于内容平台来说,水印是一个值得投入的工具,但它不是万能的。理解它的工作原理和失效边界,才能在实际部署中做出合理的决策。