Fine-tuning 是在预训练模型基础上,用特定数据继续训练,让模型更适应你的任务。
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 通用问答 | 直接用 GPT-4/Claude | 已有足够能力 |
| 特定格式输出 | Prompt Engineering | 提示词即可实现 |
| 私有知识 | RAG | 微调难学新知识 |
| 特定风格/口吻 | Fine-tuning ✅ | 需要学习风格 |
| 领域术语 | Fine-tuning ✅ | 专业术语优化 |
| 降低成本 | Fine-tuning ✅ | 用小模型替代大模型 |
| 减少延迟 | Fine-tuning ✅ | 小模型更快 |
1. Full Fine-tuning
2. LoRA (Low-Rank Adaptation)
3. QLoRA
4. Prefix Tuning / Prompt Tuning
在模型层旁添加低秩矩阵:
原始: 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 | 托管服务,无硬件需求 | 最简单 |
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")
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: 效果不好?