为什么要微调?
大模型虽然强大,但通用模型在很多垂直场景下表现不够好:
- 风格/格式不对:模型的回答风格不符合你的业务要求
- 知识缺失:模型不知道你的私有领域知识(RAG 可以补一部分,但有些场景必须微调)
- 指令遵循能力弱:复杂指令下模型容易跑偏
微调(Fine-tuning)就是解决这些问题的方案——在通用模型的基础上,用你的数据继续训练,让它适应特定场景。
LoRA:最主流的微调方式
什么是 LoRA?
LoRA(Low-Rank Adaptation)的核心思想非常巧妙:不修改原模型参数,而是在模型旁边挂一些小型的可训练矩阵。
原始模型(冻结) LoRA 适配器(训练)
┌─────────────┐ ┌──────┐
│ 权重矩阵 W │ + │ BA │
│ (d × d) │ │(d×r) │
└─────────────┘ └──────┘
rank r
训练时只更新 LoRA 参数(通常只有原模型参数的 0.1%-1%),推理时把 LoRA 权重合并回原模型,零额外推理开销。
QLoRA:更进一步
QLoRA = Quantized LoRA,把原模型量化到 4-bit 再挂 LoRA,显存需求降低 4 倍。
| 方式 | 显存需求(7B 模型) | 训练速度 | 效果 |
|---|---|---|---|
| 全参微调 | ~56GB(需要 A100-80G) | 1x | 最佳 |
| LoRA | ~28GB(A100-40G / 3090) | 0.95x | 接近全参 |
| QLoRA | ~12GB(RTX 4090 / 3090) | 0.8x | 略低于 LoRA |
QLoRA 让消费级显卡也能微调 7B 模型,是目前个人开发者最推荐的方式。
数据准备 —— 决定微调效果的关键
数据格式
目前主流是 对话格式(Chat Format),每条数据包含多轮对话:
{
"messages": [
{"role": "system", "content": "你是一个 AI 编程助手。"},
{"role": "user", "content": "Python 中如何合并两个字典?"},
{"role": "assistant", "content": "Python 3.9+ 可以使用 | 运算符:dict1 | dict2。更早版本可以用 {**dict1, **dict2} 或 dict1.update(dict2)。"}
]
}
数据量:一般 500-5000 条高质量对话就够了。质量远重要于数量——10 条精心标注的数据好过 1000 条噪数据。
数据清洗清单
```
□ 去除重复数据(editdistance 数据数量——500 条好数据胜过 10000 条脏数据
3. LoRA rank 从 16 开始,根据任务复杂度调整
4. 用验证集监控过拟合,不要盲目多跑 epoch
5. 微调不是万能的**——能通过 RAG 解决的问题,不要微调