Skip to content

模型微调(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 MiniOpenAI API无需 GPU$25/1M tokens
Llama 3.1 8BLoRA16GB3090 可跑
Llama 3.1 70BQLoRA24GB4090 可跑
全量微调 70B-多卡 A100成本高

评估微调效果

微调完成后,用测试集评估:

指标:
- 准确率(回答是否正确)
- 格式符合度(输出格式是否符合要求)
- 人工评估(最重要)

对比:
- 基础模型的效果
- RAG 的效果
- 微调后的效果

常见坑

  • 过拟合:数据量太小,模型"背下了"训练数据
  • 灾难性遗忘:微调后,原有能力下降了
  • 数据泄漏:测试集和训练集有重叠
  • 成本失控:微调次数多,GPU 费用高

相关资源