文本水印落地后最怕两件事:被人改写绕过,以及推理端开投机解码。前者是攻击问题,后者更尴尬——它是完全合法的工程优化:小模型先起草、大模型再批量验收,被拒草稿换下来的 token 一多,水印信号就跟着被稀释冲掉。Meta 研究团队 10 月 29 日挂出 TextSeal2(arXiv:2610.40613),给出了一个两边都不得罪的解法:水印在投机解码下原样存活,接受率一点不掉。

上一代输在掷硬币

TextSeal 属于 Gumbel-max 框架的无失真水印,为了保住输出多样性,它对每个 token 抛硬币,从两把密钥里随机挑一把来打水印。麻烦在检测端:它不知道生成端用了哪把钥匙,只能把两把钥匙的分数取平均,论文算出这一步白白损失 √2 倍信噪比。前代还埋着一个隐蔽缺陷:伪随机函数只量化到 13 bit,在候选 101-1000 个的高熵位置(占 0.9%)会产生 -42 millinats 的采样偏差;TextSeal2 换成 53 bit 的 splitmix64,这类偏差归零。

核心改动:合并密钥,再跑一场竞速

TextSeal2 不再掷硬币,而是把两把(或任意多把,包括可公开的检测密钥)合并成一把虚拟密钥,用 AutoMark 的高斯 copula 耦合新噪声。论文在 5,169 个真实 Qwen3.5-9B 分布上实测,这种耦合能达到最优单 token 信噪比的 97%。投机解码这一侧,草稿本身用带密钥的指数竞速采样,验证时在竞速残差上再补一场指数竞速;由指数分布的无记忆性,这场残差竞速恰好复现 block verification 的裁决——输出分布精确等于目标模型,替换草稿的 token 依旧带水印,每轮平均接受 token 数保持在无水印基线的 2.74。

数字面:检出率与延迟

主战场是 Qwen3.5-9B(温度 1、top-p 0.95、窗口 k=3、每组 3000 条生成):TextSeal2 检出 78%/97% 的 100/200 token 答案,textGrain 为 74%/97%(误报率 10^-3、同等多样性)。开投机解码(Qwen3.5-0.8B 每轮起草 8 个 token)后差距拉开:TextSeal2 保持 67%/95%,TextSeal 掉到 48%/87%,textGrain 剩 36%/76%。跨模型结论不是单边碾压:比 TextSeal 在三个模型上多检出 8-22 个百分点;对 textGrain 在 Llama-3.1-8B 领先 11 点、Qwen3.5-9B 打平、Qwen3.5-27B 落后 5 点。长文本场景同样能打:AIME 数学题(最长 8192 token)在 2048 token 处检出 41%,textGrain 自家配方 38%,准确率不变。延迟则是另一半卖点:论文在 H200 上实测,textGrain 式的 Sinkhorn 后优化每步 1.1-3.0 毫秒(占 50 毫秒解码步的 2-6%),即便最简实现也是 TextSeal2 后处理量的 8-22 倍;TextSeal2 的密钥侧计算能与前向并行,与无水印采样相差不到 0.9%。

冷水与边界

论文自曝的局限值得照抄:只测了 Llama-3.1-8B-Instruct、Qwen3.5-9B、Qwen3.5-27B 三个开放权重模型和 ELI5、MBPP、AIME 三个领域,温度 0.7-1;投机解码本身让检出率损失 2-4 个百分点;投机实现未做 batching,没测墙钟加速;利用公开密钥知识的攻击也未分析。代码在 github.com/facebookresearch/textseal(Apache-2.0 许可证),仓库已带 TextSeal2 复现脚本与 quick start,论文原文见 arXiv:2610.40613。

对文本水印这条赛道来说,这篇的价值不在那几个百分点,而在拆掉了「水印与推理效率只能二选一」的旧设定。下一道考题依然是改写攻击——那才是水印这门手艺真正的生死线。