前言

网上很多文章上来就教你跑微调代码,但很少讲清楚一个根本问题:你需不需要微调

这篇文章先回答”什么时候需要微调”,再讲清楚微调的核心概念和方法,最后给出一个决策框架。


一、微调 vs RAG:什么时候选哪个

RAG(检索增强) 微调(Fine-tuning)
解决的问题 让模型知道它不知道的事实 让模型学会它不会的行为
典型场景 “公司年假怎么请?” “用公司客服特有的语气回复用户”
数据需求 文档(PDF、TXT、网页等) 几百到几万条”输入-输出”示例对
成本 低,不需要 GPU 训练 中到高,需要 GPU
维护 文档更新即生效 需要重新训练
延迟 多了检索步骤,略慢 没有检索步骤,快
举例 产品手册问答、制度查询 特定风格的文案生成、领域分类、结构化提取

简单判断标准

1
2
3
4
5
6
7
8
你的任务需要模型知道很多事实类信息?
→ 用 RAG

你的任务需要模型以特定的格式/风格/逻辑去推理和生成?
→ 考虑微调

两个都要?
→ RAG + 微调 结合使用

二、全量微调 vs LoRA vs QLoRA

全量微调(Full Fine-tuning)

更新模型的所有参数。效果最好,但对硬件要求极高。

以 7B 参数的模型为例,全量微调需要约 60-80GB 显存(用 AdamW 优化器,还要存梯度、优化器状态)。普通人的显卡(4090 24GB、4070 12GB)根本跑不了。

LoRA(Low-Rank Adaptation)

在原始模型旁边挂载小的可训练矩阵,训练时冻结原模型参数,只更新这些小矩阵。

1
2
3
4
5
6
原模型权重(冻结) + LoRA 矩阵(可训练) = 最终模型

7B 模型的 LoRA:
- 原模型: 约 14GB(FP16,冻结不动)
- LoRA 参数: 约 10-50MB(仅训练这个)
- 训练显存: 约 16-24GB(一张 4090 就够)

QLoRA

LoRA + 把原模型量化到 4-bit。进一步降低显存需求。

1
2
3
QLoRA 训练 7B 模型:
- 显存需求: 约 8-14GB
- 消费级显卡(4070 12GB, 4060 8GB)就能跑

三者的关系:

模型参数量 训练速度 效果
全量微调 最多 最慢 最好(理论上)
LoRA 极少(<1%) 接近全量微调
QLoRA 极少(<1%) 较快 略低于 LoRA,差距很小

结论:除非你有成百上千张 A100,否则 LoRA/QLoRA 就是你唯一实际可用的选择。好消息是它的效果通常也够用了。


三、微调的数据准备

数据格式

最常用的是 Alpaca(指令微调)格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[
{
"instruction": "将以下句子翻译成英文",
"input": "今天天气真好",
"output": "The weather is really nice today."
},
{
"instruction": "将以下句子翻译成英文",
"input": "明天可能会下雨",
"output": "It might rain tomorrow."
},
{
"instruction": "判断以下句子的情感倾向(正面/负面/中性)",
"input": "这个产品太差了,用了一天就坏了",
"output": "负面"
}
]

也支持更简单的对话格式(ShareGPT 格式):

1
2
3
4
5
6
7
8
9
[
{
"conversations": [
{"role": "system", "content": "你是一个翻译助手"},
{"role": "user", "content": "翻译:你好"},
{"role": "assistant", "content": "Hello"}
]
}
]

数据量多少才够

任务类型 最少数据量 推荐数据量
风格/格式调整 100~500 条 1000~3000 条
领域知识注入 500~2000 条 3000~10000 条
复杂推理任务 2000~5000 条 10000+ 条

数据质量比数量重要得多。1000 条精心标注的高质量数据,效果往往好于 10000 条随便爬的数据。

数据质量检查清单

  • 每条 instruction 表述清晰,人看了知道该做什么
  • output 格式一致,没有前半条是 JSON 后半条是 plain text
  • 覆盖了预期的使用场景,没有明显遗漏
  • 排除了明显错误的样本(标注错误、前后矛盾)
  • 训练集和验证集不重叠

四、微调成本估算

以 QLoRA 微调 Qwen2.5-7B 为例,在 4090 24GB 上:

数据量 训练时间 电费(约) 平台费用(AutoDL 4090)
500 条 ~20 分钟 <1 元 ~2 元
2000 条 ~1.5 小时 ~1 元 ~5 元
5000 条 ~4 小时 ~2 元 ~15 元
10000 条 ~8 小时 ~4 元 ~30 元

省钱操作

  • 先用 500 条跑一轮,看效果趋势,效果好再加数据
  • 使用云 GPU(AutoDL、恒源云)比自己买显卡划算
  • 社区有很多预训练好的 LoRA 权重,找到合适的直接合并使用

五、什么时候不应该微调

  1. 需求是加知识:放文档用 RAG 就行,没必要微调
  2. 数据不够:少于 100 条高质量数据,微调效果很难保证
  3. 频繁变化的信息:比如每日更新的产品库存——微调跟不上变化速度
  4. 用更好的 prompt 就能解决:很多时候不是模型不行,是 prompt 没写好。先使劲优化 prompt,还不行再考虑微调
  5. 有现成的 API 能搞定:GPT-4o 加一个好的 system prompt 能解决大部分问题

六、决策流程

1
2
3
4
5
6
7
你要做什么?
├── 需要模型知道新信息 → RAG
│ └── 还想让模型风格化输出 → RAG + 微调
├── 需要模型按特定风格/格式输出 → 先试更好的 prompt
│ └── prompt 不够 → 微调(少量数据即可)
├── 需要模型做新的推理任务 → 微调(需要较多数据)
└── 不确定 → 先用 RAG + 好 prompt 试试,最后再考虑微调

RAG 是快刀,微调是重剑。大多数实际需求用 RAG 加一个仔细设计的 prompt 就能解决。只有当你确实需要模型”学会一种新的做事方式”时,才上微调。

下一篇文章会讲具体怎么用 LLaMA-Factory 做 LoRA 微调。