Claude文本水印:没有隐藏字符,检测靠什么?

“AI 文本水印”最容易被误解成两种东西:

在文本里偷偷加零宽字符

或者:

给每段内容嵌一个可追踪用户身份的编码

Anthropic 在 8 月 14 日公开 Claude 文本水印方案时,明确否定了这两种理解。

他们计划在未来 Claude 模型中使用基于 SynthID-Text 思路的水印:不添加隐藏字符,不额外消耗 Token,不携带用户、组织或具体会话身份;水印来自模型在多个“都合理”的候选词之间做选择时,所使用的随机性来源发生了变化。

这件事和“AI 检测器看文风判断是不是机器写的”不是同一类技术。

如果你正在做内容平台、AI 生成审计或者内部文档追踪,真正应该理解的是:这种水印能证明什么、不能证明什么,以及为什么经过重写、翻译或短文本以后,检测结论不能被当成绝对证据。

先把误区排掉:水印不在字符层

Anthropic 明确说明:

没有额外字符
没有隐藏字符
不增加 Token

所以这类检查没用:

for c in text:
    if ord(c) in [0x200B, 0x200C, 0x200D]:
        print("found hidden char")

即使完全找不到零宽字符,也不能说明文本没有水印。

水印存在于:

词序列统计模式

而不是字符编码。

LLM 本来就在多个合理 Token 之间抽样

例如:

The weather today was cold and ...

下一词可能是:

grey
overcast
windy

只要它们都在模型的高概率候选里,选择哪个通常会受采样随机数影响。

普通生成可以理解成:

candidate probabilities
+
random number
→ chosen token

水印生成则把“随机数从哪里来”换掉。

SynthID-Text 的核心不是强行选奇怪词

Anthropic 解释得很清楚:水印不会让模型为了编码而选一个本来几乎不会使用的生僻词。

它利用的是:

多个候选都合理时的低风险选择

可以抽象成:

context
+
secret key
→ pseudo-random decision

检测时再看完整词序列是否与这个 Key 产生的选择模式高度一致。

所以检测结果更像:

Probability / Confidence

而不是:

水印字节存在 = true

一个简化示意

假设当前有两个近似同义候选:

grey
cloudy

普通随机:

choice = random.choice(["grey", "cloudy"])

水印随机可以抽象成:

def keyed_choice(context, key, candidates):
    seed = HMAC(key, context)
    idx = int(seed[:8], 16) % len(candidates)
    return candidates[idx]

真实 SynthID-Text 当然比这个复杂得多。

这个例子只是为了说明:

Key 不需要出现在文本里

它只影响选择序列。

为什么读者看不出差异

Anthropic 称内部测试没有发现内容、创造性和可读性上的实际差异;它引用的 SynthID-Text 研究也曾通过真实流量和人工对比评估水印对输出质量的影响。

原因并不神秘。

如果每一次干预都只发生在:

几个本来就都自然的候选

之间,单个词几乎没有可见异常。

检测依赖的是:

大量局部选择累积后的统计相关性

而不是某一句出现特别诡异的措辞。

这也意味着:文本太短时,证据会弱

假设水印靠 500 次候选选择累积模式。

如果文本只有:

好的,已收到。

可用于统计的决策太少。

所以任何水印检测系统都必须处理:

Minimum Evidence Length

不要给 20 个字的文本一个看似精确的:

97.3% AI-generated

然后把它当事实。

更合理的 API 应该返回:

{
  "result": "INSUFFICIENT_EVIDENCE",
  "reason": "TEXT_TOO_SHORT"
}

检测结果不应该只有 true / false

我更建议设计:

public record WatermarkDetectionResult(
        DetectionStatus status,
        double confidence,
        int effectiveTokenCount,
        String detectorVersion,
        List warnings) {
}

状态:

LIKELY_WATERMARKED
LIKELY_NOT_WATERMARKED
INCONCLUSIVE
INSUFFICIENT_EVIDENCE

而不是:

AI=true

为什么“水印存在”不等于“整篇都是 AI 写的”

假设一段 2000 字 Claude 输出,被人删掉一半,再加入大量人工文字。

最终文档是:

Human
+
AI
+
Human Edit

检测可能仍发现局部水印模式。

它最多说明:

这段文本与某种水印生成过程一致

不能自动推断:

作者完全没有参与

这对学校、招聘、内容审核非常重要。

反过来也一样:没检测到,不等于没用 AI

用户可以:

重写
翻译
摘要
人工编辑
多模型改写

这些操作会改变 Token 序列。

如果检测器找不到原水印,不能推出:

一定是人工原创

所以水印更适合:

Provenance Signal

而不是:

Authorship Proof

