返回
后训练 · 评测体系

小模型后训练与评测体系

从一个垂类任务,到一套能证伪自己的评测

把「大模型能做的任务」交给一个能内嵌进产品的小模型。先建可信的度量,再谈训练收益—— 因为看不到噪声底,任何提升都只是感觉。

MLX-LM QLoRA FastAPI React SQLite 评测设计
任务示意图:答案正文拆分为 required 与 context
01

为什么做它

  • 产品需要的能力很明确:用户读完一篇文章,自动得到一份可背诵的测验,而不是手动建题。
  • 这个「自动」背后是大模型。但模型要内嵌在自己的产品里成本由自己承担,这两个约束倒推出唯一解:小参数、任务专用的模型。
  • 于是问题从「能不能训」变成「训哪一件事」——只把一件边界清晰、可客观度量的事交给模型,其余仍由大模型承担。
02

关键取舍:三次收缩选题

01

科普文案 · 已开工后否决

数据已整理完成,但发现科普不只是写作——它牵扯资料调研,以及对结论与规律本身的判断, 已超出一次 SFT 能承担的范围。

02

脱口秀文案 · 跑通冒烟后否决

几十万字文本,30 步 QLoRA 冒烟流程完整跑通、适配器已保存。 但没有客观评测标准,只能靠人盯着看,训练无法自我迭代。

03

答案拆分 · 收敛

最终只取全流程最后一环:把已经写好的答案正文划成「必答关键词 / 补充语境」。 任务清晰、可量化、数据可获取,且能直接回灌到自己的产品。

这次收敛的标准不是「哪个任务更有意思」,而是「哪个任务能被客观度量,并且我真的会用」

03

评测体系

σ
先量噪声底,再解释分数
同提示词、同模型连跑两次,F1 波动 0.0125,33 条里只有 24 条预测相同。 由此定下判据:1.3 个点以内的差异不作结论
n
用统计功效倒推测试集规模
基于逐样本 F1 做 bootstrap:50 条只能检出 ±9 点,而目标提升是 3–8 点。 测试集规划因此从 50 条改为 400–800 条,并采用配对比较。
人工金标不可变
人工只需为开发集定标一次,固化为不可变金标(内容哈希去重、版本递增); 重跑不覆盖金标,修订需显式确认并保留全部历史分数。
!
发现评分口径把自己骗了
自动评分一度误用旧格式,同一批样本被算成虚高分数。 修正后补上回归测试——评测代码本身也要被评测
04

工程实现

数据分层

  • source(不可变原件 + SHA-256 清单)
  • canonical / annotations / exports / reports
  • 生成物必须能由脚本重建

结构化输出

  • 教师模型只返回 span 的起止位置
  • 后端从原文确定性重建标签
  • 教师无法复制或改写正文

确定性后校验

  • 拒绝切断 Markdown / skill.md / llms.txt
  • 固定 ASCII 标识符不可从中间切开
  • 越界、空范围、乱序、重叠均记为样本错误

标注工作台

  • FastAPI + React + SQLite 六阶段流程
  • 后端 74 / 前端 8 项测试通过
  • SSE 卡死修复:快照耗时约 10.1s → 0.31s
05

当前进度与边界

  • 已完成:数据准备与分层、出题与标注提示词迭代、不可变金标与自动评分、技术探针(适配器已保存并校验)。
  • 进行中:冻结训练 / 验证 / 测试划分(按来源文章隔离),随后跑底座基线,再启动正式 LoRA 训练并做配对比较。
  • 诚实边界:目前没有任何模型质量结论。已有的 F1 全部是教师模型在开发集上相对人工金标的表现,不能当作训练收益。开发集同时充当迭代集,其上的分数存在过拟合风险。