大模型水印技术:从文本到多模态的水印方案

大模型水印技术:从文本到多模态的水印方案

引言 随着大模型生成的文本、图像、视频越来越逼真,区分AI生成内容与人类创作内容成为了一个紧迫的社会需求。水印技术通过在模型输出中嵌入可检测但不影响质量的标记,为解决这一问题提供了技术路径。2026年,欧盟AI法案、中国《生成式AI服务管理办法》等法规已要求AI生成内容必须可被检测。本文将系统介绍水印技术的原理和最新进展。 文本水印技术 水印的基本框架 文本水印的目标是在生成文本中嵌入统计可检测的信号,同时保持文本质量。水印系统包含三个组件: 嵌入器:在生成过程中嵌入水印 检测器:判断给定文本是否包含水印 评估器:评估水印的鲁棒性和文本质量影响 KGWW水印方案 Kirchenbauer等人提出的KGWW水印是当前最主流的文本水印方案: 核心思想:在生成过程中,将词表随机划分为"绿名单"和"红名单",水印模型倾向于选择绿名单中的token。 具体算法: 对于每个生成位置,使用前一个token的哈希值作为随机种子 将词表划分为绿名单($\gamma |V|$ 个token)和红名单($(1-\gamma)|V|$ 个token) 对绿名单token的logit添加偏差 $\delta$ 正常采样 $$ p_t^{(w)} = \begin{cases} \frac{\exp(z_t^{(w)} + \delta)}{\sum_{w’ \in G} \exp(z_t^{(w’)} + \delta) + \sum_{w’ \in R} \exp(z_t^{(w’)})} & \text{if } w \in G \ \frac{\exp(z_t^{(w)})}{\sum_{w’ \in G} \exp(z_t^{(w’)} + \delta) + \sum_{w’ \in R} \exp(z_t^{(w’)})} & \text{if } w \in R \end{cases} $$ class KGWWWatermark: def __init__(self, vocab_size, green_ratio=0.5, delta=2.0, hash_key=15485863, context_width=1): self.vocab_size = vocab_size self.green_ratio = green_ratio self.delta = delta self.hash_key = hash_key self.context_width = context_width def _get_greenlist(self, context_tokens): """根据上下文token生成绿名单""" # 使用上下文token的哈希作为种子 seed = self._hash_context(context_tokens) generator = torch.Generator(device='cpu').manual_seed(seed) # 随机选择绿名单 perm = torch.randperm(self.vocab_size, generator=generator) green_size = int(self.vocab_size * self.green_ratio) return perm[:green_size] def _hash_context(self, context_tokens): """对上下文token计算哈希""" if isinstance(context_tokens, torch.Tensor): context_tokens = context_tokens.tolist() # 使用前context_width个token tokens = tuple(context_tokens[-self.context_width:]) return self.hash_key * hash(tokens) % (2**32) def watermark_logits(self, input_ids, logits): """在水印logits中添加绿名单偏差""" batch_size = input_ids.shape[0] for b in range(batch_size): context = input_ids[b] greenlist = self._get_greenlist(context) logits[b, :, greenlist] += self.delta return logits 检测算法 检测时统计绿名单token的比例: ...

2026-06-30 · 4 min · 745 words · 硅基 AGI 探索者
鲁ICP备2026018361号