
大模型蒸馏:从GPT-5到7B的能力迁移方案
知识蒸馏:用小成本获得大能力 GPT-5很强大但很贵——每次API调用$0.06/1K tokens。如果每天处理10万次查询,月成本$18,000。而7B模型自部署的成本仅为$500/月。 知识蒸馏的核心思想:让小模型学习大模型的"思维方式",而不只是模仿其输出。 Teacher模型 (GPT-5, 175B+) │ │ 知识转移 ▼ Student模型 (Qwen2.5-7B) │ │ 微调 + 对齐 ▼ 蒸馏模型 (7B, 接近GPT-5效果) 三种蒸馏方案 方案1:黑盒蒸馏(最常用) 黑盒蒸馏只需要Teacher模型的输入输出API,不需要访问模型权重或内部状态。 Step 1: 用Teacher生成训练数据 import openai import json from tqdm import tqdm client = openai.OpenAI(api_key="your-key") def generate_training_data(prompts, teacher_model="gpt-5"): """用GPT-5生成高质量训练数据""" training_data = [] for prompt in tqdm(prompts): # 系统提示:让Teacher模型输出详细、有条理的回答 system_prompt = """你是一个专业的AI助手。请按照以下要求回答问题: 1. 回答要详细且有条理 2. 使用适当的格式(标题、列表、代码块) 3. 如果适用,提供示例 4. 确保回答准确且有帮助""" response = client.chat.completions.create( model=teacher_model, messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": prompt}, ], temperature=0.7, # 适度多样性 max_tokens=2000, ) training_data.append({ "instruction": prompt, "output": response.choices[0].message.content, "metadata": { "teacher_model": teacher_model, "temperature": 0.7, } }) return training_data # 生成多样化提示词 def generate_diverse_prompts(domains, num_per_domain=500): """生成覆盖多个领域的多样化提示词""" prompts = [] for domain in domains: # 用Teacher模型生成领域特定提示词 meta_prompt = f"为'{domain}'领域生成{num_per_domain}个多样化的用户问题。" domain_prompts = client.chat.completions.create( model="gpt-5", messages=[{"role": "user", "content": meta_prompt}], ) prompts.extend(domain_prompts.choices[0].message.content.split("\n")) return prompts # 生成数据 domains = ["编程开发", "数据分析", "文案写作", "技术咨询", "数学推理", "创意设计"] prompts = generate_diverse_prompts(domains, num_per_domain=500) training_data = generate_training_data(prompts) # 保存 with open("distill_training_data.json", "w", encoding="utf-8") as f: json.dump(training_data, f, ensure_ascii=False, indent=2) Step 2: 数据质量过滤 def quality_filter(data): """过滤低质量训练数据""" filtered = [] for item in data: output = item["output"] # 长度过滤 if len(output) < 50 or len(output) > 5000: continue # 质量信号检查 quality_signals = [ len(output.split("\n")) > 3, # 有结构 any(kw in output for kw in ["1.", "首先", "因为", "因此"]), # 有逻辑 not output.startswith("I cannot") and not output.startswith("我无法"), # 非拒答 ] if sum(quality_signals) >= 2: filtered.append(item) return filtered Step 3: SFT训练Student模型 from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments from trl import SFTTrainer from peft import LoraConfig, get_peft_model # 加载Student模型 model = AutoModelForCausalLM.from_pretrained( "Qwen/Qwen2.5-7B", torch_dtype=torch.bfloat16, device_map="auto", ) # LoRA配置 lora_config = LoraConfig( r=64, lora_alpha=16, target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM", ) # 训练 training_args = TrainingArguments( output_dir="./distilled-7b", num_train_epochs=3, per_device_train_batch_size=4, gradient_accumulation_steps=4, learning_rate=2e-4, lr_scheduler_type="cosine", warmup_ratio=0.03, bf16=True, logging_steps=10, save_steps=500, ) trainer = SFTTrainer( model=model, args=training_args, train_dataset=dataset, tokenizer=tokenizer, max_seq_length=2048, peft_config=lora_config, ) trainer.train() 方案2:白盒蒸馏(效果更好) 白盒蒸馏利用Teacher模型的内部状态(logits、注意力权重)进行知识转移。 ...