主题
模型微调(Fine-tuning)
微调是在预训练大模型的基础上,用自有数据继续训练,使模型适应特定任务或领域。
什么时候需要微调
不需要微调(用 RAG 代替):
- 只是想让模型"知道"某些知识
- 数据量小(< 100 条)
- 预算有限
需要微调:
- 需要改变模型的输出风格/格式
- 需要模型学会特定的推理模式
- 对延迟要求极高(不能每次都传大量上下文)
- 数据隐私要求不能发到第三方 API微调 vs RAG
| 维度 | 微调 | RAG |
|---|---|---|
| 知识更新 | 需重新训练 | 实时更新 |
| 成本 | 高(GPU 训练) | 低(API 调用) |
| 输出风格控制 | ✅ 强 | ❌ 弱 |
| 幻觉 | 仍可能有 | 少 |
| 推荐顺序 | 第二步 | 第一步 |
建议:先用 RAG 验证效果,确实需要再微调。
微调方式
1. Full Fine-tuning(全量微调)
调整模型所有参数,效果好但成本高(需要大量 GPU)。
2. LoRA(推荐)
只训练一小部分参数(低秩矩阵),效果接近全量微调,成本大幅降低:
全量微调:更新 70B 参数 → 需要 A100 多卡
LoRA 微调:只更新 100M 参数 → 单卡 3090 可跑3. QLoRA
LoRA + 量化,进一步降低显存需求,消费级显卡也能微调 70B 模型。
4. Prompt Tuning / Prefix Tuning
只训练输入的前缀向量,成本最低,但效果有限。
数据准备
微调数据的质量比数量重要:
json
// 格式:每条数据是一个对话
{
"messages": [
{ "role": "system", "content": "你是一位 Java 技术专家" },
{ "role": "user", "content": "什么是 Spring Boot?" },
{ "role": "assistant", "content": "Spring Boot 是..." }
]
}
// 一般需要多少条?
- 快速验证:100-500 条
- 生产可用:1000-5000 条
- 高质量:每条数据都经过人工校验数据质量要求
- 一致性:回答风格统一
- 准确性:答案必须正确(错误数据会"教坏"模型)
- 多样性:覆盖各种问法(同义改写)
OpenAI Fine-tuning
python
from openai import OpenAI
client = OpenAI()
# 1. 上传训练数据(JSONL 格式)
file = client.files.create(
file=open("training_data.jsonl", "rb"),
purpose="fine-tune"
)
# 2. 创建微调任务
job = client.fine_tuning.jobs.create(
training_file=file.id,
model="gpt-4o-mini"
)
# 3. 等待完成,然后使用
model = job.fine_tuned_model
# 使用方式和普通模型一样,只是模型名换成微调后的本地模型微调(LoRA)
使用 Hugging Face 的 PEFT 库:
python
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM
# 加载基础模型
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B")
# 配置 LoRA
lora_config = LoraConfig(
r=8, # 秩(越小参数越少,效果略差)
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.1
)
# 应用 LoRA
model = get_peft_model(model, lora_config)
# 训练(使用标准 Trainer)
# ... 训练代码 ...微调成本估算
| 模型 | 微调方式 | 显存需求 | 预估成本 |
|---|---|---|---|
| GPT-4o Mini | OpenAI API | 无需 GPU | $25/1M tokens |
| Llama 3.1 8B | LoRA | 16GB | 3090 可跑 |
| Llama 3.1 70B | QLoRA | 24GB | 4090 可跑 |
| 全量微调 70B | - | 多卡 A100 | 成本高 |
评估微调效果
微调完成后,用测试集评估:
指标:
- 准确率(回答是否正确)
- 格式符合度(输出格式是否符合要求)
- 人工评估(最重要)
对比:
- 基础模型的效果
- RAG 的效果
- 微调后的效果常见坑
- 过拟合:数据量太小,模型"背下了"训练数据
- 灾难性遗忘:微调后,原有能力下降了
- 数据泄漏:测试集和训练集有重叠
- 成本失控:微调次数多,GPU 费用高