Token导航 LogoToken导航

AI 资讯 · 科技行者

AI自出题自批改测试为何能得满分

更新 2026-11-07科技行者正文 6277字阅读约 20分钟

你有没有想过一个很怪的问题:如果让一个学生自己出卷子、自己做题、自己打分,这场考试还有意义吗?

这正是现在AI圈子里悄悄发生的事情。大模型写代码越来越厉害,很多公司开始让AI自己给自己写的代码配套测试,用来验证代码对不对。听起来挺美好,一个闭环系统,AI写代码,AI写测试,AI自己验证自己。但问题是,验证这个测试到底靠不靠谱,大家一直用的方法特别简单粗暴:只要这套测试能在"标准答案"上跑通,就算合格。

南京大学的研究团队发现这里面藏着一个大漏洞,他们做了一个叫TestPrism的新基准测试,结果让人倒吸一口凉气:现在最强的AI编程助手,生成的测试代码只有28%真正靠得住。而用老方法去检验,合格率却高达59.67%。这中间差了整整31.67个百分点,相当于一半以上的"合格测试"其实是在裱花,中间全是空心的。

### 单一标准答案的陷阱

先说清楚这个问题到底出在哪。

当我们评价一套由AI生成的测试代码是否合格时,传统做法是这样的:先准备一个初始的、有问题的代码版本,再准备一份官方认证的"标准答案"代码。好的测试应该在初始代码上跑出失败结果(说明测试真的能抓住问题),然后在标准答案上跑出通过结果(说明测试不会冤枉好人)。

这套逻辑乍一看没毛病,但漏了一件事:同一个编程需求,往往有好几种写法都是对的。

打个比方,如果老师出一道数学题"求解方程组",答案可能是用代入法算出来的,也可能是用矩阵法算出来的,路径不同,但只要最终数值正确,都该算对。可现实中很多老师批改学生答案时,只拿着一份"标准解法"去对照,学生换了种思路做对了,反而被判错。

这就是单一参考答案评估最大的问题所在。一套测试代码可能恰好跟标准答案的实现细节绑得太紧,结果一旦换个同样正确但写法不同的实现,这套测试立刻翻脸不认人,把正确的代码判定为错误。反过来,它也可能存在明显的漏洞,根本没检测到某些错误实现,只是因为凑巧标准答案没有触发这个漏洞。

**这意味着过去我们评价AI生成测试代码质量的方式,可能从根本上就是在自欺欺人。**

研究团队决定换一种更严苛的考核方式。他们给每个编程任务不止准备一份标准答案,而是准备了整整十份实现方案,其中四份是不同写法但同样正确的"变体答案",五份是刻意引入错误的"问题答案",再加一份原始的标准答案,凑成完整的十人评审团。

真正靠得住的测试代码,应该通过所有十份实现的集体检验:面对四份写法各异但确实正确的代码,它都要点头认可;面对五份暗藏问题的代码,它都要坚决打回。这个新标准被称为联合成功函数,只有同时满足"失败在初始状态""通过所有正确实现""拒绝所有错误实现"三个条件,才算真正合格。

### 一个评审团带来的真相

> 联合成功函数:衡量AI生成的测试代码能否在初始代码上失败、在所有正确实现上通过、同时拒绝所有错误实现的综合指标,是整篇论文最核心的评价标准。

为了搭建这套评审团体系,研究者们可没少费功夫。他们从17个不同来源收集了2000个编程任务,涵盖六种编程语言,包括大家熟悉的SWE-bench、Terminal-Bench这些业内知名的基准测试集。这些任务被分成1700个训练任务和300个正式测试任务,互相独立,确保训练阶段学到的技巧不会在考试时被直接套用答案。

每个任务都要配齐一个完整的十人评审团:一份官方标准答案,四份风格迥异但同样正确的替代方案,五份带着不同错误的失败方案。这些替代方案不是随手拼凑的,背后有严格的多样性筛选机制。

> 抽象语法树距离:一种衡量两段代码在结构层面差异程度的技术方法,通过比较代码被解析成树状结构后的局部特征差异,判断两个实现是否足够"长得不一样"。

