摘要大模型怎样从一组随机参数变成能够回答问题的助手本文沿着“数据准备 → 预训练 → 监督微调 → 偏好与推理优化 → 压缩部署”的主线解释每一步使用什么数据、优化什么目标、产出什么结果并讲清 SFT 与 LoRA、RLHF 与 DPO、蒸馏与量化之间的关系。关键词大模型训练、预训练、SFT、RLHF、LoRA、模型蒸馏、模型量化本文是参考 B 站 UP 主「Agent实战笔记」的大模型训练全链路课程结合原始论文和官方文档重新组织的学习笔记。DPO、QLoRA、数据与评测细节为补充内容文中的示例与代码用于解释原理。刚开始学习大模型时最容易遇到的困难是概念很多却不知道它们怎样连起来。预训练、SFT、RLHF 听起来都是训练LoRA 也叫微调蒸馏和量化都能让部署更轻。于是一个看似简单的问题反而不好回答从原始文本到一个能够使用的模型中间到底发生了什么理解这条链路可以一直追问三件事这一步喂给模型什么数据希望它学会什么又怎样判断它学得好不好。1. 先建立全局视角训练阶段与实现方法要分开看对于常见的自回归文本大模型可以先用下面这张图建立整体认识图 1各阶段的目标与产物。蒸馏后的学生模型需要重新评测也可以继续量化。这是一条便于理解的典型路线。具体模型可能省略某些步骤也可能交替进行多轮训练。不是每个模型都必须做 RLHF也不是模型上线前一定要先蒸馏再量化。另外LoRA 不需要单独放在 SFT 后面作为必经阶段SFT 回答“用什么训练任务”LoRA 回答“怎样更新参数”。二者完全可以组合。概念主要解决的问题典型输入典型产物预训练学习语言、知识与通用模式大规模文本序列基础模型SFT学习执行指令、完成任务指令与示范回答指令或领域模型RLHF利用人类反馈优化行为偏好数据、训练提示词经过偏好优化的模型DPO直接利用回答偏好训练问题、优选回答、较差回答经过偏好优化的模型LoRA减少微调时要更新的参数某个训练任务的数据适配器权重蒸馏把教师模型的能力迁移给学生教师输出或概率分布学生模型量化降低数值表示所需的位宽已有权重等张量低比特模型表示下面用“训练一个技术问答助手”的例子把这些环节串起来。2. 数据准备模型首先需要合适的学习材料假设我们希望模型回答数据库、网络和编程问题能收集到的材料可能包括技术文档、代码、问答以及教程。这些材料不会自动变成高质量训练集。网页里可能夹着导航和广告同一篇文章可能被转载几十次代码可能缺失关键部分过时文档也可能与新文档互相矛盾。因此进入训练前通常需要做文本提取、质量过滤、重复检测和数据配比。FineWeb 的研究就系统讨论了大规模网页语料的过滤与去重设计以及这些处理对模型效果的影响。FineWeb 论文可以用一张检查表理解这些工作的目的处理动作技术问答场景中的例子希望避免的问题内容提取保留文档正文与代码块模型反复学习菜单、页脚去重识别同一教程的多个转载版本重复内容占用训练预算质量筛选排除乱码、残缺代码和无意义拼接输入材料本身有错误敏感信息处理处理日志中的真实密钥与个人信息将不该学习的内容带入模型数据配比平衡技术文档、代码和通用文本某一种材料过度主导训练评测隔离将测试问题及其近重复内容隔离把记住答案误判成能力提升训练集用于更新模型验证集用于选择配置测试集用于最后评价。实践中还应考虑按来源、文档或时间分组避免同一文档的相邻片段同时进入训练集和测试集。数据量、质量、多样性和计算预算需要一起考虑。“越多越好”和“只要少量精品数据就够了”都不适合当成通用规则。3. Tokenizer文字怎样变成模型的输入神经网络处理的是数值张量。文本进入模型前会先通过 Tokenizer 切分成 token再转换为词表中的 ID。例如下面只是帮助理解的假设切分不是某个真实模型的分词结果文本数据库需要备份 token[数据库] [需要] [备份] ID [ 101 ] [205 ] [ 309 ]一个 token 可能对应一个字、一个词也可能只是子词或字节片段。不同分词器对同一句话的切分结果可能不同。Tokenizer 官方说明ID 只是索引。进入网络后Embedding 层会将它们映射成向量再交给后续层处理文本 → token ID → 向量 → Transformer 层 → 下一个 token 的概率分布这里有两个值得分清的地方。第一token 数少说明这段文本编码得更紧凑不能据此证明模型更聪明。在相同 token 上限下更紧凑的编码可能容纳更多文字但模型能否利用这些内容还取决于训练和结构。第二把多种语言都转成数字并不自动获得跨语言能力。模型仍需要从相应数据中学习语言规律和关联。复用现有模型时也应使用与其权重匹配的 Tokenizer。随意替换词表会改变 ID 与向量之间的对应关系。4. 预训练通过预测下一个 token 学习文本规律这里讨论常见的自回归语言模型。它的基本任务是根据前面的内容预测下一个 token预测时不能偷看后面的内容。因果语言建模官方说明假设一句话被切成[数据库] [需要] [定期] [备份]训练时会形成这样的预测关系看到[数据库] → 预测[需要] 看到[数据库] [需要] → 预测[定期] 看到[数据库] [需要] [定期] → 预测[备份]这类训练不需要人工为每句话另写答案因为目标 token 已经存在于原文中所以通常称为自监督学习。用公式表示一个简化的损失函数是L pretrain − ∑ t 2 T log P θ ( x t ∣ x 1 , … , x t − 1 ) \mathcal{L}_{\text{pretrain}} -\sum_{t2}^{T}\log P_\theta(x_t\mid x_1,\ldots,x_{t-1})Lpretrain−t2∑TlogPθ(xt∣x1,…,xt−1)读不懂公式也没关系它表达的意思是模型给真实的下一个 token 分配的概率越低受到的惩罚就越大。每一步训练都在重复读取一批数据 → 前向计算 → 计算损失 → 反向传播 → 更新参数从零预训练通常从随机初始化的可学习权重开始。如果已经有基础模型也可以接着进行领域继续预训练。为什么“预测下一个 token”能学到知识以技术文本为例要合理续写“数据库事务的四个特性是……”模型需要利用训练材料中的相关模式要补全一段程序则需要学习语法、变量使用和常见逻辑。大量预测任务共同塑造了模型的能力。不过这种学习不等于建立了一个可精确查询的事实数据库也不保证每次输出都正确。预训练结束后得到的 Base Model通常具备较强的文本续写能力但不一定稳定地扮演助手。比如给它“请解释事务隔离级别”它可能接着生成教材里的下一道题而不是按要求解释。5. SFT用示范教模型怎样完成任务SFT即监督微调。用于指令训练时我们提供“用户要求什么以及一个合适的回答是什么”。下面是一条自行构造的示例{messages:[{role:user,content:用两句话解释数据库索引并说明一个代价。},{role:assistant,content:数据库索引是一种帮助定位数据的数据结构可以减少部分查询需要扫描的数据。它需要额外存储空间写入时也可能增加维护开销。}]}角色和消息会通过聊天模板转换成模型能够处理的序列模板中通常包含角色标记、消息边界以及结束标记。SFT 仍然在预测下一个 tokenSFT 并没有把自回归模型变成另一种预测机制。常见做法是问题作为上下文仍逐个预测回答中的 token只对希望模型学习的回答部分计算损失。具体是否屏蔽提示词损失取决于训练配置。SFT Trainer 官方说明可以用两个问题 token 和两个回答 token 举例图 2标签先与输入位置对齐计算损失时再错开一位。图中省略特殊 token 和填充位置。这里的-100表示该标签位置不计入损失。做下一个 token 的错位对齐后“问题2”位置的输出会学习预测“回答1”。不计算问题部分的损失不代表模型看不到问题。问题依然参与上下文计算回答的预测也依赖它。用一段训练骨架理解两者的共通之处下面是 PyTorch 风格的核心逻辑省略了模型构建、数据加载、混合精度和分布式训练不是完整训练脚本。假设model是内部使用因果掩码的语言模型labels已按任务准备好填充位置也已设为-100。importtorch.nn.functionalasF model.train()forbatchindataloader:optimizer.zero_grad(set_to_noneTrue)# 不传 labels下面手动完成一次错位与损失计算。logitsmodel(input_idsbatch[input_ids],attention_maskbatch[attention_mask],).logits# [batch, length, vocabulary]predictionslogits[:,:-1,:].contiguous()targetsbatch[labels][:,1:].contiguous()lossF.cross_entropy(predictions.reshape(-1,predictions.size(-1)),targets.reshape(-1),ignore_index-100,)loss.backward()optimizer.step()预训练时标签通常来自输入文本常见的回答部分 SFT则会额外屏蔽非回答位置。每批数据需要有有效的监督 token若使用框架内置的语言模型损失也要确认它是否已经执行错位避免重复处理。SFT 能训练回答方式、格式和领域任务能力也可能学入新知识。但把业务文档全部改成问答并不能保证模型完整、准确地记住每条信息。所需数据量也没有统一的“几千条一定够用”标准。6. RLHF、DPO 与可验证奖励模型怎样进一步改进6.1 RLHF让偏好成为训练信号同一道问题可以有多个回答其中一些更准确、清楚、有用。比如问“为什么数据库查询慢”一个回答只说“升级机器”另一个先建议检查执行计划、索引和扫描量。我们可以把这种比较整理成偏好数据。经典 RLHF 路线包含收集人类对回答的偏好训练奖励模型再利用强化学习优化生成回答的策略。InstructGPT 是这一流程的代表性工作。InstructGPT 论文图 3先用人类偏好训练奖励模型再用评分信号优化策略模型图中简化了参考策略与 KL 约束等细节。奖励模型是在近似标注者的判断。它不等于事实裁判也可能存在偏差。优化时通常还需要限制模型偏离参考策略的程度避免它只追逐高分却损伤原有能力。因此不能只看奖励分数上涨。还要检查回答是否正确、是否过度迎合、是否变得冗长以及原本擅长的任务有没有退步。6.2 DPO直接从回答偏好中学习标准 DPO 使用prompt / chosen / rejected这样的偏好样本将偏好优化改写为直接训练语言模型的目标不需要像经典 PPO 路线那样单独拟合奖励模型并执行在线强化学习循环。DPO 论文{prompt:数据库查询慢时应该先做什么,chosen:先检查慢查询和执行计划确认瓶颈后再选择优化措施。,rejected:不需要检查直接把所有字段都加上索引。}DPO 简化了训练流程但不会自动修复偏好数据的问题。如果标注时总是选择更长的答案模型就可能学到“写长一点更容易得分”。6.3 可验证奖励有些任务可以直接检查结果代码能否通过测试数学答案是否满足约束这些结果有时可以由程序验证。此时可以用验证规则提供奖励信号而不必把每一次判断都交给人类或学习得到的奖励模型。DeepSeek-R1 展示了强化学习在推理能力训练中的应用GRPO 则由 DeepSeekMath 工作提出是一种与 PPO 相关的策略优化方法。DeepSeek-R1 论文、DeepSeekMath 论文理解这些名词时要区分“奖励从哪里来”和“参数如何优化”关注点例子奖励来源人类偏好训练出的奖励模型、代码测试、数学答案校验优化方法PPO、GRPO 等强化学习的关键是利用奖励优化策略。“让模型生成数据再拿这些数据训练”本身不足以定义强化学习也可能是合成数据 SFT 或蒸馏。验证器同样需要检查边界。如果测试只覆盖了几个固定输入模型可能学会通过这些测试却没有真正解决一般情况。7. LoRA 与 QLoRA怎样降低微调的资源需求前面讲的是模型学习什么现在来看更新哪些参数。全量微调会更新所选模型的全部参数。LoRA 则冻结原始权重通过可训练的低秩增量适配任务。对一个线性层可写成W ′ W Δ W , Δ W α r B A WW\Delta W,\qquad \Delta W\frac{\alpha}{r}BAW′WΔW,ΔWrαBA其中原权重W WW的形状为d o u t × d i n d_{out}\times d_{in}dout×din而A AA、B BB的形状分别为r × d i n r\times d_{in}r×din和d o u t × r d_{out}\times rdout×r。训练主要更新这两个小矩阵。LoRA 论文图 4输入分别经过原始权重与低秩分支增量乘以缩放系数后与原分支相加省略偏置等细节。例如一个4096 × 4096的权重矩阵有约 1678 万个参数。如果取r 8对应的两个 LoRA 矩阵共有8 × 4096 4096 × 8 65,536 个参数相对于这个矩阵做全量更新可训练参数减少到约1/256。这是该层的计算示例不能直接当成整个训练任务的显存或成本降幅。原模型仍要参与计算激活等内容仍占用显存不同任务也可能需要不同的秩、学习率和目标层。LoRA 不保证效果一定超过全量微调。这里分解的是需要学习的权重增量并不是声称任意完整权重矩阵都能被极低秩矩阵无损替代。QLoRA 进一步结合了量化冻结的基座权重使用 4 bit 表示梯度通过它传递到 LoRA 适配器。它不等于所有训练计算都以 4 bit 进行。QLoRA 论文所以“用 LoRA 做 SFT”是一句完整且常见的描述SFT 指训练任务LoRA 指参数更新方式。8. 蒸馏与量化两种不同的部署优化思路8.1 蒸馏让学生模型学习教师的能力蒸馏的核心是知识迁移。教师模型提供学习信号学生模型通过训练吸收它的能力。传统方法可以让学生接近教师的输出概率分布大模型场景中也常利用教师生成的回答来训练学生。知识蒸馏论文、DeepSeek-R1 论文以技术问答为例可以构造这样的教学方案准备问题 → 教师生成回答 → 检查事实、代码与格式 → 筛选形成训练数据 → 训练学生模型 → 用独立问题评价学生如果目的是降低部署成本通常会选择更小的学生模型。不过“学生必须更小”并不是蒸馏的定义。蒸馏也不是把大模型的参数直接截掉一部分。学生的容量、训练材料、优化过程都会影响最终效果教师的错误也可能随数据被学生学走。8.2 量化用更少的位数表示数值量化降低权重或其他张量的表示位宽具体量化哪些张量、采用什么数值格式取决于方法。常见的权重量化可以减少模型存储和加载所需的内存。量化官方说明这里先记住单位1 byte 8 bit FP32每参数 4 byte FP16 / BF16每参数 2 byte 8 bit每参数约 1 byte 4 bit每参数理论上约 0.5 byte假设模型恰好有 70 亿个参数仅按权重本身计算权重表示简化计算理论权重体积FP3270 亿 × 4 byte28 GBFP16 / BF1670 亿 × 2 byte14 GB8 bit70 亿 × 1 byte7 GB4 bit70 亿 × 0.5 byte3.5 GB这里使用十进制 GB且未计入量化元数据、未量化层、运行缓冲、激活和 KV Cache 等开销。因此不能据此断言“3.5 GB 显存就能运行任意 7B 的 4 bit 模型”。量化后的速度也依赖硬件与算子支持不能仅根据文件变小就断言推理一定变快。8.3 两者应该怎样比较图 5蒸馏需要训练学生量化改变数值表示。二者可以组合部署效果仍需实际评测。维度蒸馏量化主要动作训练学生模型改变张量的数值表示参数数量可以选择更少参数的学生常见权重量化通常不改变参数个数是否需要训练学生需要训练取决于方法训练后量化与量化感知训练不同主要风险能力迁移不充分继承教师错误数值误差硬件或算子不匹配能否组合学生训练后可继续量化可用于蒸馏后的模型在相同内存预算下是“较大模型量化后”更好还是“小学生模型”更好需要用具体业务测试。比较时应同时看准确率、延迟、吞吐、上下文长度和设备限制不能只给一个固定答案。9. 从模型文件到可用服务评测和部署不能省略训练完成得到的是一份模型产物。要让它成为技术问答服务还需要确认 Tokenizer、聊天模板、推理框架和权重版本相互匹配。如果使用 LoRA可以根据部署方案合并权重或加载适配器并核对对应基座。模型转换或量化之后都应重新评测。评测要覆盖模型质量与运行表现方面技术问答助手中的检查例子内容质量是否正确解释概念有没有编造接口任务完成是否回答了问题是否遵守指定格式能力回退领域表现改善后通用问答有没有变差首 token 延迟用户提交问题后多久看到第一个输出生成速度连续生成时每秒输出多少 token并发与稳定性多人同时使用时是否排队、超时或内存不足长上下文输入变长之后质量、延迟和内存怎样变化KV Cache 会保存生成过程中可复用的注意力键值避免重复计算但也会占用内存。其开销与模型结构、缓存策略、序列长度及批量规模等有关。KV Cache 官方说明端侧还需要在目标设备上实际测试内存、耗电、发热和持续运行表现服务端则需要结合请求长度、并发目标和批处理策略评估吞吐。上线后的错误样例很有价值。例如把“概念回答错误”“JSON 格式失败”“引用了过时文档”分别整理出来才能判断下一轮该改训练数据、检索系统还是提示词和服务逻辑。10. 一个落地例子技术问答助手应该从哪里开始了解完整流程后并不意味着每个项目都要从零预训练。对于一个已有业务文档的技术问答助手可以先建立评测集再用现成模型测出基线然后根据失败原因选择方法。当前问题可以优先验证的方向不知道近期更新的文档内容用检索补充上下文并检查检索结果知道内容但回答格式不稳定提示词、结构化输出能力或任务 SFT某类任务普遍做不好分析能力缺口考虑更合适的模型或领域训练几种答案都可用但风格不符合要求统一评价标准再考虑偏好优化效果达标但运行成本太高在相同评测集上比较量化、学生模型和服务优化RAG 把外部检索内容与生成结合使模型在回答时获得额外材料。它与训练可以配合但业务系统中常见的“检索后把文档放入上下文”并不要求每次更新文档都重新训练生成模型。RAG 论文举个具体例子模型已经知道怎么解释 API却不知道公司昨天修改的参数名。这时先让它检索到正确文档再观察能否回答通常比直接启动一轮训练更容易定位问题。如果找到了正确文档模型仍经常忽略“必须返回三个字段”的要求那么任务示范、输出约束或 SFT 才更贴近这个问题。对个人学习可以把目标设为一个小而完整的实验选择模型 → 固定评测集 → 记录原始效果 → 准备指令数据 → 用 LoRA 做 SFT → 与原始模型对比 → 按需量化 → 测试本地推理这条路线最有价值的产物不只是一个能加载的模型文件还有一组可回答的问题哪些能力改善了哪些没有付出了多少资源以及压缩后保留了多少效果。理解训练全流程之后面对一个新方法就可以判断它究竟改变了数据、学习目标、参数更新方式还是部署表示面对一个实际问题也能找到应当验证的环节。
