模型训练与微调

# 模型训练与微调

假设客服收到 “帮我查快递” ,却总是直接编一个物流状态。你希望它先问订单号,再根据查询结果回答,就可以准备这类正确示范,训练模型学习这个回应模式。

微调就是在已有模型上继续训练,让它更稳定地完成特定任务。 但这个例子应先尝试 Prompt 和程序规则;只有效果仍不稳定、并且有足够高质量示范时,才评估微调。

# 做一次客服微调,要得到什么

  1. 准备业务问题和正确回答,同时留出不参与训练的测试题。
  2. 选择基座模型,用 LoRA / QLoRA 等方式训练。
  3. 得到 Adapter,也就是学习到的附加参数,而不是得到一个新的完整知识库。
  4. 部署时把同一个基座与 Adapter 一起加载,让客服接口调用。
  5. 用相同测试题比较微调前后,确认追问和回答确实改善。

训练在开发或更新模型时进行,不是每个用户发消息时重新训练一次。用户聊天时发生的是推理:使用已经训练好的参数生成回答。

# 训练发生在什么阶段

方式 学什么 例子
预训练 从大量数据学习通用模式 预测文本中的下一个 Token
持续预训练 在已有模型上继续学习特定领域的文本分布 学习专业语料的表达,仍需评估通用能力退化
SFT 从示范答案学习怎样回应指令 客服遇到缺少订单号的问题,先追问订单号
偏好优化 在多个候选回答中学习偏好 更偏好准确、简洁、不编造承诺的回答

SFT 是 Supervised Fine-Tuning(监督微调):训练数据明确提供输入和期望输出。DPO 等偏好优化方法使用偏好数据,和普通问答 SFT 不应混为一谈。

全参数微调与 LoRA 则是另一个维度:它们决定修改哪些参数,不是决定训练任务。SFT 可以全参数训练,也可以使用 LoRA。

所以 “Qwen3-8B + QLoRA + SFT” 可以拆成三句话:Qwen3-8B 是原模型,QLoRA 是省资源的训练方式,SFT 表示用输入与示范答案来教它。不是三个互相竞争的模型。

# 先决定是否需要微调

方案边界见 Prompt、RAG 与微调怎样选择。以客服为例:

  • 回答语气和追问步骤不稳定,可以先改 Prompt,再评估 SFT。
  • 商品知识需要引用资料,适合 RAG。
  • 订单、库存和物流随时变化,要调用业务工具。
  • 退款和修改地址涉及权限,应由后端业务规则校验,不能靠训练保证。

只有稳定任务、训练数据和独立测试集都明确后,才有办法判断训练是否值得。先建立原模型的效果、延迟和成本基线。

# 这一组笔记怎样读

笔记 主要内容
LoRA、QLoRA 与显存 更新哪些参数,为什么省显存,量化和 Adapter 是什么
训练数据、参数与效果评估 数据格式、划分、训练参数、Loss、过拟合和验收
智能客服微调项目实战 Qwen3-8B、LLaMA-Factory、FastAPI 与 Mastra 的真实代码链路
YOLO 视觉模型训练 图像检测的标签、训练、评估和导出,与语言模型微调的区别

# 基座模型怎样选

Base 通常指偏向预训练目标的模型,Instruct 指经过指令训练的模型,但不能只凭名字判断具体能力。例如 Qwen3 (opens new window) 原始系列的 Qwen/Qwen3-8B 支持思考与非思考模式,不能自行给它补成不存在的 Qwen3-8B-Instruct 标识。

Dense(稠密模型)通常在一次前向计算中使用大部分模型参数;MoE(混合专家)每个 Token 只激活部分专家,但总权重的存储和调度仍有成本,不能只看激活参数量估算显存。

选型应比较目标语言、任务效果、模型许可、上下文长度、硬件和服务成本。较小模型经过高质量微调可能足够,但不能先认定一定比更大的通用模型好。

