V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
fbxshit
V2EX  ›  奇思妙想

哪个大模型可以自动根据上下文生成关于某个主题的聊天对话(纯文本),同时在保持文字意思大致不变的前提下,精确嵌入隐藏水印?

  •  1
     
  •   fbxshit · 11 天前 · 1765 次点击

    A: 北京的糖葫芦是不是很有名? B: 没错!尤其是在冬天,街头的小贩会卖糖葫芦,山楂蘸上糖浆,酸甜可口。 A: 真想买一个尝尝,感觉很有童年回忆!

    以上是 LLM 自动生成的一段关于北京美食的对话。

    请问大家,有没有某个通用的方法,可以让 A 在给 B 按照 LLM 生成的语句发送第一句话的时候,嵌入一段隐藏的信息,比如说一段二进制字符串 10110011 ,隐藏到第一句话里面去? 这可能会让第一句话有某种变形,比如变成“北京的糖葫芦听说很有一点名气,你觉得呢?”,或者变成“你知道北京的糖葫芦真的很有名很有名吗?”。在嵌入隐藏信息后,B 收到了“北京的糖葫芦听说很有一点名气,你觉得呢?” 然后按照某种事先商定的规则可以自动把 10110011 解码出来。

    B 在收到隐藏的信息 10110011 后,决定回复 A 一段字符串 00001100 ,通过把 00001100 嵌入关于美食的第二句话“没错!尤其是在冬天,街头的小贩会卖糖葫芦,山楂蘸上糖浆,酸甜可口”。 这可能会让第二句话变形成“对!尤其是冬天,小贩会卖糖葫芦,山楂蘸糖浆,又酸甜又可口”。 A 在收到后,程序按照某种规格自动解码出 00001100 这一段隐藏字符。

    每一段 A 与 B 的来回对话,都能被大模型按照某个主题以及前面各轮上下文,自动实时生成的文字掩盖。在任何第三方看来,这都只是一段关于美食的对话而完全看不出真实的对话隐藏在其中。

    请问大家,这个想法有没有可能通过某种本地运行的 LLM 和相应的文字处理程序实现?

    25 条回复    2025-06-18 09:55:20 +08:00
    mumbler
        1
    mumbler  
       11 天前
    你直接把这段话给大模型,让它生成 prompt 试试啊,只要你能讲清楚规则,算法,人能理解大模型一定能实现出来
    rogerer
        2
    rogerer  
       11 天前
    这个叫文本隐写,和以前的图片隐写对应,同样是改变文本的概率分布隐式注入水印信息。但是因为文本高度抽象,这个领域被应用得不是很广泛。

    此外,这个领域的主要目的是在文本内注入水印,防止文本泄密,如果要完全表示两套平行的信息,可能还是有非常的难度。
    wangxiaoer
        3
    wangxiaoer  
       11 天前 via iPhone
    @rogerer 你误会了,他不是加水印,他这个需求本质上加密通信,只不过加密后的内容仍然具备可读性和逻辑性。简单理解为大家都通过藏头诗通信,表面看到的互相发送诗词,实际上交流的内容跟诗词毫无关系。
    fbxshit
        4
    fbxshit  
    OP
       11 天前
    @wangxiaoer 其实这里想要做的并不是加密而是隐藏,是把互相发送的一串看似随机的二进制串通过大语言模型的生成能力,用实时生成的类似人类之间的正常对话进行掩盖。

    这一串二进制字符本身就是加密过的,所以如何从对话中提取的算法,也可以是完全公开的都没有问题。只要做到表面上这段对话像人类在实时聊天就行,即使查看聊天的第三方提取出这一串字符,也没有意义,因为完全无法得知这串看似随机的字符是否是有意嵌入的。

    让 LLM 介入的目的在于,如果 A 和 B 在聊天中直接发送 010101 ,显然很容易被判定为账号异常。

    然后,只要聊天双方能顺畅的互相发送二进制符号,那当然也可以随意加密和编码任何内容进行发送,但这是另一部分相对独立的内容了。
    lzxz1234
        5
    lzxz1234  
       11 天前
    定义一个 emoji 到真实含义的编码表,大模型生成的原始内容移除 emoji ,然后插入编码后的 emoji

    位置可以基于同音字替换,也可以放在句尾,解的时候只读 emoji ,查字典找回原始含义
    sillydaddy
        6
    sillydaddy  
       11 天前
    可以的。关键原理是:大模型的输出可以是完全确定性的。

    给定大语言模型一段输入,它的输出看起来是随机的,是概率性的。也就是每次给同样的输入,它的输出都不同。但是,在计算机界,就没有真正的随机。这里的关键是,大语言模型每次输出一个 token ,其实它输出的是一个表达 token 的一个向量,比如(0.2, 0.5, 1.0, 0.8, 0.7, 0.25, 0, 0.32, ...),我们要将它解释成具体的 token 。为什么说是解释呢,因为这个向量并不与任何一个已知的 token 一致。只是与已知的 token 接近,而且与不同的已知 token 的接近程度不同。如果你了解向量的知识,这点很容易理解。但是,我们需要把向量转换成已知的 token ,所以,我们根据向量跟不同 token 的接近程度,赋予每个 token 一个出现的概率,然后我们生成一个随机数(就像掷骰子),决定最终选择哪个 token 。这个过程就像北京的汽车摇号。

    可以看到,随机性完全决定于我们的随机数,而计算机学界使用的基本都是伪随机数,每次随机看起来生成的数不一样,但它完全是确定性的。

    你和接收方,可以使用一个相同的大语言模型,然后约定使用相同的随机数发生器。这样,对于同样的输入,你们的大语言模型,将给出完全相同的输出。

    有了前面的 2 个大语言模型绝对同步的保证,后面就是将字符串编码到对话中了。
    比如 A 先发起对话,“北京的糖葫芦是不是很有名?”,这句话不加入任何信息。那么 A 和 B 都完全知道 B 的回复内容。那么传送信息就简单了,可以用大语言模型将 B 的回复内容加入信息,比如通过声调的变化。外界不知道 B 原本要回复的内容,所以它解密不出来,但是 A 是知道的,所以,它相当于有一副原本,可以发现 B 的回复内容有哪些修改,进而解密。
    现在,A 和 B 已经进行了一轮对话,怎样继续呢?可以在 B 的回复后面,加上一句隐藏的提示词“请继续 A 的提问”,驱动大语言模型继续给出 A 的问话。
    然后 A 就可以在大语言模型给出的回复里面再加入信息给到 B 了。
    pWHx3x96
        7
    pWHx3x96  
       11 天前
    所以是佛曰的进化版,LLM 曰?
    fbxshit
        8
    fbxshit  
    OP
       11 天前
    @lzxz1234 感觉这样另外用 emoji 隐藏也是一个方法,但我更想知道能否把信息精确控制隐藏到大模型的文字输出中。
    fbxshit
        9
    fbxshit  
    OP
       11 天前
    @sillydaddy 难点在于如何按照 B 想要发送的秘密信息,对 LLM 生成的内容进行修改,有没有现成的类似这种功能的算法。 我试了一下让 LLM 生成一段美食的对话,然后要求它每一句话前面 10 个字,每个字的笔画分别为 7798666995 ,这样精细的控制好像不行,也可能是我提示的不对。

    照理说同样一句话可以有几百种表达方式都是可能的,而且差不多意思的内容也可以在日常表达中缩短或者拉长,这里面从原理上来讲完全有空间可以隐藏大量的额外信息在里面。
    fbxshit
        10
    fbxshit  
    OP
       11 天前
    具体需要实现的想法就像下面这样:
    第一步,A 想要发送 10100101 给 B ,他把 10100101 和一个关于北京美食的提示词给 LLM ,LLM 根据要求生成了第一句话“北京的糖葫芦是不是很有名?”同时嵌入了二进制串。

    第二步,B 收到了“北京的糖葫芦是不是很有名?”, 解码出来 A 真正想要发送的字符串 10100101. B 想要回复 A 一串字符 00001111 ,这次 B 把她的 00001111 和 A 发过来的上面那句糖葫芦输入 LLM ,要求 LLM 生成一句和糖葫芦有关的回答,同时把她的 00001111 嵌入回答,然后把嵌入了隐藏字符的回答“没错!尤其是在冬天,街头的小贩会卖糖葫芦,山楂蘸上糖浆,酸甜可口。 ”发送给 A 。
    aloxaf
        11
    aloxaf  
       11 天前
    这不就是大模型水印技术吗,只不过你想嵌入的不是水印而是秘密信息。

    https://github.com/jwkirchenbauer/lm-watermarking
    fbxshit
        12
    fbxshit  
    OP
       11 天前
    @aloxaf 谢谢
    sillydaddy
        13
    sillydaddy  
       11 天前
    @fbxshit >“要求它每一句话前面 10 个字,每个字的笔画分别为 7798666995”
    也许是你要求的信息密度太高了。10 个字还要隐藏这么多信息,还有符合语句通顺,还有语义连贯,这是 mission impossible!
    另外大语言模型对笔画、字数这些都非常不擅长。所以可能需要从其他角度考虑,或者降低一些信息密度。
    fbxshit
        14
    fbxshit  
    OP
       11 天前
    @aloxaf 看了下 lm-watermarking 好像并不能随意的嵌入任意信息,只是从总体上去判断某一段文本是否由 llm 生成。
    dhb233
        15
    dhb233  
       11 天前
    主要是看加入水印的目的吧,文字本身信息就很少,再添加额外信息就很难。
    如果目的是为了好识别是否是自己的大模型生成的,可以把一些字符用相似字符替换,替换规则可以用来识别是不是自己的模型。当然了,这不能做对抗,很容易被破解
    fbxshit
        16
    fbxshit  
    OP
       11 天前
    @sillydaddy 如果 A 和 B 两边有完全一样的 LLM ,有没有可能按照要隐藏的二进制串进行文本输出? 比如 0 就选择列表中第一个 token,接下来如果是 1 就下一个词选择列表中第二个 token 。A 这边生成了之后 B 用一样的 LLM 跟踪一下生成过程,按照每次生成了什么词就能把 0 和 1 还原出来。
    chf007
        17
    chf007  
       11 天前
    文字里藏信息和图片里藏信息不太一样,因为图片即使你把某个像素位置调整一下,颜色调整一下,整体上看来还是一副相差不大的图。信息藏进去可操作的空间很大。

    往有意义的文字序列里插信息,操作空间不大。

    首先你要跨系统传送的话,肯定不能靠大小,字体之类的(要是靠这 2 个,本质上就是图了)。

    其它可选的我能想到的就是空格、顺序、换字。

    靠空格么?那不一下就看出来了。

    靠调整文本顺序么?那有意义的文本顺序的话,必然是少量的,所以只靠顺序又能有意义的转换可藏的信息必然是有限的,你输入的越多,那文字就越没有意义。那和传输加密的无意义字符串没有区别。

    如果可以靠换不同的字,或单词来保持有意义的同时又能加进去代表隐藏的信息,但是这不就是密码本加密么,并且比密码本还更简单,因为你限定了有意义,即使是不同的字或词,从整体上看肯定会有一种相似性存在,就很容易破解。

    如果是简短的密文,应该是可以的,越长,整体的文本意义可能就越怪,就不是普通的聊天了,还是能看出来端倪。

    整体上来看,这和 AI 没什么关系,你想用 AI 只不过是想利用大模型自动化挑选字词组合有意义的文本,但是发时容易,解时难。大模型目前有一个问题就是不确定性,就是你同一段提示词加密文,执行多次他可能输出的是不一样的结果,那收端怎么解析。收端一定要规则明确,解析才准。如果收发端都确定好了详细规则,那就是普通编程了,和 AI 没多大关系。当然可以说把规则也训练进去,但是即使是这样,会不会出什么妖蛾子事也不知道。因为编解码一定是要规则明确的,换词什么的,那也一定是要在白名单之内的,AI 搞的可能有是有意外的,有意外的词,解码就不好搞了,因为你解出来的可能也是意外的密文。
    Jlzeng
        18
    Jlzeng  
       11 天前
    应用场景是什么?搞谍报?
    sillydaddy
        19
    sillydaddy  
       11 天前
    @fbxshit 哈,我刚刚也想到了,我觉得是可以的。
    假设 A 还是给 B 发了一句“北京的糖葫芦是不是很有名? ”(不包含隐藏信息),大语言模型正常的输出是“ 没错!尤其是在冬天,街头的小贩会卖糖葫芦,山楂蘸上糖浆,酸甜可口。”。
    在每输出一个 token (可以看作是一个汉字)时,A 和 B 的大语言模型以及随机数发生器都完全处于同步状态。
    就像你说的,我们可以介入这个过程,让二进制串嵌入到这个生成过程,比如在生成第一个字“没”时,其实大语言模型生成的是一个(0.2, 0.5, 1.0, 0.8, 0.7, 0.25, 0, 0.32, ...)向量,这个向量与“没”(0.2, 0.4, 1.0, 0.8, 0.7, 0.25, 0, 0.32, ..),以及“不”(0.1, 0.5, 1.0, 0.8, 0.7, 0.25, 0, 0.32, ..),以及“对”(0.2, 0.5, 0.9, 0.8, 0.7, 0.25, 0, 0.32, ..)。。。这些字最接近。然后根据接近程度,分配给“没”,“不”,“对”等这几个字,分别以(0.25, 0.3, 0.3,...)的出现概率,这时开始使用伪随机数摇骰子,我们其实是知道伪随机数在这一步一定是输出一个确定的数字,比如是 200 ,它对应到“没”字。但是我们可以介入这个过程,如果我们希望将 1 这个 bit 位加入进来,我们可以让伪随机数继续输出 200 之后的下一个数字,比如 312 ,这时它仍然映射到“没”,不符合我们的要求,继续输出再下一个,直到与“没”字不一样,比如输出 123 ,映射到“不”字,这时我们通过“相对于原本要输出的字的改变”这个现象,编码了一个 1 进去,如果希望编码 0 ,那就不改变原始输出的字。

    后面可以继续这样处理,每输出一个 token ,都可以至少编码 1 个 bit 进去。当然了,有时候,如果几个字的概率分布是(0.99, 0.01, 0.01, ...)这样,那就不要强行编码 bit 1 进去了,因为可能会让文字变得不通顺。我感觉大部分情况下,是完全可以编码 bit 1 的。甚至可以每个 token 编码多个 bit 进去,如果有多个字出现的概率相似,比如(0.1, 0.1, 0.1, 0.1, 0.1, ...)。

    这个方案优点就是可以非常精确的编码和解码,不需要人工介入,生成的语句还非常自然。利用的关键就是伪随机数发生器的确定性和同步。
    spritecn
        20
    spritecn  
       11 天前
    可用性上,用汉字声调 12 = 0,34 =1 方案,相比笔画的可行性更高一点吧,只是一个提议
    newaccount
        21
    newaccount  
       11 天前
    在字之间用零宽空格?信息就用不同的字符表示 01 或者对应转成十个数字对应四角编码,多找几个不同的零宽空格用用?
    aloxaf
        22
    aloxaf  
       11 天前
    @fbxshit #14 当然,这只是个水印技术,但是原理上是类似的。

    大模型会根据上一个 token 预测下一个 token ,这个水印的原理就是在生成下一个 token 前,根据水印哈希+前一个 token 计算出一个可用的 token 白名单,然后提高生成 token 落在白名单里的概率,来实现将水印编码进去的效果。

    这个技术是固定水印+动态白名单,只能起到验证水印的作用——即使用水印重新生成一遍白名单,然后验证每个 token 是否落在白名单内,概率越高则越可能加了水印。

    但是将这个技术稍加改动——使用密钥生成一个绿名单,然后在生成下一个 token 时,用要编码的信息( 0/1 )来干预(降低/提高) token 落在名单中的概率,就是反过来编码任意信息了。
    干预程度越大,信息密度越高,语句也越不通顺,干预程度越低,信息密度越低,但隐藏效果也更好。
    rogerer
        23
    rogerer  
       11 天前
    @wangxiaoer 文本隐写就是这个目的,只是隐写一般携带的信息比较少。
    rogerer
        24
    rogerer  
       11 天前   ❤️ 1
    可以直接参考这篇博客,总结的还是挺完全的: https://blog.csdn.net/qq_36332660/article/details/132081595
    本质上就是精心构造一些和常规情况不太一致的 Token 分布,难点在于,如何既构造差异分布携带信息又不能让大家发现这个序列是诡异的。

    这件事情在一些涉密领域有一些应用。
    lchynn
        25
    lchynn  
       4 天前
    破解文本隐写提示词:

    请你对下面的文本内容, 重新用 XXX 的文风改写一下, 要保留主要核心内容和思想。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2558 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:36 · PVG 17:36 · LAX 02:36 · JFK 05:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.