目录


第一章:一句话理解微调

微调不是让模型变聪明

大模型在预训练阶段已经"什么都知道了"。但问题是——它不知道你要它做什么

微调 = 让模型学会做你给它的那类题

举例:

微调前:
  用户:"写一首关于春天的诗"
  模型:"巴黎是法国的首都。"
  → 模型理解力没问题,但它不知道你期望输出什么格式

微调后:
  用户:"写一首关于春天的诗"
  模型:"春风拂面柳如烟,碧水清波映蓝天……"
  → 它学会了"你要的是诗,不是百科问答"

一个形象的类比

 全参微调:重新培养一个专家(贵,周期长)
       ↓
   LoRA:保留原专家,旁边加个小本子记录"这个领域的特点"
       ↓
  QLoRA:把专家"压缩存放"(4-bit),小本子照记——更省地方

核心思想:利用模型已有的能力,用很少的数据教会它"你想要的输出格式和行为模式"。


第二章:LoRA 到 QLoRA 的进化逻辑

为什么全参微调太贵

一个 65B 参数的模型:

内容 占用显存
模型权重 (FP16) 130 GB
梯度 130 GB
优化器状态 260 GB
总计 约 520 GB

一张 A100 只有 80GB,根本放不下。

LoRA:只训练"插件"

LoRA 的核心思路:

原模型参数 W(冻结,不动)
   + 插入两个小矩阵 A × B(可训练)
   = 效果接近全参微调

类比:不需要换发动机,加个涡轮增压器就行

可训练参数从 d×k 降到 r×(d+k),通常减少 10000 倍

但注意:原模型参数 W 仍然占着显存,只是不计算梯度了。

QLoRA:再压缩原模型

QLoRA 在 LoRA 的基础上加了三刀:

第一刀:原模型压缩到 4-bit (NF4 量化)
  效果:130GB → ~16GB,省 87%

第二刀:双重量化——对压缩的参数表再做一次压缩
  效果:平均每参数从 0.5 bit 降到 0.127 bit

第三刀:Paged Optimizers——优化器状态换到 CPU 内存
  效果:显存不够时用 CPU 兜底

最终效果:一张 48GB 显存的卡就能微调 65B 的模型

三个关键技术的通俗解释

技术 一句话 类比
NF4 量化 把 16bit 权重压缩到 4bit,选择最合适的"分桶"方式保留精度 把一本书缩写成关键词,保留最重要的信息
双重量化 对量化规则本身再做一层量化 写"备注"的备注,省纸
Paged Optimizers 优化器状态存到 CPU,用的时候再读 桌面放不下,用到啥文件再从柜子里拿

第三章:数据准备

数据质量 > 数据数量

这是微调中最容易被忽视的规律:

数据 100 条高质量 10000 条低质量
效果 好 ✅ 差 ❌
原因 每条都是人工精心设计的例子 有重复、有噪声、格式不统一

想要好的微调效果,花 80% 的时间准备数据,20% 的时间训练。

Alpaca 格式

LLaMA-Factory 最常用的格式(推荐入门用):

{
  "instruction": "什么是 LangChain 的 Chain?",
  "input": "",
  "output": "Chain 是 LangChain 中用于串联多个处理步骤的核心抽象。它可以将多个组件组合成一个完整的处理流程,支持顺序执行、条件分支和并行处理等模式。"
}

多轮对话版:

{
  "instruction": "什么是 Agent?",
  "input": "",
  "output": "Agent 是能自主决定调用哪些工具来完成任务的组件。",
  "history": [
    ["什么是 RAG", "RAG 是检索增强生成,从外部知识库检索信息辅助回答。"],
    ["和传统 Prompt 有什么区别", "传统 Prompt 靠模型记忆,RAG 从外部文档实时检索。"]
  ]
}

多个这样的对象放在一个 JSON 数组里,就是一个数据集

效果示例:

