摘要
基于Transformer的大型语言模型(LLMs)为大规模面向客户的应用中的自然语言任务提供了强大的基础。然而,探索它们因恶意用户交互而出现的脆弱性的研究却寥寥无几。通过提出PROMPTINJECT,一种基于掩码的迭代对抗性提示组合的平凡对齐框架,我们检验了GPT3------生产环境中部署最广泛的语言模型------如何能被简单的手工输入轻易误导。特别是,我们调查了两种攻击类型------目标劫持和提示泄露------并证明即使是能力较低,但足够恶意的代理,也能轻易利用GPT-3的随机性质,创造出长尾风险。PROMPTINJECT的代码可在http://github.com/agencyenterprise/PromptInject获取。
1 引言
在2020年,OpenAI推出了GPT-3 [3],这是一个大型语言模型(LLM),能够完成文本输入以产生类人结果。它的文本完成能力可以推广到其他自然语言处理(NLP)任务,如文本分类、问答和摘要。自那时起,GPT-3和其他LLMs------如BERT [5]、GPT-J [25]、T5 [22]和OPT [31]------通过在各种任务上取得最先进的结果,彻底改变了NLP领域。
创建GPT-3(和类似LLMs)应用程序的一种方法是设计一个提示,通过字符串替换[15]接收用户输入。例如,可以使用提示"Correct this to standard English: "{user_input}""来简单地构建一个语法修正工具,其中{user_input}是最终用户将提供的短语。一个非常简单的提示能够完成一个非常复杂的任务,这是非常了不起的。使用基于规则的策略构建类似的应用程序将困难得多(甚至不可行)。
然而,使用GPT-3轻松构建应用程序的同时也带来了代价:恶意用户可以轻易通过应用程序接口注入对抗性指令。由于GPT-3提示的结构化和开放式特点,保护应用程序免受这些攻击可能非常具有挑战性。我们将插入恶意文本以误导LLM的行为定义为提示注入。
提示注入最近在社交媒体上引起了关注,用户发布了通过提示注入误导GPT-3基于应用程序目标[8, 27, 28]的示例。然而,探索这一现象的研究仍然很少。在这项工作中,我们研究了LLMs如何通过提示注入被对手滥用。我们提出了两种攻击(图1)------目标劫持和提示泄露------并分析了它们的可行性 and 效果性。
我们将目标劫持定义为将提示的原始目标误导到打印目标短语的新目标的行为。我们展示了恶意用户可以轻松通过人为设计的提示注入执行目标劫持。
我们将提示泄露定义为将提示的原始目标误导到打印部分或全部原始提示的新目标的行为。恶意用户可以尝试执行提示泄露,以复制特定应用程序的提示,这可能是GPT-3基于应用程序最重要的部分。
我们的工作强调了研究提示注入攻击的重要性,并提供了影响因子的见解。我们相信我们的工作可以帮助社区更好地理解使用LLMs的安全风险,并设计出更好的LLM驱动的应用程序。我们的主要贡献如下:
- 我们研究了针对LLMs的提示注入攻击,并提出了一个探索此类攻击的框架。
- 我们调查了两种特定的攻击:目标劫持和提示泄露。
- 我们提供了我们工作的AI x-risk分析[9](附录A)。
2 相关工作
研究人员已经证明,LLMs能够产生有意和无意的有害行为。自从GPT-3推出以来,许多研究已经表明GPT-3会复制社会偏见,强化性别、种族和宗教刻板印象。[1, 3, 6, 26]。此外,LLMs可能会泄露训练期间使用的私人数据[4]。更进一步,恶意用户可以利用GPT-3快速大规模地生成恶意言论[13, 26]。
鉴于这个话题的重要性,许多论文专注于检测和减轻LLMs的有害行为:Gehman等人[7]研究了阻止LLMs中有毒行为的方法,并发现没有一种可靠的方法可以防止这种情况的发生。他们认为,更仔细地筛选预训练数据,包括终端用户的参与,可以减少未来模型中的毒性。
为了减轻有害行为并提高实用性,Ouyang等人[19]通过人类反馈对GPT-3进行了微调,使模型在遵循指令方面做得更好,同时提高了真实性并减少了有害和有毒行为。新模型是OpenAI API上可用的默认语言模型[11]。Xie等人[29]研究了使用两个开源库TextAttack [14]和OpenAttack [30]的方法对文本分类器的对抗性攻击。Branch等人[2]展示了简单的提示注入可以用来改变GPT-3和其他LLMs上分类任务的结果。在我们的工作中,我们展示了一种类似的攻击,但目标是误导模型输出恶意目标文本(目标劫持)或窃取原始提示(提示泄露),无论原始任务是什么。
3 PROMPTINJECT框架
我们提出PROMPTINJECT(图2),这是一个框架,它以模块化的方式组装提示,以提供LLM对对抗性提示攻击的鲁棒性的定量分析。
基础提示(表C1)由一个初始指令组成,复制了大多数语言模型应用常见的条件。这个指令可以通过由许多因素形成的万花筒式变化来测试:n次示例、用于指代用户或模型本身的标签[17, 24],甚至可以注入一个包含对提示敏感信息的更小的秘密子提示,例如对模型的特殊指令、禁止的主题和/或主题,或称为私有值的上下文增强器。
攻击提示(表C2)则通过采用攻击策略构建------目标劫持和提示泄露------这些策略可以分别假设存在一个恶意字符串------一种旨在使模型偏离轨道打印特定字符集的对抗性指令------或者一个私有值,该值嵌入在秘密中,无论如何都不应在外部透露。
此外,由于观察到语言模型对转义和限定字符表现出敏感性,攻击还可以通过一系列恶意字符来增强,以混淆模型。
考虑到不同模型设置输出结果的高变异性(表C3),我们的场景需要考虑诸如温度范围、top-p采样、频率和存在惩罚以及被提示的模型等因素。
附录C提供了对PROMPTINJECT构建块更详细的描述。
4 实验
我们通过使用PROMPTINJECT框架构建多个攻击提示来探索目标劫持和提示泄露。我们设计了各种因素的实验,并通过在OpenAI示例页面[16]收集的35个基础提示上运行它们来验证其有效性(表C4)。我们决定使用这些公共示例,因为开发者很可能会将它们作为应用程序的起点。值得注意的是,我们实验的目标不是穷尽式地搜索最佳提示攻击,而是要展示许多因素可能会影响攻击的有效性。
所有实验都使用text-davinci-002,这是目前公开可用的最强大的OpenAI模型,除非表B10中显示的结果。附录B包含了所有实验的结果,包括因素和攻击提示。
我们计算成功率(在表格中表示为%)为在表C4中指定的35个提示上的成功攻击百分比的平均值和标准偏差。为了得到平均值和标准偏差并增加结果的鲁棒性,我们每个实验重复了4次。这是由于GPT-3的随机性所必需的。例如,50 ± 1.0%的成功率意味着我们在35个提示上重复了4次实验,平均来说,一半的提示被成功攻击,标准偏差为1.0。
我们将目标劫持攻击定义为如果输出的字符串与目标字符串完全相同(忽略标点和换行符)则为成功。我们将提示泄露攻击定义为如果输出的字符串包含原始指令则为成功。我们的框架还实现了模糊匹配分数,以允许更多的灵活性,尽管在这些结果中我们尚未探索它们。
5 结果与讨论
表1展示了目标劫持和提示泄露的总结结果。更详细的结果,包括攻击提示,请参见附录B。我们将主要发现总结如下:
F1 攻击提示影响成功率(表B2和表B11)。
F2 限定符显著提高了攻击效果,但限定符类型、长度和重复次数的影响尚不明确(表B3、B4、B5)。
F3 温度影响攻击,但top-p和频率/存在惩罚则不会(表B7)。
F4 更有害的流氓字符串抑制了攻击(表B6)。
F5 停止序列阻碍了攻击(表B8)。
F6 在{user_input}之后带有文本的提示更难被攻击(表B9)。
F7 提示泄露比目标劫持更难(表B6和表B11)。
F8 text-davinci-002是目前最容易受到攻击的模型(表B10)。
虽然我们的目标不是找到最佳攻击提示,但我们实现了目标劫持58.6% ± 1.6%的成功率和提示泄露23.6% ± 2.7%的成功率。值得注意的是,几个因素影响了攻击的有效性:攻击提示中的小变化,比如使用print而不是say,并添加单词instead,都能提高攻击效果(F1)。使用限定符在指令之间添加清晰的分隔特别有效(F2)。有趣的是,流氓字符串越有害,攻击效果越差,这可能是Ouyang等人[19]对齐努力的后果(F4)。
不幸的是,GPT-3驱动的应用程序设计师只有少数机制可以抑制攻击,最有效的方法与限制模型遵循其原始目标有关:使用停止序列以避免不必要的更多文本(F5),在用户输入后带有文本(F6),定义最大输出令牌数,以及后处理模型结果(例如,通过审查输出[12])。
在比较OpenAI API上公开可用的模型时,最强大的模型text-davinci-002也是最脆弱的模型(F8),这表明存在逆尺度现象。text-davinci-002是理解指令和提示意图的最佳模型[18],但这也使得它更容易遵循注入的指令。较弱的模型通常缺乏捕捉原始任务中整个意图的能力,因此它们也未能遵循明确的恶意指令并不奇怪。
提示泄露比目标劫持明显更具挑战性(F7),但攻击提示的微小调整可能会提高泄露效果。例如,使用拼写检查作为代理任务而不是要求模型打印原始提示,攻击成功率要高得多(12.1 ± 1.4 vs. 2.9 ± 0.0)。此外,在攻击提示中添加单词instead将成功率提高到了23.6 ± 2.7(表B11)。我们相信,针对特定基础提示的更有针对性的攻击可以进一步改善这些数字。
尽管通过一些调整可以减少这个问题,但没有保证它不会发生。事实上,完全预防这些攻击可能是几乎不可能的,至少在当前开放式大型语言模型的风格下。也许一个解决方案是使用内容审查模型来监督LLMs的输出(类似于Markov等人[12]提出的模型,作为OpenAI端点API提供)。另一种可能的方法是修改LLMs以接受两个参数------指令(安全)和数据(不安全)------并避免遵循来自不安全数据参数的任何指令[27]。
尽管这些攻击的解决方案仍然是一个开放性问题,但我们的发现表明防御它们有多么困难,并强调了需要进一步研究和讨论这个主题。我们希望我们的框架能够支持研究人员回答这些问题,并最终减少我们在附录A中讨论的AI风险。
6 未来工作
由于提示注入是最近的一个主题,因此对未来工作的想法很多。一些例子是:探索自动搜索更有效的恶意指令的方法[21];使用更多模型测试注射技术,如BLOOM、GPT-J[25]和OPT [31];探索其他因素和新的攻击;进一步审查预防攻击的方法;探索GPT-3编辑和插入模型。我们发布了PROMPTINJECT的代码,旨在促进社区未来的研究,并欢迎任何研究人员扩展本文中提出的工作,希望最终这将导致在产品应用中更安全、更健壮地使用语言模型。