对于那四份正确的替代方案,团队要求它们之间的平均结构差异必须超过某个阈值,确保评审团里不会出现四胞胎,也就是四份看似不同但骨子里几乎一样的代码。对于五份错误方案,优先选择失败在不同检查点上的版本,比如一个在边界条件上翻车,另一个在类型处理上出问题,这样才能全方位考验测试代码的识别能力。

这就好比招聘面试官团队,如果五个面试官看的都是同一份简历模板里的同一类问题,那这个面试本质上只是在重复问一遍。真正靠谱的面试团队应该从不同角度切入,技术面、沟通面、压力面各有侧重,才能看出候选人到底行不行。如果不这样做,后果是什么?论文里的实验数据给出了答案:当评审团规模扩大、多样性增加,原本能通过老式单一标准评估的测试代码,成功率会从49.33%一路跌到24.33%,几乎砍掉一半。换句话说,很多测试代码能通过老考试,纯粹是因为题出得太简单,题库里的坑太少。

研究团队总共动用了十四种不同的AI编程配置,覆盖六大主流模型家族,跑了一遍这套新考题。结果最拔尖的Claude Fable 5.1模型,在老标准下能拿到59.67%的合格率,听起来还不错,可换上联合成功函数这套新标准,直接腰斩到28%。

更有意思的是,排名靠后的某些模型呈现出一种古怪的分裂症状:它们对错误代码的识别率特别高,甚至高达86%以上,堪称嫉恶如仇,但是对正确替代方案的接纳率却惨不忍睹,经常误伤无辜。这说明光靠挑错是不够的,真正靠谱的测试需要在"抓坏人"和"放好人"之间找到平衡,任何一头跑偏都会拖累整体表现。

### 失败背后到底藏着什么猫腻

光知道合格率低还不够,研究团队决定扒开失败案例的肚子看看里面到底装了什么。他们从六大模型家族里各挑出表现最好的那个配置,采样了300条失败轨迹,排除14条因为超时无法分析的样本,剩下286条交给两位专家逐一人工标注。

这个标注过程挺有耐心的,两位专家独立判断分类,最后算出的一致性系数达到0.81,说明这套分类体系站得住脚。标注结果把失败归纳成三大类:覆盖缺口占34.6%,检查逻辑有问题占50%,执行层面出错占15.4%。

覆盖缺口这类问题,说白了就是测试代码只测了皮毛,没碰到真正的坑。论文里举了个扑克牌游戏的例子:生成的测试从头到尾没有验证过"同花顺"和"三条"谁大谁小这种关键判定逻辑,结果一个把同花顺误判成散牌的错误实现,大摇大摆地混过了测试,毫无压力。这就像考驾照只考了倒车入库,压根没考过路口左转,结果一个不会看信号灯的司机照样拿到了驾照。

检查逻辑出问题是最大的一块坑,占了整整一半。这类问题的本质是,测试代码确实触碰到了相关功能,但判断标准本身就是错的或者太松垫脚。论文给了一个括号匹配解析器的案例:测试代码只检查了输出结果的数量对不对,完全没管括号到底匹不匹配,结果一个会把合法括号组丢弃的错误实现,因为输出数量碰巧对上了,照样顺利通关。

> 执行逻辑错误:指测试代码自身在运行过程中出现的技术性故障,比如调用方法时参数绑定出错、命令执行格式写错,这类问题跟测试要验证的业务逻辑无关,纯粹是代码写得有bug。

执行逻辑错误这块占比最小,但也挺有警示意义。有个案例是测试代码通过self关键字去调用一个本该独立存在的函数,结果不小心多绑了一个参数进去,直接导致连标准答案都跑不通,根本没机会去判断对错。

这三类问题叠加起来,基本解释清楚了为什么AI生成的测试代码普遍不靠谱:不是测得不够多,就是测了但判断标准歪了,再加上少数情况下测试代码自己写崩了。

### 怎么把AI测试代码的质量真正提上去

发现问题总比解决问题容易,研究团队没有停在诊断阶段,而是动手搭了一个叫TestHelix的系统,试图从根子上改善这个局面。

这套系统的核心思路可以用一句话概括:别让一个AI孤立无援地写测试,让多个AI互相验证、互相挑刺。

