阶段二的详细推理过程讲解完毕,但这时候 LLM 只经过了预训练,他只会续写,阶段三通过特定的调试,让 LLM 拥有问答、规避风险等真正可以被人用的能力。
阶段三
阶段二的产物称之为 Base Modle,阶段三转为 Chat Modle,并符合 HHH 原则(Helpful, Honest, Harmless)。
SFT (Supervised Fine-Tuning) ------ 格式与指令学习
人类事先写好一些高质量的问答,例如:
- Prompt: "写一个 Java Hello World。"
- Response: "
public class Main { ... }"
把这一整串给 LLM 训练,但是对 prompt 做 Loss Masking(损失掩码),即不让 LLM 学习如何写 Prompt,而是让他学习如何写 Response。
训练材料里加上特殊 Token 注入,用于辨识对话人和开始结束点。特殊 token 是不可见的,只用于给 LLM 做区分。
比如原始数据是:
User: Hi AI: Hello
格式化后是:
<|im_start|>user\nHi<|im_end|>\n<|im_start|>assistant\nHello<|im_end|>
这个过程的产物是 SFT 模型,只会模仿人类回答,无法分辨好坏。
Rejection Sampling (拒绝采样 / 迭代式 SFT)
拿着训练好的 SFT 针对同一个 Prompt 生成 10 个回答,使用更高级的模型、或者硬性标准(比如生成的代码能不能允许)对回答做评判,选出最好的一个。
再把这个当做数据,迭代 SFT。
Alignment (价值对齐 / RLHF / DPO)
这一步决定了模型的价值观和智力上限,通常有两种路线。
传统的 RLHF (PPO 算法)
先训练一个 Reward Model (RM) 奖励模型,即把 Unembedding 去掉改为线性层只输出一个分数,由人类来选择回答 A 和 B 那个分更高,RM 学习这个过程,变为一个打分模型。
由主模型生成答案,让 RM 奖励模型打分,再反向传播修改模型参数。
直接偏好优化 (DPO - Direct Preference Optimization)
去掉 RM 模型,使用一个损失函数取代。
使用现有的答案,分析生成的答案更靠近好还是坏,靠近好则强化,靠近坏则调整参数。
Safety & Red Teaming (安全围栏与红队测试)
使用黑客、自动化脚本等生成不安全方向的 Prompt,针对防御失败的案例,人工撰写拒绝回复答案,再用这些数据训练 LLM。
阶段四
至此完整可以用的 LLM 已经训练完毕,把所有的参数都改为只读,将模型部署到线上即可使用。
标准的模型非常大,参数很多,需要极大的显存才能允许,通过量化与压缩 (Quantization) 降低模型权重,比如从 16-bit 浮点数 (FP16) 压缩成 4-bit 整数 (INT4) 来降低缓存占用。
模型像是 Java 程序一样也要有容器,线上一般用 vLLM,本地用 Ollama。
随着知识不断更新,不可能实时训练模型,就有了 RAG 这种外挂硬盘的装置,把实时最新内容,或者企业私有数据,加入到对话的上下文。
如果不至于对话问答,还可以通过 Agent 实现更多功能,比如通过 MCP 查询提前、地图路线等。