← 返回

模型微调 (Fine-tuning)

Fine-tuning 是在预训练模型基础上,用特定数据继续训练,让模型更适应你的任务。

什么时候需要 Fine-tuning?

场景 推荐方案 原因
通用问答 直接用 GPT-4/Claude 已有足够能力
特定格式输出 Prompt Engineering 提示词即可实现
私有知识 RAG 微调难学新知识
特定风格/口吻 Fine-tuning ✅ 需要学习风格
领域术语 Fine-tuning ✅ 专业术语优化
降低成本 Fine-tuning ✅ 用小模型替代大模型
减少延迟 Fine-tuning ✅ 小模型更快

Fine-tuning 类型

1. Full Fine-tuning

2. LoRA (Low-Rank Adaptation)

3. QLoRA

4. Prefix Tuning / Prompt Tuning

LoRA 原理

在模型层旁添加低秩矩阵:

原始: W × x
LoRA:  W × x + B × A × x
其中: B ∈ (d × r), A ∈ (r × d), r << d

r (rank) 通常取 8-64,远小于隐藏层维度(4096+),所以参数量很小。

数据准备

格式要求

JSONL 格式,每行一个样本:

{"messages": [
    {"role": "system", "content": "你是一个专业的客服。"},
    {"role": "user", "content": "怎么退款?"},
    {"role": "assistant", "content": "您好,退款流程如下..."}
]}

{"messages": [
    {"role": "system", "content": "你是一个专业的客服。"},
    {"role": "user", "content": "发货时间?"},
    {"role": "assistant", "content": "通常24小时内发货。"}
]}

数据量建议

数据质量 > 数量

训练工具

工具 特点 难度
PEFT/LoRA Hugging Face 官方 中等
Unsloth 超快训练,支持 LLaMA/Qwen 简单
Axolotl 配置化,无需写代码 简单
QLoRA 原始实现 中等
OpenAI FT 托管服务,无硬件需求 最简单

快速开始 (Unsloth)

from unsloth import FastLanguageModel
import torch
from trl import SFTTrainer
from transformers import TrainingArguments
from datasets import load_dataset

# 加载模型
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/llama-3-8b-bnb-4bit",
    max_seq_length = 2048,
    dtype = None,
    load_in_4bit = True,
)

# 添加 LoRA 适配器
model = FastLanguageModel.get_peft_model(
    model,
    r = 16,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_alpha = 32,
    lora_dropout = 0.05,
)

# 加载数据
dataset = load_dataset("csv", data_files="train.csv", split="train")

# 训练
trainer = SFTTrainer(
    model = model,
    train_dataset = dataset,
    dataset_text_field = "text",
    max_seq_length = 2048,
    tokenizer = tokenizer,
    args = TrainingArguments(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        max_steps = 100,
        learning_rate = 2e-4,
        output_dir = "outputs",
    ),
)

trainer.train()

# 保存
model.save_pretrained_gguf("my_model", tokenizer, quantization_method = "q4_k_m")

OpenAI Fine-tuning

import openai

# 上传训练文件
response = openai.File.create(
    file=open("train.jsonl"),
    purpose="fine-tune"
)
file_id = response.id

# 创建微调任务
fine_tune = openai.FineTuningJob.create(
    training_file=file_id,
    model="gpt-4o-mini"
)

# 等待完成
job = openai.FineTuningJob.retrieve(fine_tune.id)

# 使用
completion = openai.ChatCompletion.create(
    model=fine_tune.fine_tuned_model,
    messages=[{"role": "user", "content": "你好"}]
)

超参数建议

参数 LoRA QLoRA
Learning Rate 1e-4 ~ 2e-4 2e-4 ~ 5e-4
Batch Size 4 ~ 16 2 ~ 8
Epochs 3 ~ 5 3 ~ 5
Rank (r) 8 ~ 32 16 ~ 64
Alpha r × 2 r × 2

评估方法

常见问题

Q: 过拟合怎么办?

Q: 显存不够?

Q: 效果不好?

学习资源