Inference-Time Safety:不改模型权重,只在推理阶段做安全控制——有哪些方法

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

AI technology illustration

这个理解在我亲手跑了一次 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)论文证明:在模型的某些注意力头上,回答真话和假话时激活值沿某个方向有规律偏移。推理时把激活沿这个方向推一把,模型说真话的概率就明显上升。全程不训练,只做一次向量加法。

我第一次在代码里做这个操作时觉得很魔幻:只是往隐藏状态上加了一个小向量,整个生成倾向都变了。这让我意识到,所谓“对齐”,在表征层面可能比想象中浅得多。

  1. 准备两组提示词:一组是“应该拒绝的有害请求”,一组是“应该正常回答的无害请求”。
  2. 分别让模型生成,记录某一层的隐藏状态。
  3. 求两组隐藏状态的平均差,得到一个方向向量。
  4. 推理时每生成一个 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

(0)
上一篇 4天前
下一篇 4天前

相关推荐