为什么要微调?

大模型虽然强大,但通用模型在很多垂直场景下表现不够好:

  • 风格/格式不对:模型的回答风格不符合你的业务要求
  • 知识缺失:模型不知道你的私有领域知识(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 解决的问题,不要微调