LLM微调实战教程:LLaMA-Factory + Unsloth
为什么学微调
商业价值:
- 企业定制AI助手:帮公司微调行业专属模型,单次¥5000-¥50000
- 数据标注+微调一条龙:标注→训练→部署,¥20000+/项目
- 模型优化服务:帮客户把通用模型调成专家模型
- AI培训:教企业团队自己微调,¥5000/天
技术价值:
- 理解AI是怎么"学习"的
- 能定制任何领域专用模型
- 掌握数据工程+模型训练全流程
微调方法对比
| 方法 | 显存需求 | 速度 | 效果 | 适用场景 |
|---|---|---|---|---|
| Full Fine-tuning | 80GB+ | 慢 | 最好 | 大公司 |
| LoRA | 16GB | 快 | 好 | 推荐 |
| QLoRA | 8GB | 中 | 好 | 显存有限 |
| Prefix Tuning | 4GB | 快 | 一般 | 简单任务 |
你的选择:QLoRA(8GB显存就够)或LoRA(16GB显存)
方案1:LLaMA-Factory(推荐新手)
安装
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
数据准备
// data/my_dataset.json
[
{
"instruction": "你是一个电商客服助手",
"input": "我买的衣服尺码不对,怎么退货?",
"output": "您好!退货流程如下:\n1. 打开订单详情页\n2. 点击'申请退货'\n3. 选择退货原因\n4. 等待商家审核(通常24小时内)\n5. 审核通过后寄回商品\n6. 商家确认收货后退款到账\n\n请问您是什么尺码不合适?我可以帮您推荐合适的尺码。"
},
{
"instruction": "你是一个电商客服助手",
"input": "快递显示已签收但我没收到怎么办?",
"output": "您好!这种情况请按以下步骤处理:\n1. 先检查是否放在驿站/快递柜\n2. 询问家人/同事是否代收\n3. 联系快递员确认签收情况\n4. 如确认未收到,请联系我帮您发起物流投诉\n\n我这边会同步帮您跟进,请您放心!"
}
]
训练配置
# configs/my_lora.yaml
model_name_or_path: Qwen/Qwen2.5-14B-Instruct
stage: sft
do_train: true
finetuning_type: lora
lora_rank: 16
lora_alpha: 32
lora_target: all
dataset: my_dataset
template: qwen
cutoff_len: 2048
per_device_train_batch_size: 4
gradient_accumulation_steps: 4
num_train_epochs: 3
learning_rate: 1e-4
output_dir: ./output/my_model
开始训练
# 一行命令开始训练
llamafactory-cli train configs/my_lora.yaml
# 训练完成后导出模型
llamafactory-cli export configs/my_export.yaml
使用微调后的模型
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("./output/my_model")
tokenizer = AutoTokenizer.from_pretrained("./output/my_model")
# 测试
prompt = "你是一个电商客服助手\n用户:快递显示已签收但我没收到怎么办?"
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=500)
print(tokenizer.decode(outputs[0]))
方案2:Unsloth(更快更省显存)
安装
pip install unsloth
训练代码
from unsloth import FastLanguageModel
# 加载模型(4bit量化,省显存)
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Qwen2.5-14B-Instruct-bnb-4bit",
max_seq_length=2048,
load_in_4bit=True,
)
# 添加LoRA
model = FastLanguageModel.get_peft_model(
model,
r=16,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_alpha=32,
lora_dropout=0,
bias="none",
)
# 准备数据
from datasets import load_dataset
dataset = load_dataset("json", data_files="data/my_dataset.json")
# 训练
from trl import SFTTrainer
from transformers import TrainingArguments
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=dataset["train"],
max_seq_length=2048,
args=TrainingArguments(
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
num_train_epochs=3,
learning_rate=2e-4,
output_dir="./output",
),
)
trainer.train()
# 保存
model.save_pretrained("./output/my_lora_model")
数据工程(最重要)
数据质量 > 数据数量
100条高质量数据 > 10000条低质量数据
高质量数据特征:
├── 指令清晰明确
├── 回答专业准确
├── 格式统一规范
├── 覆盖边界情况
└── 包含思维链(CoT)
数据生成方法
# 用GPT-4o生成训练数据
import openai
def generate_training_data(topic: str, n: int = 100):
"""用AI生成训练数据"""
prompt = f"""
生成{n}条关于"{topic}"的训练数据。
格式:JSON数组,每条包含instruction、input、output。
要求:
1. instruction统一为"你是一个{topic}专家"
2. input是用户可能问的问题
3. output是专业、详细的回答
4. 覆盖常见问题和边界情况
"""
response = openai.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
)
return response.choices[0].message.content
# 生成数据
data = generate_training_data("Python编程", 200)
商业化路径
服务1:行业模型定制
流程:
1. 与客户沟通需求(1天)
2. 收集/清洗行业数据(3天)
3. 微调模型(1天)
4. 测试优化(2天)
5. 部署上线(1天)
报价:¥10000-¥50000(视复杂度)
服务2:数据标注+微调一条龙
流程:
1. 客户提供原始数据
2. 你做数据清洗+标注
3. 微调模型
4. 部署+维护
报价:¥20000+
服务3:微调培训
课程:
├── 1天基础班:LoRA原理+实操
├── 3天进阶班:数据工程+模型优化
└── 5天企业班:全流程+部署
报价:¥5000/天
下节预告
下一课:RAG知识库搭建——让AI学习你的私有数据。
评论