本文目录29 个章节
第 9 章:微调、后训练与推理部署
微调在部分招聘岗位中是加分项或算法岗核心要求,但对多数 Agent 应用岗并非第一步。正确顺序通常是:先明确失败类型,用 Prompt、RAG、Tool、Workflow 和 Eval 建立基线;只有失败稳定指向模型行为或能力时再微调。
1. 先做选择题
| 问题 | 优先方案 |
|---|---|
| 知识更新快、需要引用 | RAG |
| 需要查询实时订单或执行动作 | Tool |
| 固定步骤与审批 | Workflow/代码 |
| 输出格式偶尔错误 | 结构化输出 + 校验 |
| 长期保持特定语气/格式 | SFT/LoRA 可考虑 |
| 领域术语理解持续不足 | 领域继续预训练或 SFT,可考虑 |
| 偏好“哪个回答更好” | DPO/偏好优化可考虑 |
| 推理太慢/太贵 | 模型路由、量化、批处理、推理引擎 |
🔥 P0 高频必会:什么时候不应该微调?
事实需要频繁更新、缺少高质量数据、问题可用 RAG/Tool/Schema 解决、没有固定 Eval、失败原因尚未定位时。微调会固化数据问题,且不能提供实时事实和权限控制。
2. SFT 是什么
Supervised Fine-Tuning(监督微调)使用输入—理想输出示例,优化模型模仿目标行为。适合:
- 稳定输出领域格式;
- 学习组织术语和表达;
- 提高特定任务的指令遵循;
- 让小模型承担分类、抽取或路由;
- 学习规范的工具调用示例。
数据示例:
{
"messages": [
{"role": "system", "content": "你是工单分类器,只输出指定 JSON。"},
{"role": "user", "content": "昨晚重复扣了两次会员费"},
{"role": "assistant", "content": "{\"category\":\"duplicate_charge\",\"priority\":\"high\"}"}
]
}具体数据格式由训练框架和模型决定,但训练、验证、测试必须严格分开。
3. 数据质量比数量更重要
检查维度:
- 输入是否符合真实分布;
- 输出是否由专家或可靠规则验证;
- 是否有冲突标签;
- 是否包含隐私、版权或敏感信息;
- 是否覆盖边界、拒答和安全案例;
- 是否与基础模型聊天模板匹配;
- 是否存在训练/测试泄漏;
- 多语言和长短样本比例是否合理。
去重
完全重复会让评测虚高,近似重复会造成泄漏。可组合:
- 内容哈希去完全重复;
- MinHash/SimHash 去近似重复;
- 按来源文档分组切分,避免同一文档段落跨 Train/Test;
- 对模板化样本按业务对象分组切分。
🔥 P0 高频必会:为什么不能随机切分所有样本?
同一文档、同一用户或同一模板的近似样本可能同时落入训练和测试,使评测虚高。应按来源、时间或业务对象 Group Split,并保留真正未见分布。
4. LoRA 与参数高效微调
LoRA 不直接更新全部模型权重,而是在部分线性层添加低秩更新,训练参数更少、显存需求更低,便于保存多个适配器。
概念上:
W' = W + ΔW
ΔW = B × A
rank(A, B) << dimension(W)重要超参数:
r:低秩维度;alpha:缩放;- target modules:应用在哪些层;
- dropout;
- 学习率、Batch、Epoch;
- 最大序列长度。
r 越大不是必然越好,会增加容量和显存,也可能过拟合。必须通过验证集选择。
QLoRA
QLoRA 在量化基础模型上训练 LoRA 适配器,进一步降低显存。但量化误差、计算吞吐和框架兼容性要实测。
5. 一个训练配置骨架
具体库 API 会变化,下面展示需要显式记录的配置,而不是可直接复制的厂商脚本:
base_model: your-base-model
dataset_version: support-intent-v4
chat_template_version: model-default-v2
method: lora
lora:
rank: 16
alpha: 32
dropout: 0.05
target_modules: [q_proj, k_proj, v_proj, o_proj]
training:
learning_rate: 0.0002
epochs: 2
max_sequence_length: 2048
effective_batch_size: 64
warmup_ratio: 0.03
seed: 42
evaluation:
dataset_version: support-hidden-test-v2
metrics: [macro_f1, schema_pass_rate, safety_violation]必须保存基础模型精确版本、Tokenizer、Chat Template、数据版本和代码提交,否则无法复现。
6. DPO 与偏好优化
Direct Preference Optimization 使用成对数据:同一输入下,一个回答优于另一个。
{
"prompt": "为客户解释退款未到账",
"chosen": "退款已提交,银行通常需要 3–5 个工作日入账……",
"rejected": "请耐心等待,之后会到账。"
}适合优化:帮助性、风格、拒答边界、简洁度、工具选择偏好。风险:
- 偏好标注不一致;
- 模型学会表面风格而非事实;
- 过度拒答;
- 对训练分布外任务退化;
- chosen/rejected 差异混杂多个因素,无法知道学到了什么。
⭐ P1:SFT 和 DPO 的区别?
SFT 学习“理想输出长什么样”;DPO 学习“两个输出哪个更偏好”。通常先 SFT 建立行为,再用高质量偏好对进一步对齐。两者都必须用独立 Eval 验证安全与能力回退。
7. RLHF / Agentic RL 的位置
RLHF 一般包含偏好数据、奖励模型和强化学习优化;Agentic RL 可能按任务成功、工具轨迹或环境奖励优化 Agent 行为。它适合有:
- 可重复环境;
- 可计算或高质量奖励;
- 大量交互数据;
- 强评测与安全控制;
- 足够算力和研究能力。
对于普通企业 Agent,先用行为克隆、轨迹评测和确定性控制通常更实际。错误奖励会促使模型“钻空子”。
8. 微调后评什么
不能只看训练 Loss。至少比较:
- 目标任务质量;
- 原通用能力是否回退;
- Schema/工具参数通过率;
- 安全拒答与误拒率;
- 幻觉和依据忠实度;
- 多语言与长文本;
- 延迟、吞吐、显存和成本;
- 对输入扰动的稳健性。
建立三套集合:
- 目标任务 Test;
- 通用能力 Regression;
- 安全/红队 Test。
🔥 P0 高频必会:训练 Loss 下降是否代表模型更好?
不代表。可能过拟合、数据泄漏或只提高模板复现。必须在独立任务、通用回归和安全集上评测,并比较基线模型的质量、延迟和成本。
9. 推理服务核心指标
- TTFT:首 Token 时间;
- TPOT:后续每 Token 时间;
- P50/P95/P99 延迟;
- Tokens/s;
- 并发与队列时间;
- GPU 利用率和显存;
- Batch 大小;
- 成功率和 OOM;
- 每百万 Token 成本。
流式输出改善用户感知,但不减少总计算时间。连续批处理可以提高吞吐,但高负载下可能增加个别请求等待。
10. KV Cache、Prefix Cache 与量化
KV Cache
保存已处理上下文的注意力 Key/Value,生成后续 Token 时避免重复计算。长上下文和高并发会显著占显存。
Prefix Cache
多个请求共享稳定前缀(系统 Prompt、工具定义)时复用计算。Prompt 版本或 Tool 集变化会导致失效。
量化
将权重或激活降低精度,例如 FP16/BF16 到 INT8/INT4,降低显存并可能提高吞吐,但会带来精度损失和硬件/Kernel 依赖。必须对任务和安全集重新评测。
🔥 P0 高频必会:量化的收益和代价?
收益是降低显存、提高可部署模型规模和潜在吞吐;代价是质量损失、部分算子/硬件兼容问题、延迟未必总下降。不能只看困惑度,要看目标任务与工具调用正确率。
11. 模型路由
模型路由可以按:
- 任务复杂度;
- 风险;
- 上下文长度;
- 语言/模态;
- 延迟预算;
- 供应商健康;
- 成本预算。
示例:
def select_model(task) -> str:
if task.risk == "high":
return "high-accuracy-model"
if task.kind in {"classify", "extract"} and task.context_tokens < 4000:
return "small-fast-model"
if task.requires_vision:
return "vision-model"
return "balanced-model"路由规则必须评测,且高风险不等于只需“大模型”;仍要审批与确定性安全控制。
12. 部署版本关系
一次推理请求应记录:
base_model_version
adapter_version
quantization_version
tokenizer_version
chat_template_version
serving_engine_version
prompt_version
tool_schema_version任何一项变化都可能影响输出。线上灰度时按完整配置快照分组。
13. 本章练习
练习 A:方案选择报告
挑选三个失败案例,分别判断用 Prompt、RAG、Tool 还是 Fine-tuning。写出成本、数据需求、更新速度和验证方式。
练习 B:小模型分类微调
构造不少于 500 条高质量分类数据,按来源 Group Split。训练前后比较 Macro-F1、格式通过率、延迟和安全集。
练习 C:推理压测
比较原始精度与一种量化配置:P95、TTFT、吞吐、显存、目标任务质量和工具调用通过率。
14. 面试高频问答
🔥 P0:LoRA 为什么省显存?
冻结基础权重,只训练低秩适配矩阵,优化器状态和梯度只覆盖少量参数。实际显存仍包含激活、基础权重和 KV 等,QLoRA 进一步量化基础权重。
🔥 P0:微调如何避免灾难性遗忘?
高质量小学习率训练、较少 Epoch、混入通用/安全样本、参数高效微调、独立通用回归集、早停和多任务平衡。最终以目标与通用能力共同评测。
🔥 P0:如何判断微调项目成功?
目标任务在隐藏测试集显著提升;通用和安全能力不超阈值退化;推理延迟/成本可接受;线上灰度业务指标改善;结果可复现,数据和模型版本完整。
⭐ P1:全量微调和 LoRA 怎么选?
LoRA 资源低、迭代快、便于多适配器,适合大多数领域行为适配;全量微调容量更大但成本和遗忘风险高,适合数据/算力充足且确需深层能力变化。用基线实验决定。
⭐ P1:vLLM/TGI/SGLang 这类引擎主要解决什么?
它们提供高吞吐模型服务、批处理、KV Cache 管理、并发调度、量化/并行和标准 API 等能力。具体特性随版本变化,选型要以目标模型、硬件、吞吐、延迟和运维实测为准。
15. 本章完成标准
- 能按失败类型选择 Prompt、RAG、Tool 或微调;
- 能解释 SFT、LoRA/QLoRA、DPO 和 RLHF 的差异;
- 训练数据有来源、分组切分和质量检查;
- 有目标、通用和安全三类评测;
- 能解释 KV Cache、量化、批处理与模型路由;
- 线上能追踪完整模型与适配配置版本。
所属系列
AI Agent 开发学习与面试指南