重写为什么会削弱统计模式

原始序列:

A B C D E F G H ...

水印检测依赖上下文与后续词选择关系。

一旦大量改写:

A X Y D Z ...

很多局部上下文都发生变化。

因此检测需要面对:

Paraphrase Robustness
Translation Robustness
Truncation Robustness
Mixing Robustness

这些才是评测水印系统时真正应该看的指标。

企业内部更适合把水印当“一个信号”,而不是单一裁决器

例如内部文档平台做 AI 内容治理,可以组合:

Watermark
Generation Log
User Disclosure
Document Metadata
Edit History

最终 provenance:

{
  "document_id": "doc-18",
  "signals": {
    "watermark": "LIKELY",
    "generated_in_company_ai": true,
    "human_edits": 14,
    "source_session": "session-82"
  }
}

这比单独跑一个检测器可靠得多。

如果企业自己提供 AI 写作,最可靠的来源其实不是水印

内部系统完全可以在生成时记录:

Generation Event

例如:

public record GenerationProvenance(
        String generationId,
        String documentId,
        String model,
        String modelVersion,
        String promptHash,
        String outputHash,
        String subjectId,
        Instant generatedAt) {
}

保存:

output_hash

后续文档编辑再进入版本链。

对于自己控制的平台,这种“生成时记录”通常比事后猜测准确。

为什么仍然需要文本水印

因为大量 AI 内容会离开原平台。

例如:

复制到邮件
粘贴到论坛
导出文本
重新发布

原始 Metadata 会丢。

水印的价值就在这里:

文本脱离原系统后
仍可能留下来源信号

不能把 Watermark Key 当普通配置

检测依赖 Key。

如果 Key 泄漏,攻击者可能研究:

如何构造或规避特定模式

所以 Key Management 应该按安全密钥处理:

HSM / KMS
Rotation
Access Audit
Version

不能写进前端 JavaScript。

Detector 也必须版本化

模型采样方式变化、水印算法升级以后,Detector 可能需要更新。

检测记录至少保存:

watermark_scheme
key_version
detector_version
model_family

否则半年后无法复核旧结论。

一个内容平台的检测接口可以这样设计

POST /api/provenance/detect

请求:

{
  "text": "...",
  "purpose": "content-moderation"
}

响应:

{
  "status": "LIKELY_WATERMARKED",
  "confidence": 0.94,
  "effective_tokens": 1382,
  "scheme": "synthid-text-compatible",
  "detector_version": "v4",
  "warnings": []
}

后台再根据业务规则处理。

不要把 Detector 直接写成:

检测到 AI → 自动封号

为什么这件事和“文章 AI 味”是两个问题

一篇文章看起来像 AI 写的,通常暴露在:

模板化标题
重复结构
空泛总结
缺少真实细节
段落节奏一致

这是风格问题。

文本水印是生成过程留下的统计信号。

一个人可以人工写得非常“AI 味”。

一段水印 AI 文本也可以写得很自然。

两者不能混为一谈。

如果你在做 AI 内容平台,建议同时维护三类指标

Provenance

内容从哪里来?

Quality

内容有没有信息价值?

Policy

是否需要披露、限制或人工检查?

不要让 Provenance 代替 Quality。

AI 生成不等于低质量。

人工写作也不等于高质量。

水印最适合的实际用途

我更看好:

平台透明度
批量内容来源分析
合规披露
模型输出研究
内部内容治理

而不是:

用一次检测给单个人定性

尤其在教育和招聘场景,误判成本很高。

一个上线前必须测的 Robustness Matrix

原文:Detection Rate
删掉 20%:Detection Rate
改写 20%:Detection Rate
翻译一次:Detection Rate
AI 再改写:Detection Rate
人工混写 50%:Detection Rate
短文本:False Positive
不同语言:False Positive

如果平台只给:

原始未编辑输出 99% 可检测

这个数字并不能代表真实传播环境。


Claude 的文本水印方案最值得理解的一点,是:它不是藏字符,而是在模型本来就存在的随机词选择里留下统计模式。

因此它天然更接近概率证据,而不是绝对身份标签。

对工程系统来说,正确姿势不是做一个:

AI / Human

二元按钮。

而是把它接入:

Provenance
Metadata
Edit History
Policy

一起判断。

如果一个系统准备依据水印做封禁、处罚或版权结论,最先应该解决的不是 UI,而是:

短文本怎么办?
重写怎么办?
混写怎么办?
误报阈值是多少?
检测版本如何复核?

这些问题比“能不能检测到”本身重要得多。


更多企业级 AI 应用、Agent、RAG 与大模型工程化内容,我会继续整理在 智元界

https://www.zyentor.com/