Jimmy's blog
返回文章列表
1021 字6 分钟

从科场舞弊案聊一聊文本水印

AI#Agent / 文本水印

最近欧盟出台了新规,要求大模型生成的文本必须带有水印。图片水印我们经常见,文本内容怎么插入水印呢?

这里,我们就从清代一次科场舞弊案聊起,简单介绍一下大模型如何给生成的文本添加水印。

咸丰八年戊午科场案

这一年科举考试,考生罗鸿禩通过中间人联系到考官浦安,许下重金,和考官事先约定,在试卷上做上标记(也叫“关节”、“关目”):

  • 第一篇文章末尾用“也夫”
  • 第二篇末尾用“而已矣”
  • 第三篇末尾用“岂不惜哉”
  • 试帖诗末尾用“帝泽”

考官据此识别到该考生的试卷,将该考生列入拟录取名单。后因试卷错别字太多,阅卷程序异常而暴露。

文本如何添加水印

其实从上面的故事中,我们已经可以提炼出文本水印的核心思想:在文本中插入可识别身份的特殊标记

现在我们回到本文讨论的核心问题:大模型如何给生成的文本添加水印?

参考上面的故事,我们很容易想到,给大模型生成的文本中也插入一些隐秘的字符,不影响用户正常阅读,但能够通过特定手段识别出来。比如在段落末尾插入空白字符,但这种方式很容易通过程序破解,并且文件携带了很多冗余字符,增加了传输和存储的成本。

更聪明的方法是让原始文本直接体现出某些特征,比如文本中固定字符出现的次数,通过精心修改的文本,是可以体现出该特征的。但这种控制次数方式有一些实际问题:首先文本长度影响太大,太短的文本如果某个固定词出现次数太多就会显得异常,太长的文本又会因为次数太少显得异常。并且攻击者很容易通过这种异常分析出水印规律从而进行伪造。

更合理的设计是使用统计规律来隐藏水印信息。简单来说,就是通过特定的算法,使某些词(或者说表达方式)在文档中出现的频率偏离正常文本。

通过一段文本表达某个意思,通常会有多种表达方式,比如我们说苹果好吃,可以说:

这个苹果真好吃。 这个苹果真美味。 这个苹果味道很好。 ……

正常的文本中出现上述某一种表述的概率是相等的,但水印文本会通过密钥,隐秘地提高某些表达方式出现的概率,从而在统计上出现概率偏差。

大模型的实际操作

具体到大模型生成文本时,因为模型本来就是在一系列 token 中分配概率进行选择,这个密钥会影响模型选择某些 token 的概率。注意,这里只是稍微提高某些 token 的概率,不会强制选择该 token,其他同义 token 仍然会出现在文本中,只不过概率稍低。实际检测的时候,通过密钥重放这种统计模式,就能知道文本是否添加了水印。这种文本不会影响正常阅读,并且复制或者轻微改写也不会破坏水印。

总结

这种通过概率添加水印的方式非常巧妙。不过也有一些限制。首先文本太短的时候不能很好地处理,并且对文本内容有一些特殊要求,如果某些信息只有一种固定表述,如“中华人民共和国的首都是北京”,这种事实性很强的内容很难嵌入水印。因此在长文本、开放式的写作中才能更容易嵌入和检测水印。

文章信息

许可协议CC BY-NC-SA 4.0