AI 文本水印是怎么工作的
文章摘要
这是一篇由 James Padolsey 撰写、带交互演示的科普长文,回答一个直觉上不可能的问题:纯文本里怎么可能藏水印?文本没有像素可以埋数据,复制粘贴之后任何元数据都不会存活,每一个字符都明明白白摆在眼前,标记还能藏在哪儿?
但水印确实是真的。谷歌从 2024 年起就在 Gemini 应用和网页端给文本打水印(其 API 目前是有文档记载的例外),而到 2026 年 8 月,新版 Claude 模型开始在模型层面给文本打标记,旧模型随后跟进。这些标记不可见、能在复制中存活,之所以能做到,是因为它们根本不住在字符里——它们住在词与词之间的选择里。
文章分五步拆解。第一步:写作是一连串小选择。 模型写到句子中途时并不知道”下一个词”,它有一个带偏好的候选清单,就像自动补全。一页文本里有几百个这样的小岔路口,其中很多岔路上有若干个同样说得通的选项——这些”余量”就是原材料。谁能影响骰子怎么落,谁就能在不改变文本含义的前提下藏进一个模式。
第二步:一把密钥去影响这些选择。 经典配方来自 Kirchenbauer 等人 2023 年的论文:在每个岔路口,用密钥驱动的数学把候选词分成绿色和红色两组——这是只有持钥人能复现的任意染色——然后把骰子略微偏向绿色。两点让它变得隐蔽:第一,偏移很轻,红色词仍可能胜出,只是概率略低;第二,染色不是词的固定属性,密钥是从紧邻的前几个词计算出来的,所以同一个候选词在一种前缀下是绿色、在另一种前缀下是红色。文章还介绍了两个”兄弟方案”:谷歌实际投产的 SynthID 用一个微型的秘密”锦标赛”代替偏移——从模型自己的概率抽取几个候选,用密钥打分,赛制安排得使得在密钥抽取上取平均后每个词的概率恰好保持模型原本的意图;而 Aaronson 在 OpenAI 做的方案更进一步,直接从密钥导出骰子本身。数学不同,原理一致:标记活在选择里。
第三步:持钥人可以数数。 检测根本不阅读文本、不判断文风,检测器只是用持钥人的染色方式重放一遍,然后数有多少词落在绿色上。没有水印(或用错密钥)时绿色应该赢一半左右,就是抛硬币。文章特别标注了一个诚实的注脚:演示里的偏移画得很强以便肉眼可见,实际投产的水印偏得温和得多,因而需要更多文本——在这个 50/50 的演示模型里,一份 1500 词的文档只会显示约 55% 的绿色。微小的倾斜只有靠长度才能变得有说服力,这就是短文本确实难以判定的原因。
第四步:编辑对水印做了什么。 因为每个词的染色来自紧邻的前几个词,一个位置只有在原始措辞的一小段窗口(该词加上它的邻居)完整存活时才算作证据。文章给了一个五档编辑深度的滑块演示,从”改错别字”到”完全重写”。在真实实现上(开源模型上的 MarkLLM 的 KGW 与 EXP 方案,经 declaude 的完全重写路径洗过):约 0.5% 的窗口存活,检测器准确率从几乎确定跌到抛硬币。已发表文献在形状上是一致的——轻度或单遍改写只是稀释而非删除水印,在 Kirchenbauer 等人的实验中,只要文本够长检测器就能恢复,甚至人工改写在大约 800 个 token(约 600 词)之后也会重新变得可检测。真正能抹掉标记的是”不共享任何原始措辞片段的重新构造”。作者也明确画出边界:这些数字来自可测量的开源实现,Anthropic 的生产方案未公开,外界目前无法针对 Claude 自己的标记跑这个测试。
第五步:这在实践中意味着什么。 作者列了五条:(1)只有持钥人能检查,你的老师、编辑或任何”AI 检测器”网站都跑不了这个测试,需要提供商的密钥或提供商自己运营的检查服务;谷歌为 SynthID 运行了一个早期访问检测门户,Anthropic 说检测工具即将推出。(2)水印检查不是”AI 检测器”,GPTZero 那类工具从文风猜测且出了名地不可靠,水印则恰恰相反,是一个刻意设计、密钥门控的统计检验,不要把两者混为一谈。(3)发现标记意味着”被处理过”,而不是”被写出来”——Anthropic 自己的文档就指出,被 Claude 校对或翻译过的人类文本也会沾上标记;而标记的缺席证明的更少。(4)短文本和低选择度文本携带的标记很少——代码、引文、事实列表这类只有一种正确续写的文本,给骰子留的余量太小。(5)有些标记能挺过重写:那些以词本身而非邻居为键的方案抗改写性强得多,但弱点是染色被到处复用,从足够多的输出中可以被逆向出来。
HN 评论精华
-
lurquer 提出了本帖最有洞察力也最令人不安的一条推论:人们默认存在一份供应商公开的红绿名单用来验证,但实际上可以有数十亿份红绿名单——把一段文本对所有名单跑一遍是很容易的,而且组合数足够多,可以给每个账号分配专属名单。这样一来不仅能判断输出是不是 AI 生成的,还能判断是谁生成的。他还认为这个水印极难甚至不可能去掉:”如果正常人类文本大致是 50-50 的红绿比例,而 AI 用 80% 红、20% 绿生成了你的文本,再怎么重写也无法把结果拉回到接近人类的 50-50,统计上的异常总会被看出来。”
-
giancarlostoro 沿着同一条线做了推测:目标可能不是验证你是否用了 Claude,而是在代码里嵌入足够信息以在 Anthropic 那边识别出你是谁——一个明面上的隐蔽哈希。他设想的场景是:如果因为 vibe coding 写出违反计算机法律的东西被逮捕,执法者可以扫描代码、发给 Anthropic 确认是某账号在某设备上用 Claude 构建的恶意软件,”记得有个黑客就是因为 Windows 唯一安装 ID 被抓的”。what 则给出更朴素的解释:也许他们只是想识别 slop 并把它排除出训练集。
-
lemoncookiechip 提出了最被讨论的技术质疑:这对模型创造力的影响。因为模型会把每个词向 A 组而非 B 组推,创造力就有损失,如果偏移不是温和的 55% 而是 70% 或 80% 就更严重。他认为在代码这类选择更少的场景下问题更糟,猜测模型会被指示不给代码打水印。他还直接反驳了评论区的天真论调:认为 Anthropic 这么做只是因为欧盟要求而非因为对自己有利,那是相当天真的——识别代码对训练未来模型至关重要,合成数据越多自我蚕食越严重,何况还能向高校出售 AI 检测服务。
-
Lazare 对创造力质疑做了有力的技术反驳:绿红分组是动态计算的,不是”用『unique』而不用『unusual』”这种固定偏好,所以未必真的影响创造力。但他同时指出一个更重要的限制:水印严格只允许提供商识别自己模型生成的文本——如果 Anthropic 想从训练数据里过滤掉 GPT 生成的内容,它得把数据喂进 OpenAI 的 API,这不现实,所以这对解决模型崩溃问题帮助有限。他认为水印真正擅长的可能是标记出亚马逊/Kindle 上那波完全 AI 生成的小说潮,”老实说这并非没有价值”。
-
gizmo686 从密码学角度提供了另一种视角:模型的”自然”输出本来就是一串随机数的结果,水印只是把这串数偏向另一串数;假如第二串是密码学安全的伪随机数,那么在不掌握密钥或 PRNG 的情况下,连”区分这串是不是有偏”都做不到,因此不一定影响输出质量。不过他补充:”实际上我怀疑他们有一个既实用又密码学安全的方案,但在密码学安全之下还有很大空间,对其他所有用途都一样好使。”
-
评论区最大的一条支线其实跟水印无关:对 Claude 写作风格的集体吐槽。wpasc 说他接触到的几乎每个人——HN 评论、同事、非技术的家人——都讨厌 Claude 的写法,”糟糕得夸张”,现在这些怪癖还要被水印规则强化。throwatdem12311 说他厌恶到快崩溃,准备说服老板换任何别的东西,”最气人的是我可以提示 Claude『这是胡言乱语,简化』,它能完美重写上一条回答,但任何 hook 或系统提示都修不好默认行为”。nomel 说这种科技兄语(tech bro speak)疯狂到把它粘进另一个 Claude 会话,新会话都读不懂前一个在说什么。chownie 引用了一个精准的形容:”Claude 的写作风格就是每一句都想读起来像 Reddit 上的 mic drop 时刻。” altmanaltman 补了一句:”街头苏格拉底——模仿了风格但没有内容。”不过 Lazare 及时指出这跟水印无关:按 Anthropic 说法,只有 8 月 2 日之后发布的模型才支持水印。
-
Terr_ 顺手吐槽了这篇文章本身的写作模式:每一节都以”这一步的一个核心想法是……”开头再跟上那个想法,既怪异又冗余,”我怀疑有人给 LLM 的提示是『每一步只放一个想法』,因为如今把流程拆成步骤实在是太——费——劲——了”。
-
fnord77 作为英语母语者说他完全看不懂”谁能影响骰子怎么落”这个说法,并给出了他认为更好的表述:”对 AI 生成的文本来说,水印通常通过在模型写作时秘密地偏置它偏好哪些词/token 来实现。”简单、可理解,不需要”骰子”或”倾斜”这些绕弯的解释。
-
throwatdem12311 半开玩笑地提出了一个新职业:雇人把 AI 输出重新措辞、手工转录以去除水印,用词典和同义词典这些”工具”充分改造文本使其不再落在 AI 分布内。system2 接得妙:”绕了一圈,被裁掉的内容写手要被重新雇回来了。真是活久见。”
-
techjamie 预测这会成为提供商的新收入来源;sroussey 补充了一个更实际的用途:当他们爬取互联网内容时,可以用来剔除自己的产出。
-
AProgramnerLazy 认为从此程序员再也没法声称代码是自己写的;huahaiy 一句话拆台:”在代码上似乎不成立,那里通常没什么选择余地。”
-
guessmyname 分享了一个务实的习惯:他几乎从不复制粘贴 AI 生成的文本,而是手工誊写,这迫使他阅读并边写边替换词句。uncivilized 的回复是本帖最佳吐槽:”你可以试试不用 LLM 直接手写!这样就完全没有水印了。”
(原文抓取成功。交互演示部分为网页动态元素,本文基于其文字说明总结。)