开源大模型的使用链路可以概括为:从 Hugging Face 获取模型和数据,使用 Unsloth 等工具完成 LoRA 或 QLoRA 微调,再根据部署环境导出为 Safetensors 或 GGUF。本篇笔记梳理这条链路中最容易混淆的概念,并给出一套可落地的微调流程。
- Hugging Face
- Unsloth https://unsloth.ai/docs/zh/mo-xing/deepseek-v4?select=gguf-%2B-4%E4%BD%8D,%E6%8C%87%E4%BB%A4%E7%89%88-16%E4%BD%8D#llama.cpp-guide
Hugging Face 是什么
Hugging Face 是开源 AI 社区和模型协作平台。它与 GitHub 类似,但主要管理机器学习相关资源:
- Models:预训练模型、微调模型和量化模型;
- Datasets:训练集、验证集和评测集;
- Spaces:可在线运行的模型演示;
- Transformers:加载、训练和推理模型的 Python 库;
- Hub:保存模型版本、配置文件、分词器和模型说明。

一个模型仓库通常不只有权重文件,还可能包含 config.json、分词器、聊天模板和模型说明。下载模型时,应先确认许可证、基础模型、参数规模、上下文长度以及运行框架是否兼容。
Unsloth 是什么
Unsloth 是一个面向大语言模型训练和推理的开源框架,重点是降低微调所需的显存和训练时间。它支持常见的 Llama、Qwen、Gemma 等模型,并提供 Notebook、Python API 和本地 Studio 界面。
Unsloth 常见用途包括:
- 使用 LoRA 或 QLoRA 微调指令模型;
- 进行监督微调(SFT)和部分强化学习训练;
- 加载 4-bit 模型以降低显存占用;
- 保存 LoRA Adapter;
- 合并并导出 Safetensors;
- 导出 GGUF,供 Ollama、LM Studio 或 llama.cpp 使用。
Unsloth 是训练和转换工具,不是模型仓库,也不是一种模型格式。实际使用时,它通常与 Hugging Face、Transformers、TRL 和 PEFT 配合工作。
GGUF 和 Safetensors 有什么区别
两者都是模型文件格式,但面向的阶段不同:Safetensors 更适合训练和 GPU 推理,GGUF 更适合本地部署。
| 对比项 | GGUF | Safetensors |
|---|---|---|
| 主要用途 | 本地推理、量化部署 | 训练、微调和 GPU 推理 |
| 常见框架 | llama.cpp、Ollama、LM Studio、KoboldCpp | Transformers、PyTorch、Unsloth、vLLM |
| 常见精度 | Q2、Q4、Q5、Q6、Q8、FP16 | FP32、BF16、FP16,也可以保存量化权重 |
| 文件内容 | 权重及较完整的模型、分词器元数据 | 主要保存张量,配置通常位于其他 JSON 文件中 |
| 文件组织 | 经常一个 .gguf 文件即可运行 |
可能由多个 .safetensors 分片和配置文件组成 |
| CPU 运行 | 非常适合 | 通常不是首选 |
| 继续训练 | 支持有限,通常需使用训练版本的权重 | 非常适合 |
| 安全性 | 数据文件本身不执行代码 | 专为安全加载设计,不使用 pickle 反序列化 |
需要注意,GGUF 不等于量化。GGUF 也能保存 FP16 权重,只是最常见的 GGUF 文件通常采用 Q4、Q5 或 Q8 量化。Safetensors 同样不代表某种固定精度,它只是安全存储张量的格式。
选择方式可以简化为:
- 还要训练、继续微调或使用 Transformers:保留 Safetensors;
- 只需要在个人电脑上聊天:导出 GGUF;
- 显存或内存有限:可从
Q4_K_MGGUF 开始测试; - 需要保留高质量母版:保存 BF16 或 FP16 Safetensors,以及 LoRA Adapter。
格式细节可以参考 GGUF 规范和 Safetensors 文档。
模型量化是什么
模型权重通常使用 FP32、FP16 或 BF16 表示。量化会用更少的位数保存或计算权重,例如 INT8 或 4-bit,从而降低存储、显存和内存需求。
量化的主要收益是:
- 模型文件更小;
- 加载所需内存更少;
- 部分硬件上的推理速度更快。
代价是可能产生精度损失。位数越低,压缩越明显,通常也越需要关注输出质量。实际选择不能只看文件大小,还应使用与业务相关的问题进行对比评测。
PTQ 与 QAT
训练后量化(Post-Training Quantization,PTQ)是在模型训练完成后直接压缩权重,不再进行完整训练。它成本低,是本地部署中最常见的方案,大多数 GGUF 量化模型属于这一类。
量化感知训练(Quantization-Aware Training,QAT)则在训练期间模拟低精度计算产生的误差,让模型提前适应量化。QAT 通常能更好地保持低位模型的效果,但训练过程更复杂、成本也更高。
可以简单理解为:PTQ 是“先训练,再压缩”;QAT 是“训练时就为压缩做准备”。
LoRA 与 QLoRA
全量微调会更新模型的大部分或全部参数,硬件成本较高。LoRA(Low-Rank Adaptation)冻结基础模型,在特定线性层旁增加小型低秩矩阵,训练时只更新这些新增参数。
因此 LoRA 具有以下特点:
- 需要训练的参数更少;
- 显存占用明显降低;
- 生成的 Adapter 文件较小;
- 同一个基础模型可以切换不同任务的 Adapter。
QLoRA 会进一步以 4-bit 加载冻结的基础模型,同时训练 LoRA 参数。与 16-bit LoRA 相比,它更适合消费级显卡,但可能略慢,并存在轻微的精度取舍。
| 方法 | 基础模型精度 | 显存需求 | 适合场景 |
|---|---|---|---|
| 全量微调 | 通常为 BF16 或 FP16 | 很高 | 资源充足、需要深度改变模型能力 |
| LoRA | 通常为 BF16 或 FP16 | 中等 | 重视训练质量且显存充足 |
| QLoRA | 通常以 4-bit 加载 | 较低 | 消费级显卡、低成本实验 |
一次完整的微调流程

