# 补充模块:LoRA / QLoRA / PEFT 基础认知
补充模块:LoRA / QLoRA / PEFT 基础认知
1. 为什么 AI Agent 岗也要了解 LoRA / QLoRA / PEFT
你投的是 AI Agent / 大模型应用方向,重点不是做基础模型训练,但你仍然需要知道微调相关知识。
原因有三个:
1.1 面试官可能会问
常见问题:
RAG 和微调有什么区别?
什么时候用 RAG,什么时候用 fine-tuning?
LoRA 是什么?
QLoRA 为什么省显存?
PEFT 和全量微调有什么区别?
你这个 Agent 项目有没有必要微调?
你不一定要真的训练过 70B 模型,但要能回答这些问题。
1.2 项目升级时可能会用到
你的 RAG + Agent 项目中,可能有这些场景适合轻量微调:
| 场景 | 是否适合 LoRA / QLoRA |
|---|---|
| 问题分类器总是分错 | 可以考虑小模型微调 |
| Agent 工具选择不稳定 | 可以考虑用工具调用样本微调 |
| 输出格式总是不稳定 | 可以考虑结构化输出数据微调 |
| 回答风格要统一 | 可以考虑 SFT |
| 私有知识经常更新 | 不适合微调,优先 RAG |
| 要让模型记住文档内容 | 不适合直接微调,优先 RAG |
| 业务规则经常变 | 不适合微调,优先 workflow / prompt / tool |
1.3 能体现你对大模型工程的完整理解
一个完整的大模型应用工程师要知道:
Prompt 解决轻量行为控制
RAG 解决知识注入
Tool Calling 解决外部动作
Agent 解决动态决策
Fine-tuning 解决模型行为和风格适配
PEFT 解决低成本微调
Evals 解决效果评估
Deployment 解决交付上线
LoRA / QLoRA / PEFT 属于其中的“低成本模型适配”部分。
2. 先理解:Fine-tuning 是什么
Fine-tuning,微调,是指在一个已经预训练好的模型基础上,用你的任务数据继续训练,让模型更适合某个特定任务。
例如:
基础模型:会通用聊天
微调数据:大量客服问答
微调后:更像客服助手
或者:
基础模型:会通用指令跟随
微调数据:大量工具调用样本
微调后:更擅长选择正确工具和生成参数
2.1 全量微调
全量微调是更新模型的全部参数。
例如一个 7B 模型有 70 亿参数,全量微调就是训练这 70 亿参数。
优点:
- 理论上适配能力强;
- 可以深度改变模型行为;
- 在大数据和强算力下效果好。
缺点:
- 显存占用大;
- 训练成本高;
- 存储成本高;
- 容易过拟合;
- 每个任务都要保存一份完整模型;
- 工程门槛高。
2.2 参数高效微调
PEFT 就是为了降低这个成本。
3. PEFT 是什么
PEFT 是 Parameter-Efficient Fine-Tuning,参数高效微调。
核心思想:
不训练整个大模型,只训练很少一部分新增参数或指定参数。
也就是说:
原始大模型参数冻结
只更新少量 adapter / prompt / low-rank 参数
这样可以显著降低:
- 训练显存;
- 训练时间;
- 存储成本;
- 多任务切换成本。
3.1 PEFT 的核心价值
| 维度 | 全量微调 | PEFT |
|---|---|---|
| 训练参数量 | 全部参数 | 少量参数 |
| 显存需求 | 高 | 低 |
| 存储成本 | 每个任务一整份模型 | 每个任务一个 adapter |
| 多任务切换 | 成本高 | 切换 adapter 即可 |
| 工程难度 | 高 | 中等 |
| 适合个人学习 | 不太适合 | 更适合 |
3.2 常见 PEFT 方法
| 方法 | 简单理解 |
|---|---|
| LoRA | 在模型线性层旁边加低秩矩阵,只训练这些矩阵 |
| QLoRA | 先把基础模型量化到 4-bit,再训练 LoRA |
| Adapter Tuning | 在 Transformer 层中插入小模块 |
| Prefix Tuning | 给模型加可训练前缀向量 |
| Prompt Tuning | 学习一组软 prompt embedding |
| IA3 | 用向量缩放激活或注意力相关部分 |
| AdaLoRA | 动态分配不同层的 LoRA rank |
初学重点掌握:
PEFT -> LoRA -> QLoRA
4. LoRA 是什么
LoRA = Low-Rank Adaptation,低秩适配。
它的核心思想是:
冻结原模型参数 W
不直接训练 W
给 W 的更新量 ΔW 做一个低秩分解
只训练两个小矩阵 A 和 B
原本全量微调是:
W' = W + ΔW
LoRA 的做法是:
ΔW = B × A
其中 A 和 B 是两个很小的低秩矩阵。
所以:
W' = W + B × A
训练时:
W 冻结
A、B 可训练
4.1 直觉理解
假设原模型中的一个大矩阵是:
4096 × 4096
全量微调要更新:
4096 × 4096 = 16,777,216 个参数
LoRA 假设这个更新矩阵不需要那么复杂,可以用低秩矩阵近似。
如果 rank = 8:
A: 8 × 4096
B: 4096 × 8
需要训练的参数大约是:
8 × 4096 + 4096 × 8 = 65,536
这比 1677 万小很多。
5. LoRA 的关键公式
LoRA 的核心可以写成:
h = W x + ΔW x
ΔW = B A
所以:
h = W x + B A x
实际实现中通常还有缩放因子:
h = W x + (α / r) B A x
其中:
| 符号 | 含义 |
|---|---|
W |
原始模型权重 |
ΔW |
微调要学习的权重更新 |
A、B |
LoRA 新增的低秩矩阵 |
r |
rank,低秩维度 |
α |
LoRA scaling 参数 |
α / r |
缩放系数 |
5.1 rank 是什么
rank 可以简单理解为 LoRA 的“表达能力大小”。
rank 越大 -> 可训练参数越多 -> 表达能力更强 -> 显存更高 -> 更容易过拟合
rank 越小 -> 参数更少 -> 更省资源 -> 表达能力有限
常见取值:
r = 4 / 8 / 16 / 32 / 64
初学实验可以从:
r = 8 或 16
开始。
6. LoRA 通常加在哪里
Transformer 里有很多线性层。
LoRA 通常加在 attention 或 MLP 的线性投影层上。
常见 target modules:
q_proj
k_proj
v_proj
o_proj
gate_proj
up_proj
down_proj
初学最常见的是:
q_proj
v_proj
很多 LLaMA 系模型也会对更多模块加 LoRA:
q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
6.1 target_modules 是什么
target_modules 指定哪些层要插入 LoRA。
示例:
target_modules = ["q_proj", "v_proj"]
含义:
只在 query projection 和 value projection 这两个线性层上加 LoRA。
如果写得太少,适配能力可能不够。
如果写得太多,训练参数和显存会上升。
7. LoRA 的重要超参数
| 参数 | 含义 | 常见值 |
|---|---|---|
r |
rank,低秩维度 | 8 / 16 / 32 |
lora_alpha |
缩放系数 | 16 / 32 / 64 |
lora_dropout |
LoRA dropout | 0.05 / 0.1 |
target_modules |
加 LoRA 的层 | q_proj, v_proj 等 |
bias |
是否训练 bias | usually “none” |
task_type |
任务类型 | CAUSAL_LM / SEQ_CLS |
learning_rate |
学习率 | 1e-4 ~ 2e-4 常见 |
batch_size |
batch 大小 | 取决于显存 |
gradient_accumulation_steps |
梯度累积 | 小显存常用 |
num_train_epochs |
训练轮数 | 1-3 起步 |
7.1 初学推荐配置
r = 8
lora_alpha = 16
lora_dropout = 0.05
target_modules = ["q_proj", "v_proj"]
bias = "none"
task_type = "CAUSAL_LM"
如果效果不够,再尝试:
r = 16
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj"]
8. QLoRA 是什么
QLoRA = Quantized LoRA。
它可以理解为:
量化后的基础模型 + LoRA 微调
具体来说:
1. 把基础模型加载成 4-bit 量化形式
2. 冻结这个 4-bit 模型
3. 在上面插入 LoRA adapter
4. 只训练 LoRA adapter
也就是说:
LoRA:基础模型通常以 16-bit / bf16 / fp16 加载,训练 LoRA
QLoRA:基础模型以 4-bit 加载,训练 LoRA
8.1 QLoRA 为什么省显存
因为大模型最占显存的是基础权重。
如果基础模型用 16-bit 存储:
每个参数大约 2 bytes
如果用 4-bit 存储:
每个参数大约 0.5 bytes
理论上基础权重显存大幅下降。
然后只训练很小的 LoRA 参数,所以整体显存要求更低。
9. QLoRA 的三个关键技术点
QLoRA 论文中常提到三个关键点:
9.1 4-bit NormalFloat,NF4
NF4 是一种适合正态分布权重的 4-bit 数据类型。
直觉理解:
普通 4-bit 量化是把数值压缩到很少的表示范围里。
NF4 针对神经网络权重分布做了更合适的编码。
9.2 Double Quantization
Double Quantization 是进一步量化量化常数。
直觉理解:
量化本身也需要保存一些 scale / constant。
double quantization 连这些常数也进一步压缩。
9.3 Paged Optimizers
Paged Optimizers 用来处理训练时显存峰值。
直觉理解:
训练中有时会突然需要很多显存。
paged optimizer 可以缓解这些内存峰值。
10. LoRA vs QLoRA
| 维度 | LoRA | QLoRA |
|---|---|---|
| 基础模型精度 | 通常 fp16 / bf16 | 4-bit 量化 |
| 训练参数 | LoRA adapter | LoRA adapter |
| 基础模型是否冻结 | 是 | 是 |
| 显存占用 | 低于全量微调 | 低于普通 LoRA |
| 训练速度 | 通常较快 | 可能受 4-bit 计算影响 |
| 适合场景 | 显存相对充足 | 显存紧张 |
| 难度 | 中等 | 稍高 |
| 依赖 | PEFT | PEFT + bitsandbytes 等 |
一句话:
LoRA 省的是训练参数。
QLoRA 进一步把基础模型权重量化,主要省显存。
11. PEFT / LoRA / QLoRA / RAG 的关系
这几个概念经常被混在一起。
11.1 RAG 解决什么问题
RAG 解决的是:
模型不知道某些外部知识
例如:
- 私有文档;
- 最新资料;
- 公司内部知识;
- 用户上传 PDF;
- 需要引用来源的问题。
RAG 的特点:
不改变模型参数
知识更新方便
适合事实性、文档型、经常变化的知识
11.2 Fine-tuning 解决什么问题
Fine-tuning 解决的是:
模型行为、风格、格式、任务模式不稳定
例如:
- 模型总是不按指定 JSON 输出;
- 工具调用参数经常错;
- 固定业务问答风格;
- 分类任务;
- 领域表达习惯;
- 指令跟随风格。
Fine-tuning 的特点:
改变模型参数或 adapter 参数
需要训练数据
知识更新不如 RAG 方便
更适合行为模式适配
11.3 LoRA / QLoRA 解决什么问题
LoRA / QLoRA 解决的是:
微调成本太高
它们不是新的任务形态,而是低成本微调方法。
11.4 一句话区分
RAG:给模型外部知识。
Tool Calling:给模型外部能力。
Agent:让模型动态决策。
LoRA:低成本改变模型行为。
QLoRA:更省显存地做 LoRA。
PEFT:一类参数高效微调方法的总称。
12. 什么时候用 RAG,什么时候用 LoRA
12.1 优先用 RAG 的场景
| 场景 | 原因 |
|---|---|
| 知识经常更新 | RAG 更新文档即可 |
| 需要引用来源 | RAG 可以返回 citation |
| 私有文档问答 | 文档可以入库检索 |
| 数据量不大但内容多变 | 微调不划算 |
| 需要减少幻觉 | 检索证据更重要 |
| 需要权限控制 | 检索层可以按权限过滤 |
12.2 可以考虑 LoRA 的场景
| 场景 | 原因 |
|---|---|
| 输出格式长期固定 | 可以学稳定格式 |
| 工具调用样式固定 | 可以学工具参数模式 |
| 领域语言风格明显 | 可以适配表达风格 |
| 分类任务稳定 | 小模型 LoRA 分类 |
| 有高质量标注数据 | 微调才有意义 |
| prompt 很长且重复 | 微调可以减少 prompt 依赖 |
12.3 不建议一上来微调的场景
| 场景 | 原因 |
|---|---|
| 只是缺知识 | 优先 RAG |
| 数据质量很差 | 微调会学坏 |
| 样本很少 | 容易过拟合 |
| 需求变化快 | 微调迭代慢 |
| 没有评测集 | 不知道是否变好 |
| 只是 prompt 没写好 | 先优化 prompt |
12.4 面试回答模板
如果问题是模型缺少外部知识,例如私有文档、最新资料或需要引用来源,我会优先用 RAG;如果问题是模型行为不稳定,例如输出格式、工具调用参数、固定业务风格,我会考虑 fine-tuning。LoRA 和 QLoRA 本质上是降低 fine-tuning 成本的方法,不是替代 RAG 的方案。实际项目里,我会先用 prompt、workflow、RAG 和工具解决问题,只有在有稳定任务和高质量数据时才考虑 LoRA 微调。
13. SFT、DPO 和 LoRA 的关系
你可能还会看到:
SFT
RLHF
DPO
LoRA
QLoRA
它们不是同一层概念。
13.1 SFT 是什么
SFT = Supervised Fine-Tuning,监督微调。
数据格式通常是:
输入 -> 标准答案
例如:
{
"instruction": "请把下面内容总结成三点",
"input": "长文本...",
"output": "1. ... 2. ... 3. ..."
}
SFT 是训练目标。
LoRA 是训练方法。
也就是说:
可以用 LoRA 来做 SFT
13.2 DPO 是什么
DPO = Direct Preference Optimization,直接偏好优化。
数据格式通常是:
prompt
chosen answer
rejected answer
用来让模型更偏向人类喜欢的回答。
13.3 它们的关系
SFT / DPO:训练目标或训练阶段
LoRA / QLoRA:参数高效训练方法
PEFT:这类方法的总称
14. 训练数据比算法更重要
做 LoRA / QLoRA 时,数据质量非常关键。
低质量数据会让模型:
- 学会错误知识;
- 输出格式变差;
- 产生更多幻觉;
- 过拟合固定表达;
- 工具调用更混乱。
14.1 好数据的特点
| 特点 | 说明 |
|---|---|
| 任务明确 | 每条数据都对应一个明确能力 |
| 格式一致 | instruction / input / output 规范 |
| 答案高质量 | 没有明显错误 |
| 覆盖边界情况 | 包含异常、拒答、空结果 |
| 与线上场景一致 | 训练问题和真实问题相似 |
| 有验证集 | 能判断是否真的提升 |
14.2 不建议把 PDF 原文直接拿去微调
很多人会误以为:
我有很多 PDF,所以可以直接微调模型。
这通常不是好思路。
原因:
PDF 原文不是高质量 instruction 数据。
模型可能学不到如何回答问题。
知识更新后还要重新训练。
引用来源也不好控制。
更推荐:
PDF 原文 -> RAG
高质量问答样本 / 工具调用样本 -> LoRA 微调
15. LoRA 微调基本流程
一个典型流程是:
1. 选择基础模型
2. 准备训练数据
3. 准备 tokenizer
4. 加载模型
5. 配置 LoRA
6. 训练
7. 验证
8. 保存 adapter
9. 推理时加载 base model + adapter
10. 必要时 merge adapter
15.1 数据格式示例
Instruction tuning 数据:
{
"instruction": "请判断用户问题属于哪一类",
"input": "RAG 为什么能减少幻觉?",
"output": "knowledge_qa"
}
工具调用数据:
{
"instruction": "根据用户问题选择工具并生成参数",
"input": "帮我查一下 RAG 的定义",
"output": {
"tool_name": "search_knowledge_base",
"arguments": {
"query": "RAG definition",
"top_k": 5
}
}
}
结构化输出数据:
{
"instruction": "请根据检索片段回答,并返回 JSON",
"input": "问题:RAG 为什么能减少幻觉?\n片段:...",
"output": {
"answer": "RAG 通过检索外部知识...",
"citations": [
{
"doc_id": "rag_001",
"page": 3
}
]
}
}
16. Hugging Face PEFT 伪代码
下面是一个简化版思路,不是完整可直接运行项目。
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
model_name = "your-base-model"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="auto"
)
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type=TaskType.CAUSAL_LM
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
核心是:
base model 冻结
LoRA adapter 可训练
17. QLoRA 伪代码
QLoRA 通常会结合 4-bit 量化加载模型。
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, TaskType
import torch
model_name = "your-base-model"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto"
)
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type=TaskType.CAUSAL_LM
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
18. Adapter 保存、加载和合并
18.1 保存 adapter
LoRA 训练后通常保存的是 adapter,不是完整模型。
model.save_pretrained("./lora_adapter")
tokenizer.save_pretrained("./lora_adapter")
18.2 推理时加载 adapter
from peft import PeftModel
from transformers import AutoModelForCausalLM
base_model = AutoModelForCausalLM.from_pretrained(
"your-base-model",
device_map="auto"
)
model = PeftModel.from_pretrained(
base_model,
"./lora_adapter"
)
18.3 合并 adapter
有时为了部署方便,可以把 LoRA adapter 合并进基础模型权重。
merged_model = model.merge_and_unload()
merged_model.save_pretrained("./merged_model")
注意:
合并后模型体积会变大。
合并后切换不同 adapter 不如原来方便。
19. LoRA 在 Agent 项目中的可能用法
你的 Knowledge Agent Assistant 项目中,不建议一开始微调整个生成模型。
更实际的用法有三个。
19.1 微调问题分类器
目标:
用户问题 -> question_type
例如:
knowledge_qa
document_summary
comparison
external_task
follow_up
chitchat
unknown
好处:
分类任务明确
数据容易构造
评估简单
不需要大模型
可以用小模型做分类,不一定用大语言模型。
19.2 微调工具选择器
目标:
用户问题 -> tool_name + arguments
例如:
{
"tool_name": "search_knowledge_base",
"arguments": {
"query": "RAG hallucination reduction",
"top_k": 5
}
}
好处:
可以让 Agent 工具调用更稳定
减少 prompt 复杂度
风险:
必须有高质量工具调用样本
必须有安全兜底
不能让模型自由调用高风险工具
19.3 微调结构化输出格式
目标:
让模型稳定输出 answer / citations / tool_trace / error
但实际项目里,通常可以先用:
JSON Schema
Pydantic 校验
失败重试
不一定马上微调。
20. LoRA 不适合解决的问题
LoRA 不是万能的。
不适合:
20.1 不适合注入大量新知识
如果你的目的是:
让模型记住 500 篇 PDF 的内容
不建议 LoRA。
应该用:
RAG
原因:
知识更新困难
引用来源不好做
容易记错或幻觉
训练成本不划算
20.2 不适合频繁变化的业务规则
如果业务规则每周改一次,微调不合适。
应该用:
配置
workflow
规则引擎
prompt
tool
20.3 不适合数据质量差的场景
如果训练数据很乱,LoRA 会把坏习惯学进去。
21. 实验路线建议
你现在不需要真的训练大模型。
建议分三步。
21.1 第一阶段:只学概念
掌握:
PEFT 是什么
LoRA 是什么
QLoRA 是什么
RAG vs 微调
LoRA 超参数
训练数据格式
21.2 第二阶段:跑一个小实验
可以选择一个小模型,做一个简单分类任务:
输入:用户问题
输出:question_type
例如训练数据:
{"input": "RAG 为什么能减少幻觉?", "output": "knowledge_qa"}
{"input": "帮我保存成学习笔记", "output": "external_task"}
{"input": "对比 RAG 和微调", "output": "comparison"}
目标不是追求 SOTA,而是理解训练流程。
21.3 第三阶段:和 Agent 项目结合
把微调后的分类器接入:
FastAPI -> classifier -> LangGraph route
然后比较:
微调前分类准确率
微调后分类准确率
这样你就能在面试中讲:
我尝试用 LoRA 对问题分类器做轻量微调,并通过分类准确率评估它是否真的优于 prompt 分类。
22. 评估微调是否有效
做 LoRA 之前一定要有 eval。
22.1 分类任务指标
| 指标 | 含义 |
|---|---|
| Accuracy | 分类准确率 |
| Precision | 某一类预测是否准 |
| Recall | 某一类是否被找全 |
| F1 | Precision 和 Recall 的综合 |
| Confusion Matrix | 哪些类别容易混淆 |
22.2 生成任务指标
| 指标 | 含义 |
|---|---|
| 格式合法率 | JSON 是否可解析 |
| 字段完整率 | 必要字段是否都有 |
| 答案正确率 | 是否回答正确 |
| 引用支持率 | 引用是否支撑答案 |
| 幻觉率 | 是否编造 |
| 人工评分 | 最可靠但成本高 |
22.3 微调前后对比
不要只说:
我做了 LoRA 微调
要说:
微调前分类准确率 78%
微调后分类准确率 88%
工具参数错误率从 12% 降到 5%
哪怕是小实验,也要有指标意识。
23. 常见误区
23.1 误区一:RAG 和 LoRA 二选一
不对。
它们可以结合:
RAG 提供知识
LoRA 改善行为
Agent 负责调用工具
23.2 误区二:有 PDF 就拿去微调
不建议。
PDF 更适合入向量库做 RAG。
23.3 误区三:LoRA 一定提升效果
不一定。
如果数据差、任务不明确、评估集不合理,可能效果更差。
23.4 误区四:QLoRA 比 LoRA 效果一定更好
QLoRA 主要优势是省显存,不是天然效果更好。
23.5 误区五:微调能完全消除幻觉
不能。
微调可以改善行为模式,但不能保证事实完全正确。
事实型问题仍然需要 RAG、引用和评估。
24. 面试高频问题与回答
Q1:PEFT 是什么?
回答:
PEFT 是参数高效微调,核心思想是不更新整个大模型,而是只训练少量新增参数或部分参数,从而降低训练显存、计算和存储成本。LoRA、QLoRA、Prefix Tuning、Prompt Tuning 都可以看作 PEFT 方法。
Q2:LoRA 是什么?
回答:
LoRA 是低秩适配方法。它冻结原始模型权重,不直接更新大矩阵 W,而是假设微调带来的权重变化 ΔW 可以用两个低秩矩阵 A 和 B 表示,也就是 ΔW = BA。训练时只更新 A 和 B,所以可训练参数大幅减少,显存和存储成本都更低。
Q3:QLoRA 和 LoRA 有什么区别?
回答:
LoRA 是在冻结基础模型的基础上训练低秩 adapter;QLoRA 则进一步把基础模型以 4-bit 量化方式加载,再在量化模型上训练 LoRA adapter。简单说,LoRA 主要减少可训练参数,QLoRA 进一步通过 4-bit 量化减少基础模型显存占用。
Q4:LoRA 和全量微调有什么区别?
回答:
全量微调会更新模型的全部参数,成本高、显存需求大、每个任务都要保存完整模型。LoRA 冻结基础模型,只训练少量低秩矩阵,训练和存储成本更低,也更适合多任务切换。但如果需要非常深度地改变模型能力,全量微调理论上表达能力更强。
Q5:RAG 和 LoRA 怎么选?
回答:
如果问题是知识缺失,尤其是私有文档、最新资料、需要引用来源,我会优先用 RAG;如果问题是模型行为不稳定,比如输出格式、工具调用模式、固定风格或分类任务,我会考虑 LoRA。LoRA 不适合用来记大量经常变化的知识,RAG 也不能替代模型行为适配,它们解决的问题不同。
Q6:你的 Agent 项目有没有必要做 LoRA?
回答:
第一版没有必要。因为当前项目的核心问题是知识检索、工具调用、状态管理和安全控制,优先用 RAG、LangGraph、结构化输出和 evals 解决。后续如果发现问题分类或工具选择长期不稳定,并且积累了足够高质量样本,我会考虑用 LoRA 微调一个分类器或工具选择器,而不是直接微调整个问答模型。
Q7:LoRA 的 rank 怎么选?
回答:
rank 控制 LoRA adapter 的表达能力和参数量。rank 越大,表达能力越强,但显存和过拟合风险也更高。一般会从 r=8 或 r=16 开始,通过验证集指标比较。如果任务简单,低 rank 就够;如果任务复杂,可以增大 rank 或扩大 target modules。
Q8:QLoRA 为什么能在较低显存下训练大模型?
回答:
QLoRA 把基础模型以 4-bit 量化形式加载,冻结量化后的基础权重,只训练 LoRA adapter。这样基础模型权重显存大幅下降,而可训练参数又很少。它还引入 NF4、double quantization 和 paged optimizers 来进一步降低显存占用和处理训练时的内存峰值。
Q9:LoRA 训练后部署时怎么用?
回答:
通常保存的是 LoRA adapter。推理时加载 base model,再加载 adapter。如果要部署方便,也可以把 adapter merge 到基础模型里,但合并后模型体积更大,切换不同任务 adapter 不如单独加载灵活。
Q10:微调前最重要的准备是什么?
回答:
不是先写训练代码,而是先明确任务和评测集。要知道希望模型在哪些样本上变好,准备高质量 instruction 数据,并定义准确率、格式合法率、工具调用成功率等指标。没有 eval 的微调很容易只是“感觉变好”。
25. 简历中是否要写 LoRA / QLoRA
如果你只是了解概念,没有实际训练过,不建议在项目经历里写得太重。
可以写在技能里:
了解 LoRA / QLoRA / PEFT 等轻量微调方法,理解其与 RAG、Prompt Engineering、Tool Calling 的适用边界。
如果你真的做了小实验,可以写:
尝试使用 LoRA 对问题分类器进行轻量微调,构建 question_type 标注数据,并通过分类准确率对比 prompt 分类与微调分类效果。
不要写成:
精通大模型微调
除非你真的做过完整训练、评估和部署。
26. 放进你的学习路线中
建议把这个模块放在阶段 6 或阶段 7 之后,作为补充模块:
阶段 8:模型适配与轻量微调基础
目标:
理解 RAG、Agent、Prompt、Fine-tuning 的边界;
掌握 LoRA / QLoRA / PEFT 的核心原理;
能判断项目中是否需要微调。
关键技术:
PEFT
LoRA
QLoRA
SFT
DPO 基础认知
训练数据格式
评估指标
adapter 保存与加载
30. 推荐资料
- Hugging Face PEFT 官方文档
- Hugging Face LoRA conceptual guide
- LoRA: Low-Rank Adaptation of Large Language Models
- QLoRA: Efficient Finetuning of Quantized LLMs
- Hugging Face bitsandbytes quantization documentation
- Hugging Face Transformers PEFT integration documentation
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)