跳到主要内容

模型适配:微调、偏好优化与蒸馏

问题

什么时候应该使用 Prompt、RAG、工具调用或模型微调?SFT、LoRA、QLoRA、偏好优化、强化微调和模型蒸馏分别解决什么问题?

面试速答版

模型适配的核心不是“把知识灌进模型”,而是让模型更稳定地遵循特定任务、格式、风格或决策边界。一般先按以下顺序排查:

  1. Prompt 与结构化输出:先解决指令和格式问题。
  2. RAG 与工具:解决事实更新、私有知识和精确计算问题。
  3. SFT/LoRA:大量示例才能描述的行为、风格和任务模式。
  4. 偏好优化或强化微调:有可靠偏好对或可验证奖励时,进一步优化决策。
  5. 蒸馏:用较强模型产生和筛选数据,让较小模型承担稳定、高频任务。

无论选哪种方式,都必须先建立独立评测集;没有基线和留出集的微调,很容易只是“训练集看起来更好”。

一、先判断问题属于哪一层

目标优先方案原因
输出固定 JSONJSON Schema、Structured Output可验证,不需要改变模型权重
回答最新公司制度RAG知识会变化,需要来源和权限
查询实时库存工具调用数据必须来自业务系统
统一客服语气和流程Prompt;示例很多时再 SFT主要是行为模式
专业分类或抽取Few-shot 基线;再 SFT/LoRA可用标注样本直接监督
改善答案偏好DPO 等偏好优化数据是成对偏好而非唯一答案
可程序验证的复杂任务强化微调/基于奖励优化测试、规则或环境可提供奖励
降低高频任务成本蒸馏、小模型专用化用任务质量换吞吐与成本优势
微调不是知识库

权重中的知识难以精确更新、删除、溯源和做用户级权限控制。需要新鲜事实、引用或数据删除能力时,优先 RAG 或工具;微调更适合改变“怎么做”,而不是维护“知道什么”。

二、常见适配方法

1. 全参数监督微调

SFT 使用输入与目标输出样本继续训练模型。它表达能力强,但训练、存储、部署和回滚成本较高,适合有足够数据与基础设施的场景。

data/sft-example.json
{
"messages": [
{ "role": "system", "content": "你是售后工单分类器,只返回约定 JSON。" },
{ "role": "user", "content": "收到的耳机左侧没有声音,刚签收。" },
{
"role": "assistant",
"content": "{\"category\":\"quality_issue\",\"priority\":\"normal\",\"needs_human\":false}"
}
]
}

训练文件格式以具体平台为准;生产系统仍应在推理时做 Schema 校验,不能因为训练过就省略验证。

2. LoRA 与 QLoRA

LoRA 冻结大部分基础权重,只训练低秩适配矩阵,可概念化为:

W' = W + ΔW,且 ΔW = B × A

它的优势是可训练参数和检查点更小,便于为不同任务维护多个 Adapter。QLoRA 在此基础上量化冻结的基础模型以降低训练显存,但量化配置、目标层和训练精度仍需实验验证。

LoRA 不是天然比全量微调更准,也不意味着“低成本零风险”。需要评估:

  • rank、alpha、dropout 和目标层。
  • 基础模型、Tokenizer、量化方式与推理后端兼容性。
  • Adapter 合并前后的质量和数值差异。
  • 多 Adapter 切换的显存、吞吐和租户隔离。

3. 偏好优化

DPO 一类方法使用“同一输入下,哪个回答更好”的偏好对:

types/preference-example.ts
interface PreferenceExample {
prompt: string;
chosen: string;
rejected: string;
reason?: string;
dimensions: Array<'correctness' | 'safety' | 'style' | 'completeness'>;
}

偏好对必须有清晰 Rubric。若标注者只是偏爱更长、更客气的回答,模型也会学习这种偏差,而不一定更正确。

4. 基于奖励的优化

当任务有可信、抗作弊的奖励时,可以使用强化微调或相近方法,例如:

  • 代码是否通过隐藏测试。
  • 数学答案是否被计算器验证。
  • 工具执行后的业务状态是否满足不变量。
  • SQL 结果是否与金标准一致。

最大的风险是 reward hacking:模型找到提高分数但违背真实目标的捷径。因此奖励函数、隐藏测试、对抗样本和人工审查必须一起设计。

5. 模型蒸馏

蒸馏通常由较强 Teacher 生成候选答案、结构化标签或工具轨迹,再经过规则、执行器或人工筛选,用于训练较小 Student。

Teacher 的答案不能未经验证直接作为真值,否则错误、风格偏差和安全问题会被批量复制。

三、训练数据工程

数据集要回答五个问题

  1. 任务是什么:输入、输出、拒答和工具边界要清楚。
  2. 数据从哪里来:真实流量、专家样本、历史工单或合成数据。
  3. 是否有权使用:许可证、用户授权、隐私、保留和删除要求。
  4. 如何防泄漏:去重后再拆分训练、验证和最终留出集。
  5. 如何覆盖失败:长尾、方言、恶意输入、无答案和权限样本。
