原创教学项目 · 核对:2026-10-09。沿用知识助手的例子;这里设计实验,不宣称跑出了模型收益。
我们已经把正确资料放进上下文,助手却常常不引用来源。现在有一笔有限的训练预算,该用来换模型、做 SFT,还是先改提示?
先别急着选框架。把几条错误输入留下来,确认要改变的是模型如何使用资料,而不是把每天变化的资料记进参数。两件事需要的数据和验收方式并不一样。
先做一个不训练的对照
固定问题、资料和生成预算,试清楚的指令与输出约束。比如要求返回 answer 和 citations,确实能减少漏字段;但它不能保证引用真的支持答案。格式通过与证据正确要分开测。
| 眼前的问题 | 先试什么 | 为什么不直接训练 |
|---|---|---|
| 资料已经过期 | 更新检索(retrieval)快照和版本选择 | SFT 不会自动知道昨天改了哪条规定 |
| 总漏引用字段 | 提示、结构化输出、解析检查 | 可能不需要维护新权重 |
| 字段齐全,但经常引用错段落 | 有依据的示范、缺证据与冲突样本 | 这是行为学习的候选(candidate)问题,但先确认标注可靠 |
| 两种回答都对,只是详略不同 | 明确偏好标准,检查评审一致性 | 不同评审可能偏好相反,不能只靠更多数据解决 |
假设提示已经改过,漏引和错引仍反复出现,我们才进入这次 SFT 实验。评估中保留“不应回答”的题:否则模型也许只是学会每次都编一个像引用的字符串。
LoRA、QLoRA、全参,差别在哪
SFT 描述的是用示范训练的目标;LoRA 和全参描述哪些参数更新;QLoRA 还涉及基座的量化存储。它们不是三个互斥的训练目标。
| 方案 | 这次为什么考虑它 | 要付出的代价 | 什么时候重新考虑 |
|---|---|---|---|
| LoRA | 先用较小的可训练参数集合检验数据是否有用 | rank、插入位置会限制可学习的变化;还要管理 adapter 与基座版本 | 明确的数据问题已排除,合理调参后仍欠拟合 |
| QLoRA | 基座权重是显存瓶颈,希望在量化基座上训练 adapter | 量化误差、算子和导出兼容性;未必比非量化 LoRA 更快 | 有足够显存,或量化让关键任务退化 |
| 全参微调(fine-tuning) | 希望让更多参数适应任务,并能承担状态与计算成本 | 梯度、优化器状态和保存成本更大;仍可能过拟合(overfitting) | 数据量、任务变化或实验结果不足以支持额外成本 |
例如一个 $4096\times4096$ 的线性层有 16,777,216 个权重。若给它加 rank 16 的 LoRA,新增可训练参数是 $16(4096+4096)=131{,}072$,相当于原矩阵的约 0.78%。这是这个矩阵的参数比例,不是整次训练显存只剩 0.78%。 基座还在,前向激活也还在。
QLoRA 通常冻结量化基座、训练额外参数,并不是把所有训练状态都改成 4-bit。具体支持的量化、计算精度和合并方式要核对 PEFT 的量化说明。原理可接着看 LoRA 与 QLoRA。
框架分工,不是一排替代品
这次项目先选容易检查 batch 的训练路径。等有了 rollout、奖励(reward)计算和权重同步(refit),再考虑更复杂的编排;不是装的框架越多,实验就越完整。
| 层次 | 可以用什么 | 在项目里负责什么 |
|---|---|---|
| 模型与 tokenizer | Transformers | 加载固定 revision、套聊天模板、前向与生成 |
| SFT 训练循环 | TRL SFTTrainer,或可审计的自定义循环 | 数据到 batch、loss、优化与验证 |
| 参数高效更新 | PEFT | adapter 配置、可训练参数和产物 |
| 启动与分布式后端 | Accelerate 配置训练启动;按兼容性接 DDP、FSDP 或 DeepSpeed | 混合精度、进程与状态分片(sharding),不负责定义业务正确性 |
| 多角色后训练(post-training) | NeMo RL、verl | 训练、生成、奖励等计算的组织;要额外核对模型和后端支持 |
| 生成服务 | vLLM、SGLang | 可用于评估或 rollout 的生成,不替代反向训练器(trainer) |
NeMo RL 的后端文档区分 DTensor / FSDP2 和 Megatron 路径;verl强调训练与生成组件的组织。这里不做谁“最快”的排名:只有把模型、长度分布、设备和目标固定,性能对照才有意义。已有团队栈也会影响选择;能复用可靠的数据和恢复流程,往往比少写几行启动命令更重要。
第一轮配置,要能解释每一个选择
下面是实验说明文件,不是可直接交给 TRL 的配置。尖括号必须换成真实 revision;依赖锁文件也要随实验保存。项目现有 mask 示例按 TRL v0.29.0 核对,不代表 2026 年只能用这个版本。
{
"run_id": "citation-lora-pilot",
"base_revision": "<immutable-model-revision>",
"tokenizer_revision": "<immutable-tokenizer-revision>",
"dataset_snapshot": "citation-demo-v1",
"split_rule": "question-family-v1",
"template_hash": "<sha256>",
"objective": "assistant-target-token-mean",
"adaptation": "lora",
"packing": false,
"resume_at": "optimizer-step-boundary"
}
为什么第一轮不 packing?不是它不好,而是先让每条样本的边界和 label 一眼可查。为什么先 LoRA?这次先验证示范是否有用,同时限制训练状态成本;不是预先认定全参没有价值。
学习率、rank、最大长度不能凭这张表拍定。先统计长度和有效 target token,跑一小批稳定性检查,再用事先限定的开发集调参预算比较。测试集不能变成每天反复挑配置的地方。
做到什么程度,才值得扩规模
| 阶段 | 留下什么证据 | 没通过时先查哪里 |
|---|---|---|
| 数据小样本 | 解码后的完整输入、target 区间、来源 | 模板、拼接、截断、标签 |
| tiny overfit | 少量训练样本的 loss 与生成变化 | 梯度、学习率,样本目标是否互相矛盾;记住这几条不代表能泛化 |
| 中断恢复 | 连续跑与恢复跑的样本序列、状态对照 | optimizer、调度器、RNG、数据游标 |
| 开发集比较 | 引用正确性、拒答分组、时间和显存 | 数据覆盖与目标,而不只是换更大模型 |
| 固定测试集 | 最终方案与旧版的配对结果 | 决定是否采用,不继续用测试集调参 |
“升级到 RL”也需要自己的理由:能否采样有效轨迹、奖励能否分辨好坏、是否存在奖励投机?SFT 做完没有提升,不自动说明该换 GRPO。
下一篇把这些决定落到数据结构与 batch;只关心多卡,可以直接去分布式选择。
本页术语 9
- 检索 retrieval
- 从外部语料里找出相关内容
- 候选 candidate
- 召回阶段捞出来、等待精排挑选的内容
- 微调 fine-tuning
- 在预训练权重上继续训练以适配具体任务
- 过拟合 overfitting
- 训练集越来越好,没见过的数据反而变差
- 奖励 reward
- RL 里指导策略更新的标量信号
- 权重同步 refit
- 训练器更新完权重后推回推理引擎,让下一轮 rollout 用上新策略
- 分片 sharding
- 把参数、梯度或优化器状态切开分给多张卡,每张只存其中一份
- 后训练 post-training
- 预训练之后为特定任务和行为做的所有训练
- 训练器 trainer
- 负责计算 loss、反向传播并更新模型参数的系统