第 7 课 · 动手学大模型(上海交大)
LLM Steganography
大模型隐写:把比特藏进流畅的句子里
上一章的水印是「让人知道这是机器写的」,这一章反过来:让文本读起来完全正常,但里面藏着只有掌握密钥的人才能取出的信息。教程用 GPT-2 实现两种编码方法。
学习目标
- 在 GPT-2 的文本生成中实现隐写术。
- 掌握霍夫曼编码和固定长度编码(FLC)两种嵌入方法。
- 同时生成隐写文本和普通文本,做对照分析。
核心概念
隐写的原理是把解码过程当作信道。语言模型每一步都会给出一个词表上的概率分布,正常生成从中采样;隐写生成则用秘密信息的比特来决定选哪个词。
固定长度编码(FLC) 最直观:取概率最高的 2 的 k 次方个候选词,用 k 个比特直接索引其中一个。实现简单,但当分布很尖锐时会强行选中低概率词,文本自然度下降。
霍夫曼编码 按候选词的概率构建霍夫曼树,高概率词对应短码。同样嵌入一个比特串,霍夫曼编码更贴合原始分布,文本更自然,代价是每步嵌入的比特数不固定。
提取端要用同一个模型、同一段上下文重跑一遍解码,才能把比特还原出来——这意味着模型和上下文本身就是密钥的一部分。
实践步骤
- 装依赖,Python 3.8 以上,PyTorch 和 Transformers;有 CUDA 更好。
- 打开 notebook,它分三部分:霍夫曼编码实现、FLC 实现、文本生成与隐写。
- 选编码方法,设置参数 k,用自定义提示词运行主函数。
- 程序会输出两个文件:
outputs-gpt2-stega.txt是隐写文本,outputs-gpt2-normal.txt是同等条件下没有隐写约束的正常生成,用于对照。 - 走一遍解码:用相同模型和上下文提取比特,还原成原始信息,确认无损。
常见误区
- 只看能不能藏,不看藏得像不像。 两个输出文件是配对的,就是为了让你比较自然度。只读隐写文本很难发现问题。
- k 值一味调大。 k 越大单步嵌入越多,但候选集里的低概率词也越多,文本会越怪。容量和隐蔽性是一对权衡。
- 忘了信息长度影响文本长度。 要藏的比特越多,生成的文本就越长,短提示词藏不下长消息。
动手练习
固定一段秘密信息和一条提示词,分别用 FLC(k 取 1、2、3)和霍夫曼编码各生成一次,记录四组结果的文本长度和你主观的自然度打分(1 到 5)。再用 GPT-2 对四段文本各算一次困惑度,看主观打分和困惑度是否一致。最后统计每种设置的平均每词嵌入比特数,画出容量与自然度的权衡曲线。
要点回顾
隐写的三个指标是容量、隐蔽性和可提取性,三者互相牵制。霍夫曼编码在自然度上占优,FLC 在实现和容量控制上更简单。GPT-2 首次运行会自动下载模型,约 500MB,国内可以先走镜像下好;换成更大的模型同样成立,只是分布更尖锐,参数要重调。
参考来源
- 上海交通大学《动手学大模型》系列编程实践教程,第七章「大模型隐写」:documents/chapter7,核验日期:2026-09-06。