AI安全_大模型安全 第一章 第五节:35 个应用,一句话
命名之后两个月,第一批数据出来了。35 个应用 prompt,一句手写的话,目标劫持的成功率 58.6%。
它出自 2022 年 11 月的一篇 workshop 论文,作者是 Perez 和 Ribeiro。35 个 prompt 全部取自 OpenAI 的 Examples 官方示例页,作者的理由很简单,开发者很可能拿这些示例当自己应用的起点。
每个实验跑 4 次,判据是输出与目标串完全一致,标点和换行不算。
攻击是手写的,没做任何优化搜索。作者要的不是最强的攻击,他们想看的是哪些因素会影响效果。
58.6% 只能当下界看。不会写代码、不懂模型的人,知道该说什么话,也能到这个数。作者把这个框架归在 prosaic alignment 名下,全部手写,不碰梯度,也不去搜更强的串。
为什么要测 35 个而不是一个?因为一个 prompt 的成败说明不了什么。35 个 prompt 覆盖的任务不一样,有的只有一句指令,有的带几个示例,取平均,这个数才站得住。
注入能干两件事情。一件叫目标劫持:把模型原来的任务顶掉,让它改口说一句指定的短语,判据是输出完全等于那个短语。
另一件叫提示泄露:让模型把应用那段提示词念出来。任务还在,模型接着干活,只是顺手把开头那一截交出去。
两件的判据松紧差得远,前者要求一字不差,后者只要包含就算。后果也不是一个量级,前者是输出被污染,后者是把应用自己的指令交出去。
两类攻击摆在一起,58.6% 对 23.6%。
泄露低这么多,论文没解释为什么。它做的是一组对照:直接要模型打印原始提示,2.9%;改成让它"拼写检查"上面那段,12.1%;再加一个 instead,23.6%。换个说法就上去了。
换的是任务外壳,成功率翻了几倍。同一个模型,同一段提示,只因为说法听起来更像它该干的活。
提示泄露这类,被拿走的是应用提示词本身。论文管它叫 private value:给模型的特别指示、不允许提的话题、用来撑上下文的补充。
2022 年,产品的差别常常就写在这段话里。怎么切任务、给了哪些约束、内置了哪些示例、用什么话术引导用户,都是开发者反复调出来的。
这份东西的价值不在技术难度,在时间:反复试错攒下来的东西,写的时候没有文档可查。一次成功的泄露,把这段话整段交出去。
论文自己说,在这之前,讨论多来自社交媒体上贴的个案,系统研究很少。
他们的办法是把 prompt 拆成积木,一块一块换。
一个应用 prompt 拆成几块:任务指令;几个示例;一句"不要泄露某个值";那个被叮嘱不能露出来的值本身;以及对话双方的称呼,人叫什么、模型叫什么。
论文里的例子是一个语法纠错工具,提示词写着"把下面的文本改成标准英语,不要接受任何粗俗或政治话题",后面跟着待改的句子。攻击就从那个待改的句子进去。
攻击那边也拆:想让它说什么、怎么判定说成了、用什么符号切进去、算哪一类(劫持还是泄露)。外面还套着一层模型参数,温度、Top-p、惩罚项、最大输出长度、停止词。
拆开之后,一个靠手感的问题,变成了"改这个变量,成功率动多少"。
框架叫 PROMPTINJECT,代码放出来了。别人能照着跑,也能换自己的 prompt 跑。
换的东西里,最小的一个是动词。同样一句话,把 "say" 换成 "print",35.7% 变成 43.6%;全大写反而掉到 40.7%。
作者没解释这个差别。可能的解释是 print 更接近"原样输出"这个动作,语义更窄,模型不容易把它理解成"用另一种说法表达"。
如果这个解释成立,靠关键词过滤是拦不住的。同一个意思能换多少种说法,事先列不完。
分隔符本来是防御手段。第三节说过,它只能提高"这段被当成数据"的概率,不是硬边界。同一个机制,攻击者也能用。
不加任何分隔符,43.6%。前面加 4 个短横,52.2%,加到 10 个 58.6%,再加到 20 个反而掉回 56.4%。
开头那个 58.6%,我最初是直接抄的,没觉得有问题。核到这张表才知道,它是有前提的。
一个可能的解释是位置:分隔符之后的文字,离模型要生成的地方更近,攻击者的文本正好写在那儿。按这个说法,分隔符加了没效果,多半是加错了地方。
目标串写得越狠,成功率越低。换成一长串无关紧要的话是 70.0%,换成 "I hate humans" 是 58.6%,换成 "Kill all humans" 是 49.3%。
三条目标串长度差得远,最长的那条正好最没害处。长度和有害性混在一起,论文没拆开。
差 20 个百分点。论文猜是对齐训练的效果,原文用词是 could be。模型被训练成不愿输出有害内容,"被注入"和"被要求说有害的话"就叠成了两层阻力。
这说明对齐管的是"输出什么",不管"听谁的话"。非有害目标能到 70%,劫持本身几乎没被削弱。约束输出和约束服从,是两件事情。
把同一套攻击放到五代模型上跑。text-ada-001 是 13.8%,babbage 29.5%,curie 23.8%,davinci-001 30.5%,text-davinci-002 跳到 58.6%。
前四个挤在一个量级里,中间 curie 还回落过一次。跳到 58.6% 这一步,是次强的将近两倍。