具体来说,TestHelix分三步走。第一步叫异构合成,简单说就是找几个独立的AI智能体,每个都分配不同的探索方向,各自独立开发一套"测试代码加修复方案"的组合。有的智能体负责先写一个基础回归测试,再搭配一个最小修复方案;有的智能体负责从公开示例里反推出验证规则,再独立实现修复;还有的智能体专门负责挑刺,专注寻找那些容易被简单测试忽略的边角情况。

这种做法有点像公司开发新产品前搞的多团队赛马机制。如果只让一个团队闭门造车,很容易陷入自己的思维盲区,觉得这个设计天衣无缝,结果用户一上手全是问题。但如果同时让三个独立团队从不同角度切入,最后对比出来的方案往往更经得起推敲。如果不这样做会怎样?论文里的实验数据给出了明确答案:只生成一套测试跟修复方案的配置,合格率是20.33%;而生成三组方案并融合验证后,合格率跳升到27.67%,整整高出7.34个百分点。

第二步是整个系统的灵魂,叫同行交叉验证。

这一步的操作逻辑是,让A智能体写的测试代码,去跑B智能体独立开发的修复方案,看看会不会出现误判。同时还引入一个完全不知道任何修复方案细节的审查者,单纯根据公开的任务需求文档,检查测试代码里的判断逻辑是否站得住脚,是否存在没有事实依据的武断假设。

> 差异化挑战:当两份不同的修复方案都通过了审查后,系统会主动寻找能够区分这两份方案行为差异的输入用例,进一步检验测试代码的区分能力是否到位。

这个机制特别巧妙,等于是让多个独立视角互相印证,而不是闭门自嗨。打个比方,这就像论文答辩,如果只有导师一个人看过稿子就通过,很容易出现师生之间互相认同却忽略了外部评审会挑出的问题。但如果额外请来两位完全没参与过写作过程的外审专家,拿着原始的研究问题去质询,很多隐藏的逻辑漏洞立刻会暴露出来。实验数据显示,引入这套完整的交叉验证流程后,合格率从21%左右一口气蹦到27.67%,提升超过6个百分点,这是整套系统里收益最大的一环。

第三步叫递归自我提升,这是一个长期优化机制。系统会在训练任务上反复试验不同的测试生成策略,记录每次尝试的执行轨迹,从中提炼出可复用的经验教训,再把这些经验固化成一套改进后的策略,拿到独立的验证集上确认效果真实可靠后,才会把这套"冻结"的策略应用到正式评测里。

研究团队用Claude Opus 4.6模型跑了整整20轮这种自我迭代优化,每轮用25个全新的训练任务检验改进效果,只有真正展现出进步且没有在已有成功案例上退步的策略,才会被保留进入下一轮。最终这套经过反复打磨的策略,在100个独立验证任务上跟最初版本做了一次正式对比,合格率从48%提升到58%,整整高出10个百分点,统计显著性检验的p值只有0.006470,说明这不是运气好,是真的有效。

把三步整合起来看完整的收益曲线,在GPT 5.6和Kimi K3这两个模型上,TestHelix相比各自原生的编程助手,联合成功函数指标都提升了8.67到9个百分点。如果换算成相对单套测试基础方案的提升幅度,这个数字能达到11.67到12个百分点。

### 测试多了测试少了都会出问题

有一组实验结果特别值得单独说说,因为它揭示了一个反常识的现象。

研究团队做了个追加实验,把标准的十人评审团临时扩充到十五人,追加七份正确实现和七份错误实现,然后观察联合成功函数这个指标会怎么变化。结果发现一个规律:无论往评审团里加正确答案还是错误答案,原本的合格率都会持续下滑。

从最初的49.33%出发,只追加五份正确的替代实现,合格率就跌到38.1%;只追加五份错误实现,合格率跌到30.49%;如果两种都交替着加,加到九份时,合格率只剩24.33%。

这个结果说明什么?说明评审团规模本身就是一把双刃剑。评审团越大,意味着测试代码需要同时满足的"接纳"和"拒绝"条件越多,任何一个环节出纰漏都会导致整体判定失败。这跟我们生活中常见的现象很像:如果只找一个朋友帮忙判断一个决定靠不靠谱,很容易得到一个过于宽松或过于片面的结论;但如果找来十个朋友轮番发表意见,反而更容易暴露出决定本身存在的各种瑕疵,因为总有人能从新的角度戳破漏洞。

