10月10日,“AI算法对抗大赛”系列更新了第5集:12个AI模型分成6支“主程+测试手”的双人队,不打游戏了,改为接力优化一份又慢又乱、还藏着陷阱的C++仓储调度程序,再互相到对方的代码里找反例。 结果两极分化:五份成功交卷的终版比原始代码快了约400到2700倍,快到撞上Windows计时精度的下限;垫底队伍的终版则在所有负载上出错。 这场比赛把“盲目全量替换老代码”的代价实测了出来:致命之处通常不是新代码跑不起来,而是它跑得更快、看起来更干净,却在悄悄改变行为,而常规随机测试根本发现不了。哔哩哔哩GitHub
硬规矩:输出必须和基线逐字节相同
规则决定了什么叫“致命”。比赛材料全部开源,题目、裁判、各模型交卷的原样代码和成绩都能自己复现。 第1轮,每个主程可以任意改写代码库,但有一条硬约束:对任何合法输入,新代码的输出都必须和基线逐字节相同。 第2轮,测试手构造合法输入去别队代码里找反例,输出不同、异常退出、60秒超时都算,越少人找到的缺陷越值钱;第3轮,测试手接手本队代码,修掉反例、实现需求变更(订单老化、载货耗电、报表多一个字段),再往下优化。GitHubGitHub
第一种:把“该保留的怪行为”顺手修掉
第一个坑埋在基线自己身上:它藏着5个必须原样保留的“怪行为”。 也就是说,这些在AI眼里酷似“缺陷”、值得顺手修掉的地方,恰恰是真正的需求,谁按文档和常识全量重写,谁就会把输出改错。豆包的主程犯的正是这类毛病:移动阶段直接读寻路距离数组,却不检查这个格子是不是本次搜索访问过的,封路把目标隔开后,它读到上一轮留下的旧距离还继续走,而基线会原地等待。 Gemini的主程则把“到最近充电桩的距离”改成从充电桩出发的多源搜索,在“取货点等于送货点且被封”的输入上和基线派不派单都不一样。这两个反例都被5名测试手同时抓到,是全场最“普遍”的错误。GitHubGitHub
第二种:4支队伍犯同一个错——把“用到才算”改成预先算好缓存
第二坑更有意思:6家主程里有4家犯了同一种毛病,还都是“提速”提出来的。基线派单是“用到才算”——先看有没有机器人可派、取货点能不能到,不行就立即跳过;四家为了快,全改成了预先算好距离缓存起来。主办方的缺陷归类写得很直接:在订单大量积压、根本派不出去、封锁每个tick都在变的输入上,这些改法反而比基线慢十倍以上,而且输出是对的,随机对拍根本测不出来。 后果就是标题里那句“有的比原来还慢”:同样是这类负载,GLM的主程要跑67到79秒,基线只要2到7秒。速度优化变成性能炸弹,炸在没被公开测试覆盖的输入上。GitHub
第三种:藏最深的引用失效,5名测试手只有1人找到
第三坑藏得最深,全场只有1名测试手找到:派单时拿着512槽环形缓存里一个距离场的指针,遍历机器人的过程中这个槽被淘汰覆盖,后面的机器人读到别的起点的距离,选错机器人。 这是典型的“引用失效”问题,AI全量重写时一样会“自然地”写出来,而它因为太难找,按“越少人找到越值钱”的规则拿了全场最高档的1.8分稀有分。赛后的复测还说明,就算撑过了正式赛,雷区也未必清空:队B的终版在“上千个被封取货点压垮1024槽缓存、封锁持续抖动”的负载上退化到超时,3次复跑都超过60秒,最慢一次97.3秒,而参考实现只要5.9秒。GitHubGitHub
第四种:交接断链,连流程本身都会停摆
第四坑发生在“交接”环节:全量替换不只是代码问题,还是协作问题。队E的主程GLM被4名测试手找到反例,接手的Grok却在第3轮用满45分钟、一行代码没改地交卷,终版全部出错。 主办方按规则计分,但注明这不代表它的正常水平。接手环节的另一重失败是新格式全部异常退出。 流程上的坑同样真金白银:最初提示词里用了“攻防”“击穿”的说法,Fable把它当成网络攻击任务,拒绝执行。 GPT两家则被OpenAI的网络安全分类器中止;期间还有比赛电脑系统设置被改动导致编译器打不开中文路径、模型清理进程时误杀整机的Python进程,多轮比赛因此整体作废重赛。GitHubGitHubGitHub
避坑办法,就藏在赛制里
避坑的方法,这一集的赛制本身就给出来了。6家主程里,只有Kimi K3没有被找到任何反例。 它88倍的隐藏负载提速甚至低于MiMo的102倍,却靠零反例拿下主程榜第一;队C的主程被5人全部击穿、抗反例分为0,好在测试手把7个反例全修了回来,团队仍拿到第二——被击穿不一定致命,但修复成本会后移。赛制还堵住了另一个极端:专门设了抗反例分项,防止AI为求安全“什么都不改”,而输出错误的负载在速度分上直接清零。 至于“全量替换后代码变干净了吗”,盲评的答案偏保守:12份匿名代码由3个参赛模型互评可维护性,终版正式分只有4.8到7.8分(满分10);作为参照,屎山基线在百分制口径下只有10分,而“干净但没优化”的参考实现是75分。GitHubGitHubGitHub
这些数字也不能直接当能力排名读:每个模型每轮只跑了一次,这是这一场的结果,不是能力排名。 第2、3轮也都是整体作废后的重赛,组队还是抽签决定的。但对想拿AI清理老代码的工程团队来说,这套开源材料给出的优先级很清楚:把老代码的实际输出(而不是文档)当规格,先逐字节对拍再谈优化;把构造反例当成和写代码分开的角色,专门针对缓存容量、封锁抖动、订单积压这类模型共同盲区造输入;接力改完的每一份“终版”,都要在全部负载上重跑复测。 否则你替换掉一座屎山,迎来的可能是一座跑得更快、错得更安静的新的屎山。GitHub