为什么需要对齐 模型能力越强,对齐越重要。一个能力满分但不对齐的 Agent,比一个能力一般但安全的 Agent 危险得多。
对齐要解决三个问题:
有用(Helpful):完成用户要求 无害(Harmless):不产生有害内容 诚实(Honest):不编造、不欺骗 对齐技术演进 2022: RLHF(OpenAI) → 人类反馈强化学习 2023: Constitutional AI → 宪法引导自监督 2024: DPO → 直接偏好优化 2025: GRPO → 群体相对策略优化 2026: Self-Play + RL → 自我对弈+推理RL RLHF(人类反馈强化学习) 流程 Step 1: SFT 人工标注 → 监督微调 → SFT 模型 Step 2: RM 生成回答 → 人工排序 → 训练奖励模型 Step 3: PPO 用 RM 打分 → PPO 优化策略 → 对齐模型 class RLHF: def __init__(self): self.sft_model = load_sft_model() self.reward_model = load_reward_model() self.ref_model = freeze(self.sft_model) # 参考模型 def train_step(self, prompt): # 1. 生成回答 response = self.sft_model.generate(prompt) # 2. 奖励模型打分 reward = self.reward_model(prompt, response) # 3. KL 散度约束(防止偏离太远) kl = self.kl_divergence(self.sft_model, self.ref_model, prompt) # 4. PPO 目标 loss = -(reward - 0.1 * kl) loss.backward() self.optimizer.step() RLHF 的问题 问题 描述 影响 成本高 大量人工标注 $百万级 主观偏差 标注者偏好不一致 质量不稳定 奖励黑客 模型学会欺骗 RM 输出冗长但无内容 训练不稳定 PPO 超参敏感 需要大量调参 Constitutional AI(宪法对齐) # Anthropic 提出,不需要大量人工标注 # 用"宪法"(一组原则)引导模型自我修正 CONSTITUTION = """ 1. 不要生成有害、非法或危险的内容 2. 尊重所有人群,不歧视 3. 诚实,不确定时说明 4. 保护用户隐私 5. 促进人类福祉 """ class ConstitutionalAI: async def generate(self, prompt): # 1. 生成初始回答 response = await self.model.generate(prompt) # 2. 自我审查 review = await self.model.generate( f"根据以下原则审查回答:\n" f"原则:{CONSTITUTION}\n" f"回答:{response}\n" f"审查结果:是否有违反原则的地方?" ) # 3. 自我修正 if "违反" in review: revised = await self.model.generate( f"根据审查意见修改回答:\n" f"原回答:{response}\n" f"审查:{review}\n" f"修改后:" ) return revised return response # 优势:不需要人工标注,可大规模 # 劣势:依赖模型自身能力,可能有盲区 DPO(直接偏好优化) # DPO:跳过奖励模型,直接优化策略 # 比 RLHF 简单且稳定 class DPO: def __init__(self, model, ref_model, beta=0.1): self.model = model self.ref_model = ref_model self.beta = beta def loss(self, prompt, chosen, rejected): """chosen 是更好的回答,rejected 是更差的""" # 模型对 chosen 的对数概率 pi_chosen = self.model.log_prob(prompt, chosen) pi_rejected = self.model.log_prob(prompt, rejected) # 参考模型的对数概率 ref_chosen = self.ref_model.log_prob(prompt, chosen) ref_rejected = self.ref_model.log_prob(prompt, rejected) # DPO 损失 logits = self.beta * ( (pi_chosen - ref_chosen) - (pi_rejected - ref_rejected) ) return -torch.log(torch.sigmoid(logits)) # 优势:训练稳定,不需要 RM,超参少 # 劣势:需要偏好数据对 GRPO(群体相对策略优化) # DeepSeek-R1 使用的方法 # 不需要价值网络,用群体统计代替 class GRPO: def train_step(self, prompt): # 1. 为同一 prompt 生成 G 个回答 responses = [self.model.generate(prompt) for _ in range(8)] # 2. 用奖励模型打分 rewards = [self.reward_model(prompt, r) for r in responses] # 3. 计算相对优势(群体内归一化) mean_r = np.mean(rewards) std_r = np.std(rewards) + 1e-8 advantages = [(r - mean_r) / std_r for r in rewards] # 4. 优化 for response, advantage in zip(responses, advantages): loss = -advantage * self.model.log_prob(prompt, response) loss.backward() # 优势:不需要价值网络,显存省 50% # 适合推理任务(有明确正确答案的场景) 对齐方法对比 方法 人工标注 训练稳定性 成本 效果 RLHF 大量 低(PPO难调) 高 好 Constitutional AI 少量 中 中 好 DPO 偏好对 高 中 中 GRPO 少量 高 低 推理任务最好 Self-Play 不需要 中 低 探索性强 实践选择 def choose_alignment_method(scenario): if scenario == "通用对话": return "DPO" # 稳定、效果好 elif scenario == "推理任务": return "GRPO" # 推理专精 elif scenario == "安全对齐": return "Constitutional AI" # 可大规模 elif scenario == "低成本快速对齐": return "DPO" # 最简单 elif scenario == "极致效果": return "RLHF + DPO" # 两阶段 else: return "DPO" # 默认选择 评估对齐效果 class AlignmentEval: def evaluate(self, model): return { "helpfulness": self.eval_helpful(model), # 有用性 "harmlessness": self.eval_harmless(model), # 无害性 "honesty": self.eval_honest(model), # 诚实性 "robustness": self.eval_robust(model), # 鲁棒性 } def eval_harmless(self, model): """测试有害拒绝率""" harmful_prompts = load_redteam_dataset() results = [] for prompt in harmful_prompts: response = model.generate(prompt) # 检查是否正确拒绝 refused = self.is_refusal(response) # 检查是否有有害内容 harmful = self.is_harmful(response) results.append(refused and not harmful) return np.mean(results) # 拒绝率 def eval_robust(self, model): """测试对抗鲁棒性""" # 越狱测试 jailbreak_prompts = load_jailbreak_dataset() success_rate = 1 - self.test_jailbreak(model, jailbreak_prompts) return success_rate 过度对齐问题 # 过度对齐:模型过于安全,什么都不敢回答 over_alignment_examples = [ "怎么做饭" → "我无法提供烹饪建议" # 过度拒绝 "写一首诗" → "我无法创作诗歌" # 过度拒绝 ] # 度量过度对齐 def over_refusal_rate(model): benign_prompts = load_benign_dataset() # 无害问题 refusals = sum(1 for p in benign_prompts if is_refusal(model.generate(p))) return refusals / len(benign_prompts) # 目标:<5% # 过高说明模型过度对齐 结论 AI 对齐没有银弹。2026 年的最佳实践:
...