主题
微调与模型适配:什么时候该动模型,动到什么程度
一句话:微调不是“让模型更懂业务”的默认手段,而是把稳定的示范或偏好压进参数;换来的是固定行为的稳定性和单位成本下降,代价是数据债、能力回归和回滚困难。
适用:2026 年需要做模型适配的 Agent 团队;方法选择与超参以具体框架和模型文档为准。
为什么需要
业务方说“模型不懂我们的业务”,第一反应往往是拿一批对话去微调。但多数时候,问题出在知识过期、工具描述含混、上下文没给对,或者流程本身缺少检查点。把这些当成模型能力缺口去训练,等于用最贵、最难回滚的手段修一个本可以在提示层解决的问题。
模型、Harness、执行环境是三件事:模型负责理解和决策,Harness 负责上下文、工具协议、状态与权限,执行环境负责真正把动作做出来。工具选错既可能是模型不会选,也可能是工具描述有歧义;回答漏步骤既可能是能力不足,也可能是检索没返回。失败现象本身不能决定归因,必须先排除能独立复现的环境故障,再检查 Harness 的信息与控制,最后才判定模型。
核心机制
先归因:训练是最后一步
这张图不是自动判官,而是把“要不要训练”拆成可验证的分支:每往下一层,成本和验证周期大约上一个数量级。真正要固定的是变量——同一批任务、同一套工具、同一版提示,只换模型或只换 Harness,才能说清收益来自哪里。
SFT 与 LoRA:把示范变成参数
SFT 学的是“在当前可见信息下,下一步应当生成什么”。因此轨迹不能直接当标签:工具还没返回时,目标动作不能使用它的结果;用户后面补充的条件,不能提前进入早期决策。否则离线数据的信息优于线上,训练越久,上线越对不上。构造样本时要做两层掩码:只对模型生成的 token 算损失;错误动作保留在上下文里,但屏蔽损失,只监督验证过的修正行为。
LoRA 冻结原权重,只训练低秩增量 ΔW = B·A,通常挂在注意力的 q/k/v/o 投影上。经验起点是 r=8–16、alpha≈2r,学习率比全参微调高一个量级;秩不是越大越好,任务简单时增大秩主要增加过拟合风险。QLoRA 把基座量化到 4-bit、适配器保持 16-bit,显存显著下降,代价是训练更慢、数值更敏感。全参微调容量更大,但成本、遗忘和回滚难度都更高,多数业务适配先用 LoRA 验证方向。
显存账:全参、LoRA、QLoRA 差在哪
| 组成 | 全参 7B(BF16) | LoRA | 依据 |
|---|---|---|---|
| 基座权重 | 14G | 14G(冻结) | 7B × 2 bytes |
| 梯度 | 14G | <1G(只算适配器) | 全参梯度与权重同尺寸 |
| Adam 状态 | ~56G | <1G | 每参数两个 fp32 矩 |
| 激活/临时 | ~28G | ~28G | 随 batch、序列变,经验值 |
| 合计 | ~112G | ~42–45G | 推导 + 经验 |
推导很直接:7B × 2B = 14G;梯度同尺寸 14G;Adam 的 m、v 两份 fp32 是 7B × 8B = 56G;再加约 28G 激活,得到 112G。LoRA 冻结基座,只存适配器的梯度与优化器状态(通常不到 1G),所以省掉的是 14G 梯度加约 56G 优化器状态;很多资料把这块笼统写成“约 56G 量级”,指的是优化器状态,不是总显存的全部差值。剩下的 14G 基座和约 28G 激活仍要装,合计 40G 出头。数字随 batch、序列长度、是否开梯度检查点、是否用 8-bit 优化器变化,表里是经验值/配置相关。
QLoRA 再把基座压到 4bit:7B 权重从 14G 降到约 3.5G,加适配器和激活,开梯度检查点、短序列时约 16G 量级,单张 24G 卡就能跑;不开检查点或长序列会明显更高。这也是经验值/配置相关。QLoRA 原论文的双重量化是把量化常数再量化,平均约 0.37 bit/参数;65B 模型约省 3GB(65B × 0.37 bit ÷ 8 ≈ 3.0GB),不是 0.37GB。0.37 的单位是 bit/参数,不是 GB;这块节省相对 4bit 基座(65B 约 32.5GB)约一成,属于锦上添花,主要收益仍来自 4bit 基座本身。
这笔账的机制只有一条:梯度与 Adam 状态随“可训练参数数”线性增长,不随模型总参数增长。Adam 为每个在训参数额外存 m、v 两份 fp32(8 字节/参数),是全参微调里最贵的一块(7B 约 56G);LoRA 冻结基座,等于把这项开销从 7B 个参数缩到适配器那几十 M 个,所以省 14G 梯度 + 56G 优化器状态是同一个原因的两面。而激活约 28G 一分不省——即使底层参数冻结,梯度仍要逐层回传到嵌入层,中间激活必须留着做反向;这就是 LoRA 省不了、只能靠梯度检查点(用重算换存储)压缩的部分。看懂这条线,也能看懂为什么很多资料说“LoRA 省 3–4 倍显存”而不是“省 3–4 个数量级”:最大的单项(激活+基座)根本没被动过。
方法选择:按学习信号和约束选,不按数据条数选
| 先问 | 如果是 | 如果否 |
|---|---|---|
| 知识是否稳定、是否需要引用、更新频率高不高 | 不稳定/需引用/高频更新 → 检索或 RAG | 稳定 → 继续 |
| 行为、格式、路由是否固定 | 固定 → SFT / LoRA | 开放创作、风格偏好 → 先改提示,或偏好优化 |
| 是否有大量可验证示范 | 有 → SFT / LoRA | 没有但环境能给反馈 → 偏好优化/RL;教师有能力 → 蒸馏 |
| 只是“更像人 / 更懂业务” | 先改提示、上下文、工具 | 跨任务稳定复现再训练 |
数据量不是决策变量,而是覆盖度变量:几十条高质量样本可以验证方向,但不足以覆盖任务族;几千条重复样本也可能只教会一种问法。不要按数据条数在 RAG 和微调之间二选一:RAG 解决知识获取,微调解决行为稳定;推理表现也可以被提示、工具、验证器和蒸馏改变。
| 方法 | 学习信号 | 数据量级(经验起点) | 主要代价 | 典型场景 |
|---|---|---|---|---|
| 全参 SFT | 正确示范 | 数千到数万 | 显存高、遗忘快、回滚重 | 领域行为整体迁移 |
| LoRA SFT | 正确示范 | 数百到数千 | 秩与目标层要试 | 多数业务适配的首选 |
| QLoRA | 正确示范 | 数百到数千 | 更慢、数值更敏感 | 单卡显存有限 |
| DPO | 成对偏好 | 数千到数万对 | 偏好数据贵、易过拟合 | 风格、取舍、拒答边界 |
| 蒸馏 | 教师输出或轨迹 | 取决于任务覆盖 | 教师错误会被复制 | 小模型降本、端侧部署 |
表里的量级只是经验起点,不是准入门槛;任务越复杂、输出越开放,需要的覆盖越多。方法也可以组合:先 SFT 得到稳定起点,再用偏好数据修取舍,最后蒸馏到部署模型。
偏好优化与蒸馏:DPO 省掉奖励模型,不省偏好数据
RLHF 通常先训奖励模型,再用 PPO 优化,并用 KL 约束防止策略跑偏;链路长、成本高,但适合“好坏只能通过比较判断”的任务。DPO 直接用 chosen/rejected 成对数据优化策略,跳过了显式奖励模型和在线采样,工程上简单很多。它改变的是偏好排序,不注入新知识:如果两条回答都错,DPO 只能学会“哪条更像对的”。
蒸馏适合教师已经具备能力、目标是迁移到更小或更易部署的学生。教师输出、结构化动作、多轮轨迹都可以作为信号,但教师高概率不等于任务正确,示范进训练集前必须验证。很多场景不需要一次完全替代:学生先执行,置信度不足或校验失败时升级到教师,级联就能拿到大部分成本收益。
数据与评测:黄金集不是训练集
数据管线至少做四件事:按任务族分层、近重复去除、PII 脱敏、来源与版本记录。训练集、验证集、测试集按任务族隔离,不能只随机切分——同一模板的变体落进两边,测出来的是记忆不是泛化。
评测要分开三种角色:黄金集用于反复比较版本,回归集覆盖历史故障和关键正常场景,留出集只在最后用一次。参与改写提示或筛选样本的题已经“参与过调优”,必须另留未看过的题做独立验证。训练损失下降只说明模型更容易生成监督内容,不说明任务能力提升;黄金集的建法与门禁用法见 07-可观测与评测。
上线:回滚的是发布单元,不是单个权重
微调产物的发布单元至少包含适配器、提示、工具 schema 和上下文策略。只回退权重、保留新提示,可能组成一个从未验证过的组合。上线走影子验证、低风险灰度、分阶段扩量、稳定替换四步;每步预置扩大、暂停、回滚三个条件。
重点看四类回归:通用能力是否下降、工具调用格式是否仍合法、拒答与安全行为是否改变、单位成功任务成本是否上升。灾难性遗忘的早期信号往往不是“变笨”,而是原本稳定的格式开始漂移、原本会追问的场景直接编造。基座模型升级后适配器通常不兼容,必须重新验证,不能假设“换个底座还能用”。
实战场景
场景:拿微调灌知识——条款一改就得重训
现象:保险产品助理把条款与费率训进 7B 的 LoRA。上线 6 周内产品条款变更 5 次,参数里的知识不会自己更新,模型连续给出已下架产品的报价,还给不出出处。一轮 7B LoRA 在单张 80G 卡上约 12 卡时,加上数据准备和整包回归约 2 人日(经验值,需校准);5 次变更等于 60 卡时加 10 人日,而同期把新条款重新入库只是分钟级。
排查过程:走归因分支。绕过模型直调工具能否独立复现——否,执行环境没问题;固定模型、把最新条款放进上下文——答对,缺的是知识获取,不是行为稳定。再看分层证据:Trace 里模型引用的费率在当轮上下文中不存在,说明它来自参数;检索日志显示对应版本条款已入库但未进上下文。判定条件没满足——不是“同类决策错误跨任务稳定复现”,训练这一步本来不该进。
对症做法:知识回检索。RAG 解决知识获取,微调解决行为稳定,不按数据条数在两者之间二选一;条款版本与生效日期进检索元数据,回答必须带出处,无出处按违规输出拦截。参数只保留稳定行为:输出格式、字段抽取、工具选择、拒答边界。已经训进参数的旧知识不能靠再训覆盖——DPO 只改变偏好排序、不注入新知识,SFT 学到的是生成倾向;收口方式是把模型侧约束到“必须引用检索片段”,并用带处出门禁验证。
复盘要点:知识更新频率是决策变量,条数不是。每次重训的真实成本不在训练那几小时,在发布单元整包重验:适配器、提示、工具 schema 和上下文策略要一起走影子与灰度。
案例:OOM 反复两天——显存账漏了优化器状态
现象:一次 7B 全参 SFT,按“权重 14G + 激活 28G”估出 42G,配两张 40G 卡开训,第一个 step 就 OOM。此后调 batch、压序列长度、开梯度检查点,两天内 9 次任务失败(经验值,需校准),训练队列被这些失败任务占住,等待同一批卡的两个实验整体顺延。
排查过程:缺的那一块在优化器状态。Adam 为每个在训参数额外存 m、v 两份 fp32,7B 就是 7B × 8B = 56G,全参 112G 里最贵的单项不是权重。三类原因分别有各自的证据:框架的显存分解日志显示峰值出现在 optimizer step 而不是 forward,说明是估算口径漏项(配置与实现问题);同一批卡跑 LoRA 稳定在 40G 出头,说明不是硬件总量不足(不是容量问题);只开梯度检查点后仍崩在长样本,说明约 28G 激活一分没省——梯度仍要逐层回传到嵌入层,中间激活必须留着做反向。
对症做法:按正文口径把账写成可核对的表,进实验单再排队。
| 组成 | 全参 7B(BF16) | LoRA | QLoRA |
|---|---|---|---|
| 基座权重 | 14G | 14G(冻结) | 约 3.5G(4bit) |
| 梯度 + Adam 状态 | 14G + ~56G | 均 <1G | 均 <1G |
| 激活/临时 | ~28G | ~28G,省不掉 | ~28G 量级,靠梯度检查点与短序列压住 |
| 合计 | ~112G | ~42–45G | 约 16G 量级(开检查点、短序列),单张 24G 可跑 |
阶梯照正文走:多数业务适配先用 LoRA 验证方向;显存不够再试 QLoRA 4bit,并先跑 16bit 基线,避免量化损失掩盖数据问题;激活靠梯度检查点用重算换存储,不靠加卡。机制只有一条——梯度与 Adam 状态随可训练参数数线性增长,不随模型总参数增长,所以先减可训练参数,再减 batch。
复盘要点:OOM 反复多数是估算口径漏了最贵的一项,不是硬件不够。“LoRA 省 3–4 倍显存”而不是“省 3–4 个数量级”,原因在最大单项(基座加激活)根本没被动过。
场景:目标域 +9%,通用域先崩——回归集没进发布门禁
现象:法务抽取 LoRA 上线第二天,同基座的其他 Agent 把工具调用参数写成自然语言、该追问的场景直接编造。发布只跑了目标域黄金集,QS +9%(经验值,需校准),事故却出在通用能力上。回滚加整包重验吃掉一个发布周期、约 3 人日(经验值,需校准),该基座上的四条业务线在这期间全部停发。
排查过程:排障顺序照正文四步:评测集有没有被污染 → 训练样本的信息可见性 → 配比与轮次 → 超参。分层证据逐个落:训练、验证、测试按任务族隔离做到了,同模板变体没落在两边,污染这条排除;轨迹掩码正确,工具未返回时的目标动作没用到它的结果;配比全是法务语料,通用样本一条没留;轮次取到 3 epoch、学习率在经验区间上限,可训练参数占比也偏高。监控六组里“格式与字段合法率”在发布拐点跳水、工具调用错误率同步上升,而任务成功率在目标域仍在涨——正是灾难性遗忘的早期形状:不是变笨,是格式漂移和该追问时直接编造。
对症做法:配比留 10%–20% 通用数据;轮次压回 1–3 epoch、学习率取经验起点;loss 不降先查掩码、模板和标签对齐,而不是盲目加秩。发布门禁把四类回归全跑——通用能力、工具调用格式是否仍合法、拒答与安全行为、单位成功任务成本;黄金集、回归集、留出集三种角色分开,留出集只用于验收那一次,不参与任何调优;回滚按发布单元整包(适配器 + 提示 + 工具 schema + 上下文策略),只退权重、保留新提示会组成一个从未验证过的组合;基座升级后适配器重新验证,每季度用新数据重跑一次回归。
复盘要点:训练损失下降只说明模型更容易生成监督内容,不说明任务能力提升。目标域的涨幅不能替代通用域的不退化——评测口径缺哪一格,事故就落在哪一格。
最小上手
text
# 示意:一次可复现的微调实验
1. 冻结基线:base_model@rev + prompt@rev + tools@rev + eval@rev
2. 数据:按任务族分层;去重;PII 脱敏;留 10%–20% 通用数据
3. 训练:LoRA r=8–16、alpha≈2r、lr 1e-4~2e-4、1–3 epoch(经验起点)
显存不够再试 QLoRA 4bit;先跑 16bit 基线,避免量化损失掩盖数据问题
4. 评测:黄金集 + 回归集 + 未参与训练的留出集;同时记质量、格式、成本
5. 上线:影子 → 5% → 25% → 全量;旧适配器与旧提示整包保留跑通判据:同一批题上,候选相对基线在关键场景不退化;工具调用合法率不下降;留出集提升方向与黄金集一致;任一阶段指标劣化能在 10 分钟内切回上一整包。
生产动作
监控六组信号:任务成功率、格式与字段合法率、工具调用错误率、人工改写率、P95 延迟、单成功任务成本。微调后前三项常一起看,因为格式变好但任务失败,说明模型学会了“像”,没学会“做”。
排障顺序:先确认评测集有没有被污染,再看训练样本的信息可见性,再看配比与轮次,最后才调超参。经验上,loss 正常但线上变差,优先怀疑数据泄漏和样本选择偏差;loss 不降,先查掩码、模板和标签对齐,而不是盲目加秩。每季度用新数据重跑一次回归,业务规则变化后旧适配器要重新评估。
边界
- 适合:行为稳定、示范充足、评测集可靠的固定任务;不适合:知识高频变化、长尾需求为主、连成功标准都说不清的场景。
- 适合:用 LoRA/QLoRA 验证方向、把大模型能力迁到小模型降本;不适合:指望微调补上工具与流程缺陷。
- 适合:DPO 处理“两个回答哪个更好”的偏好;不适合:把 DPO 当成知识注入,或拿未经验证的好坏对做训练。
- 常见误区一:微调可以替代 RAG。参数里的知识不会自动更新,也无法给出处。
- 常见误区二:数据越多越好。未去重、未脱敏、单一问法的数据会把偏差放大。
- 常见误区三:只看训练损失和平均分。关键场景退化、格式漂移、成本上升都不会写在 loss 里。
讲清楚
微调是把稳定可验证的行为压进参数,不是“更懂业务”的万能药。按执行环境、Harness、模型三层归因,确认错误跨任务稳定复现,再选 SFT、偏好优化或蒸馏;知识是否稳定、行为是否固定、示范是否充足,比“有多少条数据”更适合做决策树。SFT 难在样本:标签只能用当时可见的信息,错误轨迹留上下文但屏蔽损失。LoRA 省掉梯度与优化器状态,7B 全参约 112G、LoRA 约 40G 出头;QLoRA 再把基座压到 4bit,约 16G 量级,双重量化省的是约 3GB/65B,不是 0.37GB。DPO 省奖励模型,不省偏好数据。上线整包回滚,黄金集、回归集与留出集分开,否则测到的只是记忆。
适用:2026 年 Agent 场景下的微调与模型适配实践 | 初稿 2026-10