先泼冷水:你真的需要微调吗
动手之前先对号入座,三个判断:
- 提示词能解决的,不微调。 少样本示例、格式要求写进 prompt 就能稳定生效的话,微调是杀鸡用牛刀,还引入一整套训练与维护成本
- 知识要实时更新的,用 RAG。 RAG(检索增强生成)是把外部资料检索出来拼进上下文再回答。微调教的是「风格与格式」,不是「新知识」——往权重里塞事实又贵又容易过时,还容易编造
- 微调适合的:固定风格(品牌语气)、固定格式(稳定输出某种结构)、领域行话(内部术语与缩写的用法)
确认需求落在这里,再往下看。升级路径也建议渐进:先把提示词与少样本示例调到稳定,仍不够再上 LoRA——每一步都要有可衡量的收益,才值得进下一步。
LoRA 一段话原理
LoRA(Low-Rank Adaptation,低秩适配):冻结原模型的全部权重,在旁边训练一对小矩阵(低秩增量矩阵),推理时把增量的乘积加回原输出。好处有三:训练参数量骤降(量级上通常只有全量微调的百分之一以下),显存需求随之骤降,消费级显卡可训;产物是独立的小适配器文件,可插拔——一个基座模型挂多个 LoRA 按需切换;也可合并——把增量合并进原权重,部署时零额外开销。为什么「低秩」就够用?一个被广泛接受的解释是:微调造成的权重变化本身集中在低维子空间里,用低秩矩阵就能表达大部分调整。
LlamaFactory 是什么
一个开源微调工具箱:把数据格式、训练循环、显存优化策略、导出与部署全部封装好,提供 CLI 与 WebUI 双入口(llamafactory-cli webui 启动)。你只负责准备数据与选参数,不用自己写 Trainer,也不用研究分布式训练的各种细节,主流开源模型的 LoRA 与全量微调都支持。数据格式除了本文用的 Alpaca 风格,也支持多轮对话格式与偏好对齐数据,覆盖常见的微调场景。
三步实战
第一步:准备数据集
用 Alpaca 风格的 instruction/output 格式准备 JSON(以「工单分类」为例):
[
{
"instruction": "把下面的工单归类为:退货、换货、咨询之一。",
"input": "收到的保温杯杯盖有裂缝,想要一个新的。",
"output": "换货"
}
]
数据放进 LlamaFactory 的 data 目录,并在 data/dataset_info.json 里注册:
{
"ticket_clf": {
"file_name": "ticket_clf.json"
}
}
样本量:几百到几千条高质量数据起步,质量远比数量重要——脏数据会被忠实地上学进去。投喂前做三件事:去重、统一格式、抽查 output 的长度分布——满篇超短回答的数据,训出来的模型也只会说短句。
第二步:配置训练参数
model_name_or_path: Qwen/Qwen2.5-7B-Instruct
template: qwen
stage: sft
finetuning_type: lora
lora_rank: 8
lora_target: all
dataset: ticket_clf
cutoff_len: 1024
learning_rate: 5.0e-5
num_train_epochs: 3.0
per_device_train_batch_size: 2
output_dir: saves/qwen2.5-7b-ticket-lora
关键参数逐个一句话:
lora_rank:增量矩阵的秩,越大表达力越强也越容易过拟合;格式与风格类任务从 8 起步learning_rate:LoRA 常在 1e-5 到 1e-4 之间,过大是最常见的翻车点cutoff_len:单条样本的截断长度,覆盖最长样本即可,设大了白占显存num_train_epochs:数据少时 2–3 轮足够,轮数多了模型开始背答案- 显存不够的抓手:减小 batch size、调低 cutoff_len,或者用量化基座训练(QLoRA),消费级显卡也能跑 7B 级
第三步:训练与导出
llamafactory-cli train ticket_lora_sft.yaml
训练完的 LoRA 适配器在 output_dir。要拿去独立部署,用 export 把增量合并进原权重:
model_name_or_path: Qwen/Qwen2.5-7B-Instruct
adapter_name_or_path: saves/qwen2.5-7b-ticket-lora
template: qwen
export_dir: models/qwen2.5-7b-ticket-clf
llamafactory-cli export ticket_export.yaml
导出的完整模型可以正常交给 vLLM、Ollama 等推理方案部署,与任何普通模型无异。
常见坑
- 过拟合:数据太少加轮数太多,输出开始机械复读训练集的句式,换个说法就不会了。对策:控制轮数、扩充数据多样性
- 灾难性遗忘:只喂窄域数据,通用能力(正常对话、常识问答)明显退化。对策:混入一定比例的通用样本
- 学习率过大:loss 震荡不降甚至发散,输出乱码。对策:从 5e-5 这类保守值开始,稳定了再试更大
效果评测最小法
不必上专业评测框架:留出 20 条不进训练的用例,微调前后各跑一遍,人工对比。这 20 条固定不动,每次改配置重跑,就是最小可用的回归集。判断标准两条:目标行为(格式、风格、归类)是否稳定出现;通用能力是否还正常。条件允许的话,让没参与数据准备的同事来盲评,避免「自己训的自己看怎么都好」。
小结
- 先判断需求类型:提示词能解决的不微调,知识更新用 RAG,微调适合固定风格、格式与领域行话
- LoRA 冻结原权重、旁路训练低秩增量,消费级显卡可训,可插拔可合并
- LlamaFactory 把数据注册、训练配置、导出部署全流程封装,三步完成微调
- 最常见的坑是过拟合、灾难性遗忘与学习率过大;留 20 条用例做前后对比,就是最小评测
读者留言
COMMENTS 暂无还没有留言,来说第一句?