AI Agent 开发学习与面试指南:09-微调、后训练与推理部署

明晰 Agent 场景下何者优先 (Prompt/RAG vs SFT/LoRA/DPO),介绍 AWQ/GGUF 模型量化取舍及 vLLM 与 Ollama 高吞吐推理部署实操。

本文目录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(监督微调)使用输入—理想输出示例,优化模型模仿目标行为。适合:

  • 稳定输出领域格式;
  • 学习组织术语和表达;
  • 提高特定任务的指令遵循;
  • 让小模型承担分类、抽取或路由;
  • 学习规范的工具调用示例。

数据示例:

JSON
{
  "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 不直接更新全部模型权重,而是在部分线性层添加低秩更新,训练参数更少、显存需求更低,便于保存多个适配器。

概念上:

TEXT
W' = W + ΔW
ΔW = B × A
rank(A, B) << dimension(W)

重要超参数:

  • r:低秩维度;
  • alpha:缩放;
  • target modules:应用在哪些层;
  • dropout;
  • 学习率、Batch、Epoch;
  • 最大序列长度。

r 越大不是必然越好,会增加容量和显存,也可能过拟合。必须通过验证集选择。

QLoRA

QLoRA 在量化基础模型上训练 LoRA 适配器,进一步降低显存。但量化误差、计算吞吐和框架兼容性要实测。

5. 一个训练配置骨架

具体库 API 会变化,下面展示需要显式记录的配置,而不是可直接复制的厂商脚本:

YAML
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 使用成对数据:同一输入下,一个回答优于另一个。

JSON
{
  "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/工具参数通过率;
  • 安全拒答与误拒率;
  • 幻觉和依据忠实度;
  • 多语言与长文本;
  • 延迟、吞吐、显存和成本;
  • 对输入扰动的稳健性。

建立三套集合:

  1. 目标任务 Test;
  2. 通用能力 Regression;
  3. 安全/红队 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. 模型路由

模型路由可以按:

  • 任务复杂度;
  • 风险;
  • 上下文长度;
  • 语言/模态;
  • 延迟预算;
  • 供应商健康;
  • 成本预算。

示例:

PYTHON
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. 部署版本关系

一次推理请求应记录:

TEXT
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 开发学习与面试指南

下一步

继续浏览相关主题

沿着同一主题继续阅读。

查看最新资讯