English interface selected · this article is currently written in Chinese.
怎样判断 SFT 改善了什么:格式、准确率与能力退化
English overview →具备清晰骨架、初步数学推导或工程验证,持续补充论据与实测。
数字花园
🌿 什么是数字花园与思想演进?
遵循 Maggie Appleton 与 Andy Matuschak 的常青笔记理念:这里不是按时间沉底的流水账,而是持续修剪打磨的知识生态。文章按成熟度经历:
- 🌱 萌芽 (Seedling): 发散灵感、读书摘录、开放猜想
- 🌿 演进 (Budding): 结构渐明、初步代码推导、积极修正
- 🌳 常青 (Evergreen): 逻辑闭环、持久经得起检验的基石
- 🔬 实验待证 (Speculative): 结合沙盒与仿真探针的理论探索
训练结束,模型开始稳定输出 JSON,损失也下降了。现在能说 SFT 成功了吗?
如果 JSON 里的学习率经常多一个零,或未知步数被填成默认值,它只是更稳定地输出了一个错误答案。反过来,键顺序变了但内容完全正确,也不应仅因字符串不同就判错。
评价要对应任务真正需要的行为,并保留不同错误的区别。 本篇继续使用三字段实验记录提取任务,把训练结果拆成可以复核的几层。
文中的数字均为自写计数例子,用于说明指标口径,不是已运行模型的结果。
第一层:输出能否被正确读取
先检查完整输出是否为合法 JSON,而不是从一大段解释中随便截出一对花括号。若应用要求只返回 JSON,那么额外开场白本身就是格式失败。
再检查结构:必须是对象,包含规定的三个键,类型正确,没有不允许的额外字段。steps 应为整数或 null,learning_rate 应为数值或 null。
实现时要注意语言类型细节。例如 Python 中布尔值具有整数的继承关系,简单的整数类型判断可能把 true 当作步数接受。检查器应按任务定义处理,而不是让编程语言的默认行为决定规范。
解析器对重复键、非标准数值等情况也可能有宽松行为。用于评价的接受范围应明确,并用正常与异常输出测试它。
可解析率和结构符合率可以分开报告。前者高,并不保证后者也高。
第二层:字段有没有被正确提取
结构通过后,再比较字段含义。对于示例材料 2e-4,输出 0.0002 应被视为相同数值;JSON 键顺序变化也不应影响结果。
但允许哪些归一化要预先规定。模型名大小写、空白、单位转换是否可忽略,不能看到模型答案后临时放宽。
数值比较也不能统一使用一个很大的误差容忍范围。学习率从 0.0002 变成 0.002 是数量级错误,若绝对容差设置不合理,可能误判为正确。可以按任务使用精确十进制解析,或明确规定相对与绝对误差规则。
字段正确性应以当前材料和任务规范为依据。外部常识里某模型通常训练多少步,不能替代材料没有记录的值。
第三层:整条记录是否可以直接使用
假设一百条输出中,九十八条能解析,九十四条结构符合要求,七十八条三个字段全部正确。
这对应三个不同指标:98%、94%、78%。如果实际应用要求整条记录都正确,那么不能把 98% 宣传成任务成功率。
可以同时报告整条成功率与逐字段准确率。前者更严格,后者有助于定位错误来自模型名、学习率还是步数。
解析失败的样本也必须进入整体分母。只在成功解析的九十八条里统计正确率,然后省略两条失败,会让失败消失在报告中。
此外,多字段错误可能发生在同一条记录上。每种错误类型的计数可以重叠,不应强求它们相加恰好等于失败记录数;如果要做互斥分类,需要另定优先规则。
缺失值多时,整体字段准确率会骗人
假设一百条记录都明确包含模型名,但学习率和步数都缺失。总共三百个字段,其中两百个应为 null。
一个始终输出三个 null 的系统,字段准确率可以达到 ,但没有一条记录完全正确,也没有提取出任何已有模型名。
因此,缺失处理至少拆成两面:
| 指标 | 观察什么 | 对应失败 |
|---|---|---|
| 已知字段提取正确率 | 材料有值时是否给对 | 遗漏、填空、抄错 |
| 缺失字段留空率 | 材料无值时是否留空 | 无依据补写 |
也可以报告缺失字段中的补写率,以及已知字段中的遗漏率。分母应明确是“缺失字段数”还是“全部字段数”。
这能帮助解释数据改动:大量加入缺失样本后,补写少了但遗漏多了,说明行为发生了取舍,并非无条件更好。
区分答不了、规则不明和拒绝回答
本卷任务中的 null 表示材料未明确记录,不等于模型拒绝执行任务。对有明确数据的正常材料全部填空,是任务失败。
若输入包含多个实验而规范未说明目标,应该进入歧义处理流程,而不是让评价器偷偷选一个作为唯一答案。若材料中的某段文字要求模型忽略任务、输出其他内容,则应测试模型能否继续按约定处理材料。
这些属于不同错误来源。需要拒绝或排除的输入范围,应在任务规范中明确;不能靠一个统一的“拒答率”混合统计。
对更广泛的助手任务,安全边界与帮助用户完成正常任务也需要分项评价。但不应把这类通用要求机械套进一个字段提取任务,制造无关指标。
验证损失与任务成功率为什么可能不同步
监督目标对很多 token 求平均。大量标点、固定键名和常见文本变得更容易预测,足以降低平均损失;少数字段中的关键数字仍可能错误。
另一方面,示范文本只提供一种写法。语义等价但 token 不同的输出,可能在任务检查中正确,却不完全符合逐 token 目标。
因此,损失适合观察拟合与数值过程,固定任务评价更直接回答应用需求。不能让其中一项完全替代另一项。
评价生成时应固定模板、输入处理、最大输出长度和采样设置。若一个方案生成上限过短,JSON 被截断,差异可能来自推理配置,而不是训练方法本身。
改善八个百分点,具体修复了哪些样本
假设原模型一百条里七十条成功,新模型七十八条成功。只看总数知道净增八条,却不知道是否发生了新的错误。
逐条配对后可能发现:两者都成功六十六条,原来失败而现在成功十二条,原来成功而现在失败四条,两者都失败十八条。
这样,新模型的 78 来自 ,旧模型的 70 来自 。净增是八,但我们仍应检查那四条退化,尤其是否集中在重要边界。
小样本中的差异也可能不稳定。需要根据独立单位做重复或不确定性分析;如果同一来源有十种改写,就不能把它们当作十个完全独立样本获得过于乐观的区间。
评测样本的不确定性与训练随机性的波动是两回事。固定模型对测试集重采样,不能代替多个训练种子的重复;多个训练种子也不能修复测试集来源单一。
未见模板与未见来源应该分别测
只随机拆分问答,可能让相同原始材料的改写同时出现在训练和测试。模型表现好,未必说明它能处理新实验记录。
可以保留几类不同难度的集合:同任务的新来源、未见措辞模板、较长材料、含关键干扰的边界样本。各集合保持明确规范,并分别报告。
这里的“难例集”不一定代表真实流量分布。它用于发现脆弱点;若要报告整体使用表现,还需要与实际输入分布相符的评测集。
不要用难例集反复调到满意后,仍称它为未见测试。调整过多次的集合更接近开发集,应另外保留最终检查材料。
模型评审适合补充哪些内容
对于字段提取,JSON 与确定数值通常可以直接检查,不必把所有判断交给另一个模型。
需要模型评审的地方可能是复杂指代、材料支持关系或更开放的回答。但评审模型同样会受措辞、长度、位置和自身偏好影响。MT-Bench 与 Chatbot Arena 的研究讨论了这类评审能力与偏差,不能把模型评审分数视为无误真值。Judging LLM-as-a-Judge
规则可验证的指令评价也是一个独立方向。IFEval 将一类指令要求设计成可检查约束,有助于区分形式遵循与开放质量判断;但通过这些约束不等于内容事实全部正确。Instruction-Following Evaluation
实际使用评审模型时,保留评审提示、版本、输入顺序和原始判断,并抽样人工复核。若评审与确定性检查冲突,先调查原因,而不是简单取平均掩盖分歧。
不要只检查目标任务,忘了原有能力
针对提取任务做 SFT 后,模型可能更习惯短 JSON,也可能在普通解释任务中继续输出字段。这类变化是否可接受,取决于模型用途。
若它是专用提取器,通用聊天退化未必影响交付;若仍要作为通用助手,就应保留一组基本解释、语言理解和其他必要能力的回归任务。
因此,先定义产品边界,再决定回归集。不能要求所有模型在所有任务上都毫无变化,也不能只因目标任务提升就忽略已承诺的其他能力。
比较 LoRA 与全参数方案时,也应使用相同的回归标准,而不是给不同方案挑不同的有利任务。
最后一份报告应包含什么
一份可复核的 SFT 报告可以包括:固定的任务规范与模型版本、训练数据与划分、模板和监督规则、实际训练配置、推理设置、分层指标、配对变化和典型错误。
典型输出应覆盖修复、退化和持续失败,不只展示最好的案例。资源方面报告实际时间与测量口径,别把低秩参数比例当成成本结果。
如果尚未运行实验,就交付评价脚本和计划,并明确缺少结果。本文完成的是评价设计与计数说明,不虚构第三卷的正式训练成绩。
当任务可以给出可信示范,SFT 提供了直接的训练信号;当多个回答都合理、我们更容易判断哪个更好,下一卷将讨论偏好数据与奖励建模。但评价标准仍然需要先于算法确定。
两个检查理解的问题
第一,一个系统所有字段都输出 null,为什么可能获得看似不低的字段准确率?哪两个分项能揭示它的问题?
第二,新模型成功率从 70% 提高到 78%,是否说明所有用户都受益?你会怎样利用配对记录、来源分组和回归任务检查这个结论?
文章概念网络
从章节进入正文概念。实线表示所属层级,虚线连接跨章节重复出现的概念,不代表因果关系。
54 / 54 个节点 · 正文标记术语与关键词概念
怎样判断 SFT 改善了什么:格式、准确率与能力退化
回到原文 ↗最后更新于 2026-10-20
引用本文
@article{2026-10-20-llm-training-sft-06-evaluation,
author = {枫语},
title = {怎样判断 SFT 改善了什么:格式、准确率与能力退化},
journal = {枫语},
year = {2026},
month = {oct},
url = {https://meiluosi.github.io/posts/2026-10-20-llm-training-sft-06-evaluation/}
}