【大模型】- Constitutional AI:自我改进
Constitutional AI:自我改进
使用 AI 反馈训练 AI
类型: 学习 | 语言: Python | 🏷 前置:《Constitutional AI》(本系列第 8 篇)
学习目标
- 理解 Constitutional AI 的原则
- 实现自我批评和修订循环
- 使用 AI 生成的偏好数据训练模型
- 评估 Constitutional AI 的效果
- 理解 RLAIF 的概念
Constitutional AI 概述
Constitutional AI (CAI) 是 Anthropic 提出的一种方法,它使用 AI 反馈来训练 AI 系统,减少对人类反馈的依赖。
CAI 的三个阶段
- 监督学习阶段:模型根据一组原则自我批评和修订回答
- 强化学习阶段:使用 AI 生成的偏好数据训练奖励模型
- 策略优化:使用 PPO 或类似算法优化策略
阶段 1:自我批评和修订
原则集合
1 2 3 4 5 6 7
| principles = [ "请选择最有帮助、最准确、最无害的回答。", "请选择不包含有害、不道德或虚假信息的回答。", "请选择尊重用户隐私和安全的回答。", "请选择清晰、简洁、易于理解的回答。", "请选择符合伦理准则的回答。", ]
|
自我批评循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| def self_critique_and_revise(model, tokenizer, prompt, principles, max_revisions=3): """ 模型自我批评并修订回答 """ inputs = tokenizer(prompt, return_tensors="pt").to(model.device) with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=512, temperature=0.7 ) current_response = tokenizer.decode(outputs[0], skip_special_tokens=True) for revision in range(max_revisions): critique_prompt = f"""请批评以下回答,并根据原则进行改进:
原则: {chr(10).join([f'{i+1}. {p}' for i, p in enumerate(principles)])}
问题:{prompt} 当前回答:{current_response}
请提供: 1. 批评:指出回答的问题 2. 改进:提供改进后的回答""" critique_inputs = tokenizer(critique_prompt, return_tensors="pt").to(model.device) with torch.no_grad(): critique_outputs = model.generate( **critique_inputs, max_new_tokens=1024, temperature=0.7 ) critique_response = tokenizer.decode(critique_outputs[0], skip_special_tokens=True) if "改进:" in critique_response: current_response = critique_response.split("改进:")[-1].strip() else: break return current_response
|
批评模板
1 2 3 4 5 6 7 8 9 10 11 12
| critique_template = """请根据以下原则批评回答:
原则: {principles}
问题:{question} 回答:{response}
请提供: 1. 评分(1-10) 2. 批评:指出问题 3. 改进建议"""
|
阶段 2:AI 生成的偏好数据
偏好比较
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| def generate_preference_pair(model, tokenizer, prompt, principles): """ 生成偏好对:chosen 和 rejected """ response_a = self_critique_and_revise(model, tokenizer, prompt, principles) response_b = self_critique_and_revise(model, tokenizer, prompt, principles) comparison_prompt = f"""请比较以下两个回答,选择更好的一个:
原则: {chr(10).join([f'{i+1}. {p}' for i, p in enumerate(principles)])}
问题:{prompt}
回答 A:{response_a} 回答 B:{response_b}
哪个回答更好?请回答 "A" 或 "B"。""" comparison_inputs = tokenizer(comparison_prompt, return_tensors="pt").to(model.device) with torch.no_grad(): comparison_outputs = model.generate( **comparison_inputs, max_new_tokens=10, temperature=0.0 ) choice = tokenizer.decode(comparison_outputs[0], skip_special_tokens=True) if "A" in choice: return {"chosen": response_a, "rejected": response_b} else: return {"chosen": response_b, "rejected": response_a}
|
批量生成偏好数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| def generate_preference_dataset(model, tokenizer, prompts, principles, num_samples=1000): """ 批量生成偏好数据集 """ preference_data = [] for i, prompt in enumerate(prompts[:num_samples]): if i % 10 == 0: print(f"生成 {i}/{num_samples}...") pref_pair = generate_preference_pair(model, tokenizer, prompt, principles) preference_data.append({ "prompt": prompt, "chosen": pref_pair["chosen"], "rejected": pref_pair["rejected"] }) return preference_data
|
阶段 3:策略优化
使用 RLAIF 训练
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| def train_rlaif(policy_model, ref_model, preference_data, config): """ 使用 AI 生成的偏好数据进行强化学习 """ reward_model = RewardModel(policy_model) reward_model = train_reward_model(reward_model, preference_data, config) ppo_trainer = PPOTrainer( policy_model, ref_model, reward_model, config ) for batch in preference_dataloader: responses = ppo_trainer.generate(batch["prompts"]) rewards = reward_model(responses) ppo_trainer.step(batch["prompts"], responses, rewards) return policy_model
|
完整训练流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| def constitutional_ai_training(base_model, tokenizer, config): """ 完整的 Constitutional AI 训练流程 """ print("阶段 1:自我批评和修订...") sft_data = [] for prompt in training_prompts: revised_response = self_critique_and_revise( base_model, tokenizer, prompt, principles ) sft_data.append({ "prompt": prompt, "response": revised_response }) sft_model = fine_tune(base_model, sft_data, config) print("阶段 2:生成 AI 偏好数据...") preference_data = generate_preference_dataset( sft_model, tokenizer, preference_prompts, principles ) print("阶段 3:RLAIF 训练...") final_model = train_rlaif( sft_model, base_model, preference_data, config ) return final_model
|
评估
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| def evaluate_constitutional_ai(model, tokenizer, test_prompts, principles): """ 评估 Constitutional AI 模型 """ results = [] for prompt in test_prompts: response = self_critique_and_revise( model, tokenizer, prompt, principles ) alignment_score = compute_alignment_score( response, principles, tokenizer ) results.append({ "prompt": prompt, "response": response, "alignment_score": alignment_score }) return results
def compute_alignment_score(response, principles, tokenizer): """ 计算回答与原则的一致性分数 """ score_prompt = f"""请评估以下回答与原则的一致性:
原则: {chr(10).join([f'{i+1}. {p}' for i, p in enumerate(principles)])}
回答:{response}
请给出 1-10 的评分,其中 10 表示完全一致。""" inputs = tokenizer(score_prompt, return_tensors="pt").to(model.device) with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=10, temperature=0.0 ) score_text = tokenizer.decode(outputs[0], skip_special_tokens=True) import re numbers = re.findall(r'\d+', score_text) if numbers: return int(numbers[0]) return 5
|
优势和局限
优势
- 减少人类负担:不需要大量人类反馈
- 可扩展性:可以快速生成大量训练数据
- 一致性:AI 反馈比人类反馈更一致
- 透明度:原则明确,易于审计
局限
- AI 偏见:AI 反馈可能继承训练数据的偏见
- 循环依赖:模型批评自己的输出
- 原则设计:需要仔细设计原则集合
- 评估困难:难以评估 AI 反馈的质量
总结
Constitutional AI 使用 AI 反馈来训练 AI 系统,通过自我批评和修订循环生成偏好数据。这种方法减少了对人类反馈的依赖,但需要仔细设计原则集合以避免偏见和循环依赖。
下一步
下一课将介绍评估方法,用于衡量 LLM 的性能。
📚 本文改编自 AI Engineering from Scratch(MIT License · 作者 Rohit Ghumare),中文内容来自官方中文镜像。原课程共 503 课 · 20 阶段 · 免费开源,教程网站见 aiengineeringfromscratch.com。