我最早以为,一个模型安不安全,是在训练阶段决定的。RLHF 把“拒绝有害请求”的偏好烧进权重里,像疫苗一样,打完就免疫了。

这个理解在我亲手跑了一次 jailbreak 之后碎掉了。2024 年的一篇论文Refusal in Language Models Is Mediated by a Single Direction发现,Llama 2 在“拒绝”和“顺从”时,内部状态只在激活空间的一个方向上显著不同。把这条“拒绝方向”从残差流里减掉,模型对有害指令的拒绝率从接近 100% 掉到 1% 左右;把它加上去,连正常问题都会被拒绝。
也就是说,安全不是深层信念,而是浮在能力表面的一层闸门。
那思路就打开了:既然安全只是一层闸门,能不能不改权重,在推理阶段直接操纵它?这就是 Inference-Time Safety(推理时安全)。下面按三道闸门拆开讲。
训练时安全为什么搞不定攻击?
因为训练是一次性的静态防御,攻击是无限次的动态试探。攻击者不需要理解模型,只需要不断试错:DAN 角色扮演、编码混淆、翻译成小语种、假装开发者模式……训练不可能枚举所有攻击,重新训练又贵又慢。于是工业界把安全拆成两层:训练时把能力教好,推理时用护栏动态拦截。
三道闸门:输入、生成、输出
- 输入端
- 提示词进入模型之前,先判断它是不是恶意。
- 生成端
- 模型逐 token 生成时,干预概率分布或内部状态。
- 输出端
- 回复返回用户之前,对整段输出做二次审查。
输入端:在提示词进门之前就拦住
最有名的产品是 Meta 的 Llama Guard:一个基于 Llama 微调的分类器,按“暴力、色情、违法”等策略类别给提示词打标签,命中就拦截。它的特殊之处在于安全策略以文本形式喂给模型——想改政策,改一段话就行,不用重训。Llama Guard 3 甚至把模型压到了 1B 参数,可以跑在本地。
更轻的办法是困惑度(perplexity)过滤。jailbreak 提示通常是拼接出来的,模型对它的“惊讶程度”会异常高。Alon & Kamfonas 的论文发现,用困惑度阈值就能拦下不少攻击。但攻击者把提示写得流畅一点,这招就失灵了。
还有一种思路是让攻击“失效”。SmoothLLM 先把输入随机扰动几次——随机插入、替换或交换几个字符——再让模型分别生成、投票取多数。jailbreak 对措辞极敏感,多一个空格都可能失效,扰动后攻击成功率被大幅稀释。
最便宜的是 self-reminder:在系统提示里显式写上“拒绝有害请求”,或给模型看几个拒绝样例。Xie 等人的实验证明这能把攻击成功率压低一大截。不解决根本问题,但零成本。
生成端:在 token 概率上做加减法
在生成端动手脚,思路更直接:改 token 的概率分布。
先看 DExperts(2021)。生成时,模型面对词表里几万个 token,每个 token 有一个概率分。DExperts 同时跑两个辅助模型——一个在安全数据上微调过(专家),一个在有害数据上微调过(反专家)。重算概率的式子很朴素:
最终概率 = 基础模型概率 + α × (专家概率 − 反专家概率)
专家看好、反专家不看好,就加分;反过来就减分。主模型一个参数都不用动,输出就被往安全方向拉。
2024 年的 SafeDecoding 更轻:只需要一个安全微调过的小模型当“哨兵”。主模型每预测一个 token,哨兵同步预测;如果主模型给有害 token 打高分、哨兵却给低分,就把该 token 的概率压下去。论文报告在 GCG、DAN 等多种攻击下防御效果显著,正常回答几乎不受影响。
RAIN 则让模型自我反思:生成候选回答后,被提示“评估你自己的回答是否安全、有用”,不合格就重新生成。等于把“三思而后行”变成显式循环。代价是慢——每次回答要多跑好几轮自评。
激活空间:直接拧模型的旋钮
这一部分最反直觉,我最初也很难理解。
2023 年的 Inference-Time Intervention(ITI)论文证明:在模型的某些注意力头上,回答真话和假话时激活值沿某个方向有规律偏移。推理时把激活沿这个方向推一把,模型说真话的概率就明显上升。全程不训练,只做一次向量加法。
我第一次在代码里做这个操作时觉得很魔幻:只是往隐藏状态上加了一个小向量,整个生成倾向都变了。这让我意识到,所谓“对齐”,在表征层面可能比想象中浅得多。
- 准备两组提示词:一组是“应该拒绝的有害请求”,一组是“应该正常回答的无害请求”。
- 分别让模型生成,记录某一层的隐藏状态。
- 求两组隐藏状态的平均差,得到一个方向向量。
- 推理时每生成一个 token,把隐藏状态往这个方向推一点。
加一点,模型从“不情愿拒绝”变成“明确拒绝”;减一点,从“会拒绝”变成“有求必应”。推理开销几乎为零,却能达到类似重训练的效果。
但它也最脆弱。方向向量是统计出来的,模型内部并没有一个“真正的安全模块”。Circuit Breakers 的实验表明:单靠推理时激活干预,在自适应攻击面前很容易失守。
输出端:出门前再查一次
最后一公里是输出审查。OpenAI 的 Moderation API 和 Meta 的 Llama Guard 都支持对响应打分,不安全的回答在返回用户之前被拦下。更朴素的是自我一致性检查:同一问题回答两遍,关键内容差异过大就判为可疑。实现成本最低,但对“稳定输出有害内容”的攻击无效——它们本来就是一致的。
一张表看清六类方法
| 方法 | 干预位置 | 额外模型 | 推理开销 | 代表 |
|---|---|---|---|---|
| 输入过滤 | 输入端 | 分类器 | 低 | Llama Guard、PPL 检测 |
| 输入扰动 | 输入端 | 不需要 | 中(多次生成) | SmoothLLM |
| 对比解码 | 生成端 | 辅助模型 | 高(多模型并行) | DExperts、SafeDecoding |
| 自反思生成 | 生成端 | 不需要 | 很高(多轮自评) | RAIN |
| 激活干预 | 生成端内部 | 离线算方向 | 极低(向量加法) | ITI、refusal direction |
| 输出过滤 | 输出端 | 分类器 | 低 | Moderation API、Llama Guard |
注意激活干预这一行:几乎零开销,效果接近重训练。这是我认为推理时安全里最有研究价值的路线。
泼一盆冷水:推理时安全的三条边界
第一,它是症状管理,不是根治。护栏被绕过一次,伤害就是实打实的。第二,静态方法都能被对抗优化击穿:PPL 过滤可被流畅化绕过,SmoothLLM 可被针对性优化,激活方向可被反向工程并反转利用。第三,护栏模型本身也会成为攻击目标——同样有研究者演示过用精心构造的输入让 Llama Guard 把有害内容误判为无害。
我的判断
推理时安全会长期存在,但定位是“安全体系的第二层”。第一层仍是训练时的对齐——RLHF、DPO,以及 Circuit Breakers 这类在训练阶段就切断有害通路的做法。第二层负责应对分布外攻击和政策快速迭代:产品每周改一次安全政策,总不能每周重训模型,这时调一段 Llama Guard 的策略文本、改一个阈值就能上线——这是推理时安全不可替代的价值。
如果你在做 AI 产品,我的建议是两层都做,并持续用自动化红队测试护栏。记住:任何推理时护栏的成功率,都不该用“没被打过”来证明。
FAQ
推理时安全能替代 RLHF 吗?
不能。推理时方法拦截的是“表现”,模型内部的危险能力还在。一个没有对齐训练的基座模型,再加护栏也难堪大用。
激活干预算改模型吗?
不算。它不修改任何权重,只在前向传播时往残差流里加一个向量。就像调节音量旋钮和换音响的区别——旋钮改的是状态,不是硬件。
工业界真的在用吗?
在。Meta 在自家 AI 产品中部署了 Llama Guard 做输入输出过滤,OpenAI 的 Moderation API 是标准输出闸门。通行姿势是“系统提示 + 输入输出分类器”,而不是让模型裸奔。
聪明攻击者能同时绕过三道闸门吗?
能,论文里已经出现。任何静态方法都可被对抗优化击穿。这也是为什么安全社区把重点放在自动化红队和对抗训练上——攻击者的进化速度快于防御者的补丁速度。
想动手试试?推荐阅读这几篇原始论文
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/409.html