
一、按训练目标 / 训练阶段日常说的 SFT、偏好、强化微调1. 普通微调SFT 监督指令微调就是你说的「普通微调」最基础一环全称Supervised Fine-Tuning 监督微调数据标准问答、对话、领域标准答案单条正样本作用教会模型听懂指令、固定输出格式、学习行业知识法律 / 医疗 / 代码例子给模型几千条客服问答让它学会标准回复2. 继续预训练微调 CPT领域知识扩充微调很多人容易忽略属于前置知识微调数据无标注领域长文本行业文档、书籍、论文作用给底座模型灌入全新专业知识先扩充知识库再做 SFT场景垂直行业专用大模型如医疗、金融专属底座3. 偏好微调离线偏好对齐DPO/ORPO/KTO你说的「偏好微调」不带强化学习现在工业主流替代 RLHFDPO 直接偏好优化最常用 用「同一个问题好回答 vs 差回答」成对偏好数据纯监督损失不用奖励模型、不用 PPO 强化。ORPO 对比偏好优化 一步融合 SFT 偏好对齐省去单独 SFT 阶段轻量化训练。KTO 知识偏好优化 侧重区分有用 / 无用回答适合客服、知识库场景。4. 强化微调RLHF 人类反馈强化学习PPO你说的「强化微调」唯一带奖惩函数 强化训练的对齐方案 完整三步SFT 基础微调 → 2. 训练奖励模型打分 / 奖惩函数 → 3. PPO 强化学习迭代优化特点依靠奖惩函数引导模型生成人类更喜欢的回答对齐价值观、安全、人性化缺点算力大、训练不稳定。 衍生强化对齐GRPO推理专用强化微调数学 / 代码提升巨大5. 对比微调 CPT Contrastive Prompt Tuning小众辅助微调区分正负样例提升意图识别、上下文区分能力。二、按参数更新方式PEFT 参数高效微调所有上面的微调都能搭配不是训练目标但日常开发都会区分「全量微调 / LoRA 微调」全参数微调 Full FT 更新模型全部权重效果最好显存成本极高仅 7B 以下小模型偶尔使用。LoRA 低秩适配器微调主流 冻结主模型只训练少量低秩矩阵显存消耗极低单卡可训 70B。QLoRA 量化 LoRA 4bit 量化底座极致省显存低配显卡微调超大模型。Adapter / P-Tuning v2 前缀微调 插入额外小网络 / 可学习 prompt适合分类、小样本任务。最简流水线顺序通用大模型训练流程底座预训练 → CPT 领域预训练可选→SFT 普通微调→DPO 偏好微调/RLHF 强化微调一句话区分你提到的三类普通 SFT教模型「标准答案怎么说」偏好 DPO教模型「哪个回答更好」纯监督无强化强化 RLHF用奖惩函数 PPO 反复试错强制模型往高分回答靠拢带强化训练RLHF为例1. 环境准备首先确保安装了必要的库bashpip install trl peft transformers datasets2. 完整的修正版代码pythonimport re from datasets import Dataset from transformers import AutoTokenizer, AutoModelForCausalLM from peft import LoraConfig from trl import GRPOConfig, GRPOTrainer # 1. 准备数据集 # 模拟一个包含 prompt 和 ground_truth 的数据集 data [ {prompt: 11等于几, ground_truth: 2}, {prompt: 中国的首都是哪里, ground_truth: 北京}, ] dataset Dataset.from_list(data) # 2. 编写正确的奖惩逻辑 # 注意trl 的 reward_funcs 接收的参数是 (completions, **kwargs) # kwargs 中会自动包含数据集里的其他字段如 ground_truth # 返回值必须是一个包含浮点数的列表长度等于 completions 的数量 # 奖惩逻辑1格式奖励强制模型使用 answer 标签 def format_reward(completions, **kwargs): pattern ranswer(.*?)/answer rewards [] for completion in completions: # 检查模型输出是否包含正确的标签 match re.search(pattern, completion[0][content]) if match: rewards.append(0.5) # 格式正确给 0.5 分好的 else: rewards.append(0.0) # 格式错误给 0 分坏的 return rewards # 奖惩逻辑2准确率奖励检查答案是否与标准答案一致 def accuracy_reward(completions, ground_truth, **kwargs): rewards [] for completion, gt in zip(completions, ground_truth): content completion[0][content] match re.search(ranswer(.*?)/answer, content) if match and match.group(1).strip() str(gt).strip(): rewards.append(1.0) # 答案正确给 1 分极好 else: rewards.append(0.0) # 答案错误给 0 分坏 return rewards # 3. 配置并启动微调 # 这里使用一个小模型作为示例实际可替换为 Qwen 等模型 model_id Qwen/Qwen2.5-0.5B-Instruct # 配置 GRPO 训练参数 training_args GRPOConfig( output_dir./qwen-grpo-output, num_train_epochs3, per_device_train_batch_size2, logging_steps5, learning_rate5e-5, ) # 配置 LoRA 进行高效微调 peft_config LoraConfig( task_typeCAUSAL_LM, r8, lora_alpha16, lora_dropout0.05, ) # 初始化 GRPO 训练器 trainer GRPOTrainer( modelmodel_id, argstraining_args, train_datasetdataset, reward_funcs[format_reward, accuracy_reward], # 【核心】注入奖惩逻辑 peft_configpeft_config, ) # 开始训练模型会根据奖惩函数的反馈不断调整权重 if __name__ __main__: trainer.train() 核心修正点说明奖励函数签名trl的奖励函数必须接收completions作为第一个参数数据集里的其他字段如ground_truth会通过**kwargs自动传入。返回值格式奖励函数必须返回一个列表列表的长度必须与传入的completions长度严格一致。数据结构completions是一个嵌套列表每个元素是[{content: 模型生成的文本}]所以提取文本时需要用completion[0][content]。