AI 水印能洗干净吗?

AI 输出的内容自带水印,复制粘贴就被识别为机器生成?1746 星项目 watermarks-remover 用 Unicode 字符清洗 + 统计改写硬刚 OpenAI/Anthropic/Google,开发者实测拆解套路、避坑方案全记录。

源仓库: guillaumemeyer/watermarks-remover

watermarks-remover:硬刚 AI 水印的开源屠龙刀

项目是啥? 它是一个 Python 小工具,专门把 OpenAI、Anthropic、Google 等厂商嵌入到 LLM 输出里的「水印」剥掉。所谓水印分两类:一类是藏在 Unicode 字符里的隐形标记(零宽空格、不可见分隔符等),肉眼看不见;另一类是基于 token 概率分布的统计指纹,靠比特序列模式识别追溯来源。这个项目 2026 年 8 月 13 日登顶 GitHub Trending,斩获 1746 星,主要原因是 ChatGPT / Claude / Gemini 给文本「盖章」越来越激进,内容农场、独立作者、教育圈怨声载道,watermarks-remover 一出现就成了刚需。

问题一:AI 水印到底藏在文本哪里?

现象:把 ChatGPT 输出复制到 VSCode,开「显示所有字符」会发现行尾冒出一串 \u200B(零宽空格)或 \u202F(窄不换行空格);Gemini 偏好 \u2060,Anthropic 偶尔塞 \uFEFF(BOM)。这些字符人眼看不出来,但任何 CJK 渲染管线、Markdown 解析器都可能把它们当成异常字符处理。

根因:厂商在推理后处理阶段,按伪随机规则在低熵 token 之间插入隐形分隔符,作为可追溯标记。OpenAI 早期论文称之为 green list tokens 模式。

解法:watermarks-remover 用正则把可疑 Unicode 区段全部替换或剥离:

import unicodedata

HIDDEN_RANGES = [
    (0x200B, 0x200F),  # 零宽字符
    (0x202A, 0x202E),  # 双向控制
    (0x2060, 0x2064),  # 不可见算子
    (0xFEFF, 0xFEFF),  # BOM
]

def strip_hidden(text: str) -> str:
    cleaned = []
    for ch in text:
        if any(start <= ord(ch) <= end for start, end in HIDDEN_RANGES):
            continue
        cleaned.append(ch)
    return unicodedata.normalize("NFKC", "".join(cleaned))

跑一遍再粘贴到 Notepad,幽灵字符一扫而光。

问题二:统计水印怎么破?

现象:有些平台即便文本里看不到任何特殊字符,照样 99% 命中「AI 生成」。这是基于 token 概率分布的统计水印——watermark key 决定哪些 token 属于「绿色列表」,绿色 token 概率被人为抬高。

根因:要在不解密 key 的前提下破除统计水印,几乎只能「重写」。重写会打破原始 token 的概率模式,但新文本要保持语义。

解法:项目集成了一组 LLM 后处理脚本,用 Claude / GPT 本地重写一遍:

from watermarks_remover import StatisticalRewriter

rewriter = StatisticalRewriter(
    model="claude-haiku-4",
    strength=0.7,           # 改写强度
    preserve_terms=["API", "kubectl", "WebSocket"],
)
out = rewriter.process(open("draft.txt").read())

strength 越高,破除水印越彻底,但可读性越受影响。0.6–0.8 是社区公认的甜区。

问题三:改写后语义会跑偏吗?

现象:很多用户反映跑完工具,原文那种「程序员味儿」淡了,更像 SEO 流水账。

根因:默认改写 prompt 没给 LLM 锁定语气、人设、领域术语,模型按「通用流畅风格」重写一遍,自然丢失原味。

解法:传 style_guide + preserve_terms,或在配置里加一段 system prompt:

rewrite_prompt: |
  你是技术博主,保持第一人称、口语化、断句短。
  不要添加原文中不存在的链接。
  保留所有代码块原样不动。
  术语表:API、K8s、LangChain 不许改写。

之后再跑,文本「人味儿」能恢复七七八八。

问题四:能识别并拆除所有厂商的水印吗?

现象:作者声称 multi-vendor,但实测发现 Anthropic Claude 在 Sonnet 4.5 之后换了算法,命中率掉到 60% 左右。

根因:厂商会持续升级水印方案,开源工具天然滞后。

解法:项目里有 vendor_profiles/ 目录,把每个厂商的清洗规则做成独立模块,更新只需改对应文件,社区维护者每周都在补 PR。生产环境建议同时跑 Unicode 清洗 + 统计改写双通道:

from watermarks_remover import pipeline
result = pipeline.run(
    text,
    unicode=True,
    statistical=True,
    vendors=["openai", "anthropic", "google"],
)

问题五:用了这个工具合规吗?

现象:Reddit r/ClaudeAI 和 HN 评论区吵翻了——有人说「用户对自己输出的权利」,有人说「教唆逃避溯源」。

根因:水印本质是 metadata,去除 metadata 在大多数司法辖区并不违法;但部分 ToS 把「绕过安全机制」明确列为违规。

解法:商业用途前建议查平台 ToS;个人写作、学习笔记、二次创作基本没问题。代码里加一行注释表明「用于内容可读性修复」,避免误用即可。

Sources

  • GitHub Trending 2026-08-13:guillaumemeyer/watermarks-remover
  • r/ClaudeAI:Removing watermarks from Claude output 讨论串
  • Hacker News:watermarks-remover hits 1700 stars 主帖
  • OpenAI 论文 A Watermark for Large Language Models
  • 项目 README 与 vendor_profiles/ 源码