SynthID 文本集成于 Transformers v4.46.0

Google DeepMind 与 Hugging Face 已在 Transformers v4.46.0 中推出 SynthID Text。该技术通过在生成过程中使用 logits 处理器为 AI 生成的文本添加水印,并利用训练好的分类器对这些水印进行检测。

SynthID Text 的工作原理

SynthID Text 将水印编码到 AI 生成的文本中,以识别内容是否由特定的大语言模型(LLM)产生,而不会改变模型的底层功能或降低生成质量。

系统使用一种称为 g‑function 的伪随机函数来增强生成过程。它会生成对人类阅读者不可感知、但可被训练模型检测到的水印。实现方式为一个生成工具,可通过 model.generate() API 与任何 LLM 兼容,无需对模型本身进行修改。

水印配置

水印通过数据类 (SynthIDTextWatermarkingConfig) 管理,该类对 g‑function 及其在 tournament 采样期间的应用进行参数化。由于这些配置可以复制水印,必须安全、私密地存储。

每个水印配置需要两个主要参数:

  • keys:用于在模型词表上计算 g‑function 分数的整数列表。建议使用 20 到 30 个唯一的随机生成数字,以在可检测性和生成质量之间保持平衡。
  • ngram_len:平衡鲁棒性与可检测性的参数。数值越高可检测性越强,但水印对改动越脆弱。推荐默认值为 5,最小要求为 2。

应用水印

要应用水印,只需在 model.generate() 调用中将 SynthIDTextWatermarkingConfig 对象传入 watermarking_config 参数。

示例实现:

from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    SynthIDTextWatermarkingConfig,
)

# 标准模型和分词器初始化
tokenizer = AutoTokenizer.from_pretrained('repo/id')
model = AutoModelForCausalLM.from_pretrained('repo/id')

# SynthID Text 配置
watermarking_config = SynthIDTextWatermarkingConfig(
    keys=[654, 400, 836, 123, 340, 443, 597, 160, 57, ...],
    ngram_len=5,
)

# 带水印的生成
tokenized_prompts = tokenizer(["your prompts here"])
output_sequences = model.generate(
    **tokenized_prompts,
    watermarking_config=watermarking_config,
    do_sample=True,
)
watermarked_text = tokenizer.batch_decode(output_sequences)

检测带水印的文本

由于水印设计为对人类不可感知,检测需要训练好的分类器。每个水印配置必须配备相应的检测器,以识别其特定标记。

推荐的检测器训练流程包括:

  1. 定义水印配置。
  2. 收集至少 10,000 条示例的训练集,包含带水印和不带水印的文本,并进一步划分为训练集和测试集。
  3. 使用模型生成不带水印的输出。
  4. 使用模型生成带水印的输出。
  5. 训练水印检测分类器。
  6. 将模型与相应的配置和检测器投入生产。

Transformers 提供了 BayesianDetectorModel 类用于此目的。共享相同分词器的模型可以共享水印配置和检测器,前提是检测器的训练集包含所有参与模型的示例。

限制与鲁棒性

SynthID Text 水印对轻度改写、少量词语修改或文本裁剪具有鲁棒性。但仍存在以下限制:

  • 事实性回复:对事实性内容的水印效果较差,因为在不影响准确性的前提下可用于增强生成的机会较少。
  • 大幅编辑:如果 AI 生成的文本被彻底改写或翻译成其他语言,检测器的置信度会显著下降。
  • 对抗性使用:系统并非旨在阻止有动机的对手造成危害,但它提升了利用 AI 生成内容进行恶意行为的难度。

Sources