大模型预训练、微调、SFT、RAG 与 LoRA/QLoRA 全体系详解
前言
随着大语言模型(LLM)落地普及,预训练、微调、SFT、RAG、LoRA、QLoRA 等技术已成为 AI 工程落地的核心知识点。很多入门开发者容易混淆预训练目标、微调本质、各类微调方案选型、参数高效微调原理等核心概念。
本文从底层数学原理出发,逐层拆解大模型预训练逻辑、监督微调(SFT)、Prompt、RAG 三大应用范式,重点讲解全量微调、冻结微调、Prompt Tuning、PEFT(LoRA/Adapter)、RLHF 等主流微调框架,最后深入剖析工业界主流的 LoRA 与 QLoRA 技术细节、参数调优、初始化规则、推理部署方案,并附带实战代码示例、选型策略与常见问题解答。
目录
8 实战代码示例(Hugging Face PEFT + LoRA/QLoRA)
1 大模型预训练核心原理
1.1 预训练训练目标与数学表达
大模型预训练是基座模型能力的来源,自回归语言模型(GPT 系列) 是目前主流架构,其核心训练目标:
给定上文序列,预测下一个概率最大的词(Token)。
数学条件概率表达: P(wt∣w<t)
- wt:当前待预测的第 t 个 Token
- w<t:t 位置之前的所有上文 Token
整个预训练过程,本质是让模型学习自然语言的条件概率分布。
1.2 预训练模型真正学到的内容
经过海量无标注文本预训练后,基座模型会沉淀通用能力,分为已掌握能力和未掌握能力两大板块:
模型学到的能力
- 语言结构:语法、句式、语序、分词规则等基础语言学特征
- 通用常识:生活常识、基础科学常识、社会通识
- 世界知识:历史、地理、文化、公开行业通用知识
- 推理模式:简单逻辑推理、链式思考(CoT)基础能力
- 风格统计:通用文本风格、句式习惯、表达范式
模型无法学到的能力
- 企业私有业务逻辑、内部流程
- 垂直领域专属术语、行业黑话、专业知识
- 企业定制化回答风格、话术规范
- 自定义业务规则、输出偏好、约束条件
补充说明:预训练数据是公开通用数据,因此模型天生不具备私有化、定制化能力,这也是后续微调、RAG、Prompt 技术存在的核心原因。
1.3 对预训练模型的关键认知
很多初学者会将大模型理解为 “记忆数据库”,这是典型误区:
- 大模型不是记忆库,本质是一个超高维概率分布函数
- 模型中数十亿 / 上百亿的参数,全部是拟合该概率分布的系数
- 模型生成文本,是不断根据前文采样概率最高的 Token,而非 “检索记忆”
2 微调的本质:重塑概率分布
2.1 微调表层与底层变化
表层表现
微调过程中,模型的参数会被迭代更新: θ→θ′ θ 代表预训练原始参数,θ′ 代表微调后的新参数。从表象看,训练就是不断修改模型权重。
底层本质
参数变化只是载体,微调真正改变的是模型的输出条件概率分布:
- 微调前:Pθ(y∣x)
- 微调后:Pθ′(y∣x)
简单概括:微调 = 改变同一输入对应的输出概率排序。
2.2 微调核心逻辑与案例
以「广告文案生成」任务举例:
- 原始基座模型:输入需求后,Token 概率分布偏向解释、说明、科普类词汇,输出偏向解释型文本
- 经过广告文案数据集微调后:营销、卖点、引导类词汇概率大幅提升,输出转向销售型文案
用 Token 概率直观举例(Softmax 输出概率):
- 微调前:香 (0.6)、米 (0.2)、面 (0.1)、其他 (0.1)
- 微调后:米 (0.7)、香 (0.1)、面 (0.1)、其他 (0.1)
2.3 微调一句话总结
微调:利用少量领域专属数据,重新塑造模型的输出概率空间,让模型适配特定任务、风格与逻辑。
3 监督式微调 SFT 详解
3.1 SFT 定义与训练目标
SFT = Supervised Fine-Tuning,监督式微调,是工业界最基础、使用最广泛的微调方案。
- 定义:使用标注好的 {输入 - 理想输出} 配对数据对模型进行微调,明确告诉模型不同输入对应的标准答案。
- 区分:无监督训练(聚类、CBOW、Skip-gram、FastText 词向量训练)无人工标注,SFT 依赖人工 / 半人工标注语料。
SFT 训练目标:拟合输入到输出的条件概率 P(y∣x),损失函数采用交叉熵损失(语言模型标准损失)。
3.2 SFT 本质
在概率空间视角下,SFT 的核心行为:
- 提升标准答案对应 Token 的输出概率
- 降低错误答案对应 Token 的输出概率 本质依旧是:在原有概率空间中,对输出结果做概率重排序。
3.3 SFT 优缺点与技术延伸
优点
- 实现逻辑简单,算法门槛低
- 训练过程稳定,不易出现发散、崩溃
- 工程化落地成熟,适配绝大多数框架
缺点
- 仅能区分 “正确 / 错误”,无法表达人类偏好强度(比如区分 “优秀回答” 和 “一般回答”)
- 面对模糊、主观类任务(对话风格、价值观对齐)效果有限
技术延伸
正是因为 SFT 无法解决人类偏好对齐问题,行业后续衍生出 RLHF(人类反馈强化学习)技术,作为 SFT 的补充。
4 Prompt、微调、RAG 三大方案对比与选型
在大模型私有化落地中,Prompt、微调、RAG 是三大主流落地路线,三者底层逻辑完全不同。
4.1 Prompt 提示工程
核心原理
不修改模型任何参数,仅修改输入文本,通过精心设计提示词,引导模型利用原有预训练概率分布完成任务。
优缺点
- 优点:零训练成本、上手快、部署简单、随时迭代提示词
- 缺点:能力受基座模型上限约束、输出稳定性差、复杂定制任务效果弱
4.2 传统微调
核心原理
修改模型内部权重参数,从底层改变模型的概率分布、行为逻辑与文本风格。
优缺点
- 优点:输出稳定、风格与能力可长期固化、深度定制化能力强
- 缺点:存在训练算力 / 数据成本、训练不当易出现灾难性遗忘(丢失原有通用能力)
4.3 RAG 检索增强生成
核心原理
不修改模型参数,通过检索组件从外部知识库召回相关信息,将「原始查询 + 检索内容」拼接后输入模型生成结果。 标准流程:用户查询 → 文档检索 → 内容拼接 → 模型生成
优缺点
- 优点:知识库更新灵活、无需重新训练模型、适配海量动态知识场景
- 缺点:最终效果强依赖检索质量,无法改变模型本身的性格、逻辑与表达风格
4.4 三者核心本质区别
- Prompt:借势原有模型,改输入,不动模型
- 微调:改造原有模型,改参数,重塑概率分布
- RAG:补充外部知识,改输入上下文,不动模型
4.5 业务场景选型策略
-
选择 Prompt
- 轻度试用、快速验证业务效果
- 无算力、无标注数据,不想做模型训练
- 简单指令类、一次性临时任务
-
选择 RAG
- 依赖海量外部知识、知识库频繁更新(知识库、文档问答、企业资料库)
- 数据体量极大,不适合全部灌入微调数据集
-
选择微调
- 需要固定输出风格、定制话术
- 需要改变模型行为逻辑、任务范式
- 希望将领域能力长期固化到模型中
实战案例:车载小模型部署场景 车企将云端大模型通过知识蒸馏 + 微调,把专属交互逻辑、车载话术固化到端侧小模型中,属于典型的微调落地场景。
5 主流大模型微调全框架体系
按照模型参数改动量从大到小,行业主流微调框架分为六大类,覆盖从全量训练到轻量调优的全场景。
5.1 微调框架整体认知
整体层级(改动量由高→低): 全参数微调 → 冻结微调 → RLHF 对齐微调 → PEFT 参数高效微调(LoRA/Adapter)→ Prompt 软调参
5.2 全参数微调 Full Fine-Tuning
核心思想
训练过程中更新模型全部参数,模型原有多少参数,就训练多少参数。 举例:7B 模型更新 70 亿参数,70B 模型更新 700 亿参数。
优缺点
- 优点:模型可塑性最强、任务适配效果最优、可完成彻底的领域改造
- 缺点:显存消耗爆炸、训练算力成本极高、极易发生灾难性遗忘
适用场景
- 头部大厂、具备大规模算力集群
- 基座模型版本升级、底层能力重构
- 参数量较小的传统模型(如 BERT)
5.3 冻结微调 Partial Fine-Tuning
核心思想
冻结模型绝大部分底层参数,仅训练少量上层模块 / 网络层,常见策略:
- 仅训练模型最后几层 Transformer
- 仅训练 Embedding 嵌入层
- 仅训练分类头 / 任务输出头
底层逻辑:模型浅层存储通用语言能力,深层负责任务适配,因此只微调上层即可兼顾通用能力与定制能力。
优缺点
- 优点:显存开销大幅下降、训练过程稳定、小数据集也能取得不错效果
- 缺点:模型表达能力受限,复杂任务适配能力弱于全参微调
适用场景
中小体量模型、小样本领域微调、不希望破坏模型通用能力的场景。
5.4 Prompt 类软调参方法
核心思想
完全不改动模型原始权重,仅训练一组额外的「可学习提示向量」,通过向量引导模型行为,也被称为软提示调优。
主流算法
Prompt Tuning、Prefix Tuning、P-Tuning v1、P-Tuning v2
工作原理
在原始输入序列前,插入一段可学习的虚拟向量,训练阶段只优化该向量,模型主体全程冻结。
优缺点
- 优点:可训练参数量极少、极致省显存、单模型支持多任务共享不同提示向量
- 缺点:复杂任务效果一般,对百亿级以上大模型友好,小模型效果差
5.5 PEFT 参数高效微调
5.5.1 PEFT 整体定义
PEFT = Parameter Efficient Fine-Tuning,参数高效微调 核心思想:冻结完整基座模型,向网络中插入少量额外可训练模块,仅优化新增模块参数,原模型权重全程固定。 目前是工业界大模型微调的主流方案。
5.5.2 代表方案 1:LoRA(低秩适应)
在模型原有线性权重矩阵旁,插入一对低秩矩阵,仅训练低秩矩阵,后文单独深度讲解。
5.5.3 代表方案 2:Adapter
在 Transformer 层与层之间插入小型旁路网络模块,训练时仅更新 Adapter 模块参数。
PEFT 爆火的原因
- 千亿 / 百亿级大模型全参微调算力门槛极高,中小企业无法承担
- 单基座模型需要适配多套业务任务,PEFT 可保存多套独立微调分支
- 显存占用极低,单卡即可完成大模型微调
5.6 RLHF 人类反馈强化学习对齐
核心定义
RLHF = Reinforcement Learning from Human Feedback,基于人类反馈的强化学习 结合「SFT 监督微调 + 人工打分 + 强化学习」,核心目标是让模型输出贴合人类主观偏好、价值观与安全规范。
核心作用
- 提升模型对话自然度、贴合人类表达习惯
- 内容安全对齐,减少有害输出、幻觉胡说
- 区分回答优劣,实现偏好强度排序
优缺点
- 优点:模型对齐效果顶尖,目前 ChatGPT、文心一言等主流对话模型标配方案
- 缺点:标注成本极高、训练链路复杂、技术门槛大
6 工业界核心方案:LoRA 深度解析
6.1 LoRA 诞生背景:全参微调的痛点
以 7B 大模型为例,全参数微调存在三大致命问题:
- 训练过程不仅要存储模型参数,还需要存储梯度、优化器状态,显存占用会翻倍甚至三倍
- 每一个业务任务,都需要保存一整套完整模型权重,存储成本爆炸
- 大模型分布式训练算力要求极高,普通单机 / 单卡无法运行
关键学术观察:论文实验证明,大模型微调时,权重的变化量 ΔW 具备低秩特性。 翻译成人话:微调不是让模型彻底重学,只是轻微旋转模型的决策边界,权重变化量可以用极低维度的矩阵近似表达,这就是 LoRA 的理论基础。
6.2 LoRA 核心思想与公式推导
原始线性层计算
标准神经网络线性层公式: y=Wx
- W:原始冻结权重矩阵
- x:输入向量
- y:输出向量
LoRA 增强公式
LoRA 在线性层旁新增低秩分支,最终输出为原分支 + 低秩分支叠加: y=Wx+ΔWx 其中权重变化量拆解为两个低秩矩阵相乘: ΔW=BA 矩阵维度定义:
- A∈Rr×k
- B∈Rd×r
- 约束:r≪d,k(秩 r 远小于原始矩阵维度)
完整工程公式(引入缩放系数): y=Wx+rαBAx
- α:缩放系数,控制 LoRA 分支影响力
- r:矩阵秩,控制 LoRA 表达容量
参数量对比示例
假设原始矩阵维度 1000×1000:
- 原始全量参数:1000×1000=1000000
- 取秩 r=8,LoRA 可训练参数:1000×8+8×1000=16000 参数量压缩数十倍,显存开销大幅降低。
LoRA 作用位置
LoRA 主要作用于 Transformer 中的线性层,以 BERT、GPT 类模型为例:
- 注意力模块线性层:Q_proj、K_proj、V_proj、O_proj
- 前馈网络 FFN 层:up_proj、down_proj、gate_proj(Silu/Swish 结构)
6.3 LoRA 三大核心调参
公式回顾:y=Wx+rαBAx LoRA 是一套三维可调系统:Rank (r)、Alpha (α)、注入位置。
6.3.1 Rank (r) — 容量控制
r 代表低秩矩阵的秩,决定 LoRA 分支的表达能力上限:
- r 越大:可学习能力越强,参数量、显存占用同步上升
- r 越小:越节省显存,表达能力越弱
常用取值
行业通用取值:4、8、16、32(绝大多数场景 8/16 为最优解)
参数量计算示例
线性层维度 4096×4096:
- 全参数数量:4096×4096=16777216
- r=8 时 LoRA 参数:4096×8+8×4096=65536
- 压缩倍数:16777216÷65536=256 倍
6.3.2 Alpha (α) — 强度控制
缩放项 rα 用于控制 LoRA 分支对主模型的影响强度。 通俗理解:
- Rank = 麦克风容量
- Alpha = 麦克风音量
行业常规配置
- α=r:基础配置,影响强度适中
- α=2r:增强 LoRA 影响力,适合领域差异大的任务
6.3.3 注入位置(结构选择)
Transformer 所有线性层均可注入 LoRA,工程上按优先级分为三类:
(1)Q/V 层(首选,通用场景)
注入位置:q_proj、v_proj
- 原理:Query 决定模型关注的信息,Value 决定信息传递内容
- 优点:参数量最少、训练速度最快、性价比最高
- 适用:绝大多数常规微调、小数据集、低成本场景
(2)K/O 层(增强方案)
在 Q/V 基础上增加 k_proj、o_proj
- 原理:Key 影响注意力匹配,Output 影响注意力最终输出
- 优点:模型调整能力更强
- 缺点:参数量增加、训练变慢
- 适用:Q/V 效果不达预期的复杂任务
(3)FFN 层(深度改造)
注入位置:gate_proj、up_proj、down_proj
- 原理:FFN 负责特征变换,注入后可学习复杂特征
- 优点:最强表达能力,支持深度领域适配
- 缺点:显存、训练成本显著提升
- 适用:高端定制、复杂专业任务
6.4 LoRA 参数初始化规则
初始化是容易被忽略但决定训练稳定性的关键:
初始化目标
训练初始阶段,保证 ΔW=BA=0,不改变原始模型输出。
标准初始化方案(工程最优解)
- 矩阵 A:高斯随机初始化
- 矩阵 B:初始化为全 0 矩阵
结果:BA=0,初始状态完全等价原模型,训练起步平滑。
错误方案风险
若 A、B 全部随机初始化:ΔW=0 会导致:初始 Loss 剧烈波动、小数据集训练极易崩溃。
6.5 LoRA 推理阶段两种部署方案
LoRA 训练完成后,推理有两种主流落地方式:
方式一:动态计算 Dynamic LoRA
计算逻辑
推理时原始权重 W 与 LoRA 分支分离,前向传播实时叠加: y=Wx+rαBAx
优缺点
- 优点:支持动态加载 / 卸载 LoRA、单主模型挂载多套 LoRA 分支(类似 U 盘插拔)
- 缺点:额外增加矩阵乘法,带来轻微推理延迟
适用场景
多任务切换、需要频繁更换微调分支的服务场景。
方式二:权重合并 Weight Merge
合并公式
推理前将 LoRA 权重永久合并进原始权重: W′=W+rαBA 推理时直接使用合并后权重:y=W′x
优缺点
- 优点:推理速度与原模型完全一致,无额外开销
- 缺点:合并后无法拆分 LoRA,不支持多分支切换
适用场景
单一固定业务、追求极致推理速度的线上服务。
7 极致显存优化:QLoRA 技术详解
7.1 QLoRA 诞生背景
LoRA 仅优化可训练参数量,但基座模型本身依旧以 FP16/FP32 高精度存储,百亿级模型显存占用依旧居高不下。
QLoRA 结合模型量化 + LoRA,将基座模型压缩至 4bit 存储,进一步压榨显存空间,实现单卡微调超大模型。
核心定位区分:
- LoRA:省训练参数
- QLoRA:省基座模型显存
7.2 QLoRA 工作流程
- 将完整基座模型量化为 4bit 精度,全程冻结不更新
- 在量化模型的线性层中插入 LoRA 分支,LoRA 矩阵使用 16bit 高精度训练
- 训练过程仅更新 LoRA 低秩矩阵,量化权重保持不变
简化公式: y=W4bitx+BAx
7.3 LoRA 与 QLoRA 核心差异
- LoRA:基座模型 FP16/FP32 全精度,插入 LoRA,无量化操作
- QLoRA:基座模型压缩为 4bit 量化,再插入 LoRA 做高精度训练
7.4 4bit 量化不损失效果的底层逻辑
- 大模型权重分布近似正态分布,使用 NF4(归一化浮点 4bit)量化可以很好保留权重特征,模型基础能力不坍塌
- 4bit 量化会引入微小误差,而16bit 高精度的 LoRA 分支专门负责补偿量化误差
通俗理解:4bit 搭建模型 “骨架”,LoRA 负责精细化 “修正”。
7.5 QLoRA 优缺点与适用场景
优点
- 显存占用降到极低,消费级显卡即可微调 33B/65B 超大模型
- 最终效果无限接近全参数微调、标准 LoRA
缺点
- 量化解码存在开销,训练速度略慢于标准 LoRA
- 极端高精度任务下,效果略逊于 FP16 版本 LoRA
适用场景
显存资源有限、希望单机微调超大参数量模型的场景(个人开发者、中小团队)。
7.6 QLoRA 高频 QA
- Q:QLoRA 训练时 4bit 量化权重会更新吗? A:不会。量化基座模型全程冻结,仅更新 LoRA 低秩矩阵。
- Q:为什么 LoRA 分支必须用 16bit 训练? A:LoRA 承担补偿量化误差、学习领域特征的核心作用,需要高精度保证学习能力。
- Q:QLoRA 最适合什么场景? A:单卡 / 低显存服务器,微调 30B+ 大模型。
8 实战代码示例(Hugging Face PEFT + LoRA/QLoRA)
依赖环境安装:
pip install torch transformers datasets peft bitsandbytes accelerate
8.1 标准 LoRA 微调代码(FP16)
import torch
from datasets import Dataset
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
TrainingArguments,
Trainer
)
from peft import LoraConfig, get_peft_model
# 1. 基础配置
model_name_or_path = "your-model-path" # 替换为模型路径
lora_rank = 8
lora_alpha = 16
target_modules = ["q_proj", "v_proj"] # 仅注入Q/V层
# 2. 加载模型与分词器
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model = AutoModelForCausalLM.from_pretrained(
model_name_or_path,
torch_dtype=torch.float16,
device_map="auto"
)
# 3. 配置LoRA参数
lora_config = LoraConfig(
r=lora_rank,
lora_alpha=lora_alpha,
target_modules=target_modules,
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
# 4. 注入LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # 打印可训练参数量占比
# 5. 构造测试数据集(示例)
train_data = [
{"input": "问题1", "output": "回答1"},
{"input": "问题2", "output": "回答2"}
]
dataset = Dataset.from_list(train_data)
def format_func(example):
prompt = f"### 输入:{example['input']}\n### 输出:{example['output']}"
return tokenizer(prompt, truncation=True, max_length=512)
train_dataset = dataset.map(format_func)
# 6. 训练参数配置
training_args = TrainingArguments(
output_dir="./lora-output",
per_device_train_batch_size=4,
learning_rate=2e-4,
num_train_epochs=3,
fp16=True,
logging_steps=10,
save_strategy="epoch"
)
# 7. 启动训练
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset
)
trainer.train()
# 8. 保存LoRA权重
model.save_pretrained("./lora-save")
8.2 QLoRA 4bit 量化微调代码
仅需在模型加载阶段增加量化配置,其余代码与 LoRA 完全一致:
import torch
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig
)
# 4bit量化配置
bnb_config = BitsAndBytesConfig(
load_in_4bit=True, # 开启4bit量化
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4", # 使用NF4量化格式
bnb_4bit_compute_dtype=torch.float16
)
# 加载4bit量化模型
model_name_or_path = "your-model-path"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model = AutoModelForCausalLM.from_pretrained(
model_name_or_path,
quantization_config=bnb_config,
device_map="auto"
)
# 后续LoRA配置、训练逻辑 与 8.1 代码完全一致
8.3 LoRA 权重合并代码
from peft import PeftModel, PeftConfig
base_model_path = "your-model-path"
lora_path = "./lora-save"
save_merge_path = "./merge-model"
# 加载LoRA配置
peft_config = PeftConfig.from_pretrained(lora_path)
# 加载原始模型 + LoRA
model = AutoModelForCausalLM.from_pretrained(
base_model_path,
torch_dtype=torch.float16,
device_map="auto"
)
model = PeftModel.from_pretrained(model, lora_path)
# 合并权重并保存
merged_model = model.merge_and_unload()
merged_model.save_pretrained(save_merge_path)
tokenizer.save_pretrained(save_merge_path)
9 全文核心总结
- 预训练:让基座模型学习通用语言概率分布,沉淀通识能力,无定制化能力。
- 微调本质:修改模型参数,重塑输出概率分布,实现风格、逻辑、领域能力固化。
- SFT:基础监督微调,依靠标注数据做概率重排序,是对齐任务的基础。
- 三大落地路线
- Prompt:改输入、不动模型,适合快速验证;
- RAG:补外部知识、不动模型,适合动态知识库;
- 微调:改模型参数,适合深度定制、能力固化。
- 微调框架梯度:全参微调 (效果最强、成本最高) → 冻结微调 → PEFT (LoRA/Adapter,工业主流) → Prompt Tuning (最轻量) → RLHF (偏好对齐)。
- LoRA:利用权重低秩特性,插入少量低秩矩阵,兼顾效果与显存,是当前大模型微调首选。核心调参:Rank、Alpha、注入层。推理分动态加载与权重合并两种方案。
- QLoRA:4bit 量化基座模型 + LoRA,极致压缩显存,单机可跑超大模型,适合低算力场景。
更多推荐


所有评论(0)