系列封面

Day10|大模型微调入门——什么场景才该微调,LoRA 和全参怎么选

前言:90% 说要微调的人,其实都不该微调

上周有个读者在后台留了条挺长的消息。

"檀木,我们 RAG 上线三个月了,效果一直上不去。老板说别折腾检索了,让我去微调一个模型。可我连微调要多少张卡都不知道,该从哪下手?"

我盯着这条消息看了挺久。

不是不会答。是这句话里藏着一个特别普遍的误区——"效果不好 = 该微调了"

我见过太多团队,prompt 没调明白、检索没做干净,一拍脑袋就上微调,烧了几万块 GPU 费,回头一看,效果还不如改两行 prompt。

所以这篇我不急着教你怎么调参。先帮你把两道选择题做对:

  1. 你的问题,到底该不该用微调解决?(vs RAG)
  2. 真该微调了,LoRA 和全参怎么选?

把这两题答对,你已经跑赢 80% 匆忙上微调的人。

微调 vs RAG 决策框架


PART 01:微调 vs RAG——先把这道选择题做对

很多人把微调和 RAG 当成二选一。这是第一个大坑。

它俩根本不是解决同一个问题的

RAG 解决的是"知识":你的私有数据、公司文档、最新资讯——模型不知道的,现查现答,还能附来源。

微调解决的是"行为":让模型用你想要的风格说话、按固定格式输出、学会某个领域的推理套路。

一个管"知道什么",一个管"怎么说话"。

记住这个决策框架:

  • 知识要频繁更新、要可溯源 → 用 RAG。文档改了重灌一遍就行,几秒钟。
  • 输出风格/语气/格式固定、领域推理方式特殊 → 用 微调。比如让它永远用你们公司的法务口吻写合同条款。
  • 两者可以叠加:先微调一个"懂行"的底座,再叠 RAG 注入实时知识。这才是企业里的成熟做法。

两个最常见的翻车现场:

翻车一:用微调塞知识。 把公司文档全喂进模型微调,指望它"记住"。结果知识一更新,又得重训一遍,烧钱且永远滞后。知识的活儿,就该交给 RAG。

翻车二:用 RAG 改风格。 检索做得再好,也改不了模型"说话的味儿"。你想让它简短干练,它偏给你长篇大论——这不是知识问题,是行为问题,RAG 管不着。

所以回到开头那位读者:RAG 效果上不去,第一反应不该是"换微调",而是先问"我的问题是知识问题还是行为问题"。 八成是检索或数据没弄干净(Day09 讲过),跟微调没关系。

LoRA 低秩分解原理


PART 02:LoRA vs 全参微调——重武器里选哪把

好,假设你已经判断清楚:这事儿真该微调。那接下来选哪把枪?

全参微调(Full Fine-Tuning):更新模型的所有参数。

它的好处是效果上限高,坏处也明显——显存爆炸。一个 7B 模型全参微调,光优化器状态就要吃掉几十 G 显存,没几张 A100 别想。而且容易"灾难性遗忘":学了新任务,把老本事忘光了。

LoRA(Low-Rank Adaptation,低秩适配):这才是 2026 年普通人的主战场。

它的思路特别优雅——别动原模型,只在旁边"焊"两个小矩阵

把权重更新写成:

W = W₀ + B·A

  • W₀ 是原模型权重,完全冻结,一个参数都不动
  • B 和 A 是两个很小的矩阵(比如 4096×8 和 8×4096),只训练它俩

为什么这么干管用?因为研究发现:模型权重的实际变化,"内在秩"很低。你不需要动全部几十亿参数,用两个小矩阵就能近似表达那个变化。

效果立竿见影:

  • 可训练参数从几十亿降到几百万,不到总参数的 0.1%
  • 一张消费级显卡(甚至 Mac)就能跑
  • 效果逼近全参微调,多数场景差距可忽略
  • 还能热切换:一个底座挂多个 LoRA,按需加载,像换皮肤一样

所以入门选谁,答案很清楚:LoRA。 除非你是大厂、有卡、追求极限效果,才考虑全参。

微调最小闭环流程


PART 03:最小可跑通的微调流程

理论说完,上手。最小闭环就三步:备数据 → 训练 → 评估

第一步:备数据(指令微调格式)

微调不是随便喂文本,得整理成"指令—输出"对。最常见的是这种 JSON:

{"instruction": "把客服反馈分类", "input": "收到的货破了", "output": "物流破损投诉"}
{"instruction": "把客服反馈分类", "input": "App 一直闪退", "output": "功能Bug反馈"}

一个小提醒:几百条高质量数据,胜过几万条垃圾。先把数据洗干净(Day09 的功夫这儿用上了),别指望靠量堆出效果。

第二步:LoRA 训练(peft + transformers)

from transformers import AutoModelForCausalLM
from peft import LoraConfig, get_peft_model
from trl import SFTTrainer, SFTConfig

# 1. 加载基座模型(4bit 量化,省显存)
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-7B-Instruct", load_in_4bit=True, device_map="auto"
)

# 2. 挂 LoRA:只训练注入的低秩矩阵,原模型冻结
lora_config = LoraConfig(
    r=8, lora_alpha=16, lora_dropout=0.05,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    task_type="CAUSAL_LM",
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 6M || all params: 7.6B || trainable%: 0.08%

# 3. 训练
trainer = SFTTrainer(
    model=model,
    train_dataset=ds,
    args=SFTConfig(
        output_dir="./lora-out",
        per_device_train_batch_size=4,
        num_train_epochs=3,
        learning_rate=2e-4,
        bf16=True,
    ),
)
trainer.train()

# 4. 合并导出(推理时不用再挂 LoRA)
merged = model.merge_and_unload()
merged.save_pretrained("./qwen2.5-7b-my-lora")

print_trainable_parameters() 那一行会告诉你:7.6B 参数里,只训了 0.08%。这就是 LoRA 省钱的秘密。

第三步:评估(别省这一步)

训练完先别急着上线。留一小撮没训过的数据,让模型跑一遍,看输出对不对。没有评估的微调,等于盲飞。

还有个省钱心法:从小处验证。先用 7B 量化模型 + 几百条数据 + LoRA 跑通整条链路,确认方向对了,再考虑加大投入。别一上来就全参 + 万级数据,那是烧钱比赛。


结尾:RAG 给模型补课,微调给模型塑形

盘点一下这篇的核心:

  • 微调 vs RAG 不是二选一:RAG 管知识,微调管行为,先判断你的问题是哪一类
  • 入门选 LoRA:冻结原模型、只训低秩矩阵,一张卡就能跑,效果逼近全参
  • 最小闭环:备指令数据 → LoRA 训练 → 评估 → 合并导出

我见过最可惜的,是那些 RAG 都没玩明白、就冲去微调的团队。钱花了,问题还在。

RAG 给模型补课,微调给模型塑形——补错地方,越努力越跑偏。

工具是工具,先搞清楚你要解决什么问题,比学怎么用工具更重要。

互动时间:你现在手头的 AI 项目,卡在"知识"还是"行为"上?是 RAG 检不准,还是模型说话味儿不对?评论区说说,我帮你判断该不该上微调。


下一篇 Day11 预告:微调的数据到底怎么准备——几百条高质量数据怎么挑、怎么标注、怎么避免把模型教坏。关注小刘檀木,不错过每一篇。

— END —

小刘檀木 · 帮普通人把 AI 学进简历

Logo

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

更多推荐