训练目标、数据分组与泄漏
同一种格式在大量任务上持续不稳定、示例提示太长、领域行为可用高质量样本表达时,可以比较微调。实时事实、访问权限和精确计算更适合检索、工具与程序校验。先固定prompt基线,才能衡量训练是否值得成本。
监督微调(SFT)让模型学习目标回答的条件概率;训练样本要包含模型实际能看到的输入、目标回答、来源与许可。偏好数据包含同一问题下的chosen/rejected,标注指南必须说明为何更好,不能只奖励长答案。
python
rows = [
{'id':'1','customer':'A','text':'refund failed'},
{'id':'2','customer':'A','text':'refund failed!'},
{'id':'3','customer':'B','text':'cannot log in'},
{'id':'4','customer':'C','text':'invoice missing'},
]
train = [r for r in rows if r['customer'] in {'A','B'}]
test = [r for r in rows if r['customer']=='C']
assert {r['customer'] for r in train}.isdisjoint({r['customer'] for r in test})
assert len(train)==3 and len(test)==1
print([r['id'] for r in train], [r['id'] for r in test])若按行随机拆分,A的近重复工单可能同时进入训练与测试,测到的是记忆相似样本而非泛化。按客户、源文档、时间或事件分组,再检查近重复,是更有意义的分割。这个小例子只演示机制,不能代表真实样本量足够。
标注一致性比样本总数更重要:先双人标少量边界,比较冲突并修订规则,再扩展。清洗时保留拒答、未知和失败样本,不把不便处理的数据都删掉。敏感字段脱敏后检查任务语义是否仍成立,数据授权也要覆盖训练用途。
聊天模板把角色转换成token序列,SFT通常只对要学习的回答token计算损失,用户提示和padding使用mask;否则模型会花容量预测输入,或学到padding。截断必须保留目标尾部关键字段,不能只看样本JSON完整。训练前检查实际token序列、mask与特殊token,旧纯文本completion数据迁到chat模板时尤其如此。
练习
加入与id1内容相同、客户D的样本。按客户分组还足够吗?写一个规范化文本去重检查,识别跨集合泄漏。
完成后查看本章答案。
下一章:损失、梯度与参数高效训练。