推理时干预(Inference-time Intervention,简称 ITI)是一类在模型生成文本的过程中,不修改权重文件、不执行反向传播,仅通过调整神经网络内部激活值来引导输出方向的技术。它的核心假设是:大模型某些语义属性(如诚实度、偏见、毒性)在隐空间中存在近似线性的方向,只要在前向计算时对该方向做微小偏移,就能显著改变表层行为。这种方法特别适合已经训练好、不方便重新微调的闭源或开源大模型。

隐空间线性方向为何能控制生成
大量探针研究发现,Transformer 中间层的残差流(residual stream)里藏着可分离的语义轴。例如用一个线性分类器在某一层激活上训练,能以很高准确率判断句子是否含有虚假信息,这个分类器的法向量就被视为诚实性方向。推理时干预把该方向归一化后,在每次前向时把激活投影到这个轴上并加上一个系数乘以方向向量,相当于在特征空间推了模型一把。
这种做法之所以不影响其他能力,是因为偏移量通常很小,且只加在少数几层。模型原本学到的知识拓扑未被破坏,只是决策边界被平移。和提示词注入不同,ITI 不消耗输入 token,也不会因为用户绕过系统提示而失效。从信息论角度看,它等价于在条件分布 p(x|z+αd) 中改变了隐变量 z,而输入 x 的分布随之调整。
需要注意的是,方向并非在所有层都有效。浅层多捕获语法与局部特征,深层更偏向高级语义。实践上一般扫描各层探针准确率,挑选top-k层联合干预。下表列出常见属性对应的有效层区间:
| 属性 | 有效层(以12层模型为例) | 平均系数 |
|---|---|---|
| 降低毒性 | 6-9层 | 2.5 |
| 提升事实性 | 8-11层 | 1.8 |
| 减少性别偏见 | 4-7层 | 3.0 |
在哪些计算节点插入干预
最常见的插入点是注意力输出后、前馈网络之前的残差连接处。以 HuggingFace 的 GPT2 为例,可以通过注册 forward hook 获取 h 隐状态,计算其与方向向量 dir 的点积,再叠加 coeff * dir。另一种做法是在每个注意力头输出分别干预,称为 head-level ITI,粒度更细但实现复杂。
下面给出简化的 PyTorch 钩子示例,展示如何在指定层加上方向偏移。代码中的 direction 是预先算好的单位向量,alpha 控制强度。注意所有张量运算都在不计算梯度的上下文中进行,因此零训练成本。
import torch
# 假设 direction 形状 [hidden_size], alpha 为浮点系数
def make_hook(layer_idx, direction, alpha):
def hook(module, input, output):
# output 可能是 tuple,取隐藏态
hidden = output[0] if isinstance(output, tuple) else output
# 只在指定层干预
proj = hidden @ direction.unsqueeze(-1)
hidden = hidden + alpha * direction.view(1, 1, -1) * torch.sign(proj)
if isinstance(output, tuple):
return (hidden,) + output[1:]
return hidden
return hook
# 注册到模型第 8 层
model.transformer.h[8].register_forward_hook(
make_hook(8, direction, 2.0)
)
除了残差流,也有工作在价值向量(value)或键向量(key)上做文章,但实验表明残差流最稳定。如果模型使用了 RMSNorm,需在 norm 之前还是之后干预也有讲究:多数论文选择 norm 之后,因为此时激活尺度统一,方向位移不会被缩放抵消。
三种干预策略的取舍与局限
第一种是固定系数法,即每层用同一个 alpha。它实现简单,但在长文本生成时容易过偏,导致语言干涩。第二种是自适应系数,根据当前 token 的投影大小动态缩放,能缓解过度干预。第三种是多头方向融合,把多个相关属性方向做正交化后联合注入,适合同时约束毒性与事实性。
从效果看,ITI 在 TruthfulQA 等基准上能把小模型准确率提升十几个点,且推理延迟仅增加约百分之三。但它并非银弹:方向向量如从偏分布数据算出,可能带入新偏见;另外对超大模型(如 70B 以上)隐空间非线性增强,单一线性方向解释力下降,需要分层多方向组合。
工程落地时建议先把方向向量放在验证集上做离线评估,确认偏移后困惑度(perplexity)不飙升,再上线上灰度。由于不改动权重,回滚只需摘掉 hook,比微调安全得多。对于需要频繁切换风格的客服机器人,这种零成本切换尤其有价值。
快速搭建可撤消的干预管线
把上述逻辑封装成上下文管理器,可以让干预随 with 语句自动挂载与卸载。这样在批量请求中,只对特定用户会话开启 ITI,其余流量走原生模型,资源隔离清晰。下面示例展示管理器写法。
from contextlib import contextmanager
@contextmanager
def iti_context(model, layer_idx, direction, alpha):
handle = model.transformer.h[layer_idx].register_forward_hook(
make_hook(layer_idx, direction, alpha)
)
try:
yield model
finally:
handle.remove()
# 使用方式
with iti_context(model, 8, direction, 1.5):
out = model.generate(input_ids)
这种结构让算法工程师能在不碰训练代码的前提下,给线上模型打补丁。配合配置中心下发方向和系数,可实现小时级策略调整。总体而言,推理时干预补齐了提示词与微调之间的空白地带,是低成本治理大模型行为的实用手段。
Inference_time_Intervention大模型推理模型行为控制修改时间:2026-08-16 19:00:33