那一栏不是 0。
是 []。
零分好歹说明有人问过你、你没答上来。空数组的意思是——人家压根没问。
【灯光渐暗,赛方的反馈是:没有反馈】
上礼拜 dev.to 上有篇赛后复盘。一个哥们儿投了个非洲的深科技挑战赛,没进半决赛,赛方从头到尾一句解释都没给。
把这个"没给解释"记一下,它是后面所有事的前提。
他自己去查。第一站就撞上那个空数组——交上去的 submission.json 里,accuracy 那一栏是空的。翻 git 记录,那个文件一共只有一次提交,截止日之前再没被人打开过。
而精度指标占评分公式的一半。
半个分数,记成了一个空集。
荒诞程度约等于:你交了卷,判卷老师压根没翻开,然后给你打了 0。
写代码的都懂,最难受的不是报错,是什么都不报。
他不服。装 lm-eval-harness,接自己的本地 llama-server 跑评测,两百个请求全军覆没,整齐划一地返回 Invalid logprobs data。
那就读源码。
第一个 bug 挺朴素:调 lm_eval 的时候传了个 base_url=local。
local。这不是个 URL,这是个形容词。
第二个 bug 就有点水逆了:lm-eval 的 GGUF 后端要 echo=true,靠回显整个 prompt 拿 logprobs——那是旧版 completions 的行为。可现在的 llama-server 只对新生成的 token 给 logprobs,harness 还没跟上。旧协议撞上新实现,教科书级别的渡劫现场。
两个 bug 都真实、都能复现,最后还上报到了上游。他也在本地绕过去了:不用 logprobs,改成语法规约、让模型直接吐答案文本,再从生成结果里读置信度。
跑出来了。赛方自带的那个标准通识多选题,arc_easy acc_norm = 0.74。这个数,比一支微调过的半决赛作品还高。
填回去,总分从 10.23 变成 47.23。
模型架构一行没改。就补了个数。
他这辈子性价比最高的一次改动,也是最没用的一次。
插一段跟主线无关的。同一条流水线的 1.5B 版本,得分比他最终选的 7B 高出 35 分,速度和内存两项还更漂亮。他没要。因为注册测试的两个提示里有一个,1.5B 会引用一个现实中根本不存在的 Flutterwave 客户端库——同一份检索上下文丢给 7B,它对着一份真接口写出了请求调用。这个算显灵。
(打住,这段跟淘汰没关系,我就是觉得该记一笔。)
他做的是个离线编码助手,知识库死锁在那四家尼日利亚金融科技 API 的官方文档里——Paystack、Flutterwave、Monnify、Termii。RAG 路线,答之前先把真实文档片段捞出来标上来源,不指望模型自己记。780 个分块,全程本地跑,不联网,不需要任何 key。他选原版 qwen2.5-coder-7b 加 Q4_K_M 量化,理由也不浪漫——那是能塞进赛事 8GB 内存限制的最大模型。
这东西存在的意义是"不编"。
它的死因是"没改权重"。
淘汰理由下来了:原创性得分不够,3 分,满分 10。原因是模型直接用了原版,没动过权重。
他做的那些东西——RAG、引用溯源、780 个分块、不联网不烧 key——在这份原创性审查里,一个字都没被提到。
后来他把 20 个半决赛作品全 clone 下来,带完整 git 历史,一份份读技术报告。结论:20 个全都动过基础模型,LoRA、QLoRA、蒸馏、模型合并,至少占一样。他是里面唯一一个原版架构。另外,18 支微调过的队伍晋级了。
他复盘说,当时看到这个现象,判断成"评分公式上的一个取舍"——没往根因上想,没意识到那其实是一道自己不知道存在的门槛。
一道前置闸门,在任何技术评分跑起来之前先拦一遍。你模板填得对不对,它看;你有多少分块、引文溯源做得多老实,它不看。它只看你有没有动过权重。
那个空数组,和那个 3 分,是两件毫不相干的事。前者是他一周追出来的 bug,后者是杀他的那个。
我上次讲过一个段子,说排查 bug 最怕的不是难,是方向错了。当时当笑话讲的,现在看是纪实文学。
他把能查的都查明白了。查明白了也没用。
修好的是自己的 bug,死因毫发无伤。
(跟日常对照一下:你以为考核你的是代码质量,其实第一道自动跑完的门禁只查你工时填没填。你把一周花在代码质量上。)
评论区有人说得挺准:空数组和原创性淘汰是两类不同的失败,不该被压进同一个分数。至少得把三种情况分开——评测器崩了导致没测、测了但没达标、被前置门槛直接拒了。这三种,在他那份 submission.json 里长得一模一样。
作者自己说,只要系统在原创性门槛拒他的时候能吐一行字,带个原因码,就能省他一周。
一行日志。就一行。
我替他想了一下那行长什么样:
[rejected at stage 1: originality] reason=base_model_unmodified
这行字的市值,七天。
(友情提示:如果你的排查清单上有一个特别值得修的 bug,先花五分钟确认它跟你的死因是不是同一个案子。多数时候不是。)
