怎么证明 AI 答对了:golden 快照与评测的坑
AI 写 SQL 查数据,答对答错怎么判定?
直觉做法:拿 AI 的结果和「标准答案」比。但医疗数据没有标准答案:同一个问题,不同写法、不同条件,结果都不一样。我们做了 31 道题的评测,踩过四个坑,每个坑都改变了一次评测设计。
● ● ●
坑一:结果比对没有「等值」概念
第一版评测:AI 生成的 SQL 跑出来的结果,和人工标注的 golden 结果比对,完全一致算对。
第一个问题马上出现:结果集有顺序差异。SQL 没有 ORDER BY 时,同一查询每次返回的行序可能不同。A 查出来是 [张三, 李四],B 查出来是 [李四, 张三],数据一模一样,字符串比对却判错。
修法:结果先排序再比对,或者用「集合相等」(行集相同即对,不看顺序)。
● ● ●
坑二:fingerprint 对无 ORDER BY 的视图不可比
第二版升级:算结果的 fingerprint(哈希指纹),快且能发现细微差异。
然后我们发现了更隐蔽的问题:MIMIC 的模板视图大多没有 ORDER BY。同一个视图,这次查 100 行、下次查 100 行,但中间行的顺序是数据库自由决定的。fingerprint 比对两次独立查询的「同一视图」,经常对不上:不是结果错,是顺序抖。
这个坑最难排查:fingerprint 不一致,你以为 AI 答错了,其实是判定标准本身不可靠。最后我们放弃 fingerprint,改用「行数 + 列数」双层判定:行数一致且列数一致,算通过;不一致再深入看。
● ● ●
坑三:评测题本身设计有缺陷
第三版跑完,31 题错 3 题。逐题看,发现 2 个错不是 AI 的问题,是评测题自己写错了:
一道题问「患者的平均住院时长」,golden 答案是「首次住院的平均值」;AI 算的是「所有住院的平均值」。问题语义是「患者平均」,答案是「住院平均」——题目和答案口径不一致,AI 按题目理解答对了,评测却判错。
另一道题问「首次入住 ICU 的数据」,golden 取的也是首次,但问题表述成「入住 ICU 的数据」,AI 理解成全部入住。同样是题目语义模糊。
教训:评测题要像产品需求一样评审。题目、预期答案、判定逻辑三者口径必须一致,否则测出来的不是模型能力,是出题人的失误。
● ● ●
坑四:模型输出抖动(chosen 为空)
第四版:AI 选模板路由时,偶发输出为空(chosen 字段没生成)。第一次遇到,以为是模型挂了,重跑一遍又好了。
这是 LLM 的输出抖动:同一输入,大部分时候正常,小概率返回空或格式错误。处理方式不是修模型,是加重试逻辑:chosen 为空就重试一次,仍空才判失败。加了重试后,这类错误从偶发变成几乎为零。
● ● ●
我们最终的评测设计
评测判定流程:行数列数双层校验 + 输出抖动重试
四轮迭代后,最终的评测流程长这样:
- 01问题集
:31 道临床问题,覆盖 31 个模板的高频场景 - 02golden 快照
:53 个(部分模板多参数组合),记录「这个模板这个参数下应该返回多少行多少列」 - 03执行
:AI 选模板填参数 → 确定性执行 SQL - 04判定
:行数 + 列数双层校验,通过才算对 - 05重试
:输出抖动(chosen 空)自动重试一次 - 06记录
:每题保留完整日志(问题、模板、参数、结果、判定),可追溯
这套设计跑完 31 题:30/31(96.8%)。唯一的「错」最后发现是模板语义边界(两个模板描述重叠,合理歧义),不是能力问题。
● ● ●
给做评测的人
- 01先定义「对」
。等值(集合相等)还是等序(完全一致)?无 ORDER BY 的数据只能比集合 - 02别迷信 fingerprint
。无 ORDER BY 的视图指纹不稳定,行数+列数是更稳的基线 - 03评审你的评测题
。题目、golden、判定口径必须一致。评测题的错误会伪装成模型错误 - 04重试是评测的一部分
。LLM 输出有抖动,不给重试机会的评测会系统性低估模型
AI 评测的本质是把「答得对不对」从感觉问题变成工程问题。判定标准设计得不好,测出来的数字会骗你:不是模型骗你,是你的评测设计骗你。
● ● ●
参考来源
- 01
本系列第三篇《复现 MotherDuck:Qwen3.8 27B 在 MIMIC 上做到 96.8%》(评测流程应用) - 02
MIMIC-IV 官方文档(模板视图与数据口径):https://mimic.mit.edu/docs/iv/ - 03
EHRSQL 基准(公开医院问答 SQL 评测):https://github.com/glee4810/EHRSQL - 04
本文配套的评测脚本与 golden 快照(行数列数校验实现)——本系列实验数据