一、LoRA 是什么?
LoRA(Low-Rank Adaptation,低秩适应)是一种大模型微调技术。
问题的起点
大模型(比如 Qwen、Llama)动不动 7B、70B 参数。如果每次想让它学点新东西,都要重新训练所有参数,那需要几十张 A100 显卡跑几天——普通人根本没这个条件。
LoRA 的思路
不碰原模型,只在旁边挂一个「小插件」。
打个比方:
| 做法 | 类比 |
|---|---|
| 全量微调 | 把整本教科书改写成你想要的版本 |
| LoRA | 在教科书页边贴几张便利贴,写上你的补充说明 |
原始模型的权重完全不改。LoRA 只在某些关键层旁边插入一个极小的矩阵(低秩矩阵),训练时只更新这个矩阵的参数。
为什么叫「低秩适应」?
数学上,一个大矩阵可以用两个小矩阵的乘积来近似。LoRA 利用这个原理:原始权重矩阵 $W$ 不动,额外训练两个小矩阵 $A$ 和 $B$,模型的最终输出变成 $W + A \cdot B$。$A$ 和 $B$ 加起来可能只有原权重的 千分之一 大小。
二、LoRA 有什么用?
它的核心能力只有一个:以极低的成本,改变大模型的「行为方式」。
LoRA 改变的是风格/格式/行为,不是知识
- 想让模型学会新知识 → 用 RAG(检索增强生成)
- 想让模型换一种方式说话、做事 → 用 LoRA
典型应用场景
| 场景 | 例子 |
|---|---|
| 风格迁移 | 让通用模型用鲁迅的文风写作 |
| 格式约束 | 强制模型输出严格 JSON,不多一个标点 |
| 角色扮演 | 把 Qwen 变成《原神》里的钟离 |
| 领域口吻 | 医疗问诊语气、法律文书的严谨措辞 |
| 指令遵循 | 让模型更好地遵守 system prompt,不乱发散 |
LoRA 的优势
- 显存极低:7B 模型一张 RTX 3090(24G)就能训,甚至 8G 显卡也勉强能跑
- 文件极小:训练产物只有几 MB,一个模型可以挂几十个不同的 LoRA,即插即用
- 训练极快:几百条数据,半小时出结果
- 不破坏基座:LoRA 卸载后,模型恢复原样,零风险
三、怎么使用 LoRA?
大体分四步:
第一步:准备数据
把你想要模型学会的「行为」写成示例对话。
假设你想让模型变成毒舌客服,你就写 50-200 条这样的对话:
|
|
数据量不用多,50-200 条高质量示例就能看到明显效果。质量远比数量重要。
第二步:选择工具
市面上一堆工具,但本质上都在做同一件事。推荐两个:
| 工具 | 特点 | 适合谁 |
|---|---|---|
| LLaMA-Factory | 有 Web UI,全程点鼠标 | 完全不想写代码的新手 |
| Unsloth | 快 2-5 倍,省一半显存 | 会写点 Python,追求效率 |
Unsloth 的核心代码不到 30 行,本质就是:加载模型 → 挂 LoRA → 喂数据 → 训练 → 保存。
第三步:训练
设置几个关键参数,然后等:
| 参数 | 作用 | 一般设多少 |
|---|---|---|
| LoRA rank(秩) | 决定「插件」的容量。越大越细腻,但也越占显存 | 8 或 16 够用 |
| 学习率 | 每次学多少 | 5e-5,别乱调 |
| 训练轮数 | 数据反复学几遍 | 3-5 轮 |
第四步:使用
训完后你得到一个几 MB 的 LoRA 文件。使用时同时加载原模型和这个 LoRA 文件,模型就变成了你训练的样子。
想切换回原模型?卸载 LoRA 就行,一秒恢复。
一个模型可以同时挂多个 LoRA——比如挂一个「毒舌风格」和一个「输出 JSON」,模型就变成一个会输出 JSON 的毒舌助手。
四、与相关概念的关系
| 概念 | 做什么 | 和 LoRA 的关系 |
|---|---|---|
| 全量微调 | 改全部参数 | LoRA 的替代方案,效果更好但成本高几百倍 |
| RAG | 外挂知识库检索 | 互补关系:RAG 管知识,LoRA 管风格 |
| Prompt Engineering | 写提示词 | 最轻量方案,但效果有限。调不动了再上 LoRA |
| QLoRA | LoRA + 4bit 量化 | LoRA 的省显存版本,8G 显卡也能跑 7B 模型 |
| PEFT | 参数高效微调的大类 | LoRA 是 PEFT 家族里最流行的一个成员 |
五、一句话总结
LoRA = 给大模型外挂一个小插件,只改行为不改知识,训练成本极低,几 MB 文件即插即用。