调优决策树¶
调优不是微调的同义词。FDE 应按成本和可逆性从外到内处理问题。
推荐顺序¶
需求和验收标准
-> 输入与输出 schema
-> 提示词和示例
-> 上下文与 RAG
-> 工具和工作流
-> 模型选择与路由
-> SFT / LoRA / QLoRA
-> 偏好优化 DPO
-> 可验证奖励的 GRPO/RL
如果问题是缺少最新知识、权限过滤或业务数据,微调通常不是答案。如果问题是稳定格式、术语、风格、工具行为或特定决策模式,而且高质量样本足够,微调才值得进入候选。
先分类失败¶
| 失败 | 先改什么 | 不要先做什么 |
|---|---|---|
| 用户目标含糊 | 需求、交互和澄清逻辑 | 换更大模型 |
| 缺事实或资料 | 数据接入、RAG、工具 | 用 SFT 背诵动态知识 |
| 检索到了但回答漏点 | 上下文组织、引用与生成提示 | 继续扩大 TopK |
| 固定格式不稳 | JSON schema、受约束解码、示例 | 收集几万条再微调 |
| 术语或风格不一致 | 明确规则、few-shot、SFT | 只调 temperature |
| 工具选择错误 | 工具描述、路由样本、评测 | 给 Agent 更高权限 |
| 延迟或成本高 | token、路由、缓存、量化 | 盲目训练小模型 |
提示词调优¶
稳定提示词通常包含:
- 角色和任务,不写虚泛人格。
- 输入数据的边界与可信度。
- 明确步骤,只保留会改变结果的约束。
- 输出 schema 和失败表达。
- 2 到 5 个高价值示例,覆盖边界而非重复正常案例。
每个版本都有 ID,并在同一评测集上比较。不要一边改模型、一边改检索、一边改提示词。
SFT¶
Supervised Fine-Tuning 用目标输入和理想输出训练模型。适合稳定行为、领域表达、工具格式和重复工作模式。
数据优先级:正确性 > 覆盖 > 一致性 > 数量。先做数百到数千条高质量样本的小实验,检查学习曲线和保留集,再决定扩充。
数据检查¶
- train/validation/test 按用户、文档、时间或任务来源隔离,避免近重复泄露。
- 保留困难、拒答、信息不足和错误工具案例。
- 统一 chat template、角色、结束 token 和工具 schema。
- 删除模板污染、泄露答案、互相矛盾和不可追溯的合成样本。
- 记录数据许可证、来源、PII 和删除机制。
LoRA 与 QLoRA¶
LoRA 论文冻结基础权重,把更新表示为低秩矩阵,减少可训练参数和训练显存。Hugging Face PEFT提供了主流实现。
QLoRA 把冻结基础模型量化后再训练 LoRA adapter,适合消费级 GPU。它降低门槛,但不消除激活、上下文和批量造成的显存压力。
实用起点¶
| 参数 | 起点 | 调整信号 |
|---|---|---|
learning_rate |
1e-5 到 2e-4,依模型/数据而定 | loss 不降或快速过拟合 |
lora_r |
8、16、32 | 任务复杂且欠拟合时增大 |
lora_alpha |
常与 rank 同级或 2 倍 | 与学习率共同评测 |
lora_dropout |
0 到 0.1 | 小数据过拟合时增加 |
batch_size |
每卡 1 起步 | 用梯度累积维持有效 batch |
| 序列长度 | 先覆盖真实 P90 | 不为标称上下文浪费激活显存 |
这些不是最佳参数,只是搜索起点。目标模块、模型架构、Tokenizer 和数据分布都会改变结果。
DPO 与 GRPO¶
- DPO 使用 chosen/rejected 偏好对,适合改进风格、排序和偏好行为,流程比经典 RLHF 简单。
- GRPO/RL 适合存在可验证奖励的推理、代码或 Agent 任务。奖励设计错误会训练出钻空子的行为。
TRL 官方文档支持 SFT、DPO、GRPO 和 Reward Modeling。学习时先用小模型和小数据跑通完整评测闭环,再扩展到昂贵训练。
一次可信训练实验¶
- 固定基础模型、数据版本和测试集。
- 保存未训练基线输出。
- 先跑短程 smoke test,确认格式、loss、显存和 checkpoint。
- 只搜索少量高影响参数。
- 比较基础模型、adapter、合并模型和量化后模型。
- 检查目标任务、通用能力、安全和长尾退化。
- 记录随机种子、代码、依赖、硬件、耗时与成本。
常见错误¶
- 训练集就是测试集,得到虚假的提升。
- 用更多低质合成数据稀释少量高质样本。
- 只看训练 loss,不看业务通过率和严重错误。
- LoRA 合并或量化后没有重新评测。
- 用微调修复会频繁变化的产品知识。
- 模型学会输出格式,却没有学会何时拒答。
可选工具:LLaMA-Factory适合用统一配置尝试 LoRA、QLoRA、SFT、DPO 等方法;生产前仍需理解它生成的模型、模板和训练参数。
调优方法选择表¶
| 你观察到的问题 | 优先实验 | 需要的数据 | 退出条件 |
|---|---|---|---|
| 指令含糊导致回答漂移 | 重写任务和 rubric | 20 条失败样本即可起步 | 人工仍无法一致判断正确性 |
| 固定结构偶尔解析失败 | schema/约束解码 | 正常与边界结构样本 | 解析率达到门禁 |
| 缺少动态事实 | RAG 或工具 | 权威数据源与证据标注 | 关键资料仍不在语料库 |
| 领域表达不稳定 | few-shot,再评估 SFT | 高质量输入/理想输出对 | 提示已够稳定或 SFT 显著胜出 |
| 工具选择错误 | 工具描述、路由、负例 | 正确/错误工具轨迹 | 权限风险仍不可接受 |
| 风格偏好 | 提示、SFT 或 DPO | 一致标准的偏好对 | 偏好提升但事实性下降 |
| 可验证推理失败 | 更强模型或 RL 类方法 | 可执行 verifier | 奖励被钻空子或通用能力退化 |
最小 LoRA 实验配置¶
下面是记录结构,不是跨模型通用最佳值:
base_model: <exact-revision>
dataset: domain-sft-v3
chat_template: <name-and-version>
method: qlora
quantization: nf4
target_modules: [q_proj, k_proj, v_proj, o_proj]
lora:
r: 16
alpha: 32
dropout: 0.05
training:
learning_rate: 0.0001
epochs: 2
micro_batch_size: 1
gradient_accumulation_steps: 16
max_sequence_length: 4096
seed: 42
evaluation:
baseline_run: eval-base-v3
heldout_set: domain-test-v3
模型架构可能使用不同模块名。训练前打印实际可训练参数,确认没有误解冻基础模型,也没有因模块名不匹配而训练零个参数。
数据质量抽检¶
从每个来源和任务类型各抽至少 20 条,逐项检查:
- 输入是否包含完成任务所需信息,输出是否真的可由输入推出。
- 多位标注者对关键结论是否一致;分歧是否反映规则缺失。
- 拒答和信息不足样本是否存在,而不是所有问题都有完美答案。
- 合成样本是否只是同一模板换实体,造成虚假规模。
- train/test 是否存在近重复、同一文档片段或时间穿越。
- 输出风格规则是否掩盖事实错误和工具错误。
实验台账¶
| Run | 唯一改动 | 训练成本 | 目标通过率 | 通用保留集 | 严重错误 | 推理成本 | 决策 |
|---|---|---|---|---|---|---|---|
| base | 无 | 0 | |||||
| r016 | rank 16 | ||||||
| data-v4 | 数据清洗 v4 |
结果至少比较四种制品:基础模型、未合并 adapter、合并后的模型、最终部署量化模型。量化后质量或性能变化属于发布制品的一部分,不能用训练阶段结果代替。
本章实践¶
从一个 50 条失败集开始,先用提示和 schema 修复,再选择其中无法修复且模式稳定的问题制作 200 条 SFT 数据。比较两条路线的质量增益、实现时间、推理成本和回滚难度。最终结论允许是“不微调”。