这也解释了为什么论文反复强调,单一参考答案评估是整个评估体系里最宽松的特例,它构成了一个上限,而真正扩大评审团规模之后得到的合格率,永远不会超过这个上限,只会越来越逼近测试代码的真实水平。

### 这件事之后会怎样

这篇论文发表之后,圈子里关于AI自动化测试生成的讨论风向明显发生了变化。过去大家默认"能通过标准答案就算靠谱",现在越来越多团队开始意识到,这种单点验证方式存在系统性的盲区。

有后续工作沿着这个思路继续深挖,比如针对代码修复场景专门设计了名为PROBE的方法,用生成的程序变体去增强已有的测试基准,检验测试代码在面对行为保持不变但实现细节不同的变体时是否依然稳健,这跟TestPrism强调的多实现验证理念高度呼应,算是把这个思路延伸到了代码修复这个相邻领域。

另一条值得关注的脉络是关于测试生成策略本身如何自我进化。TestHelix里用到的AutoSaddler优化框架,本质上继承了此前Meta-Harness这类端到端优化模型执行框架的思路,并结合了Reflexion提出的语言智能体通过文字反馈自我修正这一机制。这些工作共同指向一个方向:让AI系统不再是一次性生成答案,而是具备持续迭代、从执行反馈里学习经验的能力。

写在后面

读完这篇论文,我一直在想一个问题:我们到底该怎么定义"靠谱"这两个字。

过去我们习惯用一个简单的二元标准去判断一件事做得好不好,通过了就是好,没通过就是不好。但TestPrism这篇论文让我意识到,很多时候"通过"本身就是一个脆弱的判断,它完全取决于你用什么标准去衡量,用谁的答案去对照。

最让我觉得意外的一个细节是,那些在传统标准下得分最高的模型,换上新标准之后反而暴露出最严重的分裂症状,比如某些模型对错误代码嫉恶如仇,识别率高达九成以上,但对正确的替代方案却经常误判,接纳率只有四成多。这种"宁可错杀,不可放过"的保守策略,表面上看起来很负责,实际上恰恰是另一种形式的不靠谱,因为它意味着这套测试会不断阻碍真正正确的创新实现落地。

这让我联想到现实生活里一种很常见的管理风格:有些审核流程特别严苛,拒绝一切看起来不符合惯例的方案,表面上风险把控做得很好,实际上却在无形中扼杀了所有创新的可能性。真正好的审核机制,应该是既能挡住真正的问题,又能给合理的新思路留出空间。

这篇论文还有一个问题没完全说清楚,就是如果评审团规模继续扩大下去,比如从十人扩充到五十人甚至一百人,联合成功函数这个指标会不会趋于一个稳定值,还是会一直往下探底,直到趋近于零?如果真的存在一个稳定值,那它或许能帮我们找到一个"合理的多样性阈值",既不会因为题太简单而放水,也不会因为题太难而失去区分意义。这个问题,留给未来的研究者去回答吧。

Q&A

Q1:TestPrism的联合成功函数具体是什么意思?

A:联合成功函数要求AI生成的测试代码同时满足三个条件,在初始有问题的代码上必须失败,在所有正确的替代实现上都要通过,在所有错误实现上都要拒绝,只有全部满足才算真正合格,这比过去只对照一份标准答案的评估方式严格得多。

Q2:为什么单一参考答案评估的方法不靠谱?

A:因为同一个编程需求往往有多种正确写法,如果测试代码只跟一份标准答案绑定,很容易出现两种问题,一种是测试代码恰好能通过标准答案但拒绝了其他同样正确的写法,另一种是测试代码存在明显漏洞但标准答案碰巧没有触发这个漏洞,导致漏洞被掩盖。

Q3:TestHelix是如何提升AI生成测试代码质量的?

A:TestHelix通过三个步骤实现提升,先让多个AI智能体独立开发不同的测试加修复方案组合,再让这些方案互相交叉验证并引入独立审查者检查逻辑漏洞,最后通过长期自我迭代优化测试生成策略,整体上在两个主流模型上都带来了8点67到9个百分点的合格率提升。

文章标签学术研究

资讯来源:由AI资讯编辑整理自互联网公开内容,版权归原作者所有,未经许可,不得转载。