对齐问题:让模型"听话"且"不闯祸"
大模型的安全对齐是AGI发展道路上不可回避的核心问题。一个能力强大但不对齐的模型可能带来严重的社会风险。本文系统梳理当前主流的对齐技术方案。
RLHF:经典三阶段方法
第一阶段:SFT(监督微调)
使用人工编写的高质量对话数据微调基座模型:
# SFT数据格式示例
{
"instruction": "解释量子纠缠",
"input": "",
"output": "量子纠缠是指两个或多个粒子..."
}
SFT建立模型的指令跟随能力,是对齐的基础。
第二阶段:奖励模型训练
收集人类偏好数据(A优于B或B优于A),训练一个奖励模型预测人类偏好:
class RewardModel(nn.Module):
def __init__(self, base_model):
super().__init__()
self.transformer = base_model
self.value_head = nn.Linear(hidden_size, 1)
def forward(self, input_ids):
hidden_states = self.transformer(input_ids).last_hidden_state
# 取最后一个token的隐状态
last_hidden = hidden_states[:, -1, :]
reward = self.value_head(last_hidden)
return reward.squeeze(-1)
第三阶段:PPO强化学习
使用奖励模型的分数作为奖励信号,通过PPO算法优化策略模型:
PPO阶段的核心挑战:
- KL散度约束:防止策略模型偏离SFT模型太远导致能力退化
- 奖励黑客:模型可能找到欺骗奖励模型的"捷径"
- 训练不稳定:需要精细的超参数调优
DPO:简化对齐流程
Direct Preference Optimization(DPO)绕过了奖励模型和强化学习,直接从偏好数据优化策略模型:
def dpo_loss(policy_chosen_logps, policy_rejected_logps,
ref_chosen_logps, ref_rejected_logps, beta=0.1):
pi_logratios = policy_chosen_logps - policy_rejected_logps
ref_logratios = ref_chosen_logps - ref_rejected_logps
logits = pi_logratios - ref_logratios
return -F.logsigmoid(beta * logits).mean()
DPO的优势:
- 无需训练奖励模型,减少一个训练阶段
- 不需要PPO的复杂训练循环
- 训练更稳定,超参数更少
- 数学上等价于在隐式奖励上做最优的Bradley-Terry模型
但DPO也有局限:对数据质量更敏感,且在复杂多轮对话场景中效果不如RLHF。
Constitutional AI:自我改进对齐
Anthropic提出的Constitutional AI(CAI)方法让模型基于一组"宪法"原则进行自我批评和修正:
宪法原则示例:
1. 不要生成歧视性内容
2. 拒绝协助危险活动
3. 保持诚实,不编造信息
4. 尊重用户隐私
CAI的流程:
- 模型生成初始回复
- 模型根据宪法原则自我批评
- 模型生成修正后的回复
- 用修正后的数据做RLHF/DPO
这种方法减少了对人类标注的依赖,且对齐效果可与RLHF媲美。
安全护栏与实时过滤
对齐训练之外,推理时的安全护栏同样重要:
输入过滤
class InputGuard:
def __init__(self):
self.classifier = load_toxic_classifier()
self.jailbreak_detector = load_jailbreak_detector()
def check(self, user_input):
if self.classifier.is_toxic(user_input):
return "block", "输入包含不当内容"
if self.jailbreak_detector.detect(user_input):
return "block", "检测到越狱尝试"
return "pass", None
输出过滤
对模型输出进行实时审查,包括:
- 敏感信息检测(PII、密钥、内部代码)
- 有害内容分类(暴力、自残、违法建议)
- 事实性核查(与知识库交叉验证)
Llama Guard系列
Meta的Llama Guard是专门训练的安全分类器,可以判断输入输出是否安全:
from transformers import pipeline
guard = pipeline("text-classification", model="Meta-Llama/LlamaGuard-3-8B")
result = guard("待检测的文本")
# 输出: safe / unsafe + 违规类别
红队测试
红队测试是对齐效果评估的关键环节。有效红队测试需要覆盖:
攻击向量分类
- 越狱攻击:通过角色扮演、编码等方式绕过安全限制
- 提示注入:在数据中嵌入恶意指令
- 间接注入:通过检索内容注入指令
- 多轮诱导:通过多轮对话逐步突破边界
自动化红队
def automated_red_teaming(target_model, attack_strategies):
vulnerabilities = []
for strategy in attack_strategies:
attack_prompt = strategy.generate()
response = target_model.generate(attack_prompt)
if safety_classifier.is_unsafe(response):
vulnerabilities.append({
"strategy": strategy.name,
"prompt": attack_prompt,
"response": response,
"severity": strategy.severity
})
return vulnerabilities
评估基准
推荐的对齐评估基准:
- HarmBench:标准化的有害行为测试集
- AdvBench:对抗性提示基准
- TruthfulQA:真实性评估
- BBQ:偏见评估
- MMLU-Pro-Safety:安全相关知识测试
结语
安全对齐不是一个一次性任务,而是一个持续迭代的过程。随着模型能力的增强,对齐技术也需要不断演进。从RLHF到DPO再到Constitutional AI,对齐方法正在变得更加高效和可扩展。但在AGI的背景下,如何确保对齐的鲁棒性和可扩展性,仍然是open problem。