1. 明确目标并建立基线
先确定微调要改变什么,例如回答格式、术语使用、客服话术或特定任务能力。微调前使用固定问题测试基础模型,保存回答和指标,作为后续对比基线。
不要把所有问题都交给微调解决。需要实时更新的事实更适合使用 RAG;需要严格执行的结构可以先尝试提示词、工具调用或输出校验。
2. 准备数据
聊天微调可使用 messages 格式,每条样本包含 system、user 和 assistant 消息:
{
"messages": [
{"role": "system", "content": "你是一名专业客服助手。"},
{"role": "user", "content": "退款多久到账?"},
{"role": "assistant", "content": "审核通过后,通常会在 1 至 5 个工作日内原路退回。"}
]
}
使用 JSONL 时,每条完整 JSON 记录占一行。数据整理时应注意:
- 答案正确,表达风格一致;
- 去除重复、乱码和互相矛盾的样本;
- 训练数据应覆盖真实输入的不同说法;
- 留出约 5%~10% 作为验证集;
- 先用少量高质量数据验证流程,再逐步扩大规模。
3. 选择基础模型
优先选择已经具备目标语言和基础任务能力的 Instruct 模型。模型越大不一定越合适,还要考虑许可证、显存、推理速度和最终部署环境。
训练一般从 Hugging Face/Safetensors 模型开始,而不是直接拿量化 GGUF 继续微调。模型与数据必须使用匹配的聊天模板,否则可能出现角色标签泄漏、重复生成或停止符失效。
4. 设置 LoRA 参数
一套适合初次实验的起始参数如下:
| 参数 | 建议起点 | 说明 |
|---|---|---|
load_in_4bit |
true |
启用 QLoRA,降低显存占用 |
r |
16 |
LoRA Rank;复杂任务可尝试 32 |
lora_alpha |
16 或 32 |
控制 LoRA 更新强度 |
lora_dropout |
0 |
Unsloth 优化配置;过拟合时可调整 |
max_seq_length |
2048 |
应结合训练样本长度和显存设置 |
learning_rate |
2e-4 |
普通 LoRA/QLoRA 的常见起点 |
num_train_epochs |
1~3 |
训练过多容易记忆数据 |
LoRA 通常应用到注意力和 MLP 的主要线性层:
target_modules = [
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",
]
具体参数应通过验证结果调整,不能只观察训练损失。Unsloth 的 LoRA 参数指南提供了更详细的解释。
5. 训练、评估并迭代
训练结束后,使用微调前相同的测试集进行比较,同时增加训练集中未出现过的表达方式。重点观察:
- 目标任务的正确率是否提高;
- 通用能力是否明显下降;
- 是否出现固定套话、过度拒答或重复输出;
- 输出格式和风格是否稳定;
- 验证集损失是否开始上升。
如果效果不足,可以检查数据覆盖范围、聊天模板、学习率、Rank 和训练轮数;如果模型只是复述训练样本,则应减少轮数、补充数据或增加正则化。调参后重新与基线比较,直到满足目标。
保存与部署
训练完成后通常保留三种产物:
- LoRA Adapter:体积最小,但推理时需要原始基础模型;
- 合并后的 Safetensors:适合 Transformers、vLLM 或后续继续处理;
- 量化 GGUF:适合 Ollama、LM Studio 和 llama.cpp 本地部署。
如果只保存 GGUF,后续继续训练会比较困难。因此建议至少保留 LoRA Adapter、tokenizer、训练配置、基础模型名称和数据版本;有足够存储空间时,再保留合并后的高精度 Safetensors。
常见误区
微调等于给模型添加知识
微调更擅长改变行为、格式和表达方式。对于频繁更新、必须可追溯的事实,RAG 通常更合适。
训练损失越低越好
损失持续下降不代表泛化能力持续提高。模型可能只是在记忆训练集,因此必须保留独立验证数据,并进行人工测试。
直接使用 GGUF 训练
GGUF 主要面向推理。常规 Unsloth LoRA 流程应使用其支持的 Hugging Face 模型或 Safetensors 权重,训练后再导出 GGUF。
忽略聊天模板
不同模型使用不同的角色标记、停止符和特殊 Token。训练和推理模板不一致,会直接影响模型输出。
总结
Hugging Face 负责模型与数据的发现和分发,Unsloth 提供低成本的训练与导出能力;Safetensors 更接近训练和 GPU 推理生态,GGUF 更接近本地量化部署。显存有限时,可以从 4-bit QLoRA、Rank 16、1~3 个 Epoch 开始,但最终效果主要取决于数据质量、聊天模板和评估方法。
完整实践可以从 Unsloth 官方教程开始,并优先保存可继续训练的 Adapter 或 Safetensors,再按部署需要生成 GGUF。