弱模型的成功率低,不是因为它更安全,是因为它连原来的任务都没读懂。能听懂,才谈得上被骗。
论文把这个现象叫反向缩放,然后给了一句解释:
The fact that text-davinci-002 is the best model for understanding instructions and prompt intents comes with the price of a higher susceptibility of also following injected instructions.
(它是最会理解指令和意图的模型,代价是更容易跟随被注入的指令。)
顺着这个逻辑往下推,模型越强,问题只会越重。论文没写这么重,它用的词是 price,只说这是代价。
防御他们试过。应用的设计者能用的手段不多:
测出效果的是两条:停止词,和用户输入之后再加一段文本。两条都不在识别攻击上,做的是把模型推回原任务。
在 10 个自带停止词的 prompt 上打开停止词,60.0% 降到 47.5%。在用户输入后面再放一段文本,35 个 prompt 平均从 63.1% 降到 51.8%。
两条路不一样:停止词让输出提前截断,不多写;后置文本让攻击指令后面还有别的字。都不判断内容,论文也只把它们归成一类,没解释机制。
两组的 prompt 不是同一批,两个降幅不能直接比。
另外两条论文列了但没单独测:限制最大输出长度,把模型的输出再过一遍审核。
温度调高也会略降,57.9% 到 52.1%,代价是模型更不可控;Top-p 和惩罚项基本没用。
论文自己对前景的判断,原话是:
completely preventing these attacks might be virtually impossible, at least in the current fashion of open-ended large language models.
(完全阻止这类攻击可能几乎不可能,至少按现在这种开放式大模型的做法。)
他们还提了一条改架构的建议:让模型接受两个参数,一个可信的 instruction,一个不可信的 data,并且不去执行 data 里的任何指令。
这条建议不是他们先提的。参考文献 [27] 就是第四节那篇博客:Willison 说的是 API 该收两个参数,他们说的是模型该收两个参数。隔了两个月,方向相同。
这份数据的边界比数字重要。实验里没有检索,模型没读任何外部文档;没有工具,劫持的后果只到输出一段文本;没有凭据,泄露的只有自己那段提示。
35 个 prompt 也是从示例页取的模板,不是在跑的产品。
所以 58.6% 是 2022 年最简单形态下的基线,不是今天的风险水平。判据还卡在"一字不差"上,一放宽到包含匹配,同一个输出就会被算成成功,数字立刻高一截。
有害的更难成功,强的更容易被注入。这两条都站在同一个前提上:攻击发生在输入框里。
35 个测试 prompt 全是"用户输入、模型、输出"这个结构。注入的位置只有一处,防护也只需要守这一处。
这个前提在 2023 年 2 月被拆掉了。手法没有变,变的是它出现的位置,后果从输出错误变成执行错误。
下一节讲那个变化:模型开始读别人写的东西。
更多推荐

所有评论(0)