我用通俗 + 原理两层给你讲清楚,这两个问题是一回事:模型怎么拒绝 → 拒绝的本质是什么 → 怎么精准找到 “拒绝向量”
模型天生不会拒绝,拒绝是后期对齐(alignment)硬加上去的,主要靠三步:
有监督微调 SFT人工 / 机器造一批数据:
- 敏感问题 → 标准答案是:“我不能回答”“这个问题不合适”
- 正常问题 → 正常回答让模型学到:看到某类输入 → 输出拒绝句式。
RLHF / RLAIF 强化对齐训练一个 “奖励模型”:
- 模型回答违规内容 → 给负分
- 模型礼貌拒绝 → 给高分再用 PPO 让大模型尽量往 “拒绝” 的方向优化。
最终落到:隐空间里的一个 “拒绝模式”对齐后,模型的隐藏层特征(hidden states) 里,会形成一个稳定模式:
只要输入触发敏感关键词 / 意图 → 隐状态就往 **“拒绝子空间”** 走 → 解码出拒绝文本。
一句话:拒绝 = 隐空间里一条固定的 “回答路径”,对齐把这条路焊死了。
不是去找某一层权重,而是找隐空间的一个方向,步骤非常标准化:
造两组对比 prompt
- 安全集 S:正常问题(模型会正常回答)
- 敏感集 R:敏感问题(模型一定会拒绝)
跑模型,抽隐藏态对 S 和 R 都跑一遍,取最后几层 transformer 的 hidden states(一般最后 2–4 层最关键)。
算 “拒绝方向”用简单线性方法就行:
- 对 S 所有样本求平均隐向量 μ_S
- 对 R 所有样本求平均隐向量 μ_R
- 拒绝方向 d = μ_R − μ_S
再用 PCA/CCA 提纯一下,去掉噪音,就得到唯一、稳定的拒绝方向。
验证随便换个新敏感问题,它的隐状态一定靠近 d;正常问题则远离 d。
就是推理时,把拒绝方向从隐状态里去掉:
h′=h−(h⋅d)d
- h:原始隐状态
- h′:去掉拒绝方向后的隐状态
- 模型就不会再触发拒绝路径,直接按原始能力回答。
特点:
- 不用重训、不用改权重
- 几分钟搞定
- 只删 “拒绝”,不影响正常能力
- 模型拒绝:是对齐在隐空间里加了一条固定拒绝路径;
- 找拒绝向量:对比 “正常 / 敏感” 的隐状态,算出共同偏离方向;
- 一键解禁:推理时把这个方向投影掉,拒绝就消失了。
如果你想,我可以再给你写一段极简伪代码,你一眼就能看懂它是怎么实现 “去掉拒绝” 的。