作者:Vivedha Elango
图源:Jon Moore on Unsplash
前言: 随着大型语言模型(LLM)在各类AI应用中迅速普及,如何保护它们免受训练阶段与推理阶段的安全威胁,成为研发者无法回避的重要课题。本文系统梳理了当前主流的LLM防御技术,涵盖预训练、后训练和推理各阶段,详细分析了不同方法的优缺点及应用场景。无论你是构建AI系统的开发者,还是关注模型安全的研究者,本篇纯技术博文将为你提供一套实用且全面的参考指南。
大型语言模型(LLMs)是当今AI系统的重要组成部分。它们为聊天机器人、虚拟助手和文本生成器等工具提供支持。但就像任何复杂的技术一样,LLMs也有它们的弱点。这些模型可能会在使用过程中受到恶意输入攻击,或者在训练过程中遭到数据篡改。
要保护LLMs免受这些风险,需要有周密的策略。在训练阶段和实际应用阶段,都必须设置好防护措施。
在这篇博客里,我会分享我关于防御LLMs的一些经验。我们会看看不同的保护方法,讨论它们的优缺点,并探讨这些方法在实际中的应用。不管你是构建AI系统,还是单纯好奇它们是怎么保持安全的,这篇博客都能给你清晰的了解。
让我们开始吧!
我们如何确保LLM模型安全?
我们可以在训练和推理阶段实施防御措施,来增强模型的抗攻击能力。在训练阶段,像监督微调(SFT)和来自人类反馈的强化学习(RLHF)等技术,可以通过调整模型参数来识别并拒绝攻击。相反,在推理阶段,模型权重保持不变,行为通过提示词或者"护栏"来控制,筛选掉不安全的内容。
每种方法都有优缺点。推理时的防御方法灵活性更高。你可以修改提示词,或者添加模块组件,而无需重新训练整个模型。但它们可能会增加延迟,并且在应对细微或需要推理的攻击时显得吃力。而训练阶段的防御措施则能让模型更有效地检测复杂攻击,但也会带来代价,比如对齐税(alignment tax)------为了安全调整导致数据分布变化,或引起灾难性遗忘,从而降低了总体性能。
防御策略在语言模型生命周期的不同阶段实施【来源】
1. 训练阶段的防御
训练阶段防御是一个关键领域。这是保护AI模型在训练过程中所采取的方法,包括训练前和初步训练完成后的步骤。我来解释一下每个阶段的主要方法。
1.1 预训练阶段的防御
构建模型安全性的第一个机会出现在预训练期间。也就是准备数据和设置训练流程的时候。通常会用到两个关键策略:
内容过滤
第一步是从训练数据中删除有害或带毒性的内容。像Team等人(2024年)在Gemini 1.5【1】、Dubey等人(2024年)在Llama 3【2】的研究表明,遵循严格的安全规则可以减少模型行为中的风险。在这个阶段清理数据,可以避免后续出现很多问题。
条件预训练
另一种做法是用特殊标记对潜在有害的数据进行标注,就像Anil等人(2023年)在PaLM 2【3】中描述的那样。这能帮助模型理解哪些内容是有风险的,从而学会生成更安全的输出。早早设置这些保护措施,可以让后续微调和优化步骤变得轻松很多。
1.2 后训练阶段的防御
模型预训练完成后,还可以采取额外的步骤让它变得更安全。这些步骤包括监督微调(SFT)和对抗性训练。
后训练防御------作者自制图
1.2.1 监督微调(SFT)
这个过程是给模型展示一些不安全输入的例子,并教它如何拒绝它们。例如,Bianchi等人(2023年)【4】发现,只需在训练集中添加占比3%的"专门拒绝"数据,就能带来明显的差异。关键是要收集各种各样的不安全情景,让模型能更好地应对不同情况。
安全指导让模型更安全,但过度强调安全可能导致模型过度小心【来源】
1.2.2 对抗性训练
对抗性训练是更高级的方法,它涉及用具有挑战性的场景来测试模型。Ge等人(2023年)【5】开发了一个系统:一个模型生成不安全输入,另一个模型训练去拒绝它们。这种来回对抗的过程帮助模型变得更加坚韧。通常会用奖励模型来引导这个过程,一个模型专注于生成有帮助的回复,另一个模型负责标记不安全的内容以供改进。
根据评估者反馈,MART首先从生成的提示中识别出成功的攻击,然后利用这些攻击训练对抗性LLM【来源】
多层安全措施
依赖单一防御措施是不够的。结合多种方法可以创造出更强大、更安全的模型。这里有一些高级技巧:
两步式安全微调:Wang等人(2023h)【6】提出了一种两步法。首先,模型学习识别问题是有害的还是无害的;然后,再评估自己答案的安全性。在模型使用阶段(推理时)添加安全检查,也有助于阻止有害输出。
SELF-GUARD的流程。左边是两步训练流程,右边是推理流程【来源】
对抗性优化:另一种做法是结合优化技术进行对抗性训练,比如Madry【7】介绍的方法。它用特定算法来测试和强化模型,抵御困难输入。这种方法效果好,但需要大量算力。如果资源有限,可以考虑更轻量的方法,比如软提示微调(He & Vechev,2023)或LoRA(Varshney等,2024)。这些方法专注于改进模型,而不需要完全重新训练。
1.2.3 通过RLHF进行偏好对齐
从人类反馈中进行强化学习(RLHF)已经成为将LLMs与人类价值观对齐的核心方法。在RLHF中,通过对同一提示的回复进行排序训练奖励模型。然后,这个奖励模型反过来调优目标语言模型,采用迭代优化的方式(Ouyang等人,2022)。
PPO方法的三步流程图:1)监督微调(SFT),2)奖励模型(RM)训练,3)基于PPO的强化学习【来源】
RLHF的突出之处在于它能改进模型在分布外(OOD)场景下的泛化能力,能应对复杂或意外的情景(Kirk等人,2023b)。不过,构建一个有效的偏好数据集仍然是一个大挑战。Ji等人(2023)通过创建带标注的数据集,评估回复的有帮助性和无害性来解决这个问题。
标注过程分为两个阶段:首先,对QA对进行14个危害类别的安全评估并赋予元标签;然后,根据帮助性和安全性对回复进行排序【来源- Ji等人(2023)】
与此同时,Shi等人(2023b)提出的可扩展方案,通过反向指令模型自动生成任务,比如把一首关于爱的十四行诗变成"写一首关于人类之爱的十四行诗"的提示。这种方法也被用来生成安全数据集中的有害输入。
SAFER-INSTRUCT按照结构化方法改进基于指令的学习,从反向指令调优开始,高效生成主题特定指令,筛选低质量指令,并用专家模型生成高质量回复【来源】
虽然RLHF高度依赖人类反馈,但AI反馈强化学习(RLAIF)通过用AI生成反馈(依据预定义的安全规则"宪法")来减少这种依赖(Bai等人,2022b)。RLAIF降低了标注数据集所需的工作量,同时还能让模型适应不同用户需求和组织政策。
宪法式AI(CAI)分两阶段训练模型:监督学习(SL)和强化学习(RL)。SL阶段通过核心原则指导模型初步行为,为RL阶段打下坚实基础【来源】
RLAIF已经在Claude(Anthropic,2024)和Qwen2(Yang等人,2024a)等系统中取得了良好效果。不再需要人工打分每一个回复,而是依赖于AI驱动的、安全目标导向的评估,使其既可扩展又易于适配。
收集到偏好数据后,更新模型参数就是下一个挑战。主要有两种算法推动这一过程:
- PPO(近端策略优化) :OpenAI的InstructGPT使用PPO,在训练迭代中根据奖励模型赋予的分数动态优化输出。虽然可高度定制,但PPO因为依赖动态数据生成和梯度更新,所以算力开销大。变种如RRHF引入排序损失以更有效地微调偏好(Yuan等人,2023a);GRPO则在训练周期中提升了内存效率而不损失性能(Shao等人,2024)。
RRHF与PPO工作流程对比【来源】
- DPO(直接偏好优化) :DPO把偏好优化简化成微调,直接用偏好数据调整参数,不需要奖励建模或复杂的打分循环。这种方法使训练过程更稳定,被Zephyr、Llama3和Yi等系统广泛采用。不过,DPO的反馈不是为特定模型量身定制的,因此在泛化能力上略有不足。
DPO微调语言模型以对齐人类偏好------无需强化学习。传统方法需要先训练奖励模型,再用RL最大化奖励;DPO直接用分类目标优化偏好,省去了奖励建模和复杂RL【来源】
在偏好优化中,平衡像"有帮助"与"无害"这样的相互竞争的目标是至关重要的,但因为它们本身存在冲突,所以这件事非常具有挑战性。一边鼓励模型给出有帮助的回答,一边又要拒绝有害的回答,这种做法会在多目标优化过程中引发不稳定。
1.2.4 表征工程(Representation Engineering)
除了像RLHF或RLAIF这样端到端的基于梯度的方法之外,一些研究者直接专注于操控模型的内部表征,以增强对模型行为的控制和可靠性:
- 知识编辑(Knowledge Editing) :Mitchell等人(2022)提出的技术,通过修改transformer架构中的特定层,来注入新知识或删除不需要的信息。
- 引导方法(Steering Methods) :这些方法是通过机械式地分析内部表征来实现调控,而不是单纯依赖外部微调流程。
最近的研究进展展示了,表征工程可以作为一种防御机制,用来抵御不安全的输出:
- Zou等人(2024a)将潜在的有害输出重定向到正交表征或序列结束(end-of-sequence)标记上,从而迫使模型彻底停止生成有问题的回复。
受表征工程启发,"断路器"(circuit breaking)直接作用于内部表征,把有害状态和断路器连接起来。这阻碍了模型在一系列有害状态中的穿行【来源】
通过把以可解释性为重点的方法和传统对齐技术结合起来,我们可以在不增加过多复杂度的情况下,更深层次地掌控LLMs在各种场景下的行为。
所以,总结一下......
后训练防御中用到的技术,可以通过下图直观总结:
后训练防御技术【作者自制图】
2. 推理阶段防御
在AI模型生成回复的时候保持安全也非常重要。有几种方法可以降低风险,比如提示技术(Prompting)、护栏系统(Guardrails)、模型集成(Ensembling)、以及对抗性后缀过滤(Adversarial Suffix Filters)。
2.1 提示(Prompting)
因为语言模型很擅长跟随指令,所以提示是一种无需重新训练模型就能提升安全性的好方法。
作者自制图
提示重写
调整输入提示是让AI回复更安全的一种方式。研究人员发现,加上像"负责任地回应"或者"避免伤害"这样的短语,会让模型更倾向于拒绝不安全的请求。
另一种方法叫做减少潜在冒犯(Reducing Potential Offense,RPO),它通过识别特定的词语或后缀来减少有害输出,而不是放大它们。这有助于保持回复的适当性。
还有一种叫自我反思提示(Self-Reflection Prompting),就是让模型先生成一个回复,然后自己检查一下,看是否符合道德和安全准则。
少量示例提示(Few-Shot Prompting)
为了应对棘手的对抗性攻击,有一种策略叫做上下文防御(In-Context Defense),就是在输入提示里加入安全行为的例子。这些例子教模型怎样识别和回应有害请求。这种方法可以和检索技术结合,检索出跟用户查询相关的安全示例,并添加到提示词中。两者结合起来,可以帮助模型生成更安全、更有上下文意识的回复。
少量示例攻击和防御方法的示意图【来源】
链式思考提示(Chain-of-Thought Prompting,CoT)
链式思考方法能提升模型解决复杂问题的推理能力。它引导模型把问题拆解成多个步骤,仔细思考意图。这种方式还能帮助模型在作答时应用安全规则。
提示(Prompting)是一种实用又经济的提高安全性的办法,因为不需要重新训练模型。但它也不是完美的。使用太多例子或者多步骤提示,会让回复时间变慢。而且,如果示例中有不安全内容,还可能把模型带偏。为了应对这些问题,通常会把提示和其他方法,比如不安全关键词过滤,结合使用。
2.2 护栏系统(Guardrail Systems)
护栏系统是用来帮助语言模型生成安全、得体回复的工具。它们像一个过滤器,阻止不安全内容的生成。护栏系统通常包括几个部分,比如提示过滤器(Prompt Filters)、毒性检测器(Toxicity Detectors),以及帮助生成符合伦理的回复的工具。
比如NeMo Guardrails系统。它结合了大型语言模型(LLMs)和数据库,来检测对话中的不安全内容和错误信息。同时,它使用一种叫Colang的专门语言来定义安全规则。其他研究人员也提出了类似的工具,比如SPML,它允许开发者设计安全的提示。
除了过滤内容以外,护栏系统还可能用微调过的模型来双重检查提示和回复的安全性。这类系统是确保语言模型负责任地运行的重要部分。
NeMo Guardrails的总体架构【来源】
2.3 语言模型集成(Language Model Ensembling)
语言模型集成就是把多个模型的输出结合起来,生成更安全、更准确的回复。原理很简单:通过混合多个模型的预测结果,减少单个模型出错的风险。但这种方法也有实际上的挑战。
通过选择既"有帮助"又"无害"的回复来防御对抗性攻击【来源】
Chen等人(2023a)提出了一个叫做移动目标防御(Moving Target Defense,MTD)的方法。它结合了8个大型商业模型的回复,再评估它们,选出既"无害"又"有帮助"的回复。这种方法在理论上是有效的,但缺点也很明显:很慢,而且需要大量算力,因此在真实系统中很难用。
基于此,Chern等人(2024年)又提出了辩论式方法(debate-based approach)。在这种方法里,多个模型就敏感或有风险的话题进行"讨论"。首先,每个模型给出一个初步回复;然后,通过多轮反馈互相完善答案。这种方式可以显著提升安全性,尤其是小模型和大模型配合使用时。不过,缺点是开销大。运行多个模型参与辩论,既耗时间又耗算力,不太适合日常应用。
通过多智能体辩论抵御对抗性攻击【来源】
总之,虽然集成方法可以提高安全性,但它们更适合那些对成本和速度要求没那么苛刻的专门任务。
2.4 针对对抗性后缀的防御(Defense Against Adversarial Suffixes)
对抗性后缀就是在提示后面添加一段文本,诱使模型输出有害或不当内容。Zou等人(2023b)发现,有些后缀可以让模型批准危险请求。传统的关键词过滤往往拦不住这样的攻击,因此需要更好的方法。
截图示例:ChatGPT(左上),Claude 2(右上),Bard(左下),LLaMA-2(右下)【来源】
困惑度(Perplexity)过滤
一种检测对抗性后缀的方法是测量它们的困惑度(perplexity)。困惑度高,通常意味着这段话不太自然、不合逻辑,这就能帮助发现对抗性后缀。
但这个方法也有缺点。Alon和Kamfonas(2023年)指出,单靠困惑度会出现大量误报------安全的提示也可能被错误地标记成有害。为了提高准确率,他们用LightGBM算法训练了一个分类器。
基于扰动的方法(Perturbation-Based Methods)
对抗性后缀对小变化特别敏感,这让基于扰动的防御方法非常有效。
擦除与检查算法(Erase-and-Check Algorithm) :Kumar等人(2023年)提出了这个方法。它每次从提示中删除一个单词,然后检测剩下的内容是否仍然有害。如果任何一个删减后的版本被判定为不安全,就把整个提示标记为有害。这种方法可以发现隐蔽的对抗性提示。
擦除与检查通过逐个移除提示末尾的单词并检测变化版是否危险来防御对抗性后缀攻击【来源】
随机平滑(Randomized Smoothing,SmoothLLM) :Robey等人(2023年)提出了SmoothLLM,它通过向输入中加入随机噪声,让模型更抗攻击。具体方法是:稍微改变输入,比如插入、交换或修改单词。这种小变化可以打破对抗性后缀的效果。
SmoothLLM已在对生成内容指导(GCG)攻击的测试中,把成功率降低到了1%以下。
具体流程是:
- 普通LLM直接处理被操纵的提示,没有额外保护。
- SmoothLLM在LLM之前加一道保护层,先生成多个经过扰动的版本,再选择安全的输入供模型回复。这能在攻击到达模型之前就中断它们。
SMOOTHLLM防御示意图:未保护的LLM(左)vs加了扰动保护的LLM(右)【来源】
总结一下,
推理阶段防御技术可以用下图来总结:
推理阶段防御技术总览【作者自制图】
结语(Closing Thoughts)
没有一种单一的方法可以完全保护语言模型。最好的办法是叠加多种安全措施。
在训练阶段实施防御可以在早期就识别复杂攻击,但也可能改变模型行为,有时会影响性能。而推理阶段的技术(即模型运行时用的)则更灵活,但往往难以应对高阶威胁。
根据我的经验,来自人类反馈的强化学习(RLHF)和来自AI反馈的强化学习(RLAIF)是不错的折中方案。它们能在不增加太多额外成本的情况下提升安全性。
如果你在找实用的方法,不妨把简单的方法(比如精心设计提示)和结构化护栏(Guardrails)结合起来用。而模型集成(Ensembling)虽然效果好,但成本太高,应该留给那些对可靠性要求极高的场景。
没有完美的防御。但通过合理混合各种策略,可以让你的模型在保持有用性的同时,大大提升安全性。安全威胁会不断演变,我们的防御也必须与时俱进。