types/training-example.ts
interface TrainingExample {
id: string;
input: unknown;
target: unknown;
source: 'production' | 'expert' | 'synthetic';
license: string;
consent: 'granted' | 'not-required';
piiStatus: 'none' | 'redacted' | 'restricted';
split: 'train' | 'validation' | 'holdout';
version: string;
}

质量通常比数量更重要

  • 去除模板错误、互相矛盾和无法验证的样本。
  • 不要让“无法回答”样本全部变成强行作答。
  • 保留困难样本,不能只训练最顺利的 happy path。
  • 合成数据按来源和生成模型分层评估。
  • 记录数据版本、清洗脚本和变更原因,支持复现与删除。

四、实验与发布流程

每次实验至少固定并记录:

  • 基础模型与精确版本。
  • 数据集、模板、Tokenizer 和随机种子。
  • 方法、超参数、量化和 Adapter 配置。
  • 代码、依赖、硬件和训练日志。
  • 离线评测、线上灰度和安全报告。

发布门禁应比较任务成功、安全、延迟和每个成功任务成本,而不是只比较训练 loss。

五、常见失败模式

灾难性遗忘

模型在窄任务上变好,却损失通用能力。对策是混入通用/安全样本、降低训练强度,并对原有能力做回归测试。

过拟合和数据污染

验证集与训练集近重复,或评测题混入训练数据,会产生虚假的高分。要按语义去重,并保留由独立团队管理的 holdout。

格式正确但事实错误

SFT 可以让 JSON 更漂亮,却不能保证字段值真实。对金额、权限、库存和引用做确定性验证。

基础模型升级后 Adapter 失效

Adapter 与基础模型版本紧密绑定。升级需要完整回归,不能只因为模型名称相似就直接挂载。

忽略部署成本

训练成功不等于可上线。还要验证量化后质量、冷启动、并发、批处理、Adapter 切换和故障回滚。

六、前端与全栈开发者最需要关注什么

  • 前端不要接触训练密钥和未经脱敏的训练数据。
  • 数据标注台要支持 Rubric、冲突处理、撤回和审计。
  • 实验面板同时展示切片质量、延迟、成本和安全回归。
  • UI 明确显示模型版本、灰度组和失败回退,不让用户承担实验异常。
  • 线上反馈不能直接进入训练;先做授权、脱敏、去重和质量审核。

七、面试常见问题

Q1:什么时候需要微调,而不是继续改 Prompt?

答案:先用 Prompt、Schema、RAG 和工具建立基线。当大量示例才能描述稳定行为,Prompt 已变得复杂且效果仍不稳定,并且有足够高质量数据与评测时,才考虑微调。

Q2:LoRA 为什么省资源?

答案:它冻结基础模型,只训练低秩增量矩阵,训练参数和检查点都更小。但实际显存和质量仍受优化器、激活、序列长度和目标层影响。

Q3:QLoRA 和普通量化有什么区别?

答案:QLoRA 是量化基础权重后进行参数高效训练;普通推理量化主要为了部署。两者目标不同,都需要量化后回归评测。

Q4:微调能替代 RAG 吗?

答案:通常不能。微调适合行为和任务模式,RAG 适合持续更新、可引用、可删除并需要权限控制的知识。

Q5:什么是 DPO?

答案:它使用 chosen/rejected 偏好对优化模型更倾向人们偏好的回答。关键是偏好数据和 Rubric 的质量,而不是只准备大量对比样本。

Q6:什么时候适合强化微调?

答案:任务有可靠、可重复、难以作弊的奖励时,例如测试、计算器或业务不变量。开放式审美任务若奖励不可靠,风险会很高。

Q7:蒸馏解决什么问题?

答案:让较小模型学习强模型在特定任务上的行为,以降低延迟和成本。Teacher 输出必须经过验证,Student 仍需在独立集上评测。

Q8:如何避免训练集泄漏到评测集?

答案:先做精确和语义去重,再按来源或实体拆分;保留独立 holdout,并记录所有合成和人工修改的血缘。

Q9:为什么训练 loss 下降不代表产品变好?

答案:loss 只描述训练目标上的拟合。产品还关心任务成功、拒答、权限、安全、延迟和成本,且要看不同风险切片。

Q10:如何管理多个 Adapter?

答案:把基础模型版本、Adapter 版本、任务、租户、评测和回滚策略一起登记;限制动态加载来源并验证兼容性和隔离。

Q11:线上用户反馈可以直接拿来训练吗?

答案:不可以直接使用。要先确认授权与用途,脱敏、去重、过滤攻击内容、标注质量并提供删除与审计能力。

Q12:微调上线前最重要的检查是什么?

答案:与未微调基线在独立数据集上比较,确认关键安全切片不退化,并完成灰度、监控和可立即回滚的模型版本管理。

参考资料

相关阅读