AI Day 7
AI Day 7: Fine-tuning实战 — LoRA / QLoRA / Adapter — 用少量数据定制你的模型
Fine-tuning 是通过领域数据更新模型权重,让通用LLM掌握特定任务或领域知识;LoRA/QLoRA 等PEFT方法让这件事在消费级显卡上成为可能——只训练不到1%的参数,效果逼近全参数微调。
2026-04-08
Fine-tuningLoRAQLoRAPEFTAdapterDoRAIA3UnslothTRLLLaMA-Factory
日期:2026-04-08
阶段:第一阶段 — AI/LLM技术深潜 (Day 1-15)
标签:Fine-tuning LoRA QLoRA PEFT Adapter DoRA IA3 Unsloth TRL LLaMA-Factory
学习路径树
AI/LLM 深度技术学习 50天计划
├── 第一阶段:模型基础 (Day 1-15)
│ ├── Day 1: Transformer架构与LLM基础 ✅
│ ├── Day 2: 模型量化与本地部署 ✅
│ ├── Day 3: 训练过程深度:Pre-training / SFT / RLHF / DPO ✅
│ ├── Day 4: Prompt Engineering与上下文学习(ICL)原理 ✅
│ ├── Day 5: RAG架构:检索增强生成全链路 ✅
│ ├── Day 6: 向量数据库与Embedding模型 ✅
│ ├── Day 7: Fine-tuning实战:LoRA / QLoRA / Adapter ← 你在这里
│ ├── Day 8: 推理优化:vLLM / TensorRT-LLM / SGLang
│ ├── Day 9: 长上下文技术:RoPE扩展 / Ring Attention
│ ├── Day 10: 多模态模型:Vision-Language架构
│ ├── Day 11: Reasoning模型:CoT / o1 / R1 / Extended Thinking
│ ├── Day 12: Agent框架:ReAct / Tool Use / Planning
│ ├── Day 13: MCP协议与Tool生态
│ ├── Day 14: 模型评估:Benchmark / Arena / 安全评估
│ └── Day 15: 阶段复习与架构总结
│
├── 第二阶段:工程实践 (Day 16-30)
│ ├── Day 16-20: LLM应用架构设计(微服务/网关/缓存/监控)
│ ├── Day 21-25: 生产级RAG系统(Chunking/Rerank/评估/迭代)
│ └── Day 26-30: Agent系统工程化(状态管理/错误恢复/成本控制)
│
├── 第三阶段:金融零售AI应用 (Day 31-42)
│ ├── Day 31-35: 金融AI(风控模型/智能投顾/合规/反欺诈)
│ ├── Day 36-40: 零售AI(推荐系统/智能客服/供应链预测/营销)
│ └── Day 41-42: CeFi x DeFi x AI融合架构
│
└── 第四阶段:面试冲刺 (Day 43-50)
├── Day 43-46: 系统设计面试(LLM平台/RAG/Agent/推荐)
├── Day 47-49: 产品/架构面试模拟
└── Day 50: 总结与作品集
核心概念
一句话定义
Fine-tuning 是通过领域数据更新模型权重,让通用LLM掌握特定任务或领域知识;LoRA/QLoRA 等PEFT方法让这件事在消费级显卡上成为可能——只训练不到1%的参数,效果逼近全参数微调。
金融类比
Fine-tuning = 银行员工的"专项培训"
Full Fine-tuning(全参数微调):
重新培训整个团队——每个人的所有技能重新学一遍
→ 成本极高: 需要封闭培训3个月,全员脱产
→ 效果好: 团队完全适配新业务
→ 风险: 可能"忘记"原有技能(灾难性遗忘)
→ 类比: 更新所有7B/70B个参数 → 需要数百GB显存
LoRA(低秩适配):
给每人发一本"补充手册"——只包含新业务差异部分
→ 成本低: 周末培训,不影响日常工作
→ 效果好: 核心能力不变,新业务快速上手
→ 灵活: 不同业务发不同手册,随时切换
→ 类比: 只训练0.1-1%新增参数,冻结原始权重
QLoRA(量化+低秩适配):
用压缩版培训手册——内容不变但打印成口袋书
→ 成本极低: 材料费减少75%
→ 效果几乎一样: 核心内容都在
→ 适合: 预算有限的小团队也能做专项培训
→ 类比: 基座模型4bit量化+LoRA = RTX 4060 8GB微调7B模型
┌─────────────────────────────────────────────────────────┐
│ 方法 │ 培训成本 │ 效果 │ 灵活性 │ 8GB显卡 │
│─────────────────┼──────────┼───────┼────────┼─────────│
│ Full FT │ $$$$ │ ★★★★★ │ ★★ │ ✗ │
│ LoRA (FP16) │ $$ │ ★★★★ │ ★★★★★ │ ✗ (7B) │
│ QLoRA (NF4) │ $ │ ★★★★ │ ★★★★★ │ ✓ (7B) │
│ Prompt Tuning │ ¢ │ ★★★ │ ★★★★ │ ✓ │
└─────────────────────────────────────────────────────────┘
知识点1: Fine-tuning概览
为什么需要Fine-tuning
Day 4学了Prompt Engineering → 零成本、即时生效
Day 5学了RAG → 注入外部知识,不改模型权重
Day 7学Fine-tuning → 改变模型"内在能力"
三种方法的适用场景:
┌──────────────────────────────────────────────────────────────┐
│ 需求 │ 最佳方案 │
│──────────────────────────────┼───────────────────────────────│
│ 格式/风格统一 │ Fine-tuning (学会输出格式) │
│ 需要最新信息 │ RAG (检索实时数据) │
│ 领域专业术语/行话 │ Fine-tuning (内化术语) │
│ 复杂推理模式 │ Fine-tuning + CoT │
│ 简单问答/指令 │ Prompt Engineering (够了) │
│ 结合私有知识库 │ RAG + Fine-tuning (最佳组合) │
└──────────────────────────────────────────────────────────────┘
金融场景的真实需求:
- 合规报告格式: 每次输出必须严格遵守特定模板 → Fine-tuning
- 金融术语理解: "敞口""头寸""背书"的准确含义 → Fine-tuning
- 最新政策引用: MiCA法规/Basel IV更新 → RAG
- 客户风险评估: 固定评估框架+个性化数据 → Fine-tuning + RAG
Full Fine-tuning vs PEFT
Full Fine-tuning(全参数微调):
更新模型的所有参数
7B模型 (如Qwen2.5-7B):
参数量: 7 × 10⁹ 个参数
FP16训练显存: 7B × 2B(权重) + 7B × 2B(梯度) + 7B × 8B(Adam优化器)
= 14GB + 14GB + 56GB = 84GB
→ 需要A100 80GB或多卡训练
70B模型:
→ 需要 ~840GB → 至少8-16张A100
→ 每次训练成本: 数千到数万美元
问题:
1. 硬件门槛极高
2. 灾难性遗忘 (Catastrophic Forgetting): 新数据覆盖旧知识
3. 训练数据要求多 (通常需要10万+样本)
4. 每个任务需要保存一份完整模型副本
PEFT (Parameter-Efficient Fine-Tuning):
只训练极少数新增参数,冻结原始权重
核心理念:
预训练模型的权重已经捕获了丰富的通用知识
微调时只需要一个"小的增量"来适配新任务
这个增量可以非常小 → 大幅降低计算和存储需求
PEFT方法分类:
┌───────────────────────────────────────────────────────┐
│ 方法类型 │ 代表方法 │ 核心思路 │
│────────────────────┼───────────────────────┼──────────│
│ 低秩分解 │ LoRA / DoRA / LoRA+ │ 权重增量 │
│ Adapter插入 │ Adapter / IA3 │ 新增模块 │
│ Prompt类 │ Prefix / P-Tuning v2 │ 虚拟Token │
│ 混合方法 │ MAM Adapter / UniPELT │ 多技术融合│
└───────────────────────────────────────────────────────┘
2025-2026现状:
LoRA及其变体已经成为事实标准
95%的开源微调项目使用LoRA或QLoRA
其他方法更多作为学术研究存在
知识点2: LoRA原理 — Low-Rank Adaptation
核心数学
LoRA的核心洞察 (Hu et al., 2021):
预训练模型在微调时,权重的变化量ΔW具有低秩特性
即: ΔW可以分解为两个小矩阵的乘积
原始前向传播:
h = W₀ · x (W₀是预训练权重,被冻结)
LoRA前向传播:
h = W₀ · x + (B · A) · x (A和B是新增的可训练参数)
其中:
W₀ ∈ R^(d×k) — 原始权重矩阵,例如 4096×4096
A ∈ R^(r×k) — 降维矩阵,例如 16×4096
B ∈ R^(d×r) — 升维矩阵,例如 4096×16
r = 秩 (rank) — 远小于d和k,通常8/16/32/64
参数量对比:
┌───────────────────────────────────────────────────┐
│ 原始W₀: 4096 × 4096 = 16,777,216 参数 │
│ LoRA A: 16 × 4096 = 65,536 参数 │
│ LoRA B: 4096 × 16 = 65,536 参数 │
│ LoRA总: 131,072 参数 │
│ │
│ 参数比: 131,072 / 16,777,216 = 0.78% │
│ 节省: 99.2% 的参数量 │
└───────────────────────────────────────────────────┘
初始化:
A → 随机高斯初始化 (或Kaiming初始化)
B → 零初始化
→ 训练开始时 B·A = 0,不改变原始模型行为
→ 训练过程中逐步学习领域适配的增量
缩放因子 α (Scaling):
h = W₀·x + (α/r) · B·A·x
α 通常设为 r 的1-2倍 (如 r=16, α=16 或 α=32)
α/r 控制LoRA输出的缩放幅度
→ α越大,LoRA的影响越大
→ 训练时调α比调学习率更方便
在哪些层加LoRA
Transformer中可以加LoRA的位置:
┌──────────────────────────────────────────────────────────┐
│ Self-Attention层: │
│ Q (Query) 投影 — W_q ← 通常加LoRA ✓ │
│ K (Key) 投影 — W_k ← 可选加LoRA │
│ V (Value) 投影 — W_v ← 通常加LoRA ✓ │
│ O (Output) 投影 — W_o ← 可选加LoRA │
│ │
│ FFN层 (Feed-Forward Network): │
│ Gate 投影 — W_gate ← 2025推荐也加 ✓ │
│ Up 投影 — W_up ← 2025推荐也加 ✓ │
│ Down 投影 — W_down ← 可选加LoRA │
└──────────────────────────────────────────────────────────┘
经验法则 (2025-2026最佳实践):
基本配置: Q, V (原始论文推荐, 最小训练量)
推荐配置: Q, K, V, O (覆盖全部注意力投影)
最佳配置: Q, K, V, O + Gate, Up, Down (全覆盖, 效果最好)
在Unsloth/LLaMA-Factory中:
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"]
秩 r 的选择
r越大 → 参数越多 → 表达能力越强 → 但容易过拟合/成本增加
r越小 → 参数越少 → 训练更快 → 但可能欠拟合
推荐值:
┌─────────────────────────────────────────────────────────┐
│ 场景 │ 推荐r │ 原因 │
│────────────────────────┼───────┼─────────────────────────│
│ 简单格式/风格适配 │ 8-16 │ 任务简单,小r就够 │
│ 领域知识注入 │ 16-32 │ 需要一定表达能力 │
│ 复杂推理任务 │ 32-64 │ 需要更大适配空间 │
│ 多任务/多语言 │ 64-128│ 任务多样性高 │
│ 接近Full FT效果 │ 128-256│ 2025论文验证可近似Full FT│
└─────────────────────────────────────────────────────────┘
7B模型+r=16全层LoRA的参数量计算:
每层LoRA参数: 7个target × 2 × r × hidden_dim
Qwen2.5-7B: hidden_dim=4096, 32层
每层: 7 × 2 × 16 × 4096 = 917,504
总计: 917,504 × 32 = 29,360,128 ≈ 29M 可训练参数
占比: 29M / 7,000M = 0.4%
LoRA的合并与切换
训练完成后有两种使用方式:
方式1: 合并 (Merge)
W_merged = W₀ + B·A
→ 合并后和原始模型结构完全一样
→ 推理时零额外开销
→ 但丢失了灵活切换的能力
方式2: 多LoRA热切换
同一基座模型 + 不同LoRA适配器
┌──────────────────────────────────────────────────┐
│ 基座模型: Qwen2.5-7B (固定,只加载一次) │
│ │
│ LoRA-A: 金融合规 (29MB) ← 合规问答时加载 │
│ LoRA-B: 客户服务 (29MB) ← 客服对话时加载 │
│ LoRA-C: 数据分析 (29MB) ← SQL生成时加载 │
│ │
│ 切换时间: 毫秒级 (只替换小矩阵) │
│ 存储: 基座14GB + 3个LoRA共87MB │
│ vs 3个Full FT模型: 3 × 14GB = 42GB │
└──────────────────────────────────────────────────┘
vLLM/SGLang (2025) 支持多LoRA并发服务:
同一GPU上同时serve多个LoRA
不同请求路由到不同LoRA
→ 极大降低多任务部署成本
知识点3: QLoRA — 消费级显卡微调的关键
QLoRA原理 (Dettmers et al., 2023)
核心创新: 将基座模型量化到4-bit,LoRA部分保持高精度
三大技术:
┌──────────────────────────────────────────────────────────┐
│ 1. NF4 (4-bit NormalFloat) │
│ 专为正态分布权重设计的量化格式 │
│ 比普通INT4更好地保留信息 │
│ 权重从FP16 (16bit) → NF4 (4bit),压缩4x │
│ │
│ 2. Double Quantization │
│ 量化的缩放因子再次量化 │
│ FP32 scale → FP8 scale (节省约0.37 bit/参数) │
│ 对7B模型额外节省约300MB显存 │
│ │
│ 3. Paged Optimizers │
│ 优化器状态在CPU/GPU之间自动分页 │
│ 长序列训练时显存不足 → 自动卸载到CPU内存 │
│ 避免OOM,代价是略微增加训练时间 │
└──────────────────────────────────────────────────────────┘
前向传播:
1. 将NF4权重反量化为BF16/FP16 → W₀_dequant
2. 计算 h = W₀_dequant · x + B·A · x
3. LoRA部分 (B, A) 始终以BF16计算 → 保持梯度精度
反向传播:
只计算LoRA参数的梯度 (A和B)
基座权重冻结 → 不需要梯度 → 不需要优化器状态
→ 显存大幅节省
RTX 4060 8GB 微调7B — 显存计算
以QLoRA微调Qwen2.5-7B-Instruct为例:
显存占用分解:
┌───────────────────────────────────────────────────────────┐
│ 组件 │ FP16 Full FT │ QLoRA (NF4+r16)│
│──────────────────────────┼──────────────┼────────────────│
│ 模型权重 │ 14.0 GB │ 3.8 GB (NF4) │
│ LoRA参数 (BF16) │ — │ 0.06 GB │
│ 梯度 │ 14.0 GB │ 0.06 GB │
│ 优化器状态 (Adam) │ 56.0 GB │ 0.24 GB │
│ 激活值 (seq=512, bs=2) │ ~4.0 GB │ ~1.5 GB │
│ CUDA内核+碎片 │ ~1.0 GB │ ~0.8 GB │
│──────────────────────────┼──────────────┼────────────────│
│ 总计 │ ~89 GB │ ~6.5 GB ✓ │
└───────────────────────────────────────────────────────────┘
RTX 4060 8GB实际可用: ~7.2 GB (系统占用部分)
QLoRA 7B训练: ~6.5 GB → 可以跑! ✓
优化技巧 (进一步节省):
- gradient_checkpointing = True → 用计算换显存, 减少激活值~60%
- batch_size = 1 + gradient_accumulation = 8 → 等效bs=8
- max_seq_length = 512 → 够用就行, 不要设太大
- Unsloth优化 → 比标准HuggingFace快2x, 省40%显存
实测 (RTX 4060 8GB + Unsloth + QLoRA):
模型: Qwen2.5-7B-Instruct, NF4量化
数据: 1000条SFT对话
r=16, lora_alpha=16, 全层LoRA
seq_len=512, bs=1, grad_accum=4
显存: ~5.8 GB → 还有余量!
速度: ~120 tokens/sec
时间: 1000条×3 epochs ≈ 15-25分钟
QLoRA效果对比
QLoRA论文关键结论:
QLoRA (NF4 + r=64) ≈ Full Fine-tuning (FP16)
在多个benchmark上差距 <1%
┌───────────────────────────────────────────────────────┐
│ 方法 │ MMLU │ GSM8K │ HumanEval │ 显存 │
│────────────────┼───────┼───────┼───────────┼─────────│
│ Full FT 7B │ 62.3 │ 47.5 │ 35.4 │ 84 GB │
│ LoRA FP16 │ 61.8 │ 46.9 │ 34.8 │ 28 GB │
│ QLoRA NF4 │ 61.5 │ 46.2 │ 34.1 │ 6.5 GB │
│ 差距 │ -0.8 │ -1.3 │ -1.3 │ -92% │
└───────────────────────────────────────────────────────┘
结论: 花1/13的显存,获得>98%的效果 → 性价比极高
知识点4: 其他PEFT方法
Adapter Tuning
原理 (Houlsby et al., 2019):
在Transformer每层的FFN后插入一个小型Adapter模块
Adapter结构:
x → LayerNorm → Down-Project → ReLU → Up-Project → + x (残差)
Down-Project: d → bottleneck (如 4096 → 64)
Up-Project: bottleneck → d (如 64 → 4096)
与LoRA的区别:
LoRA: 并行加在权重矩阵上 (不改变推理路径)
Adapter: 串行插入到模型中 (增加推理延迟)
优点: 理论性质好,早期PEFT开山之作
缺点: 推理时无法合并到原始权重 → 有额外延迟
现状: 2025-2026已基本被LoRA取代
Prefix Tuning & Prompt Tuning
Prefix Tuning (Li & Liang, 2021):
在每层Attention的Key和Value前面拼接可训练的"虚拟前缀"
原始: Attention(Q, K, V)
Prefix: Attention(Q, [P_K; K], [P_V; V])
P_K, P_V 是可训练参数, 长度通常20-100个虚拟token
参数量: 层数 × 2 × prefix_len × hidden_dim
Prompt Tuning (Lester et al., 2021):
更简单: 只在输入Embedding层前拼接可训练的"虚拟Prompt"
原始: Embed("请分析这只股票的风险")
Prompt Tuning: [P₁, P₂, ..., P₂₀] + Embed("请分析这只股票的风险")
P₁~P₂₀ 是可训练的连续向量 (不对应任何真实词)
参数量: prompt_len × hidden_dim ≈ 20 × 4096 = 81,920 (极少)
对比:
Prompt Tuning: 最少参数,但效果较弱 (适合超大模型 >100B)
Prefix Tuning: 参数适中,效果比Prompt Tuning好
LoRA: 参数略多,效果最好,已成标准方案
IA3 (Infused Adapter by Inhibiting and Amplifying Inner Activations)
原理 (Liu et al., 2022):
不添加矩阵,而是给关键激活值乘以可训练的缩放向量
Attention: K' = l_K ⊙ K, V' = l_V ⊙ V
FFN: h' = l_FF ⊙ h_FFN
l_K, l_V, l_FF 是可训练向量 (不是矩阵!)
参数量: 层数 × 3 × hidden_dim ≈ 32 × 3 × 4096 = 393,216
特点:
参数量比LoRA少一个数量级
训练极快 (秒级收敛)
效果略逊于LoRA,适合few-shot adaptation场景
DoRA (Weight-Decomposed Low-Rank Adaptation)
2024年提出,2025-2026开始广泛采用
核心改进:
将权重分解为"方向"(direction)和"幅度"(magnitude)
W = m · (W₀ + B·A) / ||W₀ + B·A||
m 是可训练的幅度向量 (每列一个标量)
B·A 学习方向调整
→ 解耦了方向和幅度的学习
效果:
LoRA: 学习率敏感,方向和幅度耦合
DoRA: 更稳定,多个benchmark上比LoRA提升0.5-2%
代价: 额外参数量极小 (每层多一个d维向量)
使用:
from peft import LoraConfig
config = LoraConfig(use_dora=True, ...) # peft库直接支持
PEFT方法全对比表
┌──────────────────────────────────────────────────────────────────────┐
│ 方法 │ 参数量 │ 效果 │ 推理延迟│ 可合并│ 成熟度 │
│─────────────────┼──────────┼────────┼────────┼───────┼──────────│
│ Full FT │ 100% │ ★★★★★ │ 无额外 │ — │ ★★★★★ │
│ LoRA │ 0.1-1% │ ★★★★ │ 可合并 │ ✓ │ ★★★★★ │
│ DoRA │ 0.1-1%+ │ ★★★★+ │ 可合并 │ ✓ │ ★★★★ │
│ QLoRA │ 0.1-1% │ ★★★★ │ 可合并 │ ✓ │ ★★★★★ │
│ Adapter │ 1-5% │ ★★★★ │ +5-10% │ ✗ │ ★★★ │
│ IA3 │ 0.01% │ ★★★ │ 可合并 │ ✓ │ ★★★ │
│ Prefix Tuning │ 0.1% │ ★★★ │ +2-3% │ ✗ │ ★★★ │
│ Prompt Tuning │ 0.001% │ ★★ │ 无额外 │ — │ ★★★ │
└──────────────────────────────────────────────────────────────────────┘
2025-2026结论:
默认选LoRA/QLoRA → 最成熟、生态最好、效果最佳
想要更好 → DoRA (LoRA的即插即用升级)
超大模型+极少数据 → IA3/Prompt Tuning
知识点5: 微调数据工程
数据格式
SFT微调的标准数据格式 (Chat Template):
格式1: Alpaca格式 (简单指令)
{
"instruction": "分析这只股票的风险因素",
"input": "股票代码: 600519, 行业: 白酒",
"output": "茅台主要风险因素包括:\n1. 政策风险: 限制三公消费...\n2. ..."
}
格式2: ShareGPT格式 (多轮对话, 推荐)
{
"conversations": [
{"from": "human", "value": "什么是信用违约互换(CDS)?"},
{"from": "gpt", "value": "CDS是一种信用衍生品..."},
{"from": "human", "value": "买入CDS和卖空债券有什么区别?"},
{"from": "gpt", "value": "两者都是做空信用风险,但..."}
]
}
格式3: OpenAI Messages格式 (兼容API)
{
"messages": [
{"role": "system", "content": "你是金融分析师..."},
{"role": "user", "content": "分析贷款组合的信用风险"},
{"role": "assistant", "content": "我将从以下维度分析...\n1. ..."}
]
}
注意:
不同模型有不同的Chat Template
Qwen2.5: <|im_start|>system\n...<|im_end|>\n
Llama3: <|begin_of_text|><|start_header_id|>system<|end_header_id|>
训练时工具会自动应用正确的template → 不需要手动处理
数据质量 > 数据数量
关键原则: 1000条高质量数据 > 10万条低质量数据
LIMA论文 (2023) 证明:
仅1000条精心策划的数据 → 微调效果接近GPT-4
→ "Less Is More for Alignment"
2025-2026最新验证:
Phi-3 (微软): 小数据精调 → 超越更大模型
Qwen2.5: 官方推荐SFT数据量 500-5000条
高质量数据标准:
┌────────────────────────────────────────────────────────┐
│ 维度 │ 要求 │
│──────────────┼──────────────────────────────────────────│
│ 准确性 │ 答案事实正确,无幻觉 │
│ 完整性 │ 回答覆盖问题的所有方面 │
│ 格式一致 │ 输出格式统一 (如都用Markdown结构) │
│ 多样性 │ 覆盖不同类型的问题和场景 │
│ 长度适当 │ 不过短 (空洞) 也不过长 (注水) │
│ 无毒性 │ 不含偏见、歧视、错误引导 │
└────────────────────────────────────────────────────────┘
合成数据 (Synthetic Data)
2025-2026微调数据的主流获取方式: 用强模型生成弱模型的训练数据
方法1: Seed-based生成
1. 人工写20-50条高质量种子样本
2. 用Claude/GPT-4o根据种子样本批量生成
3. 人工审核筛选 → 保留80%左右
Prompt示例:
"以下是金融合规问答的示例。请生成10个类似的问答对,
要求覆盖反洗钱、KYC、Basel III等不同主题..."
方法2: Evol-Instruct (WizardLM思路)
将简单指令进化为复杂指令:
简单: "什么是ROE?"
进化: "如果一家银行的ROE从15%下降到8%,同时资本充足率上升了3个百分点,
请分析可能的原因,并评估这对股东和监管机构意味着什么。"
方法3: Self-Instruct + 过滤
1. 让模型自己生成instruction
2. 让模型回答
3. 用另一个模型打分/过滤
4. 保留高分数据
金融领域的合成数据注意:
- 数字必须合理 (ROE不会是200%)
- 监管引用必须真实 (不能编造法规条文)
- 建议: 合成 → 人工审核 → 修正 → 入库
领域数据准备清单
金融微调数据来源:
┌──────────────────────────────────────────────────────────┐
│ 来源 │ 示例 │ 获取难度 │
│───────────────────┼───────────────────────┼────────────│
│ 公开金融FAQ │ 银行官网常见问题 │ ★ │
│ 监管文件 │ 银保监会公告/SEC Filing │ ★ │
│ 行业研报 (摘要) │ 券商研报公开部分 │ ★★ │
│ 财报分析 │ 上市公司年报 │ ★★ │
│ 合规知识库 │ 反洗钱/KYC知识 │ ★★★ │
│ 内部工单 │ 客户服务对话记录 │ ★★★★ (脱敏)│
│ AI合成 │ Claude/GPT-4o生成 │ ★ (成本低) │
└──────────────────────────────────────────────────────────┘
推荐数据集规模:
Quick Start: 200-500条 → 验证方法可行性
Production: 1000-3000条 → 日常金融对话
Advanced: 5000-10000条 → 多任务+多场景覆盖
知识点6: 工具链对比
2025-2026主流微调工具
┌───────────────────────────────────────────────────────────────────────────┐
│ 工具 │ 特点 │ 优点 │ 缺点 │
│────────────────┼──────────────────┼──────────────────┼─────────────────│
│ Unsloth │ 速度之王 │ 2x快, 60%省显存 │ 仅支持单GPU │
│ TRL (HF) │ HuggingFace官方 │ RLHF/DPO/PPO全 │ 速度一般 │
│ Axolotl │ 配置驱动 │ YAML配置一切 │ 黑盒感强 │
│ LLaMA-Factory │ 中文生态最好 │ 100+模型, WebUI │ 定制灵活度略低 │
│ torchtune │ PyTorch原生 │ 代码透明 │ 生态较新 │
└───────────────────────────────────────────────────────────────────────────┘
Unsloth — RTX 4060用户的首选
为什么选Unsloth:
1. 手写CUDA kernel → 比标准HF快2x
2. 智能显存管理 → 省40-60%显存
3. 4-bit QLoRA原生支持 → RTX 4060 8GB轻松跑7B
4. 一键合并+导出GGUF → 训练→部署一条龙
5. 支持2025-2026主流模型: Qwen2.5/Llama3.x/Mistral/Gemma2/Phi-4/DeepSeek
安装 (2026最新):
pip install unsloth
# 自动检测CUDA版本, 安装匹配的优化kernel
最小可运行示例:
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Qwen2.5-7B-Instruct-bnb-4bit",
max_seq_length=2048,
load_in_4bit=True,
)
model = FastLanguageModel.get_peft_model(
model,
r=16,
lora_alpha=16,
target_modules=["q_proj","k_proj","v_proj","o_proj",
"gate_proj","up_proj","down_proj"],
lora_dropout=0,
use_gradient_checkpointing="unsloth", # Unsloth优化版
)
LLaMA-Factory — 零代码WebUI微调
特点:
- 浏览器WebUI界面, 点击配置即可训练
- 支持100+模型 (覆盖2025-2026所有主流开源模型)
- 内置多种数据格式适配
- 中文社区活跃, 文档齐全
适用场景:
- 不想写代码, 快速验证想法
- 团队中非工程师也需要微调
- 批量实验不同超参数
启动:
git clone https://github.com/hiyouga/LLaMA-Factory.git
pip install -e ".[torch,metrics]"
llamafactory-cli webui
→ 浏览器打开 http://localhost:7860
知识点7: 完整微调流程
Step-by-Step流程
┌────────────────────────────────────────────────────────────────┐
│ Step 1: 选基座模型 │
│ ↓ │
│ Step 2: 准备数据 (格式化+清洗+划分) │
│ ↓ │
│ Step 3: 配置超参数 │
│ ↓ │
│ Step 4: 训练 (QLoRA) │
│ ↓ │
│ Step 5: 评估 (Loss/人工/Benchmark) │
│ ↓ │
│ Step 6: 合并LoRA到基座 │
│ ↓ │
│ Step 7: 导出GGUF (用于llama.cpp/Ollama本地推理) │
│ ↓ │
│ Step 8: 部署 (Ollama/vLLM/API服务) │
└────────────────────────────────────────────────────────────────┘
Step 1: 基座模型选择
2025-2026推荐 (8GB显卡):
┌────────────────────────────────────────────────────────────┐
│ 模型 │ 参数量 │ 中文 │ 推荐场景 │
│──────────────────────┼───────┼──────┼───────────────────│
│ Qwen2.5-7B-Instruct│ 7B │ ★★★★★│ 中文金融首选 │
│ Llama-3.1-8B-Inst │ 8B │ ★★★ │ 英文通用 │
│ Mistral-7B-v0.3 │ 7B │ ★★★ │ 代码+推理 │
│ Gemma-2-9B-it │ 9B │ ★★★ │ Google生态 │
│ Phi-4-mini (3.8B) │ 3.8B │ ★★★ │ 超轻量, 效果惊人 │
│ DeepSeek-R1-7B │ 7B │ ★★★★ │ 推理链式思考 │
└────────────────────────────────────────────────────────────┘
金融中文场景 → Qwen2.5-7B-Instruct (中文能力最强的7B级模型)
更小显存 → Phi-4-mini 3.8B (QLoRA仅需~3.5GB)
Step 3: 超参数推荐值
QLoRA微调超参数推荐 (RTX 4060 8GB + 7B模型):
┌────────────────────────────────────────────────────────────────┐
│ 超参数 │ 推荐值 │ 说明 │
│───────────────────────────┼─────────────┼──────────────────│
│ 量化: load_in_4bit │ True │ NF4量化基座 │
│ LoRA r │ 16 │ 平衡效果与速度 │
│ LoRA alpha │ 16 或 32 │ alpha=r 或 2r │
│ LoRA dropout │ 0.0 │ Unsloth推荐0 │
│ target_modules │ 全部7层 │ q/k/v/o/gate/up/dn│
│ 学习率 (lr) │ 2e-4 │ QLoRA标准值 │
│ lr_scheduler │ cosine │ 余弦退火 │
│ warmup_ratio │ 0.03-0.1 │ 前3-10%步热身 │
│ batch_size (per_device) │ 1-2 │ 显存限制 │
│ gradient_accumulation │ 4-8 │ 等效bs=4-16 │
│ epochs │ 2-3 │ 小数据集3轮 │
│ max_seq_length │ 512-1024 │ 够用即可 │
│ weight_decay │ 0.01 │ 轻微正则化 │
│ gradient_checkpointing │ True │ 必开, 省显存 │
│ bf16 │ True │ RTX 4060支持bf16 │
│ optimizer │ adamw_8bit │ 8-bit Adam省显存 │
│ max_grad_norm │ 1.0 │ 梯度裁剪 │
│ logging_steps │ 10 │ 每10步记录loss │
│ save_strategy │ steps / epoch│ 定期保存checkpoint │
└────────────────────────────────────────────────────────────────┘
常见错误:
lr太高 (>5e-4) → loss震荡不收敛
lr太低 (<5e-5) → 几乎没学到东西
epochs过多 (>5) → 过拟合,失去通用能力
seq_len太大 → OOM
Step 6-7: 合并与导出
训练完成后的三步操作:
# Step 6: 合并LoRA到基座模型
model.save_pretrained_merged(
"merged_model", # 输出目录
tokenizer,
save_method="merged_16bit", # FP16合并
)
# Step 7: 导出GGUF (供Ollama/llama.cpp使用)
model.save_pretrained_gguf(
"gguf_model",
tokenizer,
quantization_method="q4_k_m", # 推荐的量化方案
)
# Step 8: 在Ollama中使用
# 创建Modelfile:
# FROM ./gguf_model/unsloth.Q4_K_M.gguf
# PARAMETER temperature 0.7
# SYSTEM "你是金融合规专家..."
#
# ollama create my-finance-model -f Modelfile
# ollama run my-finance-model
完整链路 (RTX 4060 8GB):
QLoRA训练 (15-30分钟)
→ 合并LoRA (2分钟)
→ 导出GGUF Q4_K_M (5分钟)
→ Ollama加载 → 本地推理
→ 全程单卡完成
知识点8: 评估与调试
Loss曲线解读
健康的训练曲线:
┌──────────────────────────────────────────────┐
│ Loss │
│ 2.5 ─ * │
│ * │
│ 2.0 ──* │
│ ** │
│ 1.5 ────** │
│ *** │
│ 1.0 ────────**** │
│ ****** │
│ 0.5 ────────────────********* ← 收敛 │
│ │
│ 0.0 ┼──────────────────────────── Steps │
│ 0 200 400 600 800 1000 │
└──────────────────────────────────────────────┘
特征: 快速下降 → 逐渐趋平 → 稳定在某个值
最终loss参考: 0.5-1.0 (SFT对话数据)
过拟合信号:
┌──────────────────────────────────────────────┐
│ Loss │
│ train_loss **** │
│ 2.0 ─ * ** *** │
│ * *** eval_loss ↑ 上升! │
│ 1.0 ──** * │
│ *** * │
│ 0.1 ──────** train_loss → 接近0 (死记硬背) │
│ │
│ ┼──────────────────────────────── Steps │
└──────────────────────────────────────────────┘
信号:
train_loss持续下降到接近0 → 模型背诵了训练数据
eval_loss开始上升 → 泛化能力下降
生成内容重复/僵化 → 模式崩溃
解决:
减少epochs (3→2 或 2→1)
增加数据量或增加数据多样性
降低lr
增加weight_decay (0.01→0.05)
使用早停 (Early Stopping)
WandB / TensorBoard监控
训练时推荐接入WandB (Weights & Biases):
pip install wandb
training_args = TrainingArguments(
report_to="wandb", # 自动上传训练日志
run_name="qwen7b-finance-v1", # 实验名称
...
)
关键监控指标:
┌────────────────────────────────────────────────────────┐
│ 指标 │ 健康范围 │ 异常信号 │
│──────────────────────┼──────────────┼─────────────────│
│ train/loss │ 稳步下降 │ 震荡/不下降 │
│ eval/loss │ 跟随下降 │ 与train背离 │
│ learning_rate │ 按schedule变 │ — │
│ grad_norm │ <10 │ >100 (梯度爆炸) │
│ GPU显存使用 │ <95% │ OOM │
│ tokens_per_second │ 稳定 │ 突然下降=瓶颈 │
└────────────────────────────────────────────────────────┘
常见问题排查
问题1: 训练后模型输出乱码
原因: Chat Template不匹配
排查: 检查tokenizer的chat_template是否正确
解决: 使用模型官方的tokenizer,不要手动修改
问题2: Loss不下降
原因: 学习率太低 / 数据格式错误 / 梯度为0
排查: 先用10条数据验证流程
解决: 提高lr到2e-4 / 检查数据是否被正确tokenize
问题3: 模型只会重复训练数据中的句子
原因: 严重过拟合
排查: 检查train_loss是否接近0
解决: 减少epochs / 增加数据量 / 增加dropout
问题4: OOM (Out of Memory)
排查顺序:
1. 降低batch_size → 1
2. 降低max_seq_length → 512
3. 开启gradient_checkpointing
4. 使用8-bit optimizer
5. 降低r (32→16→8)
6. 减少target_modules
RTX 4060 8GB终极OOM配方:
bs=1 + grad_accum=8 + seq_len=512 + grad_ckpt=True
+ 8bit_adam + QLoRA NF4 + r=16 → 通常可解决
问题5: 合并后模型退化
原因: alpha/r比值设置不当
排查: 合并前先用LoRA加载测试
解决: 训练时用alpha=r (不放大), 逐步调整
人工评估框架
定量评估不够 → 必须辅以人工评估
评估维度 (金融场景):
┌────────────────────────────────────────────────────────┐
│ 维度 │ 评分标准 │ 权重 │
│──────────────┼──────────────────────────┼─────────────│
│ 准确性 │ 金融术语和数字是否正确 │ 40% │
│ 完整性 │ 是否覆盖了所有要点 │ 20% │
│ 专业度 │ 语气/格式是否像专业人士 │ 20% │
│ 安全性 │ 是否有投资建议等合规风险 │ 10% │
│ 流畅度 │ 语言是否自然连贯 │ 10% │
└────────────────────────────────────────────────────────┘
方法:
1. 准备50条测试问题 (不在训练集中)
2. 分别用基座模型和微调模型回答
3. 盲评打分 (不告诉评估者哪个是哪个)
4. 计算Elo Rating或Win Rate
期望结果:
微调模型 Win Rate > 65% → 微调有效
微调模型 Win Rate < 50% → 微调有害,需要检查数据
今日思考
问题1: Fine-tuning和RAG哪个优先?
答:RAG优先,Fine-tuning补充。
决策框架:
┌──────────────────────────────────────────────────────────────┐
│ 先尝试 Prompt Engineering (零成本, 分钟级) │
│ ↓ 效果不够 │
│ 再尝试 RAG (注入外部知识, 天级) │
│ ↓ 效果还不够 / 有特殊格式/风格需求 │
│ 最后用 Fine-tuning (改变模型能力, 周级) │
│ ↓ 最佳实践 │
│ Fine-tuned模型 + RAG = 既懂领域知识,又有最新数据 │
└──────────────────────────────────────────────────────────────┘
原因:
RAG: 不需要训练,即时生效,知识可更新,可解释
FT: 需要数据收集+训练+评估,但能改变模型的"行为模式"
金融场景:
"用专业金融语气回答" → Fine-tuning (改变风格)
"引用最新Basel IV条文" → RAG (知识检索)
"用专业语气引用最新条文" → Fine-tuning + RAG (组合)
问题2: LoRA的r应该怎么选?有没有更科学的方法?
答:从小到大递增实验,用eval_loss指导选择。
实践方法:
1. 先跑r=8, 16, 32三组实验 (数据量小时几分钟跑完)
2. 比较eval_loss和人工评估
3. 通常r=16是7B模型的甜点
2025-2026新进展:
- LoRA+: 对A和B用不同学习率 → 同等r下效果更好
- rsLoRA: 缩放因子改为 α/√r (而非α/r) → 大r时更稳定
- AdaLoRA: 动态调整不同层的r → 重要层分配更多秩
- AutoLoRA: 自动搜索最优r → 但搜索成本高
个人经验:
简单任务 (格式适配): r=8够了
领域知识 (金融): r=16-32
多任务复杂场景: r=64
不确定时: 先跑r=16, 效果不好再加
问题3: 作为PM/架构师,什么时候应该建议团队做Fine-tuning?
答:当"行为模式"而非"知识"是瓶颈时。
应该Fine-tuning的信号:
✓ 输出格式不一致 (JSON/Markdown/表格)
✓ 语气不符合品牌调性 (如需要严肃金融专业风格)
✓ 特定推理模式 (如风控评分的固定分析框架)
✓ 领域专业术语经常用错
✓ Prompt太长 (>2000 tokens的few-shot示例) → 微调后可省掉
不应该Fine-tuning的信号:
✗ 需要最新数据 → 用RAG
✗ 偶尔用到的功能 → 用Prompt Engineering
✗ 数据量<50条 → 太少,先用few-shot
✗ 团队没有GPU资源 → 用API + Prompt (但2026云端微调很便宜)
成本考量 (PM视角):
云端微调(RunPod/Lambda): ~$1-3/小时 (A100), 7B训练约2小时
本地微调(RTX 4060): 电费忽略不计
数据标注: 1000条 × $0.5/条 = $500 (最大成本)
维护成本: 模型更新/数据迭代的持续投入
ROI评估:
微调前: Prompt Token成本 $X/天 (长system prompt)
微调后: Prompt缩短70% → Token成本降至 $0.3X/天
加上: 准确率提升 → 减少人工审核 → 额外节省
面试表达
问题: 解释LoRA的原理,为什么它能以很少的参数达到接近全微调的效果?
30秒版本:
"LoRA基于一个关键洞察:微调时权重的变化量是低秩的,也就是说变化集中在一个
低维子空间里。所以我们不需要更新所有参数,只需要用两个小矩阵B和A的乘积来
近似这个增量。以7B模型为例,只训练0.4%的参数,效果能达到全微调的98%以上。
结合QLoRA的4-bit量化,一张8GB显卡就能微调7B模型。"
2分钟版本:
1. 数学原理:
"原始权重W₀冻结,新增一个低秩增量 ΔW = B×A。
A把高维输入降到r维,B再升回去。r通常只有16,
相比4096×4096的原始矩阵,参数量缩减了99%以上。"
2. 为什么有效:
"微调本质上是让模型适配一个新任务,这个适配信息的内在维度远低于
模型的参数空间。就像给一个已经很优秀的银行分析师发一份补充手册——
不需要重新培训所有知识,只需要告诉他新业务的差异点。"
3. 工程价值:
"a) 显存从84GB降到6.5GB (QLoRA + 7B);
b) 多个LoRA可以共享一个基座模型,存储和切换成本极低;
c) 合并后推理性能零损耗,部署和原始模型完全一样;
d) 降低了AI定制化的门槛——中小团队也能做领域微调。"
4. 实际应用:
"在金融场景中,我会用QLoRA微调一个合规对话模型:
基座选Qwen2.5-7B,用合规QA数据训练,r=16,
在RTX 4060上20分钟训完,导出GGUF后用Ollama本地部署。"
追问准备:
Q: "LoRA和Full Fine-tuning效果差距大吗?"
A: "QLoRA论文表明差距通常在1%以内。但在极端领域偏移场景下
(如英文模型学中文),Full FT仍然更好。目前LoRA的大量
变体(DoRA/LoRA+/rsLoRA)在不断缩小这个差距。"
Q: "你会如何选择r的值?"
A: "根据任务复杂度:格式适配r=8,知识注入r=16-32,复杂多任务r=64。
实践中我会跑3组对比实验,用eval_loss和人工评估综合决定。
2025的经验是r=16对大多数SFT场景已经足够。"
Q: "什么情况下不应该微调?"
A: "三种情况:一是需要最新实时数据,用RAG更合适;
二是数据量不足50条,few-shot效果可能更好;
三是任务偶尔使用、不需要极致效果,Prompt Engineering足够。
Fine-tuning应该是排除其他选项后的最后手段。"
学习资源
必读论文/文章
| 资源 | 说明 |
|---|---|
| LoRA原始论文 (Hu et al., 2021) | PEFT奠基之作,必读 |
| QLoRA (Dettmers et al., 2023) | NF4+LoRA,消费级微调的关键 |
| DoRA (Liu et al., 2024) | LoRA的方向-幅度解耦改进 |
| LIMA: Less Is More (Zhou et al., 2023) | 1000条数据的威力 |
| PEFT方法综述 (Lialin et al., 2023) | 全面的PEFT技术对比 |
实操教程
| 资源 | 说明 |
|---|---|
| Unsloth Wiki | 官方文档,入门到高级 |
| Unsloth Colab Notebooks | 免费Colab直接跑,零配置 |
| LLaMA-Factory文档 | 中文最全微调工具 |
| HuggingFace PEFT库 | 标准PEFT实现 |
| TRL SFTTrainer | SFT训练标准流程 |
视频推荐
| 资源 | 说明 |
|---|---|
| Trelis Research - LoRA Explained | 最清晰的LoRA讲解 |
| Sebastian Raschka - PEFT | 深度技术讲解 |
| Unsloth YouTube Channel | 实操教程,RTX 40系为主 |
明日预告
Day 8: 推理优化 — vLLM / TensorRT-LLM / SGLang
核心问题:
微调好了模型 → 如何高效地服务数千用户?
单次推理很快 → 但并发100个请求时如何保持低延迟?
GPU很贵 → 如何最大化吞吐量/成本比?
预习内容:
- KV Cache: 为什么推理时需要缓存,以及如何管理
- PagedAttention (vLLM): 像操作系统管理内存一样管理KV Cache
- Continuous Batching: 动态组批,最大化GPU利用率
- Speculative Decoding: 用小模型加速大模型推理
- TensorRT-LLM vs vLLM vs SGLang: 三大推理框架对比
- 量化推理: GPTQ/AWQ/GGUF在推理时的性能差异
与今日的关系:
Day 7 Fine-tuning → 训练出领域模型
Day 8 推理优化 → 让这个模型高效服务用户
组合 = 从训练到部署的完整链路
Day 7 总结: Fine-tuning通过更新模型权重让LLM适配特定领域和任务。LoRA用低秩矩阵分解实现了"只改0.4%参数,获得98%效果"的惊人效率;QLoRA再叠加NF4量化,使得RTX 4060 8GB也能微调7B模型。实际工程中,选择Prompt Engineering → RAG → Fine-tuning的递进策略,只在"行为模式"而非"知识"成为瓶颈时才微调。工具链方面,Unsloth是消费级显卡首选(2x加速+60%省显存),LLaMA-Factory则提供零代码WebUI体验。数据质量远比数量重要——1000条精心标注的金融QA数据,足以让通用模型变成专业助手。