规则评分:能用代码判的,先用代码判
免费、秒出、绝对稳定——以及它 58% 的天花板
评测的第一个问题永远是:怎么判对错?
最朴素的答案:用代码判——关键数字在不在答案里?JSON 能不能解析?字段类型对不对?这类判分免费、毫秒级、绝对稳定,能跑在每次提交上。
但它有天花板。本节实测:同一批答案,规则评分准确率 58%,模型判分 100%——差距全在"一周之内""五十九元"这类换个说法的正确答案上。
先用好规则,再知道它什么时候不够用。
判客观题用标准答案卡:秒出、零成本、绝不出错。判作文得请老师:贵、慢、可能有主观偏好。
聪明的做法不是二选一,而是:能进答案卡的都进答案卡,剩下的才请老师。
规则评分能判什么
| 类型 | 规则 | 例子 |
|---|---|---|
| 格式合法 | JSON 能否解析、字段是否齐全、类型对不对 | ap3.2 的校验器 |
| 关键事实 | 标准答案里的数字/关键词是否出现 | "答案里有没有 59" |
| 结构约束 | 长度范围、是否含必需段落、有无禁用词 | "回答不超过 200 字且必须带引用编号" |
| 一致性 | 字段之间的关系 | ap3.5 的"总额 == 明细加总" |
| 拒答识别 | 是否包含拒答话术 | "含『没有查到』则判为拒答" |
一条经验:凡是你能写出判断条件的,都该用规则——它不花钱,所以可以每次改动都全量跑。
实测:规则的天花板在哪
12 条人工标注样本(含 4 条"意思对但换了说法"的答案):
人工=True 规则=False 模型=True ❌规则判错 「一周之内都可以退。」
人工=True 规则=False 模型=True ❌规则判错 「会员一年不到两百块。」
人工=True 规则=False 模型=True ❌规则判错 「订单满五十九元即可免运。」
人工=True 规则=False 模型=True ❌规则判错 「两小时内必须响应。」
人工=False 规则=True 模型=False ❌规则判错 「24 小时内响应即可。」
规则评分准确率:7/12 (58%)
模型判分准确率:12/12 (100%)
两类失败,方向相反:
① 漏判(把对的判成错):答案用中文数字("五十九元")、近义表达("一周之内")、换算说法("不到两百块")——字面不匹配,但意思完全正确。
② 误判(把错的判成对):最后一条更危险——标准答案是"2 小时",候选答案是"24 小时内响应即可",里面恰好包含字符 2,规则判它通过了!
这个坑非常常见:用 "2" in answer 判分,24、12、2026 全都会误命中。
把规则写得更结实(五个技巧)
# ❌ 危险:子串匹配
"2" in ans
# ✅ 用词边界 + 单位
re.search(r'(?<!\d)2\s*(小时|h)', ans)
# ✅ 数字归一化:全半角、中文数字、空格
normalize("两小时") == normalize("2 小时")
# ✅ 多个可接受表述都列上
any(p in ans for p in ["7 天", "7天", "七天", "一周", "7 个自然日"])
# ✅ 拒答识别单独判,别混进正确性
refused = any(w in ans for w in ["没有查到", "无法确认", "不掌握"])
最实用的一招是第三条:写一个 normalize() 统一处理全半角、中文数字、单位空格,再比对——本课实测里 5 个规则失败案例中,有 3 个能靠归一化救回来。
规则 + 模型的分工
| 判什么 | 用什么 |
|---|---|
| 格式、类型、字段、一致性 | 规则(永远) |
| 精确数值型答案(且你能穷举表述) | 规则 + 归一化 |
| 开放表述、语义等价、"答得好不好" | 模型判分(下一节) |
| 高风险场景的最终确认 | 人工抽检(永远保留一定比例) |
成本上的现实:规则评分可以每次提交跑 500 条;模型判分跑 500 条要花钱和时间——所以主力用规则、模型判分只覆盖规则判不了的那部分,是绝大多数团队的实际做法。
🔧 动手做:给你的评测写一套结实的规则(12 分钟)
- 跑本节代码,重点看规则判错的那 5 条,理解两类失败(漏判 / 误判)。
- 写你的
normalize():处理全半角、中文数字、单位空格,至少覆盖你评测集里的数字表述。 - 修掉子串误命中:检查你现有的规则,有没有
"2" in ans这类写法?换成带词边界的正则。 - 重跑你的评测集:规则评分准确率(以人工标注为真值)提升了多少?
- 标记出规则判不了的那些条目——它们就是下一节模型判分的工作范围。
✅ 做到这里你应该有:一个带归一化的规则评分器 + 你的规则准确率 + 一份"规则判不了"的清单。
为什么:规则评分是评测体系的基础设施——它便宜到可以每次提交都跑,这决定了它能成为门禁(ap5.5)。模型判分再准,也不可能每次 commit 都跑 500 条。先把能自动化的自动化,把贵的留给真正需要的地方。
你的判分逻辑也是代码,它也会有 bug——而且它的 bug 特别隐蔽:分数看起来正常,但判错了一半。防御:① 拿人工标注的样本反测你的判分器(本节做的就是这件事:12 条已知真值的样本,测出规则准确率 58%);② 判分逻辑改动时,跑一遍历史评测结果看分数有没有突变;③ 关键指标定期人工抽检 —— 测量工具本身也要被测量。
我的评测要判断:【描述判断标准,比如「答案里是否包含正确的金额」】。请帮我写判分函数,要求:1) 处理数字的多种表述(阿拉伯/中文数字、全半角、单位与空格);2) 避免子串误命中(如「2」命中「24」);3) 拒答识别单独返回,不混入正确性;4) 给出一组测试用例验证判分器本身正确(含容易误判的边界)。
规则评分三句话:能写出条件的都用规则(免费可全量跑)、天花板在语义等价(实测 58%)、最危险的是子串误命中;归一化能救回一大半。
下一节请"老师"上场:模型判分——实测 12/12 的理解力,以及它自带的两种偏差。
🔎 来源与核验· 1 条,点开核对
