总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328
AutoDAN: Generating Stealthy Jailbreak Prompts on Aligned Large Language Models
https://arxiv.org/pdf/2310.04451
https://www.doubao.com/chat/3992899011569410
[论文总结] AutoDAN: Generating Stealthy Jailbreak Prompts on Aligned Large Language Models
速览
这篇论文名为“AUTODAN: GENERATING STEALTHY JAILBREAK PROMPTS ON ALIGNED LARGE LANGUAGE MODELS”,主要研究大语言模型(LLMs)的越狱攻击问题,提出了一种名为AutoDAN的新方法,能自动生成隐蔽的越狱提示,具体内容如下:
- 研究背景:随着大语言模型被广泛应用,人们为其添加了安全功能,防止产生有害或不当回复。但越狱攻击出现了,它能让模型绕过安全机制,生成有害内容。现有越狱攻击方法存在局限性,手动编写的方法可扩展性差,基于学习的方法生成的提示语义无意义,易被检测。所以,研究人员想找到一种能自动生成隐蔽越狱提示的方法。
- 研究方法
- 威胁模型和公式化:越狱攻击旨在让模型对恶意问题给出答案,而不是拒绝。研究人员将攻击目标设定为让模型生成特定开头的回复,并通过条件概率来表示攻击损失函数,以此优化越狱提示。
- 遗传算法和分层遗传算法:遗传算法是受自然选择启发的优化算法。AutoDAN利用遗传算法,通过种群初始化、适应度评估、遗传策略和终止条件这几个步骤来生成越狱提示。其中,种群初始化借助大语言模型修改手工制作的提示,保证多样性;适应度评估采用对数似然函数计算损失;遗传策略包括交叉和变异操作,分层遗传算法(AutoDAN-HGA)还利用了文本数据的层次结构,在句子和段落层面分别进行操作;终止条件结合了最大迭代次数和拒绝信号测试。
- 实验评估
- 实验设置:使用AdvBench Harmful Behaviors数据集,选择GCG攻击作为基线方法,用基于关键字的攻击成功率、GPT重新检查攻击成功率和句子困惑度作为评估指标,对多个开源和商业大语言模型进行测试。
- 实验结果:AutoDAN生成的越狱提示攻击成功率更高,且困惑度低,说明其更隐蔽。在对抗基于困惑度的防御时,AutoDAN能有效绕过,而GCG攻击效果大幅下降。同时,AutoDAN在跨模型转移性和跨样本通用性上表现出色。通过消融实验发现,AutoDAN中各个模块都对性能有提升作用。
- 研究局限和结论:AutoDAN的局限性在于计算成本较高,在某些具有强大系统提示的模型(如Llama2)上表现不佳。但总体来说,该方法在大多数当前大语言模型上表现良好。研究人员希望此研究能引起对大语言模型安全问题的关注,推动更强的防御和更严格的安全设计的发展。
第三章主要介绍了针对大语言模型(LLMs)越狱攻击的AutoDAN方法,包括威胁模型、算法流程和相关设置,具体如下:
- 输入数据:包含恶意问题集合(Q)和相应的越狱提示集合(J),将两者组合形成输入集 T T T ,即 T = { T i = < J i , Q i > } i = 1 , 2 , . . . , n T = \{T_{i}=<J_{i}, Q_{i}> \}_{i = 1,2, ..., n} T={Ti=<Ji,Qi>}i=1,2,...,n,这个 T T T就是输入给LLMs的数据。
- 中间处理过程
- 种群初始化:以手工制作的越狱提示为基础,借助大语言模型对其进行修改。这样做既能保留原始提示的基本特征,又能让初始种群具有多样性,为后续的算法优化提供良好的起点。
- 适应度评估:根据设定的目标,计算每个个体(即不同的越狱提示)的适应度。具体来说,就是看生成的提示能在多大程度上让模型按照攻击者的期望回答问题,越符合期望,适应度越高。
- 遗传策略:采用分层遗传算法(AutoDAN-HGA)。在段落层面,先根据适应度选择一些优秀的提示直接进入下一代,然后用一种基于分数的选择方法挑选其他提示进行交叉和变异操作。交叉就是交换不同提示中的句子,变异则借助大语言模型修改提示,以此产生新的提示。在句子层面,计算每个单词的重要性分数,考虑到分数可能不稳定,还引入了动量机制。根据分数选择部分单词,用同义词替换其他提示中的相应单词,进一步优化提示。
- 终止条件判断:持续上述操作,直到满足一定条件。条件一是达到最大迭代次数;条件二是模型的回答中没有出现预设的拒绝关键词。一旦满足条件,就停止算法。
- 输出结果:算法停止时,输出当前适应度最高的越狱提示,这个提示就是AutoDAN最终生成的、被认为最有可能成功让模型绕过安全机制,对恶意问题给出相应回答的提示。
论文阅读
方法
论文中的Figure 1展示了研究方法AutoDAN的核心要点和在Llama2模型上的实验结果对比,具体如下:
- 图1(a):AutoDAN方法概述
- 攻击原理:在大语言模型(LLM)中,存在一种攻击手段叫越狱攻击。正常情况下,模型会拒绝回答恶意问题,但通过添加特殊的越狱提示,模型可能会被误导给出有害答案。例如,让模型写一篇宣扬厌食或暴食是健康生活方式的博客文章,正常时模型会拒绝,而加上越狱提示后,可能就会给出相应内容。
- AutoDAN的运作方式:AutoDAN是一种针对对齐大语言模型的新型越狱攻击方法。它通过精心设计的分层遗传算法来自动生成隐蔽的越狱提示。在图中可以看到,首先有一个初始化步骤,利用原型提示进行适应度评估,然后采用分层遗传策略,包括在不同层次上对提示进行优化,比如对句子和单词分别进行操作,同时还有基于大语言模型的变异操作。这种方式能让生成的越狱提示既保持语义上的合理性,又能有效地绕过模型的安全机制。
- 图1(b):在Llama2模型上的结果
- 对比方法:这里将AutoDAN与之前的一种开创性工作(Zou等人在2023年提出的方法,简称GCG攻击)进行对比。GCG攻击虽然能利用梯度信息自动生成越狱提示,但生成的提示往往是无意义的字符串。
- 实验结果:从图中可以看出,GCG攻击生成的提示很容易被简单的困惑度防御机制识别和抵御,导致攻击成功率下降。而AutoDAN生成的提示则不同,它可以有效绕过这种防御,并且在攻击Llama2模型时,能够成功地让模型给出符合攻击者意图的回答,展现出了更好的攻击效果和隐蔽性。
2.1基本定义
威胁模型
越狱攻击与LLM的对齐方法密切相关。此类攻击的主要目标是破坏LLM的人为对齐值或模型开发人员施加的其他约束,迫使他们用正确答案回答对手提出的恶意问题,而不是拒绝回答。考虑一组恶意问题,表示为
Q
=
{
Q
1
,
Q
2
,
.
.
.
,
Q
n
}
Q = \{Q_{1},Q_{2},...,Q_{n}\}
Q={Q1,Q2,...,Qn},对手使用越狱提示来阐述这些问题,表示为
J
=
{
J
1
,
J
2
,
.
.
.
,
J
n
}
J = \{J_{1},J_{2},...,J_{n}\}
J={J1,J2,...,Jn},从而产生组合输入集
T
=
{
T
i
=
<
J
i
,
Q
i
>
}
i
=
1
,
2
,
.
.
.
,
n
T = \{T_{i}=<J_{i},Q_{i}>\}_{i = 1,2,...,n}
T={Ti=<Ji,Qi>}i=1,2,...,n。当输入集
T
T
T呈现给受害者LLM
M
M
M时,模型会产生一组响应
R
=
{
R
1
,
R
2
,
.
.
.
,
R
n
}
R = \{R_{1},R_{2},...,R_{n}\}
R={R1,R2,...,Rn} 。越狱攻击的目的是确保
R
R
R中的响应主要是与
Q
Q
Q中的恶意问题密切相关的答案,而不是符合人类价值观的拒绝信息。
补充说明
- “对手使用越狱提示来阐述这些问题”:大语言模型(LLM)通常会遵循人类设定的规则和价值观,拒绝回答恶意或有害的问题。但攻击者(对手)为了让模型回答恶意问题,会精心构造一些特殊的文本内容,也就是“越狱提示”。这些提示就像是“魔法咒语”,试图绕过模型的安全机制和规则限制,让模型误以为回答恶意问题是合理的,进而阐述并回答这些原本不应该回答的问题 。例如,正常情况下模型不会回答“如何制造炸弹”,但添加特定越狱提示后,可能就会给出相关内容。
- “从而产生组合输入集”:这里的组合输入集是把恶意问题和对应的越狱提示组合起来形成的集合。恶意问题 Q Q Q是攻击者真正想问的有害或不当问题,越狱提示 J J J是用来诱导模型回答的特殊文本。将每一个恶意问题 Q i Q_{i} Qi和对应的越狱提示 J i J_{i} Ji组合在一起,就形成了一个组合输入 T i = < J i , Q i > T_{i}=<J_{i},Q_{i}> Ti=<Ji,Qi> ,多个这样的组合输入集合起来,就构成了组合输入集 T T T 。这个集合是攻击者向大语言模型发起越狱攻击时输入给模型的数据,期望模型基于此给出符合恶意问题意图的回答。
这里的 < J i , Q i > <J_{i},Q_{i}> <Ji,Qi> 是一种表示方式,用来体现把越狱提示 J i J_{i} Ji和恶意问题 Q i Q_{i} Qi 组合到一起。可以简单理解为把这两个元素打包成一个整体 ,形成一个新的输入单元 T i T_{i} Ti 。在大语言模型的越狱攻击场景中,就是将特定的诱导提示(越狱提示)和想要模型违规回答的问题,捆绑起来作为一个整体内容,输入给模型,以尝试实现攻击目的 。 它强调的是两者的配对组合关系,以便后续作为一个整体去考察模型的响应。
公式化表述
直观地讲,为单个恶意问题的回答设定一个具体目标是不切实际的,因为为给定的恶意查询确定合适的答案具有挑战性,并且可能会损害对其他问题的普遍性。因此,一个常见的解决方案是将目标响应指定为肯定的,例如以“Sure, here is how to [Qi].”开头的答案。通过将目标响应锚定到具有一致开头的文本,就可以用条件概率来表达用于优化的攻击损失函数。
在此上下文中,给定一个标记序列 < x 1 , x 2 , . . . , x m > < x_{1},x_{2},...,x_{m}> <x1,x2,...,xm>,LLM估计下一个标记 x m + 1 x_{m + 1} xm+1在词汇表中的概率分布:
x
m
+
j
∼
P
(
⋅
∣
x
1
,
x
2
,
.
.
.
,
x
m
+
j
−
1
)
,
for
j
=
1
,
2
,
.
.
.
,
k
.
(
1
)
x_{m + j} \sim P(\cdot | x_{1},x_{2},...,x_{m + j - 1}), \quad \text{for } j = 1,2,...,k. \quad (1)
xm+j∼P(⋅∣x1,x2,...,xm+j−1),for j=1,2,...,k.(1)
越狱攻击的目标是促使模型产生以特定单词开头的输出(例如“Sure, here is how to [Qi].”),即表示为
<
r
m
+
1
,
r
m
+
2
,
.
.
.
,
r
m
+
k
>
< r_{m + 1},r_{m + 2},...,r_{m + k}>
<rm+1,rm+2,...,rm+k>的标记。给定输入
T
i
=
<
J
i
,
Q
i
>
T_{i}=< J_{i},Q_{i}>
Ti=<Ji,Qi>,其标记等于
<
t
1
,
t
2
,
.
.
.
,
t
m
>
< t_{1},t_{2},...,t_{m}>
<t1,t2,...,tm>,我们的目标是优化越狱提示
J
i
J_{i}
Ji以影响输入标记,从而最大化概率:
P ( r m + 1 , r m + 2 , . . . , r m + k ∣ t 1 , t 2 , . . . , t m ) = ∏ j = 1 k P ( r m + j ∣ t 1 , t 2 , . . . , t m , r m + 1 , . . . , r m + j ) ( 2 ) \begin{align} P(r_{m + 1},r_{m + 2},...,r_{m + k} | t_{1},t_{2},...,t_{m}) &= \prod_{j = 1}^{k}P(r_{m + j} | t_{1},t_{2},...,t_{m},r_{m + 1},...,r_{m + j}) \end{align} \quad (2) P(rm+1,rm+2,...,rm+k∣t1,t2,...,tm)=j=1∏kP(rm+j∣t1,t2,...,tm,rm+1,...,rm+j)(2)
遗传算法
遗传算法 (GA) 是一类受自然选择过程启发的进化算法。这些算法用作模拟自然进化过程的优化和搜索技术。GA 从候选解决方案的初始种群(即种群初始化)开始。根据适应度评估,该种群会根据特定的遗传策略(例如交叉和突变)进行进化。当满足终止标准时,算法结束,终止标准可以是达到指定的代数或达到所需的适应度阈值。GA 可以抽象为:
算法1 遗传算法
- 用随机候选解初始化种群(3.2节)
- 评估种群中每个个体的适应度(3.3节)
- 当终止条件未满足时(3.5节),执行以下操作:
- 采用遗传策略产生后代(3.4节)
- 评估后代的适应度(3.3节)
- 选择个体进入下一代
- 结束循环
- 返回找到的最佳解
遗传算法是一种受生物进化启发的优化算法,模拟了自然选择和遗传的过程,用于寻找最优解。
- 初始化种群:算法开始时,创建一组随机的候选解,这些候选解就像一个“种群”,每个候选解类似种群中的“个体” 。这些个体代表了对问题可能的解答。
- 评估适应度:通过特定的评估方法,衡量每个个体在解决问题上的表现,也就是适应度。适应度高的个体更接近问题的最优解。
- 循环迭代
- 产生后代:在每一代中,通过遗传策略(如交叉、变异等,类似生物的基因交换和突变),从当前种群的个体中产生新的个体,即后代。
- 评估后代适应度:对新产生的后代个体,同样评估其适应度。
- 选择个体进入下一代:根据适应度,从当前种群和后代中选择部分个体,组成下一代种群,让更优秀的个体有更大机会继续进化。
- 终止与输出:不断重复上述过程,直到满足预先设定的终止条件(比如达到最大迭代次数、找到足够好的解等) ,此时算法停止,输出找到的最优个体,也就是最佳解。
2.2 种群初始化
初始化策略在遗传算法中起着关键作用,因为它可以显著影响算法的收敛速度和最终解决方案的质量。要为 AutoDAN 设计有效的初始化策略,应该牢记两个关键考虑因素:
原型手工越狱提示已经在特定场景中证明了其有效性,使其成为宝贵的基础。因此,必须不要偏离它太远;
确保初始种群的多样性至关重要,因为它可以防止过早收敛到次优解决方案并促进对解决方案空间的更广泛探索。
为了保留原型手工越狱提示的基本特征并促进多样化,本论文使用 LLM 作为负责修改原型提示的代理,如下所示。该方案背后的原理是 LLM 提出的修改可以保留原始句子固有的逻辑流程和含义,同时引入单词选择和句子结构的多样性。在本文中,使用 Openai 的 GPT-4 API 进行 LLM 的多样化。
2.3适应度评估
由于越狱攻击的目标可以用公式2来表示,则可以直接使用计算该似然度的函数来评估遗传算法中的个体适应度。这里采用对数似然作为损失函数,即给定一个特定的越狱提示 J i J_{i} Ji,损失可以通过以下公式计算:
L
J
i
=
−
log
(
P
(
r
m
+
1
,
r
m
+
2
,
.
.
.
,
r
m
+
k
∣
t
1
,
t
2
,
.
.
.
,
t
m
)
)
(
3
)
\mathcal{L}_{J_{i}} = -\log(P(r_{m + 1},r_{m + 2},...,r_{m + k} | t_{1},t_{2},...,t_{m})) \quad (3)
LJi=−log(P(rm+1,rm+2,...,rm+k∣t1,t2,...,tm))(3)
为了与旨在寻找适应度更高的个体的遗传算法的经典设置保持一致,将
J
i
J_{i}
Ji的适应度得分定义为
S
J
i
=
−
L
J
i
\mathcal{S}_{J_{i}} = -\mathcal{L}_{J_{i}}
SJi=−LJi。
L J i = − log ( P ( r m + 1 , r m + 2 , . . . , r m + k ∣ t 1 , t 2 , . . . , t m ) ) \mathcal{L}_{J_{i}} = -\log(P(r_{m + 1},r_{m + 2},...,r_{m + k} | t_{1},t_{2},...,t_{m})) LJi=−log(P(rm+1,rm+2,...,rm+k∣t1,t2,...,tm))
- 背景:在越狱攻击场景中,我们希望大语言模型按照攻击者期望的方式回答恶意问题。这里涉及到给定输入(包含越狱提示 J i J_{i} Ji和恶意问题相关标记 t 1 , t 2 , . . . , t m t_{1},t_{2},...,t_{m} t1,t2,...,tm )后,模型输出特定开头(由 r m + 1 , r m + 2 , . . . , r m + k r_{m + 1},r_{m + 2},...,r_{m + k} rm+1,rm+2,...,rm+k 这些标记组成)内容的概率。
- 各部分含义
- P ( r m + 1 , r m + 2 , . . . , r m + k ∣ t 1 , t 2 , . . . , t m ) P(r_{m + 1},r_{m + 2},...,r_{m + k} | t_{1},t_{2},...,t_{m}) P(rm+1,rm+2,...,rm+k∣t1,t2,...,tm) :这是一个条件概率,表示在给定输入标记 t 1 , t 2 , . . . , t m t_{1},t_{2},...,t_{m} t1,t2,...,tm (来自越狱提示 J i J_{i} Ji和恶意问题)的情况下,模型输出标记 r m + 1 , r m + 2 , . . . , r m + k r_{m + 1},r_{m + 2},...,r_{m + k} rm+1,rm+2,...,rm+k (即我们期望的特定开头内容)的概率。概率越大,说明模型越有可能按我们期望的方式回答。
- log \log log :对数运算,在这里取对数是为了将概率值进行一种变换,让后续计算和分析更方便。
- 前面的负号“ − - −” :因为概率值 P P P的范围是 0 0 0到 1 1 1 ,取对数后是负数,加负号是为了让得到的 L J i \mathcal{L}_{J_{i}} LJi值是正数,这个 L J i \mathcal{L}_{J_{i}} LJi就是损失值。损失值越小,说明模型按期望输出的概率越高,也就意味着当前的越狱提示 J i J_{i} Ji效果越好。
S J i = − L J i \mathcal{S}_{J_{i}} = -\mathcal{L}_{J_{i}} SJi=−LJi
- 含义: S J i \mathcal{S}_{J_{i}} SJi 是适应度得分。在遗传算法里,我们通常希望找到适应度高的个体(这里就是好的越狱提示 J i J_{i} Ji )。前面算出的 L J i \mathcal{L}_{J_{i}} LJi 是损失值,损失值越小越好,为了符合习惯上“数值越大表示越好(适应度越高)”的设定 ,就给损失值 L J i \mathcal{L}_{J_{i}} LJi 取个负号,得到适应度得分 S J i \mathcal{S}_{J_{i}} SJi 。这样一来, S J i \mathcal{S}_{J_{i}} SJi 数值越大,就代表对应的越狱提示 J i J_{i} Ji 越能让模型按攻击者期望的方式回答问题,也就是适应度越高。
2.4 遗传策略
2.4.1 AutoDAN-GA
基于初始化方案和适应度评估函数,我们可以进一步设计遗传策略来进行优化。遗传策略的核心是设计交叉和变异函数。通过使用基本的多点交叉方案作为遗传策略,因此可以得到第一个版本的遗传算法,即 AutoDAN-GA,具体如下所示:
Algorithm 10:AutoDAN - GA算法讲解
这是一种用于生成越狱提示的遗传算法,以下是对其步骤的详细讲解:
- 输入(步骤1)
- 原型越狱提示 J p J_{p} Jp:作为算法的起始提示,是生成有效越狱提示的基础。
- 关键词列表 L r e f u s e L_{refuse} Lrefuse:包含模型可能用于拒绝回答的关键词,算法会监测模型回复中是否出现这些词,以此判断攻击是否成功绕过模型的防御机制。
- 超参数:预先设定的一些参数,用于控制算法的运行过程,如种群大小、迭代次数等。
- 种群初始化(步骤2)
利用算法5中基于大语言模型(LLM)的多样化方法来初始化种群。这一步会生成一组初始的越狱提示个体,这些个体具有一定的多样性,为后续的进化操作提供基础。 - 循环迭代(步骤3 - 7)
- 终止条件判断(步骤3):只要模型的响应中包含 L r e f u s e L_{refuse} Lrefuse 里的关键词(意味着模型拒绝回答,攻击未成功),并且迭代次数未达到上限,就继续循环。
- 适应度评估(步骤4):依据公式3计算种群中每个个体(即每个越狱提示)的适应度得分。适应度得分衡量了该提示使模型按照攻击者期望方式回答的能力,得分越高,提示效果越好。
- 选择精英和父代提示(步骤5):根据公式4从当前种群中挑选出表现优秀的精英提示,以及用于繁殖后代的父代提示。精英提示直接进入下一代,父代提示则用于产生新的提示个体。
- 交叉和变异操作(步骤6):按照算法7对父代提示进行交叉和变异操作。交叉是交换不同提示的部分内容,变异是对提示进行小的随机修改,通过这些操作产生新的提示个体,模拟生物进化中的遗传变异过程,期望得到更好的越狱提示。
- 输出(步骤8)
当循环结束(模型响应不再包含拒绝关键词或者达到最大迭代次数),返回适应度得分最高的最优越狱提示 J m a x J_{max} Jmax ,这个提示就是算法最终找到的、最有可能成功绕过模型防御机制,让模型按攻击者意图回答问题的提示。
2.4.2 AutoDAN-HGA
文本数据的一个显著特征是其层次结构。具体而言,文本中的段落通常表现出句子之间的逻辑流程,并且在每个句子中,单词选择决定了其含义。因此,如果我们将算法限制为越狱提示的段落级交叉,那实际上将搜索限制在单一层次级别,从而忽略了巨大的搜索空间。为了利用文本数据固有的层次结构,AutoDAN将越狱提示视为段落级种群的组合,即不同的句子组合,而这些句子又由句子级种群(例如不同的单词)组成。在每次搜索迭代期间,我们首先探索句子级种群的空间(例如单词选择),然后将句子级种群整合到段落级种群中,并开始在段落级空间(例如句子组合)上进行搜索。这种方法产生了一种分层遗传算法,即 AutoDAN-HGA。(笔者注:句子级种群应该是包含段落级种群的,这里应该视为一种搜索空间压缩)
文本数据的层次结构特点 文本不是简单的字符堆砌,它有层次。段落里句子是按逻辑顺序排列的,比如先陈述观点,再举例说明。而句子又由单词构成,单词不同,句子意思就不一样。比如“我喜欢苹果”和“我讨厌苹果”,就因“喜欢”和“讨厌”这两个单词意思不同,句子表意完全相反
。单一层次搜索的局限 如果只用段落级交叉(比如只是把不同段落打乱组合)来生成越狱提示,就像只在大楼的一层里找东西,而忽略了其他楼层。这样搜索范围太窄,可能错过很多能成功绕过模型限制的提示组合方式,因为没考虑句子内部单词层面的变化可能性。
AutoDAN - HGA的做法
- 将越狱提示分层看待:AutoDAN把越狱提示看成是由不同层次的种群组成。段落级种群,就是不同句子的组合方式;句子级种群,就是组成句子的不同单词选择。打个比方,把越狱提示当成一篇文章,段落级种群决定文章里段落怎么排,句子级种群决定每个段落里具体用词。
- 搜索过程:在搜索迭代时(就像一次次尝试找最佳的越狱提示),先在句子级种群这个空间探索,也就是尝试不同的单词组合,找到合适的句子。然后把这些句子整合到段落级种群里,再去探索不同句子怎么组合成段落更好,也就是在段落级空间搜索。这样就像先在大楼每层房间里找东西,再到不同楼层之间找最佳布局,充分利用了文本数据层次结构的特点,通过分层搜索,扩大搜索范围,更有可能找到能成功让大语言模型“越狱”(绕过限制给出攻击者想要答案
)的提示,这就是分层遗传算法AutoDAN - HGA 。
段落级别:选择、交叉和变异
给定由算法5初始化的种群,AutoDAN将首先按照公式3评估种群中每个个体的适应度得分。适应度评估之后,下一步是选择进行交叉和变异的个体。假设我们有一个包含
N
N
N个提示的种群。给定精英率
α
\alpha
α,我们首先允许适应度得分最高的前
N
∗
α
N * \alpha
N∗α个提示直接进入下一次迭代而不进行任何修改,这确保适应度得分持续下降。然后,为了确定下一次迭代所需的剩余
N
−
N
∗
α
N - N * \alpha
N−N∗α个提示,我们首先使用一种基于提示得分选择提示的选择方法。具体而言,提示
J
i
J_{i}
Ji的选择概率由softmax确定:
P J i = e S J i ∑ j = 1 N − N ∗ α e S J i ( 4 ) P_{J_{i}} = \frac{e^{S_{J_{i}}}}{\sum_{j = 1}^{N - N * \alpha} e^{S_{J_{i}}}} \quad (4) PJi=∑j=1N−N∗αeSJieSJi(4)
经过选择过程后,我们将有 N − N ∗ α N - N * \alpha N−N∗α个“父提示”可供交叉和变异。然后,对于每个提示,我们以概率 p c r o s s o v e r p_{crossover} pcrossover与另一个父提示执行多点交叉。多点交叉方案可以概括为在多个断点处交换两个提示的句子。随后,交叉后的提示将以概率 p m u t a t i o n p_{mutation} pmutation进行变异。
这部分内容主要介绍了在AutoDAN算法里,段落级别进行选择、交叉和变异操作的过程。
假设我们要通过一种方法生成能够绕过语言模型安全限制的提示,就像设计一把能打开特定锁的万能钥匙。我们先使用算法5生成了一批提示,这些提示就像是一群候选人,我们要从他们当中选出最优秀的,再通过一些手段让他们变得更好。
步骤详解
评估适应度得分 一开始,我们有一个包含 N N N个提示的种群,每个提示都像是一个候选人。我们按照公式3来给每个候选人打分,这个分数就代表了这个提示在绕过语言模型安全限制这件事上的能力,分数越高能力越强。
选择精英提示 现在我们设定了一个精英率 α \alpha α,它就像是一个筛选比例。我们直接让得分最高的前 N ∗ α N * \alpha N∗α个提示进入下一轮,就好比让班级里成绩最好的那一部分同学直接进入下一轮比赛,而且他们不用做任何改变,这样可以保证整体的水平不会下降。
选择剩余提示 剩下还需要 N − N ∗ α N - N * \alpha N−N∗α个提示进入下一轮。我们用一种基于得分的方法来选择这些提示,具体用的是softmax公式。这个公式就像是一个投票机制,得分越高的提示被选中的概率就越大。就好像在选举中,大家更愿意把票投给能力强的候选人。比如有两个提示 J 1 J_1 J1和 J 2 J_2 J2, J 1 J_1 J1的得分高,那么 J 1 J_1 J1被选中进入下一轮的可能性就比 J 2 J_2 J2大。通过这个过程,我们就选出了$N
- N ∗ α N * \alpha N∗α个“父提示”。
多点交叉操作 选好“父提示”后,我们要对它们进行一些改变,让它们变得更优秀。对于每个“父提示”,我们有 p c r o s s o v e r p_{crossover} pcrossover的概率让它和另一个“父提示”进行多点交叉。这就像是让两个人交换身体的部分器官,只不过这里是在多个断点处交换两个提示里的句子。比如说,提示 A A A有三句话,提示 B B B也有三句话,我们在第一句和第二句之间、第二句和第三句之间这两个断点处进行交换,可能就得到了一个新的提示,它包含提示 A A A的第一句、提示 B B B的第二句和提示 A A A的第三句。
变异操作 经过交叉后的提示,还有 p m u t a t i o n p_{mutation} pmutation的概率会发生变异。变异就像是突然发生了基因突变,让提示产生一些小的变化。这种变化可能会让提示变得更好,也可能变得更差,但它增加了提示的多样性,让我们有更多机会找到能绕过语言模型安全限制的优秀提示。
通过不断重复这些选择、交叉和变异的步骤,我们就有可能找到最适合的提示,也就是那把能打开特定锁的万能钥匙。
这是一个交叉函数(Crossover Function)算法,主要用于在两个字符串(这里可理解为越狱提示相关文本)之间进行句子交换操作,模拟生物遗传中的交叉过程,生成新的字符串。下面是对算法各步骤的解释:
- 函数定义:
function CROSSOVER(str1, str2, num_points)
定义了一个名为CROSSOVER
的函数,接受三个参数:str1
和str2
是要进行交叉操作的两个字符串,num_points
表示计划进行交换的最大断点数量。 - 拆分句子
sentences1 ← split str1 into sentences
:将字符串str1
按句子拆分,得到一个句子列表sentences1
。sentences2 ← split str2 into sentences
:将字符串str2
按句子拆分,得到句子列表sentences2
。
- 确定交换相关参数
max_swaps ← min(length(sentences1), length(sentences2)) - 1
:计算最多能进行交换的次数,取两个句子列表长度的最小值减1。因为至少要保留一个句子不交换 。num_swaps ← min(num_points, max_swaps)
:确定实际进行交换的次数,取计划的断点数量num_points
和最多可交换次数max_swaps
中的较小值。swap_indices ← sorted random sample from range(1, max_swaps) of size num_swaps
:从1到max_swaps
的范围内随机选取num_swaps
个不重复的索引值,并按升序排序,这些索引将作为交换句子的断点位置。
- 初始化新字符串列表:
new_str1, new_str2 ← empty lists
初始化两个空列表new_str1
和new_str2
,用于存储交叉操作后的句子。last_swap ← 0
初始化变量last_swap
为0,用于记录上一次交换的位置。 - 循环交换句子
for each swap in swap_indices do
:遍历前面确定的交换索引列表。- 对于每个交换索引
swap
,通过随机选择决定交换方式:- 如果随机选择为真,
new_str1
添加sentences1
从last_swap
到swap
位置的句子,new_str2
添加sentences2
从last_swap
到swap
位置的句子。 - 如果随机选择为假,交换添加的句子来源,即
new_str1
添加sentences2
相应位置句子,new_str2
添加sentences1
相应位置句子。
- 如果随机选择为真,
- 每次交换后,
last_swap ← swap
更新last_swap
为当前交换索引。
- 处理剩余句子:交换完索引指定位置后,再次通过随机选择决定剩余句子添加方式,将
sentences1
和sentences2
从最后一次交换位置到末尾的句子按随机选择的方式分别添加到new_str1
和new_str2
。 - 返回结果:
return join new_str1 into a string, join new_str2 into a string
将两个新的句子列表分别连接成字符串并返回,得到交叉操作后的两个新字符串。
我们让算法 5 中引入的基于 LLM 的多样化也充当变异函数,因为它能够保留全局含义并引入多样性。我们在算法 7 中描述了上述过程。
对于 N − N ∗ α N - N * \alpha N−N∗α选定的数据,此函数返回 N − N ∗ α N - N * \alpha N−N∗α个后代。将这些后代与我们保留的精英样本相结合,我们将获得下一次迭代的总共 N N N个提示。
算法7是用于对选定数据执行交叉和变异操作的函数,目的是生成新的后代数据,模拟生物遗传进化过程以优化越狱提示等相关内容,以下是详细解释:
- 函数定义与初始化
function APPLY_CROSSOVER_AND_MUTATION(selected_data, *kwargs)
定义了名为APPLY_CROSSOVER_AND_MUTATION
的函数,接受参数selected_data
(选定的数据,可能是一组越狱提示等)和可变参数*kwargs
。offsprings ← []
初始化一个空列表offsprings
,用于存储生成的后代数据。- 交叉操作循环
for parent1, parent2 in selected_data and not yet picked do
遍历selected_data
中尚未配对的父代数据(parent1
和parent2
可理解为两个父代越狱提示)。if random value < p_{crossover} then
:生成一个随机值,若该随机值小于预设的交叉概率p_{crossover}
,则执行交叉操作:
child1, child2 ← CROSSOVER(parent1, parent2, num_points)
调用算法6中的CROSSOVER
函数,以parent1
和parent2
为输入,根据指定的断点数量num_points
,生成两个子代数据child1
和child2
。append child1 and child2 to offsprings
将生成的子代child1
和child2
添加到offsprings
列表中。- 若随机值不小于
p_{crossover}
,执行else
语句:append parent1 and parent2 to offsprings
,即不进行交叉操作,直接将父代parent1
和parent2
添加到offsprings
列表。- 变异操作循环
for i in Range(Len(offsprings)) do
遍历offsprings
列表中的每个元素(即子代数据)。if random value < p_{mutation} then
:生成一个随机值,若该随机值小于预设的变异概率p_{mutation}
,则执行变异操作:
offsprings[i] ← DIVERSIFICATION(offsprings[i], LLM)
调用DIVERSIFICATION
函数,以子代数据offsprings[i]
和大语言模型LLM
为输入,对offsprings[i]
进行变异操作,更新该子代数据。- 返回结果:
return offsprings
函数执行完毕,返回经过交叉和变异操作后生成的后代数据列表offsprings
,这些新数据将用于后续的迭代或评估过程。
句子级别:动量词评分
在句子级别,搜索空间主要围绕单词选择。在使用等式3中介绍的适应度分数对每个提示进行评分后,我们可以将适应度分数分配给相应提示中出现的每个单词。由于一个单词可以出现在多个提示中,我们将平均分数设置为最终指标,以量化每个单词在实现成功攻击中的重要性。为了进一步考虑优化过程中适应度分数的潜在不稳定性,作者在单词评分中加入了基于动量的设计,即根据当前迭代和上一次迭代中的分数平均值来决定单词的最终适应度分数。如算法8所述,在过滤掉一些常用词和专有名词(第4行)后,我们可以得到一个单词分数词典(第6行)。
单词评分基础
在句子层面,想找到更好的越狱提示,关键在于选择合适单词。用前面公式3算出每个提示的适应度分数后,把这个分数分摊到提示里的每个单词上。比如一个提示适应度分数是80分,里面有10个单词,那每个单词先初步认为有8分(实际不是简单平均,这里只是举例方便理解 )。但一个单词可能在不同提示里出现,所以最后用平均分数来确定这个单词的重要性得分,得分越高,说明这个单词在让模型成功“越狱”(绕过限制回答恶意问题 )这件事上可能越重要。
基于动量的设计
在不断优化找更好提示的过程中,适应度分数可能会变来变去不稳定。就像股票价格,一会儿高一会儿低。为了让单词评分更靠谱,引入基于动量的设计。不单纯看当前这一次迭代算出的单词分数,而是结合上一次迭代这个单词的分数,取平均值来确定最终分数。比如这次单词A分数是7分,上次是6分,那最终分数可能就是(7 + 6)÷ 2 = 6.5分。这样能让单词的评分更平滑、更稳定,避免因为某次分数波动大,就误判单词的重要性。
最终操作
通过算法8,把那些没啥用的常用词(像“的”“了”这种)和专有名词(像人名、地名 )过滤掉,因为它们对“越狱”攻击作用不大。然后把剩下单词和它们对应的分数整理起来,形成一个单词分数词典。这个词典就像一个工具,能帮我们后续挑选更合适的单词,组成更有效的越狱提示 。
从这本词典中,我们选择得分最高的
K
K
K 个单词来替换其他提示中的近义词,如算法 9 所述。
算法8主要用于构建动量词词典,其核心是根据个体(比如越狱提示)及其适应度分数,计算每个单词的分数,并结合动量设计更新单词分数,最终得到按分数排序的单词词典并返回前(K)个单词。以下是对该算法的详细解释:
函数定义与初始化
- 函数定义:
function CONSTRUCT_MOMENTUM_WORD_DICT(word_dict, individuals, score_list, K)
定义了一个名为CONSTRUCT_MOMENTUM_WORD_DICT
的函数,接受四个参数。其中word_dict
是已有的单词字典(可能记录了之前迭代中单词的分数 );individuals
是一组个体,比如一系列越狱提示文本;score_list
是与individuals
对应的适应度分数列表;K
是一个整数,用于指定最终返回单词词典中的单词数量。 - 初始化变量:
word_scores ← {}
初始化一个空字典word_scores
,用于临时存储每个单词对应的分数列表。
计算单词分数
- 遍历个体与分数:
for each individual, score in zip(individuals, score_list) do
同时遍历individuals
和score_list
,每次取出一个个体(如一个越狱提示)和对应的适应度分数。 - 过滤单词:
words ← words from individual not in filtered
从当前个体中提取出不在过滤列表filtered
中的单词。这里的过滤列表可能包含常用词、专有名词等对攻击效果影响不大的词。 - 记录单词分数:
for each word in words do
遍历提取出的每个单词,执行append score to word_scores[word]
,即将当前个体的适应度分数添加到word_scores
字典中对应单词的分数列表里。例如,若单词“attack”在当前个体中出现,就把该个体的分数添加到word_scores["attack"]
这个列表中。
结合动量更新单词分数
- 计算平均分数:
for each word, scores in word_scores do
遍历word_scores
字典中的每个单词及其对应的分数列表,执行avg_score ← average of scores
,计算该单词分数列表的平均分数。 - 结合动量更新:
- 如果单词在
word_dict
中已存在,执行word_dict[word] ← (word_dict[word] + avg_score)/2
。这一步体现了动量设计,将当前计算出的平均分数与之前记录在word_dict
中的分数取平均值,更新该单词在word_dict
中的分数。 - 如果单词不存在于
word_dict
中,执行word_dict[word] ← avg_score
,即直接将计算出的平均分数作为该单词在word_dict
中的初始分数。
- 如果单词在
排序与返回结果
- 排序单词字典:
sorted_word_dict ← word_dict sorted by values in descending order
按照单词分数从高到低对word_dict
进行排序,得到sorted_word_dict
。 - 返回结果:
return top K items of sorted_word_dict
返回排序后sorted_word_dict
中前(K)个单词及其分数,完成动量词词典的构建并输出。
算法9是一个用同义词替换单词的函数,主要作用是根据单词分数字典,对给定提示中的单词尝试用同义词替换,以优化越狱提示等相关文本,以下是对该算法的详细解释:
- 函数定义:
function REPLACE_WITH_SYNONYM(prompt, word_dict, *kwargs)
定义了名为REPLACE_WITH_SYNONYM
的函数,接受三个参数。prompt
是要进行单词替换操作的提示文本(比如越狱提示 );word_dict
是单词分数字典,记录了单词及其分数,以及可能包含的同义词信息;*kwargs
是可变参数,用于接收其他可能的输入。- 遍历提示中的单词:
for word in prompt do
逐个遍历提示prompt
中的单词。对于每个单词,执行以下操作:
-synonyms ← find synonym in word_dict
:在word_dict
中查找当前单词的同义词列表。例如,若当前单词是“good”,从字典中找到“excellent”“great”等同义词。
-word_scores ← scores of synonyms from word_dict
:从word_dict
中获取这些同义词对应的分数。- 尝试同义词替换:
for synonym in synonyms do
遍历找到的同义词列表。对于每个同义词,进行如下判断:
-if random value < word_dict[synonym]/SUM(word_scores) then
:生成一个随机值,将其与当前同义词分数在所有同义词分数总和中所占的比例进行比较。比如,所有同义词分数总和是100,当前同义词分数是20,其比例就是0.2。如果随机值小于0.2 ,则执行替换操作。
-prompt ← prompt with word replaced by synonym
:将提示prompt
中的当前单词替换为这个同义词。
-Break
:一旦完成替换,就跳出当前同义词遍历循环,不再尝试其他同义词替换这个单词。- 返回结果:
return prompt
函数执行完毕后,返回经过同义词替换操作后的提示文本prompt
。
2.5 终止标准
为了确保AutoDAN的有效性和效率,我们采用了终止标准,结合了最大迭代次数测试和拒绝信号测试。如果算法已经用尽了最大迭代次数,或者在LLM响应的前 K K K个单词中未检测到集合列表 L r e f u s e L_{refuse} Lrefuse中的关键字,则AutoDAN将终止并返回当前最佳越狱提示,该提示具有最高的适应度得分。最后,AutoDAN-HGA如下所示:
算法2(AutoDAN - HGA)是一种分层遗传算法,用于生成能够绕过语言模型安全限制的越狱提示,以下是对该算法步骤的详细解释:
- 输入(步骤1)
- 原型越狱提示(J_{p}):作为算法起始的基础提示,后续的操作将基于此进行优化。
- 关键词列表(L_{refuse}):包含语言模型用于拒绝回答的关键词,用于判断模型响应是否成功绕过限制。
- 超参数:预先设定的参数,用于控制算法运行,如种群大小、迭代次数等。- 种群初始化(步骤2)
使用算法5中基于大语言模型(LLM)的多样化方法来初始化种群。这一步会生成一组初始的越狱提示个体,这些个体具有一定的多样性,为后续的进化操作提供基础。- 循环迭代(步骤3 - 12)
- 终止条件判断(步骤3):只要模型响应中包含(L_{refuse})里的关键词(即模型拒绝回答,攻击未成功),并且迭代次数未达到上限,就继续循环。
- 句子级迭代(步骤4 - 7)
- 适应度评估(步骤5):依据公式3计算种群中每个个体(即每个越狱提示)的适应度得分,衡量提示使模型按攻击者期望方式回答的能力。
- 计算动量词分数(步骤6):通过算法8计算每个单词的动量词分数,量化单词在攻击中的重要性,考虑分数稳定性。
- 更新句子(步骤7):利用算法9,根据动量词分数,用同义词替换提示中的单词,优化提示。
- 段落级迭代(步骤8 - 11)
- 适应度评估(步骤9):再次依据公式3计算种群中每个个体的适应度得分。
- 选择精英和父代提示(步骤10):根据公式4从当前种群中挑选出表现优秀的精英提示,以及用于繁殖后代的父代提示。
- 交叉和变异操作(步骤11):按照算法7对父代提示进行交叉和变异操作,产生新的提示个体。- 输出(步骤13)
当循环结束(模型响应不再包含拒绝关键词或者达到最大迭代次数),返回适应度得分最高的最优越狱提示(J_{max}),该提示最有可能成功绕过模型防御机制,让模型按攻击者意图回答问题。