微调是修改模型本身的"记忆"和行为。如果模型"不知道答案"→ 用 RAG;如果模型"知道但说不对"→ 用微调。
RAG(检索增强)
本质:外挂知识库,不改模型
改什么:只改外部数据
适用:知识问答、文档检索
数据量:越多越好
更新知识:随时加文档,立即可用
微调(Fine-tuning)
本质:修改模型参数权重
改什么:改模型内部的"记忆"
适用:风格模仿、格式输出、领域术语
数据量:几十到几千条高质量样本
更新知识:重新训练,几小时到几天
05 线上微调:阿里云百炼
使用阿里云百炼平台,无需 GPU,零代码完成模型微调。
4.1 准备微调数据
百炼使用 JSONL 对话格式,每行一条 JSON 对象:
{"messages": [
{"role": "system", "content": "你是XX产品的客服助手,回答要简洁专业。"},
{"role": "user", "content": "怎么退款?"},
{"role": "assistant", "content": "您好,退款请在订单详情页点击「申请退款」,1-3个工作日原路返回。"}
]}
- 至少 50~100 条 高质量样本(质量 > 数量)
- 覆盖你想让模型学会的各种场景
- 同一个问题用不同问法问("多久能下来"/"审核需要多长时间")
- 至少 10~20% 是多轮对话
4.2 创建微调任务
登录百炼控制台
打开 bailian.console.aliyun.com → 左侧菜单「模型训练」→「模型微调」
选择基础模型
推荐 qwen3-8b(和你本地用的 Qwen3-4B 同系列,中文效果好,性价比高)。
选择训练方式
选 LoRA(高效训练):只训练模型一小部分参数,速度快 5~10 倍,成本低,适合初学者。
4.3 参数配置
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 学习率 (learning_rate) | 1e-4 | 小数据量不宜太高,防止过拟合 |
| 训练轮数 (n_epochs) | 3 | 50~100 条数据跑 3 轮足够 |
| LoRA Rank | 8 | 小数据小 rank 更稳定 |
| LoRA Alpha | 16 | 通常为 rank 的 2 倍 |
| LoRA Dropout | 0.1 | 标准值 |
| 最大序列长度 (max_length) | 2048 | 问答格式每条只有几百 token |
| 验证集比例 | 10% | 数据量小可调到 5% |
| 验证步数 (eval_steps) | 5 | 总步数少时不能设太高 |
如果报 The validation set size (9) must be larger than the minimum required size,说明验证集太小。解决方案:① 降低验证集比例到 5%;② 扩充数据量到 100 条以上。
4.4 训练产出
| 配置项 | 建议 |
|---|---|
| Checkpoint 保存间隔 | 每 1 个 epoch 保存一个 |
| 导出数量上限 | 最多保存 3 个 |
| 模型加密 | 开启(平台默认) |
训练完成后最后一个 checkpoint 自动发布为模型,可在百炼的模型推理中测试,或部署成 API 接入 FastGPT 使用。
06 本地微调:LLaMA-Factory
使用 LLaMA-Factory WebUI 可视化微调,几乎不用写代码。
5.1 硬件要求
| 模型 | QLoRA 4bit 最低显存 | 推荐显存 |
|---|---|---|
| Qwen2.5-7B (4bit) | 6 GB | 8 GB+ |
| Qwen2.5-1.5B (4bit) | 2 GB | 4 GB+ |
5.2 环境安装
安装 Python 3.10
从 python.org 下载,安装时务必勾选 "Add Python to PATH"。
创建虚拟环境
cd D:\
mkdir llm-finetune
cd llm-finetune
python -m venv venv
.\venv\Scripts\Activate.ps1
先执行:Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser,选 Y。
安装依赖
python -m pip install --upgrade pip
pip install torch==2.3.1 --index-url https://download.pytorch.org/whl/cu121
pip install "llamafactory[gpu,bitsandbytes]"
验证 PyTorch GPU:python -c "import torch; print(torch.cuda.is_available())",输出 True 即成功。
5.3 数据格式转换
LLaMA-Factory 使用 Sharegpt 格式,需要把百炼的 JSONL 数据转一下:
| 百炼格式 | LLaMA-Factory 格式 |
|---|---|
"role": "system" | "from": "system" |
"role": "user" | "from": "human" |
"role": "assistant" | "from": "gpt" |
顶层 key: "messages" | 顶层 key: "conversations" |
转换脚本
python -c "
import json, os, shutil
src = r'D:\work-mode-projects\6a87f3bdaab9df26fba9b0cf\网站备案微调数据.jsonl'
data_dir = r'D:\llm-finetune\venv\lib\site-packages\llamafactory\data'
dst = os.path.join(data_dir, 'website_filing.jsonl')
with open(src, 'r', encoding='utf-8') as f:
lines = f.readlines()
converted = []
for line in lines:
obj = json.loads(line.strip())
conversations = []
for msg in obj.get('messages', []):
role = 'system' if msg['role'] == 'system' else ('human' if msg['role'] == 'user' else 'gpt')
conversations.append({'from': role, 'value': msg['content']})
converted.append({'conversations': conversations})
with open(dst, 'w', encoding='utf-8') as f:
for item in converted:
f.write(json.dumps(item, ensure_ascii=False) + '\n')
print(f'转换完成:{len(converted)} 条')
"
注册数据集
在 data/dataset_info.json 中添加:
{
"website_filing": {
"file_name": "website_filing.jsonl",
"formatting": "sharegpt",
"columns": {
"messages": "conversations"
}
}
}
5.4 启动 WebUI 并配置训练
启动 WebUI
# 设置 HuggingFace 镜像加速(国内必选)
$env:HF_ENDPOINT="https://hf-mirror.com"
llamafactory-cli webui
浏览器自动打开 http://localhost:7860。
WebUI 配置
| 设置项 | 推荐值 | 说明 |
|---|---|---|
| 模型名称 | Qwen2.5-7B-Instruct | 从 HuggingFace 自动下载 |
| 微调方法 | lora | 参数高效微调 |
| 量化等级 | 4 | 4bit QLoRA,省显存(关键!) |
| 量化方法 | bnb | bitsandbytes 量化 |
| 计算类型 | fp16 | AMD GPU 兼容性好 |
| 数据集 | website_filing | 注册的数据集名 |
| 学习率 | 1e-4 | 标准 LoRA 学习率 |
| 训练轮数 | 3 | 小数据量 3 轮 |
| 批处理大小 | 2 | 显存小用 2 |
| 梯度累积 | 8 | 补偿小 batch(有效 batch=16) |
| 截断长度 | 2048 | 问答数据每条几百 token |
| 验证集比例 | 0.1 | 10% 验证集 |
开始训练
点击「开始」按钮,等待训练完成。训练时可以实时看 loss 曲线,持续下降说明有效。训练完成后在「导出」页面导出模型,可导入 Ollama 在 FastGPT 中使用。
LLaMA-Factory 需要 HuggingFace 格式的模型(.safetensors 文件),不能直接用 Ollama 的 GGUF 格式。模型路径留空,让框架从 HuggingFace 自动下载。