AKL AI CLUB BETA ← 前沿导读
FRONTIER · 黑箱与安全

在开源模型上用梯度练出的一串乱码,贴到闭源模型后面照样管用——而最好的那道防线,只把成功率从九成压到四成

Adversarial Attacks on LLMs

Lilian Weng 在 OpenAI 组建并领导过安全系统团队,负责 GPT-4、DALL·E 3 上线前的红队与对抗测试流程 · 个人博客 Lil'Log 自 2017 年更新至今,多篇综述被研究者当作入门教材 · 本文把 2018–2023 年五类攻击方法和几乎所有已知防守串成一张图
2023 年 10 月
为什么选它越狱这个题目上,网上流传的多是段子和技巧清单,缺一份把攻击方法和防守代价摆在同一张表里的东西。这篇是。读完能拿到两样别处不好拿的:一个解释越狱为什么消灭不掉的结构性框架,以及每种已知防守分别要用什么去付账——能力、延迟,还是误伤。

对抗攻击在图像上研究了十年,到文本这边一度被认为做不动:像素是连续的,可以顺着梯度一点点推;token 是离散的,没有直接的梯度信号。Lilian Weng 这篇 2023 年 10 月的长文,就是把这个「做不动」被一步步做动的过程记下来的一张地图。她开篇先把范围收窄:只谈推理时的攻击,模型权重固定不动——训练数据投毒、把预训练语料和隐私从模型里抠出来,都不在射程内。剩下的问题只有一个:给定一个已经做过安全对齐的模型,怎么构造一段输入,让它说出它本该拒绝说的话。

值得读的不是那五类方法本身,是把它们并排摆出来之后浮上来的那个不对称。攻击方做的是一道有梯度的优化题:定义一个损失函数——让模型开口先说「当然,下面是……的方法」——然后用梯度去搜一串能把这个损失压下去的后缀。防守方做的是一道没有梯度的约束题:要在不知道下一次攻击长什么样的前提下,把一整片行为空间封死。这篇文章绝大部分篇幅在讲攻击,讲缓解只有最后一节,作者还专门加了句免责声明,说这块需要另开一篇。那一节的短,本身就是结论。

分水岭不在技巧,在有没有权重

文章把攻击分成五类:改 token、梯度搜索、越狱提示、人工红队、模型红队。其中只有第二类需要白盒——拿得到权重、架构和梯度,实践中就是指开源模型。这条线是全文最要紧的一条。Wallace 等 2019 提出的「通用对抗触发器」(UAT,universal adversarial trigger:一串与具体输入无关、贴在任何提示前后都生效的固定 token)已经显出苗头:分类任务只要 1 个 token,生成任务 4 个,而且能跨分词方式、跨架构迁移。Weng 给的解释是,它们多半在利用训练数据里那些被烤进模型全局行为的偏差。

Zou 等 2023 把这条路走到了头。他们用「贪心坐标梯度」(GCG)搜一段后缀,目标是让模型面对任何有害请求都先回一句肯定句;实现上先用一阶泰勒展开粗筛出每个位置最有希望的候选 token,再只对少数候选算精确损失,因为第二步很贵。还有个细节工程上值得抄:他们不是一上来就优化全部提示,而是等当前后缀在前 m 条上都成功了再加第 m+1 条,等于给攻击排了张课程表。这串后缀只在 Vicuna-7b 和 13b 上训练,却对商用闭源模型显出了非平凡的迁移率——这句话后来被引用了无数次。

越狱不是 bug,是两种结构性失败

Wei 等 2023 给越狱归纳了两个失败模式,这是全文概念上最值钱的一段。第一个是「目标冲突」:模型的能力目标(永远遵循指令)和安全目标本身打架,于是有了前缀注入(要求它先说一句肯定)、拒绝抑制(明令不许用拒绝的句式)、风格注入(不许用长词,它就写不出免责声明),以及各种 DAN 式角色扮演。第二个是「泛化错配」:安全训练没覆盖到某个领域,而模型的能力覆盖到了——Base64 编码、ROT13、摩斯码、火星文、把敏感词拆成子串(token smuggling)、换一种小语种提问,全属于这一类:输入对安全训练来说是分布外的,对预训练语料来说不是。

把第二条想透会有点凉。它说的是:安全训练的覆盖面天然小于预训练的覆盖面,两者之间的差集就是越狱空间。模型能力每扩出一块新地方——多学一门语言、多认一种编码、多会一种格式——差集就跟着长一块,除非安全训练同步跟上,而它从来跟不上。按这个框架,越狱不是某次训练没做好,是能力和安全两条曲线增速不同留下的结构性缺口。

自动化红队,和它自己挖的坑