问题:什么是 Output Parser
答案:Output Parser 是 LangChain 中用于将大模型自由文本输出
      转换为结构化数据的工具。大模型输出是自由文本(如"好
      的,我给你返回一个JSON..."),但程序需要 dict、list
      等结构化数据。Output Parser 就像一个"翻译器"。

提升数据质量的技巧

常见问题 处理方法
标题太短(如"目录"、“概述”) 直接删掉,或者扩展成完整问题
答案有重复 手动去重,只保留最完整的版本
答案带代码 保留,这正是微调的价值——让模型学会你的代码风格
问题不够具体 改写:"Chain" → "LangChain 中的 Chain 是什么?有什么用?"

第四章:微调工具对比

LLaMA-Factory ⭐ (推荐入门)

方面 说明
定位 一站式微调工具,从数据到训练到推理
支持方法 LoRA / QLoRA / DoRA / 全参 / DPO / GRPO
模型池 600+ 模型直接支持(Qwen、DeepSeek、LLaMA 等)
界面 Web UI、命令行两种方式
适合人群 初学者、实验对比
门槛 最低,点几下就能跑

优势:Web UI 直观,不需要写代码即可完成一次完整微调。 不足:黑盒感较强,报错有时不友好,生产部署还需额外工具。

Unsloth(进阶)

方面 说明
定位 底层优化训练速度的内存效率库
相比 LLaMA-Factory 训练速度 2x 快,显存再省 50%
代码量 10 行 Python 即可跑通
适合人群 已经理解微调流程,想提高效率的人

代码示例

from unsloth import FastLanguageModel

model, tokenizer = FastLanguageModel.from_pretrained(
    "unsloth/Qwen2.5-7B",
    load_in_4bit=True
)
model = FastLanguageModel.get_peft_model(model, r=16)

注意:没有 Web UI,需要自己写训练脚本。

Axolotl(实验研究)

方面 说明
定位 配置驱动的微调框架
特点 YAML 配置文件定义一切,实验可复现
适合人群 需要对比多种方案效果的研究者

不足:配置项比 LLaMA-Factory 还多,学习曲线较陡。

选择建议

学习阶段 → LLaMA-Factory(自动挡)
熟悉后   → Unsloth(手动挡,性能更好)
做实验   → Axolotl(可复现性最强)

第五章:微调新方法一览(了解即可)

DoRA(2024)

  • 思路:把权重分解为"幅度 + 方向",LoRA 只调方向,DoRA 两者都调
  • 效果:低秩场景下比 LoRA 好 2-3%
  • 使用:在 LLaMA-Factory 里加一行参数 use_dora: true

LoRA-XS(2025)

  • 思路:参数更少的 LoRA 变体
  • 适合场景:极端资源受限(手机端、边缘设备)

ReFT(2025)

  • 思路:不调整权重,而是调整模型的"内部表征"
  • 状态:非常新,效果有争议,尚在验证阶段

GRPO(2025)

  • 来源:DeepSeek-R1 使用的方法
  • 定位强化学习而非纯微调
  • 区别:SFT 是"给答案让它学",GRPO 是"给奖励让它自己探索"

一句话总结

LLaMA-Factory 基本都收录了这些新方法,学会它之后改一行配置就能试用。


第六章:评估比训练更重要

正确循环

很多新手花 1 天训练,0 分钟评估。这是完全错误的顺序:

准备数据 ─→ 训练模型 ─→ 评估效果 ─→ 分析问题
   ↑                            │
   └──────── 修改数据 ←──────────┘

一般需要循环 3-5 轮才能得到满意的模型。

最简单的评估方法

方法一:对比问答(推荐)

准备 10 个测试问题,分别问:

  • 原始模型(未微调)
  • 微调后的模型

对比输出差异:

  • 微调后的回答是否更符合你期望的格式?
  • 是否包含你准备的专属知识?
  • 有没有遗忘原有的能力?(灾难性遗忘)

方法二:Loss 曲线

  • 训练 loss 持续下降 → 模型在学习 ✅
  • 训练 loss 下降但验证 loss 上升 → 过拟合 ⚠️
  • loss 一开始就震荡不下降 → 数据或参数有问题 ❌

方法三:测试集准确率

最适合"有标准答案"的任务(分类、提取、翻译等)。

关键原则

原则 说明
先评估,再迭代 每次改数据或参数后都要做一次评估
基座对比 永远和未微调的基座模型比较,才知道微调是否有效
人工看 > 指标看 花半小时读几条回答,比看一个数字有用得多

第七章:用 LLaMA-Factory 实操指南

本章是一份 实操路线图,告诉你如果有天想上手跑一次完整的微调,该怎么走。

7.1 准备工作

你需要什么:

方案 优点 缺点
Google Colab 免费版 零配置、免费 T4 GPU 需要 Google 账号、有使用时长限制
阿里云/腾讯云 GPU 实例 可长期使用 收费(约 5-10 元/小时)
本地 Nvidia 显卡 不限时间 需要 8GB+ 显存
本地 CPU 免费 慢(0.5B 模型约 10-20 分钟)

7.2 安装 LLaMA-Factory

# 一行命令安装
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"

7.3 数据准备

LLaMA-Factory/data/
  ├── dataset_info.json         ← 数据集注册文件(已存在)
  └── my_langchain_data.json    ← 你准备的数据集(新建)

在 dataset_info.json 中注册你的数据集:

{
  "my_langchain": {
    "file_name": "my_langchain_data.json",
    "formatting": "alpaca",
    "columns": {
      "prompt": "instruction",
      "query": "input",
      "response": "output"
    }
  }
}

7.4 开始训练

命令行方式(推荐学习用):

llamafactory-cli train \
  --model_name_or_path Qwen/Qwen2.5-1.5B \
  --dataset my_langchain \
  --lora_target q_proj,v_proj \
  --lora_rank 8 \
  --learning_rate 2e-4 \
  --num_train_epochs 3.0 \
  --per_device_train_batch_size 4 \
  --output_dir ./output/my_langchain_model

关键参数解释:

参数 含义 建议初学值
lora_rank LoRA 秩,越大学得越好但也越贵 8 或 16
learning_rate 学习率,太大不稳定,太小学不动 2e-4
num_train_epochs 训练轮数,3-5 轮通常就够了 3
batch_size 每次处理几条数据,越大越快但越费显存 4(按显存调)

7.5 可视化的 Web UI 方式

llamafactory-cli webui

打开浏览器后:

  1. 选择模型(如 Qwen2.5-1.5B)
  2. 选择数据集(你注册的 my_langchain)
  3. 选择微调方法(LoRA 或 QLoRA)
  4. 点击"开始训练"
  5. 观察实时 Loss 曲线 ↓

7.6 训练完成后

训练结束后你会得到输出目录:

output/my_langchain_model/
  ├── adapter_config.json   (LoRA 配置)
  ├── adapter_model.safetensors  (训练好的适配器权重,约 5-30MB)
  └── training_log.json     (训练日志)

注意:你得到的只是一个很小的适配器文件(5-30MB),不是完整的模型。使用时要和基座模型配合。

7.7 用微调后的模型推理

llamafactory-cli chat \
  --model_name_or_path Qwen/Qwen2.5-1.5B \
  --adapter_name_or_path ./output/my_langchain_model

然后你就可以像聊天一样和微调后的模型对话了。

7.8 完整实操流程图

┌─────────────────────────────────────────────────────────┐
│                   LLaMA-Factory 实操流程                   │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  1. 准备环境:Colab / 云GPU / 本地                      │
│      ↓                                                  │
│  2. 安装 LLaMA-Factory(一行命令)                      │
│      ↓                                                  │
│  3. 准备数据(Alpaca 格式 JSON)                        │
│      ↓                                                  │
│  4. 注册到 dataset_info.json                            │
│      ↓                                                  │
│  5. 运行训练命令(或打开 Web UI 点点点)                │
│      ↓                                                  │
│  6. 观察 Loss 曲线下降                                   │
│      ↓                                                  │
│  7. 完成 → 得到适配器权重(仅几 MB)                    │
│      ↓                                                  │
│  8. 加载适配器 + 基座模型,开始问答测试                  │
│      ↓                                                  │
│  9. 不满意?返回第 3 步改数据 → 再训练                  │
│                                                         │
└─────────────────────────────────────────────────────────┘

总结一句

微调 = 好基座 + 好数据 + QLoRA + 迭代评估

不需要理解梯度下降、反向传播,也能做出有效的微调模型。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