Amit Shekhar
2026-08-18
D
原文
---
title: "LLM 水印是如何工作的?"
author: "Amit Shekhar"
source_url: "https://outcomeschool.com/blog/how-does-llm-watermarking-work"
published_at: "2026-08-18T00:00:00.000Z"
fetched_at: "2026-09-17T16:00:50Z"
updated_at: "2026-09-17T16:00:50Z"
language: "zh"
review_status: "draft"
---
# LLM 水印是如何工作的?

这篇文章会介绍 LLM 水印如何工作,也就是模型悄悄留在生成文本中的隐藏信号。我们还会看到为什么需要水印,LLM 如何逐个选择 token,密钥如何在不改变含义的情况下暗中影响这些选择,检测器之后如何找出隐藏模式,为什么文本质量不会因此受损,它与 AI 文本检测器有什么区别,以及它擅长和不擅长哪些场景。
本文会讨论以下内容:
- 什么是水印?
- 为什么 LLM 生成的文本需要水印?
- LLM 如何生成文本?
- LLM 如何选择下一个词?
- 让水印成为可能的隐藏自由度
- 密钥登场
- 优选 token 与其他 token
- 小幅调整概率
- 为什么优选集合不断变化
- 一个 token 与数千个 token
- 检测如何工作?
- 它与 AI 文本检测器有什么区别?
- 为什么文本质量不会受损
- 有人编辑文本后会怎样?
- 现实中哪些地方会使用 LLM 水印?
- LLM 水印的优缺点
我是 **Amit Shekhar**,[Outcome School](https://outcomeschool.com) 创始人。我教过并辅导过许多开发者,他们凭自己的努力获得了高薪技术岗位;我也帮助许多科技公司解决过各自独特的问题,并创建了多个被顶级公司采用的开源库。我热衷于通过开源、博客和视频分享知识。
我在 Outcome School 教授 [AI and Machine Learning](https://outcomeschool.com/program/ai-and-machine-learning)。
我们开始吧。
### 什么是水印?
先从大家都见过的东西讲起。
拿起一张纸币,对着光观察,会看到纸张内部隐藏的图案。这个隐藏图案就叫作**水印**。
这里可以注意到两点。
第一,水印不像普通油墨那样印在纸币表面,而是在纸张内部形成的。
第二,我们平时使用纸币时看不到它。只有把纸币对着光、主动寻找时,它才会显现。
因此,水印是一种隐藏标记,平时悄无声息,只有接受检查时才会现身。它回答了一个简单的问题:这是谁制作的?
LLM 水印对文本起到同样的作用。
**LLM 水印 = LLM + 水印**
简单说,就是在 LLM 生成的文本中加入隐藏标记。
问题是,文本既没有纸张,也没有光线。我们无法在句子里面藏一幅图案,因此只能把水印藏在别处。
**在 LLM 水印中,标记就藏在遣词选择里。**
别担心,下面会逐步讲清楚它究竟如何实现。
### 为什么 LLM 生成的文本需要水印?
如今,LLM 可以撰写文章、邮件、回答、新闻报道和评论,而且生成的文本看起来与人类写作一模一样。
于是就产生了一个问题。
看到一段文字时,我们如何知道它出自人类还是机器?
来看几个现实场景。
学生提交了一份作业,老师想知道是不是学生本人写的。
网站收到数千条商品评论,公司想知道它们是否来自真实顾客。
一篇新闻报道在社交媒体上传播,人们想知道它是否出自人类记者。
在这些场景中,我们都需要一种检查文本来源的方法。
仅靠阅读无法解决问题,因为优秀的 LLM 文本看起来完全正常。我们需要一种解决方案,LLM 水印就派上了用场。
思路很简单。LLM 生成文本时,会悄悄在其中留下隐藏信号。之后,任何持有密钥的人都可以检查这个信号。
要理解这个信号如何隐藏,首先必须知道 LLM 如何生成文本。
### LLM 如何生成文本?
在介绍水印之前,必须先了解一件非常重要的事。
**LLM 每次生成一个 token。**
那么,token 是什么?
token 是一小段文本,通常是一个词或词的一部分。为了便于理解,可以暂时把 token 当作一个词。
LLM 不会一次写出完整答案。它先写一个 token,再查看此前写下的所有内容,然后生成下一个 token,如此反复,直到答案完成。
这种生成方式叫作自回归生成。[Autoregressive Models](https://outcomeschool.com/blog/autoregressive-models) 一文对此做了深入介绍。
因此,写出一段包含几百个词的文字,意味着 LLM 分别做了几百次决策。
这一点非常重要,因为每一次决策都是隐藏信号的机会。
### LLM 如何选择下一个词?
通过例子最容易理解。
假设目前已经写下:
```text
I am going to the ___
```
现在,LLM 必须选择下一个 token。
这里要明白,LLM 并不会直接给出一个词。它首先会为每个可能成为下一项的 token 分配概率。
在这个例子中,结果可能如下:
```text
office → 0.31
park → 0.29
market → 0.22
gym → 0.18
```
可以看到,LLM 正在告诉我们每个 token 出现的可能性。
`0.31` 对应 `office`,表示模型认为下一个正确 token 是 `office` 的概率为 31%;`0.29` 对应 `park`,表示概率为 29%,依此类推。
之后,模型会从列表中选出一个 token。
没有水印时,模型在这里选择概率最高的候选项。
```text
Without watermark → office
```
于是句子变成“I am going to the office”。
**注意:** 模型并不总是选择数值最高的 token。有时,它会特意选择概率较低的 token,以免行文显得重复。但数值越高,被选中的概率就越大,这一点始终成立,也是理解本文所需的唯一要点。
如果想学习 tokenization、LLM 内部原理和 Transformer 架构,并从零构建大语言模型(LLM),可以查看 Outcome School 的 [AI and Machine Learning Program](https://outcomeschool.com/program/ai-and-machine-learning)。
### 让水印成为可能的隐藏自由度
再看一次刚才的数字。
```text
office → 0.31
park → 0.29
market → 0.22
gym → 0.18
```
这里有一个很有意思的现象。
`office` 的概率是 `0.31`,`park` 是 `0.29`,两者差距很小。
更重要的是,下面四个句子全都完全正确。
```text
I am going to the office
I am going to the park
I am going to the market
I am going to the gym
```
无论读哪一句,都不会觉得有问题:没有语法错误,也没有奇怪的含义,任何人都察觉不到异常。
**水印恰恰存在于这一点点自由度之中。**
也就是说,在大多数生成步骤中,LLM 都有多个不错的候选项,没有哪一项是唯一正确的选择。因此,我们可以轻轻把模型推向其中某些优质候选项,而不损害文本。
接下来最重要的问题是:应该推动哪些候选项?
如果总是推动同一批词,人们就会注意到一种奇怪的重复风格。因此,选择必须看起来随机;但在之后检查时,我们又必须能够复现同样的选择,否则永远检测不到水印。
如何得到一种看起来随机、却又可以复现的结果?答案就是密钥。
### 密钥登场
**密钥被用作种子,以选出一组看似随机、但可以复现的 token。**
可以用一个简单的例子理解**种子**这个词。
假设有一副扑克牌和一台洗牌机。我们向机器输入一个数字,它会根据这个数字洗牌。
如果输入数字 `7`,机器会生成一种特定的牌序。在我们看来,这副牌已经完全打乱。
现在,把数字 `7` 再输入另一台机器,并放入一副新牌,得到的牌序会与第一次完全相同。
因此,数字 `7` 就是种子。它同时带来两个结果。
- 对不知道种子的人来说,结果看起来是随机的。
- 知道种子的人可以再次生成相同结果。
密钥在 LLM 水印中的作用正是如此。模型所属公司会对这个密钥保密。
### 优选 token 与其他 token
在进入这一部分之前,还要先了解一个词:**词表(vocabulary)**。
词表是模型获准生成的全部 token 列表,可以把它想象成模型的字典。真实模型的词表大约包含 5 万到数十万个 token。
[Byte Pair Encoding in LLMs](https://outcomeschool.com/blog/bpe-in-llms) 一文详细解释了词表最初如何构建。
现在回到刚才的例子。
模型即将选择“I am going to the”之后的下一个 token。就在这一步,算法会使用密钥,把整个词表分成两组。
对于当前这一步,算法会像下面这样划分词表:
```text
Preferred tokens: park, market, school...
Other tokens: office, gym, house...
```
**注意:** 这种划分与含义或质量无关,并不是说 `park` 比 `office` 更好。它更像是为词表里的每个词抛一次硬币,而每次抛硬币的结果由密钥决定。这些词只是恰好落到了不同的组里。
研究论文把这两组称为绿名单和红名单。名称并不重要,思路都一样:一组会得到小幅推动,另一组不会。
### 小幅调整概率
现在,我们既有 LLM 给出的原始概率,也有刚刚划分的两组 token。
接下来,算法会稍微调整 LLM 的原始概率:优选 token 获得小幅提升,其他 token 的概率则略微降低。
例如:
```text
office → 0.31 → 0.25
park → 0.29 → 0.36
market → 0.22 → 0.25
gym → 0.18 → 0.14
```
可以看到发生了什么。
`park` 和 `market` 是优选 token,所以数值上升。
`office` 和 `gym` 属于另一组,所以数值下降。
顺序也随之改变。此前 `office` 以 `0.31` 排在首位,现在则是 `park` 以 `0.36` 排在首位。
还有一点值得注意。调整前后,四个数字之和都是 1。提升操作没有凭空增加任何东西,只是把其他 token 的一小部分概率转移给了优选 token。
现在,模型选择 `park`。
于是句子变成“I am going to the park”。
这个句子完全正常。读者根本察觉不到其中发生过特殊操作,读起来与普通文本没有任何区别。
这里还要知道,推动幅度是一项可以控制的设置。
幅度越大,水印越容易检测,但模型会更频繁地偏离最佳用词,质量也会下降。幅度越小,文本质量越好,却需要更长的文本才能让模式变得明显。
这是一种权衡,需要根据使用场景选择具体数值。
### 为什么优选集合不断变化
最重要的一点是:
**密钥并不会把 `park` 永久标记为优选 token。**
生成下一个 token 时,密钥与当前上下文可能产生另一套优选集合。在新集合中,`park` 很可能进入另一组,而 `office` 则可能进入优选组。
因此,这个过程会在每一步不断变化。
```text
Secret key + context → preferred token set → small probability boost → next token
```
再读一遍这个流程,因为它是 LLM 水印的核心。
**密钥 + 上下文:** 每一步中,算法都会把密钥与此前生成的文本混合起来。
**优选 token 集合:** 混合结果决定在当前这一步中,哪些词属于优选项。
**小幅提升概率:** 优选词的概率会得到轻微推动。
**下一个 token:** 模型根据调整后的概率选择一个 token,而这个新 token 又会成为下一步上下文的一部分。
之后,整个循环会针对下一个 token 再运行一遍,并生成一套新的优选集合。
因此,带水印的文本不会形成任何看得见的习惯。没有哪个固定词会反复出现。每一步的优选组都不同,所以不会产生读者能够察觉的重复模式。
还有另一个非常重要的原因。
假设优选组永远固定,任何人都可以从模型生成大量文本,统计哪些词出现得略微过于频繁,再逐渐推断出整个优选组。之后,他们可以移除水印;更糟的是,还可以给自己的文本添加假水印,再嫁祸给这个模型。
由于优选组每一步都在变化,这种攻击无法奏效。不知道密钥的外部人员,只会看到以普通顺序排列的普通词语。
**给你的一点提示**
无论从事哪个技术领域,都应该熟悉以下主题:
- LLM
- RAG
- MCP
- Agent
- Fine-tuning
- Quantization
我们在一个视频里把它们串了起来:
[AI Engineering Explained: LLM, RAG, MCP, Agent, Fine-Tuning, and Quantization](https://www.youtube.com/watch?v=lnfWvX66FUk)
不用停下来现在就看,先收藏,之后有时间再看。未来的你会感谢现在的自己。
下面回到主题。
### 一个 token 与数千个 token
接下来是一个最自然的问题。
如果每一步的变化都这么小,怎么可能检测出来?
答案在数量之中。
一个 token → 极小的变化 → 看起来完全正常。
但累积到数千个 token 时,优选 token 的出现次数会超过随机情况下的预期。
可以用硬币来理解。
假设把一枚公平硬币抛 10 次,出现 6 次正面,没有人会觉得奇怪,这种情况经常发生。
现在,假设把同一枚硬币抛 10000 次,却出现了 8000 次正面。此时就能确定其中有问题,公平硬币不可能有这种表现。这个结果与运气所能产生的范围相差太远。
带水印的文本也是如此。
对于人类撰写的普通文本,或不带水印的模型文本,大约一半 token 会落入优选组,另一半落入其他组。这正是纯随机的结果,因为分组本身就像抛硬币。
但在带水印的文本中,优选组每一步都会获得轻微推动,最终落入优选组的 token 就会远远超过一半。
来看一组具体数字。假设一段文本包含 1000 个 token。
如果文本没有水印,大约会有 500 个 token 落入优选组。可能是 480 个,也可能是 520 个,因为随机结果从不精确。
如果文本带有水印,优选组中可能会出现 750 个 token。
1000 个 token 中有 750 个落入优选组,不可能只是运气所致。这就像抛一枚公平硬币 1000 次,却得到 750 次正面,基本不可能发生。
对于一句话,这点差异没有意义;对于一大段文字,就很难再用运气解释。
它由此形成一种统计模式。
这里的**统计**是指,无法在某个局部直接看见,只有对大量文本进行计数才能发现的模式。
这个模式就是水印。
### 检测如何工作?
了解如何加入水印后,接下来看看如何检测水印。
流程如下:
```text
Generated text → watermark detector → uses the secret key → checks the statistical pattern → Watermark detected
```
下面逐步说明。
**第 1 步:** 把文本交给检测器。检测器将文本拆成 token,也就是模型处理的那些小片段。
**第 2 步:** 检测器来到第一个 token,查看它之前的上下文。检测器使用密钥和这段上下文,重建该步骤生成时所用的完全相同的优选集合。之所以能够重建,是因为密钥充当种子,而相同种子与相同上下文总会得到相同结果。
**第 3 步:** 检测器检查这个 token 属于优选组还是另一组,并记录数量。
**第 4 步:** 检测器移到下一个 token,重复相同操作,一直处理到文本末尾。
**第 5 步:** 最后,检测器把统计数量与纯随机情况下的预期进行比较。如果优选 token 的数量接近一半,文本就没有水印;如果远高于一半,说明水印存在。
现在,我们已经理解了检测过程。
这里有几个非常重要的要点。
- 检测器不需要 LLM,只需要文本和密钥。
- 检测器不需要原始 prompt。
- 检测器不需要在任何地方保存生成文本的副本,也不必把任何内容存入数据库。证据就在文本本身之中。
- 检测器会给出置信度。它可以说明这种模式由随机情况造成的可能性有多低,从而让结果变得可衡量。
还有一点值得注意。检测器逐 token 计数,所以也可以只检查文本的一部分。假设一篇文章一半由学生撰写,另一半由模型生成,检测器可以显示其中一部分模式很强,而另一部分没有这种模式。
不过,检测器确实需要密钥。
这是一个非常重要的限制。我们无法自行检查一段文本,只有模型所属公司,或公司信任并向其提供密钥的人,才能执行检查。一旦密钥泄露,任何人都可以消除或伪造水印,所以整个系统都依赖于密钥安全。
水印检测器就是这样工作的。
### 它与 AI 文本检测器有什么区别?
很多人应该都用过号称能够判断文本是否由 AI 生成的工具。下面看看它们与本文介绍的方法有何不同。
AI 文本检测器只读取最终文本并作出猜测。它会观察写作风格、句子长度、词语的可预测程度等特征。没有人向它提供任何秘密信息,它只是从外部进行有依据的猜测。
水印检测器并不猜测。文本生成过程中,有人有意把标记放进了文本,检测器再用密钥将其读出。
为了便于理解,用表格列出两者的差异。
| AI 文本检测器 | 水印检测器 |
| --- | --- |
| 读取最终文本,根据风格猜测 | 读取有意植入的隐藏信号 |
| 不需要密钥,也不需要模型所有者协助 | 需要模型所有者的密钥 |
| 适用于任何模型生成的文本 | 只适用于主动添加水印的模型所生成的文本 |
| 经常误把人类写作标记为 AI 写作 | 会给出可衡量的误判概率 |
因此,两者都有各自的用途。水印检测器可靠得多,但只有模型所有者预先完成添加水印的工作,它才会有效。
如果想深入学习 LLM 与 Agent 评估以及 LLM-as-a-Judge,可以查看 Outcome School 的 [AI and Machine Learning Program](https://outcomeschool.com/program/ai-and-machine-learning),其中提供了端到端讲解。
### 为什么文本质量不会受损
此时,我们心里可能会产生一个疑问。
既然我们在推动模型偏离最佳答案,文本质量难道不会变差吗?
需要仔细理解这一点。
推动幅度非常小。再看一次刚才的例子:`office` 从 `0.31` 变为 `0.25`,`park` 从 `0.29` 变为 `0.36`。模型选择的仍然是它原本认为很好的候选词,只是没有选择排名第一的选项,而是选择了第二名。
还有一点:很多时候,模型几乎没有选择自由。
例如,考虑“The capital of France is \_\_\_”这句话。模型可能给出如下结果:
```text
Paris → 0.99
Lyon → 0.004
Nice → 0.003
```
这里,`Paris` 的概率是 `0.99`。即使稍微提升其他 token 的概率,也无法超过 `0.99`,所以模型仍然会写出 `Paris`。
这对我们非常有利。答案必须符合事实时,水印不会横加干涉;模型确实有许多同样优秀的候选项时,水印才会发挥作用。
**因此,水印只利用模型原本就有的选择空间。**
这也说明了短文本的问题。如果文本只有几个词,模型自由选择的次数就很少,可供测量的模式也非常微弱。水印检测器需要足够多的 token 才能作出有把握的判断。短文本难以检查,长文本则容易检查。
### 有人编辑文本后会怎样?
这是一个非常实际的问题。分几种情况来看。
**情况 1:改动少量词语。** 假设有人在一篇长文中修改十个词,其余数百个 token 仍然带有原来的模式。检测器依旧能找到水印,只是置信度略低。
**情况 2:换一种说法重写每个句子。** 此时,大多数 token 都是由人类或另一个模型重新选择的。新 token 对我们的密钥一无所知,所以只会随机落入优选组。原有模式会大幅减弱,检测器也可能漏掉水印。
**情况 3:把文本翻译成另一种语言。** 几乎每个 token 都会改变,水印基本消失。
因此,坦率的总结是:
- LLM 水印能够抵御少量编辑。
- LLM 水印难以抵御大幅重写和翻译。
- 只有模型所有者主动添加水印时,这种方法才有效;没有添加水印的模型所生成的文本,永远无法用这种方式检测出来。
所以,水印只能视为一种有用信号,而不能当作最终证据。
### 现实中哪些地方会使用 LLM 水印?
来看一个真实用例。
Google DeepMind 构建了一套名为 **SynthID** 的系统,其中的 SynthID-Text 所做的事,正是本文介绍的机制。模型生成文本时,它会略微调整 token 选择,持有密钥的检测器之后就能检查这段文本。
同一思路也适用于文本以外的媒介。对于图片、音频和视频,可以在人眼和人耳无法察觉的情况下,把隐藏信号放进像素或声音中,再由检测器识别。[Multimodal AI](https://outcomeschool.com/blog/multimodal-ai) 一文详细介绍了模型如何同时处理这些不同模态。
因此,核心思想始终相同:把信号藏进无人察觉的细微选择里,之后再用密钥将其读出。
### LLM 水印的优缺点
下面看看 LLM 水印的优点和缺点。
**优点:**
- 文本质量几乎不变。
- 不需要在任何数据库中存储内容。
- 检测会给出可衡量的置信度,而不是猜测。
- 读者看到的是完全正常的文本。
**缺点:**
- 大幅重写或翻译会消除模式。
- 无法有把握地检查短文本。
- 必须保护密钥,因为密钥泄露会破坏整个机制。
- 只适用于选择添加水印的模型。
现在,我们已经知道哪些地方可以使用 LLM 水印,又需要在哪些地方保持谨慎。
### 总结
下面简要回顾全文。
LLM 每次生成一个 token。每一步中,它会为所有可能成为下一项的 token 分配概率,再从中选出一个。
在大多数步骤中,许多不同 token 都能产生完全正常的文本。水印就存在于这种自由度之中。
密钥充当种子。每一步中,密钥与当前上下文会把词表划分为优选 token 和其他 token,并小幅提升优选 token 的概率。
优选集合并不固定,而是在每一步变化,因此文本不会形成看得见的习惯。
一个 token 只发生微小变化,所以不会显得异常。累积到数千个 token 时,优选 token 的数量会远远超过随机情况所允许的范围,由此形成一种统计模式。
检测器取得文本和密钥,在每一步重建优选集合,统计优选 token 的数量,再把计数结果与随机预期比较。
因此,水印并不是肉眼可见的标记。
它是一种统计模式,通过略微改变各个 token 被选中的概率而形成。
现在,我们应该已经理解 LLM 水印如何工作。
准备 AI Engineering 面试:[AI Engineering Interview Questions](https://github.com/amitshekhariitbhu/ai-engineering-interview-questions)
今天就到这里。
谢谢。
**Amit Shekhar**
[Outcome School](https://outcomeschool.com) 创始人