# 工具分别负责什么

工具 职责
LLaMA-Factory (opens new window) 用配置和 CLI 组织多种训练与评估流程
PEFT (opens new window) LoRA 等参数高效微调与 Adapter 加载
TRL (opens new window) SFT 和偏好训练等训练组件
Unsloth (opens new window) 为支持的模型优化训练和推理效率,需检查兼容范围
DeepSpeed / FSDP 在多 GPU 场景切分状态和组织分布式训练
vLLM 高吞吐推理服务,支持范围取决于模型与量化方式
llama.cpp / Ollama 适合部分本地推理与模型管理场景,不是通用 GPU 训练框架

不要同时引入所有工具。先选一条能够复现的训练和部署链,再固定模型 revision、依赖与配置。

# 从一条示范到一次参数更新

以 “用户没提供订单号,客服先追问” 为例,SFT 不是把这段文字存成问答字典,而是反复执行下面的过程:

  1. Tokenizer 把系统要求、用户问题和示范回答转换为 Token ID,按模型对话模板拼接。
  2. 模型根据前面的 Token 预测下一个 Token,训练时使用示范序列提供前文,这叫 teacher forcing(教师强制)。
  3. 损失函数比较预测与示范答案;反向传播计算梯度,优化器调整允许训练的参数。
  4. 用新问题验证模型是否也会先追问。只会复述原题,不算学会了这个行为。

训练时能看到标准答案,推理时看不到,只能接着自己已经生成的内容继续预测。所以训练 Loss 很低,真实对话仍可能跑偏;需要测试连续多轮,而不只测试第一句问候。计算细节见 数据与效果评估。

# 一次值得做的微调实验怎么定目标

不要把目标写成 “客服更聪明” 。可以定义成:缺少查询参数时先追问,已有工具结果时不改动关键事实,工具失败时不编造成功,同时保留原模型的常用问答能力。

先固定测试题和通过条件,再比较 Prompt 基线与微调版本。如果原模型已经能稳定完成,新增的训练、显卡服务、数据维护和回归成本可能不划算;如果问题主要来自工具数据错误,继续训练模型也解决不了根因。

评估成本要同时看一次性的整理与训练,以及长期的推理、模型更新和回归测试。开源权重不等于零成本,自部署也不自动比 API 便宜。低请求量时闲置 GPU 可能占主要成本;持续大流量时则要看吞吐、并发和单个成功任务的总成本。

# 面试问答

1. 你怎么向别人解释模型微调?参考答案

微调不是从零教模型说话,而是在现有能力上,用业务示范继续训练。比如客服没拿到订单号时,应该先追问而不是猜状态,我会用这类输入和正确回应教它稳定执行。训练得到的参数用于后续推理,实时订单仍由工具查询,不能靠微调记住。

2. 微调是不是把业务知识记进参数里,就不需要查数据库了?参考答案

训练确实可能让模型记住部分知识,但参数不是可以按订单号可靠查询的数据库,也不能实时更新。我会让微调学习稳定的回答行为,让工具查询实时订单,让 RAG 提供有出处的产品资料。例如订单今天发货,必须以业务接口为准,不能用训练时的旧答案回应。

3. 为什么不直接换一个更大的模型?参考答案

我会把换模型和微调放在同一测试集上比较,不预设微调一定更好。大模型可能直接解决复杂理解问题,但费用、延迟和部署要求也可能更高;小模型微调更适合边界清晰、重复量大的任务。如果主要是实时知识或权限问题,两种方案都不能替代工具和后端校验。

4. 为什么客服系统微调了模型,仍然需要工具和 RAG?参考答案

微调主要让模型更稳定地理解业务表达、追问缺失信息和组织回答。库存、订单状态需要实时查询,产品文档需要检索来源,这些不能靠模型记忆保证。我的设计会把回答行为、知识检索和业务执行分开,权限与写操作仍由后端控制。