预训练让模型接触大量文本,指令微调则把某种任务的输入和期望回答组织成样本。它仍可使用 next-token 目标,但你要明确哪些 token 是条件,哪些 token 是要学习输出的内容。
一条指令样本包含什么
例如任务是提取活动信息。指令是“提取时间与地点”,输入是“周六下午三点在社区图书馆见”,回答是一个约定字段的结构。样本需要固定模板、角色边界和结束标记,并与模型采用的格式兼容。
训练前先检查样本是否自相矛盾、答案是否能从输入中得到、字段是否一致。标签质量往往比增加几条随意生成的样本更重要。
明确损失的范围
一种常见策略只对回答部分计算损失,把提示部分标签设为忽略值。也有训练方案对整个序列计算目标。你需要明确选择,而不是把所有公开代码都当成同一种处理。
# 位置对齐示意:真正构造 x/y 时仍要做 next-token 移位。
prompt = [11, 12, 13]
response = [21, 22, 23]
tokens = prompt + response
labels = [-100] * len(prompt) + response
这个示例只说明“忽略提示”的边界。实现时还要处理下一位置预测、padding、截断、样本拼接和 special tokens,不能直接把这里的 labels 与未移位 logits 配对。
留出集要测同一个任务
训练与评估应分离。如果任务有固定字段,可以检查字段完整性和格式正确率;若答案有客观事实,可以按任务定义检查正确性。对开放式回答,事先给出评价标准,避免看到结果后临时改规则。
比较微调前后时,使用同一组留出输入、同一种提示模板与推理设置。把不符合格式、漏字段和错误事实分别记录,比只给一句“效果更好”更可检查。
数据目标和更新方法不是一回事
SFT 描述的是有监督微调的目标与数据流程。它既可以更新较多模型参数,也可以配合参数高效方法。下一课的 LoRA 改变的是哪些参数被训练、怎样表示权重增量,不会自动替你选择训练数据或评估指标。
本课先交付一份数据样例、损失策略说明和评估清单。实际扩大训练前,再验证模板与训练/推理分词是否匹配。