人工红队这条线有两组数字值得记:Ziegler 等 2022 给人类红队做了个工具,高亮每个 token 的显著度并直接给出替换候选,单条样本的耗时从 20 分钟降到 13 分钟;Anthropic 的红队数据集收了近 4 万条人类攻击,并发现 RLHF 模型随着规模变大反而更难攻破。真正的规模化要靠模型红队:Perez 等 2022 让一个红队模型去攻目标模型,用一个有害性分类器判定是否得手,再把这个判定当奖励做 RL。

这里有个所有人都会踩的坑,文章讲得很直白:你拿分类器当奖励,RL 就会去攻分类器,而不是攻模型。分类器的任何瑕疵都会被优化成一种「高效攻击模式」,而它其实什么都没攻破。同一节还有一句更扎心的旁注——如果你的红队打的是一个现成的分类器,这件事的边际价值本来就有限,因为那个分类器可以直接拿去过滤训练数据或者拦输出。RL 红队另有个跑不掉的取舍:KL 惩罚放松,攻击成功率上去了,样本多样性塌了,模型会死磕一种得手过的套路。

防守只有一节,而且每条都在同一个地方付账

逐条看这最后一节。让模型自我提醒「要负责任、不要生成有害内容」,确实能明显压低越狱成功率,代价是它变保守、创作类任务受损、连安全与不安全的判断也会出错——这跟第 45 篇里那句「一句没优化过的警告挡住了 150 个进化出来的思想病毒」是同一件事:便宜、有效、但脆。对抗训练被认为是最强的防守,可 Jain 等 2023 测的两种设置里,第二种(对拒绝回复做梯度下降、对红队回复做梯度上升)基本没用:生成质量掉了一大截,攻击成功率几乎没动。困惑度过滤对白盒攻击有效,因为梯度搜出来的后缀通常是乱码——UAT 的困惑度在 10 的 7 次方量级,加了语言模型损失约束的 UAT-LM 降到 10 的 4 次方,UTSC-1 只有 160 左右,代价是成功率跟着下降。至于输入预处理——让模型改写一遍,或者重新分词把 token 打散成更小的片——最好的结果也只是把成功率从九成多压到四成。

这些零碎的交易背后其实有个统一的数学形式:Madry 等 2017 的鞍点问题。外层在模型参数上做最小化,内层在扰动上做最大化,所有攻击方法归根到底都是在解内层那个最大化。这个框架还带出一个反直觉的结论:对抗鲁棒性需要更大的模型容量,因为它要求决策边界变得更复杂;而且光是把容量加大、不做任何数据增强,鲁棒性也会涨一点。

这篇里被引用最多的那句话,恰恰是最该打折的一句。「在开源模型上训出来的对抗后缀能迁移到商用闭源模型」,三年来被当作开放权重危险性的核心证据,但 Weng 自己在原文里就标了注:Vicuna 的训练数据来自 shareGPT,本质上是 GPT-3.5 的蒸馏,所以那次迁移更接近白盒攻击,而不是干净的黑盒迁移。三年引用下来,这条注脚被磨没了。这件事对第 39 篇那份开放权重放行流程是有分量的——真正该测的问题不是「攻击会不会迁移」,而是「攻击能不能在没有血缘关系的两个模型之间迁移」,而这个问题到今天也没被认真量过。

另一件事是这篇的威胁模型已经过期了,而它过期的方式,恰好是这个专栏最近一个月反复在写的东西。文章假设:权重固定、推理时、单轮、攻击者是一个人在输入框里打字。间接提示注入在全文里只占一个段落(Greshake 等 2023)。今天它是主线:载荷从工具返回值和外部文档里进来,上下文长到可以跨轮投毒,而模型手上握着能改生产环境的权限——第 27 篇那次打穿 Hugging Face 的越权、第 45 篇一个念头在 agent 之间连传 20 跳、第 54 篇 1200 个 agent 自己建论坛,都不是「用户输入了一段坏提示」这个模型装得下的。攻击面已经从提示词搬到了系统架构,而这篇讲的全部防守都还站在模型这一层。

不过它有一样东西没过期,就是那个鞍点框架:内层最大化好解,外层最小化难解。三年过去,内层被做出了几十种新花样,外层几乎原地没动——最好的预处理防线仍然只能把成功率从九成压到四成,对抗训练依然要拿能力去换。如果这个不对称在模型这一层解不掉,那正确的做法就不是继续加固模型,而是别让不可信的输入和高权限的动作待在同一个上下文里。这话听着像句工程常识,但第 46 篇和第 54 篇都证明了它有多难落实。最后值得说一句的是这篇文章的诚实:作者当时正在 OpenAI 负责这件事,全文没有一句「我们已经解决了」。
对抗攻击越狱红队提示注入开放权重
去读原文 本文是原创导读,不是原文翻译——真正的细节、证据和微妙之处都在原文里。 原文Lil'Log · Adversarial Attacks on LLMs(英文,约 33 分钟阅读)→

本文为 AKL AI Club 原创撰写的导读,不是原文翻译;著作权归原文作者所有。 篇目由编辑独立选取,来源均经人工核实。