第 7 章:进阶训练
主线对话已经能用。这一章是加分项:蒸馏、LoRA、工具调用、自适应思考。
1知识蒸馏
两种常见说法:
- 黑盒:只学老师的最终回答(硬标签)。主线 SFT 里大量 Qwen3 的 tool / reasoning 数据,本质上就是这个。
- 白盒:还要学老师在每个 token 上的概率分布。脚本是
train_distillation.py,损失是交叉熵 + KL,带温度。
cd trainer
python train_distillation.py
脚本展示了教师/学生双模型、MoE 与 Dense 组合、断点续训和分布式,适合当「读得懂的参考实现」,不是必须步骤。
2LoRA:改性格,不大改大脑
只训练旁路的低秩增量,主体权重冻结。适合医疗、自我认知等垂直场景。实现全手写,不依赖 peft。
cd trainer
python train_lora.py
数据仍是多轮 jsonl,例如放到 lora_xxx.jsonl。测的时候基础权重名要和训练时一致:
python eval_llm.py --weight full_sft --lora_weight lora_medical
python eval_llm.py --weight full_sft --lora_weight lora_identity
合并回完整模型:
cd scripts && python convert_model.py
数据很多时也可以直接
full_sft。务必把通用数据和领域数据混在一起,否则很容易过拟合、忘掉原来会的事。3工具调用已经在 SFT 里
2026 年 3 月后不再单独训 reason / tool 权重。约 10 万条由 qwen3-4b 合成的工具样本混进了 sft_t2t,覆盖约 10 个模拟工具(时间、计算、天气等)。默认 full_sft 就会一点 Tool Call,但谈不上泛化。
python eval_toolcall.py --weight full_sft
典型轨迹:模型先吐 <tool_call>{...}</tool_call>,脚本执行工具,再把结果塞回去,模型组织成人话。
4自适应思考
「要想不要想」下沉到 chat template,而不是再训一个思考模型。
open_thinking=0:预置空思考块,倾向直答open_thinking=1:预置思考起始标签,继续写推理再回答- CLI、OpenAI API、WebUI 都有这个开关
response = client.chat.completions.create(
model="minimind",
messages=[{"role": "user", "content": "你是谁?"}],
extra_body={"chat_template_kwargs": {"open_thinking": True}}
)
同时开 Tool Call 和显式思考时,思考过程往往不稳定——训练数据里还缺少「边想边调工具」的联合样本。