我前阵子给一个 AI 判分器做质检,遇到一个很极端的 case:满分 100 分的论述题,AI 判分器给出 0 分,负责复核的老师给出 100 分,两边整整差出来一个满分。做算法评测这些年,这种案例不常见,但每遇到一次,都值得把过程完整拆开复盘。下面我会从极端偏差的复现开始讲,逐步聊到评测集怎么搭、指标怎么设、问题怎么定位,以及如何把质检沉淀成上线后的常驻机制。如果你在负责模型评测、算法测试,或者做教育类 AI 产品的质量保障,这些经验可以直接拿去用。
1. 一次差出 100 分的质检现场回放
1.1 这 100 分是怎么差出来的
当时我们正在给一套中学物理论述题自动评分模块做例行质检,内容是让 AI 根据评分标准,对学生的简答题答案给出 0 到 100 分的得分。整体跑完一批历史真实试卷后,大部分样本的差异都集中在 ±3 分以内,这个表现其实已经不错了。但有一个样本格外扎眼:学生答案被判了 0 分,人工老师的标准分则是 100 分。
第一眼看上去,AI 判分器确实有理由给低分。那道题的标准答案得分点里要求出现“压强增大”“可能爆胎”这类关键表述,而这个学生答案的前半段写的是“温度升高分子间距变大,表现为体积膨胀”,通篇没有出现“压强”两个字,模型给出的结论是“未提及压强或爆胎,知识点覆盖不足”。但老师复核时指出,这个学生答案后半段还有一句“单位面积受力就会增加,超过橡胶约束极限时会发生破裂”——“单位面积受力”就是压强的定义,“破裂”就是爆胎。按命题组意见,这属于完全正确,理应给满分。
问题在于,老师看到的是完整答案,AI 判分器实际看到的并不是。这也是这次质检给我上的第一课:不要只盯着输出分数,先搞清楚模型到底看到了什么输入。
1.2 为什么必须盯住极端个案
有人可能会说,跑 1000 个样本,整体准确率 95%,最大误差 100 分这种案例是不是可以忽略?我的看法恰好相反。判分器是给人打分的系统,任何一个学生被少给 100 分,对他个人来说就是 100% 的公平问题,这个风险不能用平均数来掩盖。
更重要的是,极端 case 从来不是孤立噪声,它往往代表某一类高频样本。这个学生答案属于“换了一种说法但物理含义完全正确”的类型,在文科题里更常见,比如“政府通过财政支出带动社会需求”和“政府花钱拉动消费”,本质一样,措辞完全两套。只要这一类型答案会被误杀,说明判分器对“表达变体”的鲁棒性不够,漏掉一个样本,线上就会有一批同类样本一起漏掉。只看 MAE 和准确率,这类风险会被 999 个正常样本稀释得看不见。
我当时在质检报告里写了一句狠话:MAE 4 分,最大误差 100 分,这两个数字放在一起看,才说明系统真实的风险边界在哪里。后来这句话成了我们团队每个版本发布的固定检查项。
2. 质检前必须想清楚的三件事
2.1 定义“判对”:容差、双层标注与标准分
做 AI 判分器的质检,第一个问题不是“怎么测”,而是“什么是正确”。老师之间打分本身就存在主观差异,你不能要求模型输出和某个老师完全一致,那样既不现实,也没有意义。
我当时把评分差异划分为三个层级:完全一致、可接受差异、明确错误。可接受差异用容差来衡量,我们取的是 ±5 分。原因是先统计过老师之间的评分标准差大概在 3 到 5 分,要求 AI 比人工老师还稳定属于不切实际;但容差也不能再放大,否则后面的误差分析就没有分辨力。于是“判对”的定义就是:AI 得分落在人工标准分 ±5 分区间内,记为一次命中。
这里有一个很容易被忽略的坑:人工标准分本身不是一个人说了算。我的做法是至少两个老师独立打分,分歧超过 10 分的样本进入专家仲裁,最终取中位数或仲裁结果作为标准分。1200 条质检集里,大约有 8% 的样本需要仲裁。不先把人工标签标准化,后面所有模型评估都是建立在流沙上。
2.2 样本怎么选:分层抽样加上定向踩线样本
质检集不能只靠随机抽。随机抽样保证的是“整体分布像真实线上数据”,但极端问题往往藏在小概率分支里,比如低分卷、空白卷、超长答案、口语化答案、带格式答案。所以我把样本来源拆成三部分。
第一部分是随机抽样,从线上历史数据里按比例抽,保证评估结果能代表真实场景。第二部分是分层抽样,按题目类型、知识模块、难度等级、分数段分别抽取,确保每个有代表性的子群体都有足够样本量。第三部分是定向采样,这部分最重要——我会专门收集那些“踩线答案”和“边界答案”,比如及格线附近的论述、字数特别短但点都答到的答案、长到离谱的答案、完全口语化的答案。
举一个实际例子,这次质检就有一部分刻意加入的答案,学生用“热胀冷缩”替代“气体受热膨胀”,用“嘣了”替代“爆胎”。这类踩线表述在真实场景里比比皆是,但常规随机抽样里占比不高,不去定向补齐,你根本测不出判分器的语言鲁棒性问题。这次差出 100 分的 case 能暴露,也和定向采样里放了大量长答案有很大关系。
2.3 指标怎么设计:MAE、一致性率、极端误差率
指标设计必须服务于两个目标:看整体水平,以及看极端风险。我当时核心跟踪四个指标。
第一个是平均绝对误差 MAE,计算方式是所有样本的 |AI 分 - 人工分| 取平均,它反映整体偏离程度。第二个是一致性率,统计误差在容差 ±5 分以内的样本占比,直观反映“判得准不准”。第三个是极端误差率,统计误差大于等于 20 分的样本占比,这是我最关注的指标,因为这类错误直接意味着某个学生拿到一个完全不可用的分数。第四个是最大误差,也就是单个样本最离谱的偏差值。
只看整体指标会掩盖很多问题。我把 1200 条样本按人工分数段分箱后,发现低分段 0 到 30 分的一致性率只有 72%,极端误差率高达 6%,而整体一致性率却有 91%。低分段本来答案文字少、信息密度低,模型更容易被措辞带偏。后续我把“分箱一致性率”和“极端误差率”直接写进了发布门禁,整体 MAE 反而降级成参考指标。
3. 从 100 分偏差倒查:问题定位与根因修复
3.1 复现并缩小触发条件
拿到这个 0 分 case 后,第一步不是猜原因,而是复现。单独把这条学生答案重新提交给判分器,稳定复现 0 分。然后我开始做最小化消融,把答案一句话一句话地删掉,再重新提交,观察分数变化。
过程很有意思:删掉第一句“温度升高分子间距变大”,分数变成 60;删掉第二句“表现为体积膨胀”,分数变成 90;把最后一句“超过橡胶约束极限时会发生破裂”删掉,分数直接掉回 0。到这里,我基本确定模型能识别“破裂”是爆胎,能识别“体积膨胀”是热胀冷缩,但当这些内容同时存在于一个较长答案里时,分数反而异常。
进一步做二分定位后发现,触发条件并不是语义组合,而是答案长度。答案被某个输入处理环节截断了,模型实际看到的文本,和我拿到的完整文本根本不是同一个东西。这个 case 再次敲醒我:复现“后处理 / 前处理”的问题,不能只盯着算法本身。
3.2 拆解链路:输入解析、模型推理、规则后处理
AI 判分器不是“输入答案,输出分数”的黑盒单点,中间至少有三个环节:输入解析、模型推理、规则后处理,每一环都可能造成分数异常。我把这次的问题逐一拆开。
输入解析阶段,判分器对长答案有硬性长度限制:超过 500 个字符会直接截断。这个学生答案比较长,前半段只写完了“温度升高分子间距变大,表现为体积膨胀”,正好压在截断边界上,而后半段“单位面积受力就会增加,超过橡胶约束极限时会发生破裂”被完全丢弃。模型拿到的是残缺文本,当然给不出高分。
模型推理阶段,大语言模型对截断没有任何感知,它不知道后面还有内容,只会基于当前可见文本判断得分点是否覆盖,于是给出 0 分,理由也精准对应了“未提及压强或爆胎”。规则后处理阶段,系统把模型输出解析成 0 到 100 的整数,这个 case 本身的解析没有错,错的是上游输入已经坏了。
三个环节里,模型能力是一个因素,但直接根因是输入截断策略太粗暴。这给了我一个重要的工程心法:任何端到端评测发现问题,先分层排查,再决定是改模型、改 prompt 还是改工程链路,不要一上来就微调模型。
3.3 修复不是只改 bad case
找到根因后,修复并不难,难的是避免让修复变成“针对单条样本打补丁”。我当时做了三件事,而不是简单放开长度限制。
第一,把输入截断从“按字符数硬切”改成“按句子边界截断”,并且将长度上限从 500 字符提升到 2000 字符,同时加日志,记录每次截断的位置和比例。第二,在前端拼接 prompt 时,给模型显式提示“考生答案可能存在截断”,让它对上下文缺失保持敏感,不要因为看不到后续内容就直接否定。第三,给规则后处理增加了解析失败兜底逻辑:宁可抛给人工复核,也不要默认给 0 分。
改完后重新跑全量质检集,极端误差率从 1.2% 降到 0,一致性率从 91% 提升到 94.5%,低分段一致性率从 72% 涨到 89%。这里我想特别提醒:如果你只是把这一条 bad case 加进回归集,然后盯着它变绿,很容易把系统调成“过拟合测试集”的状态。正确做法是回到链路设计层面,把同类问题的一整条路径都堵住,并且用一批新采样的长答案做验证,而不是只验这一条。
4. 把质检变成流水线:上线后的持续保障
4.1 固定回归集与滚动回归集
一次质检修完问题只是开始,真正让我睡得着觉的是把质检流程变成常驻机制。我把评测集分成了两部分。
固定回归集,我保持 500 条精选样本,三个月内不允许增删,专门用来保证历次版本之间不倒退。每次模型更新、prompt 调整、后处理规则变更,都必须先跑固定回归集,任何一致性率下降超过 1 个百分点,直接阻断发布。滚动回归集,每周从线上新数据里抽 200 条加进来,让评测集跟上真实答案风格的变化,这部分还会把上一周的 bad case 自动纳入。
配套的发布门禁大概长这样:
| 门禁项 | 阈值 |
|---|---|
| 整体一致性率(±5 分内) | ≥ 95% |
| 极端误差率(误差 ≥20 分) | 必须为 0 |
| 最大误差 | ≤ 15 分 |
| 低分段一致性率占比 | ≥ 85% |
| 空解析率 / 解析失败率 | ≤ 0.5% |
这些阈值不是拍脑袋定的。极端误差率必须为 0 是因为一次 20 分以上的误差,就已经超出容差设计的预期,对学生个体不可接受;解析失败率 0.5% 则对应线上每天过滤几千单时,最多允许个位数的异常流到人工复核,不能放任不管。
4.2 线上监控:抽检、漂移与告警
发布之后也不能只看离线评测,因为线上答案分布会漂移。我的做法是在线上做了千分之一的实时抽检,每天大概抽出 300 到 500 条,交给老师复核,或者用另一个不同结构的强模型做交叉打分。抽检出的结果,不只用于看准确率,更重要的是计算“漂移预警指标”。
具体公式是:当日抽检 MAE 和过去 7 日均值 MAE 做差,差值超过 1.5 分,触发告警。这时候不会自动回滚,而是进入人工排查流程:先按题目、分数字段、答案长度、输入解析日志聚类,看看漂移来自哪一类样本,再决定是调 prompt、调后处理规则,还是需要重新标注一批数据做微调。
监控看板里的核心其实是“分箱一致性率趋势”,因为它比平均 MAE 更能反映结构性退化。有一周我用 MAE 看显示一切正常,但分箱趋势里已经连续三天高分段一致性率下滑,后来定位到是上面改了一个 prompt 措辞,对高分答案的判断变保守了。不拆细到分箱,绝对发现不了这种问题。
4.3 闭环迭代:bad case 库、评议会、再训练
质检最忌讳的是发现问题、修一个、丢掉一个。我建了一个 bad case 库,每一条都打标签,包括输入解析问题、知识错误、表达变体、评分标准冲突、截断问题等。每次版本发布、每次监控告警产生的 case 都会自动入库。
每周我们会开一次评议会,人数不多:一位命题老师、一位模型工程师、一位 QA,再叫上负责规则后处理的同学。大概流程是集中过近一周的 bad case,先让老师给出权威意见,再由工程师快速判断是哪一层的问题,能当天修掉的规则问题当天改,不能当天解决的进下一轮迭代。积累到一定量后,我会从库里人工挑选高价值样本进训练集,做模型微调或者 prompt 迭代,频率大概是每两周迭代一次 prompt,每四周评估一次是否值得微调。
这套闭环的核心不是工具,而是“有人对极端 case 负责”。没有固定角色跟进,bad case 库很快就会变成一堆没人看的死数据。
5. 我在质检中踩过的几个坑
5.1 接近满分的答案反而是重灾区
一开始质检我总盯着低分和 0 分的样本,觉得低分容易出错。后来统计结果显示,高分段误杀也很严重,尤其接近满分的优秀答案往往篇幅长、句式复杂、概念替换更灵活,输入截断、表达变体、逻辑跳跃这些问题在高分段样本里的出现频率明显更高。
这次差出 100 分的 case,严格说就是一个“满分答案被误杀成 0 分”的叠加极端。所以质检抽样时我会刻意加大高分段的样本量,尤其是 90 到 100 分段,单独作为一个采样桶,而不是让它自然出现一点点量。你永远不知道一个优秀学生精心写出的漂亮答案,会被哪个解析环节切成碎片。
5.2 人工标注本身就不一致,别全赖模型
做质检最尴尬的是拿人工分当“金标准”,但人工分本身也不稳。我之前在另一批数据里统计过,两个老师之间的评分差异超过 10 分的样本比例有 7%,如果直接拿其中一个人的分数当标准,评估结果会忽高忽低。
所以我后来坚持所有质检集都走双层标注加仲裁,至少在关键边界样本上,两个老师必须独立给分,差异大的进第三轮专家仲裁。这个流程很费时间,但它直接决定你后续所有结论是否可信。模型团队的同事经常抱怨“又是人工标注慢”,但慢一点,比拿不稳定标签把模型调偏再返工要划算得多。
5.3 模型随机抖动会被误判成回归
大模型推理通常带采样随机性,同一个答案用相同配置跑两次,分数可能差出十几分甚至更多,这会让质检出现“假回归”。有一段时间我每天都跑回归集,连续三天一致性率时高时低,差点因为一个随机波动去回滚版本。
后来统一规定了所有离线评测必须固定随机种子,并在关键样本上多次采样取平均分。线上推理如果对稳定性要求高,可以把 temperature 调到很低,或者对存疑样本做两次采样再输出结果。记住一个原则:评测环境要尽量确定,线上环境要尽量稳定,两者都别给随机性留太大空间。
5.4 提示词里写一万句宽松,不如给一个例子
修复这个 100 分 case 时,我一开始在 prompt 里加了一长串指令:“学生答案可能存在不同表达,不要因为未出现标准答案原词而扣分,请识别同义表述并理解物理含义”。效果很差,一致性率只涨了 0.3 个百分点。
后来把指令换成一个具体的 few-shot 示例:给出“学生写单位面积受力,标准答案写压强,两者等价,应给满分”的完整示例,一致性率立刻拉升。大模型对抽象指令的对齐度,远不如对具体例子的模仿能力。现在我迭代 prompt 时,都会把最典型的 bad case 直接做成示例写进去,而不是反复在文字层面喊口号。
5.5 质检报告没人看,等于白做
踩过最大的坑之一是写出一份漂亮的质量报告,但模型团队和产品团队看完不知道下一步怎么办。报告里堆满指标曲线、样例截图,却没有给出可执行的建议,这样的人工质检基本是无效劳动。
后来我要求每份报告必须包含三部分:核心指标、Top 问题列表针对每个 bad case 给出触发条件和影响面、明确建议修改的模块并标注这是输入解析、模型、prompt 还是后处理问题。团队拿到报告后,不需要再重新分析一遍,直接按优先级排期处理。执行到位之后,报告就不再是“质检交差”,而成了真正的研发输入。
这次质检经历给我最大的冲击,不是技术方案多精巧,而是让我意识到 AI 判分器这类系统的质量保障,真正的难点在于“对每个极端样本保持敏感”。差出 100 分的 case,背后不是某个大模型的智商缺陷,而是输入处理策略、后处理兜底、人文对齐标准这些不起眼的地方出了问题。做过一轮完整闭环后,我现在每接触一个新判分项目,都会最先问三件事:输入会不会被截断、解析失败时会不会默认给极端分、评测集里踩线样本够不够多。把这三件事想明白了,很多极端偏差都能在发生前就堵住。希望这些踩坑记录,能让你在给 AI 做质检时少走一点弯路。