**HARDTESTS:如何打造更可靠的编程能力测试**
卡内基梅隆大学、加州大学圣巴巴拉分校和德克萨斯大学奥斯汀分校的研究团队,包括Zhongmou He、Yee Man Choi、Kexun Zhang、Jiabao Ji、Junting Zhou、Dejia Xu、Ivan Bercovich、Aidan Zhang和Lei Li,于2025年5月在arXiv上发表了这项重要研究,论文编号为2505.24098v1。感兴趣的读者可以通过https://leililab.github.io/HardTests/获取更多资料。
想象一下,你正在教一个人工智能如何编写程序。你需要不断给它出题并检查它的答案是否正确。但问题来了:你怎么知道它的答案真的对呢?就像老师需要标准答案一样,AI训练也需要可靠的"答案检查器"(在AI领域,我们称之为"验证器"或"测试用例")。
如今,顶尖的AI编程助手如OpenAI的模型正在接近人类顶尖程序员的水平,甚至能解决编程奥林匹克竞赛级别的难题。这些模型之所以如此强大,部分原因是它们经历了一种叫做"强化学习"的训练过程。简单来说,就是当AI给出正确答案时会得到奖励,错误则会受到惩罚。但这里有个关键问题:谁来判断AI的程序是对是错?
现有的判断方法主要依靠"测试用例"——给程序一些输入,检查输出是否符合预期。然而,研究团队发现,现有的测试用例集存在严重问题:在APPS数据集中,有60%通过测试的程序实际上是错误的;在CodeContests数据集中,46%通过测试的程序虽然功能正确,但效率太低,无法通过人类编写的真实测试。
更糟糕的是,研究人员发现80%的编程问题根本无法获取人类编写的官方测试用例。这些测试用例通常是私有的,无法抓取。虽然有一些自动生成测试用例的方法(如TACO),但它们的可靠性有限——对于困难的问题,错误判断率甚至超过90%。
为了解决这个问题,研究团队提出了HARDTESTGEN,一个能生成高质量测试用例的管道系统,并用它创建了HARDTESTS数据集,包含47k个竞赛级编程问题及其高质量测试用例。与现有方法相比,HARDTESTS在评估AI生成的代码时,准确率提高了11.3个百分点,召回率提高了17.5个百分点。对于更难的问题,准确率的提升甚至可达40个百分点。
**为什么需要更好的测试用例?**
编程竞赛题目通常需要高效的解决方案,使用先进的数据结构和算法。一个看似正确但实际有缺陷的解决方案可能会通过大多数随机测试,但在特殊情况下失败。
举个例子,假设有一个关于树结构的问题。在n个节点、深度为d的随机树上,时间复杂度为Θ(nd)的算法通常表现良好,因为随机树的平均深度只有Θ(log n)。但如果测试用例是一个特殊的"链状树"(每个非叶节点只有一个子节点),其深度d等于n,那么这个算法的运行时间会变成Θ(n?),可能导致超时。
生成既有效又全面的测试用例非常困难。现有方法如CodeT和TACO主要依靠AI直接生成测试输入。虽然这对小规模输入有效,但很难保证大规模输入的有效性,更不用说让这些输入足够特殊以发现程序中的缺陷。
**HARDTESTGEN:如何生成更好的测试用例**
研究团队的关键发现是: 1. 当测试用例从AI生成的程序中生成,而不是直接由AI生成时,测试用例的有效性更高 2. 不同的测试生成器会基于不同的假设创建测试,从而产生多样化的测试分布
基于这些发现,HARDTESTGEN设计了一个三步流程: 1. 首先让AI考虑测试用例的不同方面 2. 从AI生成的测试生成器程序中提取测试用例 3. 使用人类编写的标准程序(在线编程竞赛中广泛存在)验证测试用例
**生成测试用例的三种方式**
HARDTESTGEN生成三种类型的测试输入:
第一种是"直接生成的输入"。想象一下,这就像是让AI直接写出一些简单的测试案例,类似于问题描述中的样例。这些测试通常规模较小,容易理解,可以快速检查程序的基本功能是否正确。每个问题会生成约10个这样的测试。
第二种是"常规输入"。这些是根据问题规范随机生成的数据。就像你在烹饪时需要测试食谱是否适用于各种原料一样,程序也需要在各种常规输入上测试。对于大多数问题,AI会生成一个Python函数,每次调用都会返回一个随机输入。这个函数会被调用20次生成20个随机输入。
对于某些特殊问题,常规随机输入可能会导致输出分布不平衡。例如,当问题的预期输出是"Yes"或"No"时,随机输入可能导致几乎所有测试用例的答案都是"Yes"。在这种情况下,AI会生成多个函数,每个对应一个输出类别,确保测试覆盖所有可能的输出类型。
第三种是"黑客输入"。这些是专门设计来发现那些隐蔽错误的测试用例。就像安全专家会尝试各种方法找出系统的漏洞一样,HARDTESTGEN会生成一系列函数,每个函数试图创建能让某种特定错误解法失败的输入。这些测试用例特别针对那些看似正确但实际上在特定情况下会失败的解法,比如算法复杂度不够优化的情况。
所有生成的输入都会通过一个验证器检查,确保它们符合问题规定的所有约束条件。
**生成测试输出**
对于每个问题,系统最多使用8个人类编写的标准程序(称为"oracle程序")来生成输出。这些程序通常来自可靠的来源,如原始平台或官方解法。每个标准程序都会为所有合成的输入生成输出。如果两个标准程序的输出在90%以上的情况下匹配,系统会认为这些输出是可接受的,并采用匹配部分作为最终输出。
对于大多数问题,简单的字符串比较就足以判断两个输出是否匹配。但有些问题需要特殊的判断函数。例如,一个问题可能要求返回一个集合(元素顺序不重要)或一系列达到某种效果的操作。在这种情况下,AI会实现一个特殊判断函数,该函数接受输入和两个输出作为参数,返回一个布尔值表示两个输出是否等价。在HARDTESTS数据集中,约25.4%的问题需要这种特殊判断函数。
**HARDTESTS数据集:一个全面的编程问题集**
通过HARDTESTGEN,研究团队创建了HARDTESTS数据集,包含来自13个主要在线评判系统的47,136个竞赛级编程问题,其中32.5k个问题配有高质量的测试用例。数据来源包括Codeforces、AtCoder、Luogu、CodeContests和TACO。
为了确保数据集的质量,研究团队进行了清洗、去重和防止污染处理。对于只有非英语描述的问题,他们使用GPT-4o进行了翻译。为了处理五个直接数据源之间的重叠内容,他们根据问题ID和描述中的n-gram重叠过滤掉了重复的问题,优先保留来自原始平台而非镜像站点的版本。对于正确的程序,他们保留了所有可用版本,并用各自的来源标记它们。
研究团队还对数据集进行了去污染处理,移除了与LiveCodeBench(一个常用的评估基准)中出现的问题。由于LiveCodeBench的大多数问题来自Codeforces和AtCoder,他们直接比较了问题的URL进行匹配。
在难度标签方面,他们保留了所有五个数据源的难度标签。在后续的实验中,他们使用了Luogu的难度标签,因为它为来自AtCoder和Codeforces的问题提供了一致且细粒度的标签。Luogu的难度标签分为七个级别,第一级代表初学者级别,第七级对应国家竞赛级别的问题。
**测试用例质量的直接评估**
如何评估测试用例的质量?研究团队将测试候选程序视为一个二分类过程:如果程序通过所有测试用例,则被分类为正例;否则为负例。
为了直接评估测试用例的质量,他们评估了这些测试用例作为二分类器的表现。给定一个问题、一个标准测试套件(oracle)、一个合成的测试套件以及一组候选程序,他们根据程序在这两个测试套件上的表现对程序进行分类。
当合成测试套件和标准测试套件都认为一个程序是正确的,这是一个真正例(TP)。当合成测试套件认为程序正确而标准测试套件认为错误,这是一个假正例(FP)。类似地,他们可以定义真负例和假负例。基于这些类别,他们使用精确率和召回率来衡量测试质量。
研究团队比较了HARDTESTS与两个基线方法:
1. CodeContests:主要包含来自Codeforces的问题。Codeforces只提供一定长度限制内的测试用例。CodeContests收集这些"私有测试用例",并通过对私有测试用例进行随机扰动生成新的测试用例(称为"生成的测试用例")。这给了CodeContests一个不公平的优势,因为它可以访问标准测试的分布。在实验中,研究团队只使用了生成的测试用例,这减少了不公平性但没有完全消除。
2. TACO:整合了几个现有数据集(如APPS和CodeContests),保留了它们的测试用例。此外,TACO还使用GPT-4o直接生成输入,并使用标准程序生成输出,创建了额外的测试用例。研究团队发现,对于一些来自AtCoder和Codeforces的问题,TACO的测试用例包含官方测试用例。为了确保公平比较,他们移除了这些官方测试用例。
研究团队还评估了只使用HARDTESTGEN的Type 1或Type 2输入的变体,以证明所有三种类型的必要性。
**评估流程**
为了比较测试用例与其他合成器的性能,研究团队选择了同时存在于HARDTESTS和基线数据集中的问题。对于AtCoder,他们选择了653个同时存在于HARDTESTS和TACO中的问题。对于Codeforces,他们选择了600个同时存在于HARDTESTS、CodeContests和TACO中的问题。
他们使用三个大型语言模型(Qwen2.5-Coder-7B-Instruct、Qwen2.5-Coder-14B-Instruct和GPT-4o)生成候选程序。对于每个问题,他们从每个LLM中抽取10个候选程序,使用0.7的温度和0.95的top-p值。他们还为每个问题随机选择了10个真实的人类提交。
对于金标准标签,对于AtCoder,他们在之前可用的官方测试上运行候选程序。对于Codeforces,他们将候选程序提交到网站以获得真实判断。人类编写的候选程序是从MatrixStudio/Codeforces-Python-Submissions抽样的,该仓库提供了官方判断结果。然后,他们使用合成测试用例对这些程序的正确性进行分类,并将结果与金标准标签进行比较,从而评估测试用例质量。
**结果与发现**
研究结果显示,HARDTESTS在大多数评估设置下显著优于TACO和CodeContests,无论是在精确率还是召回率方面。更重要的是,随着问题难度的增加,这种优势变得更加明显。例如,对于AtCoder上使用Qwen2.5-Coder-7B-Instruct模型生成的代码,在难度级别4+的问题上,TACO的精确率为21.67,召回率为68.42,而HARDTESTS的精确率为60.00,召回率为94.74。这意味着,在强化学习训练期间使用HARDTESTS会产生更多的真正例奖励,并且大大减少假正例奖励。
此外,研究团队发现,随着程序来源的"智能程度"降低(从人类编写到7B LLM生成),HARDTESTS的精确率优势变得更加明显。他们认为这是因为技能较低的程序员更有可能产生功能正确但效率低下的程序。例如,在人类编写的错误程序中,14.9%是由于TLE(超时)导致的,而在三个LLM编写的错误程序中,30.0%是由于TLE导致的。因此,HARDTESTS中更大、更多样化的测试用例比TACO和CodeContests中的小规模测试用例更有可能捕获低效程序。
与只使用Type 1(直接生成)输入的变体相比,包括Type 2(常规)和Type 3(黑客)测试用例的完整HARDTESTS始终带来2%到48%的精确率提升,而召回率的下降始终在2.5%以内。这证明了拥有不同类型测试的必要性。
**测试用例质量对LLM后训练的影响**
研究团队还探索了测试用例质量在三种不同后训练场景中的影响:教师蒸馏、自蒸馏和强化学习。
在教师蒸馏实验中,研究团队从DeepSeek-R1为HARDTESTGEN中的每个问题采样了一个带有C++解决方案程序的推理轨迹,去重和去污染后共得到46.6k个轨迹。他们使用这些轨迹微调了两个来自Qwen2.5-Coder-Instruct-7B的模型:一个使用所有46.6k个轨迹,另一个仅使用根据HARDTESTS正确的13k个轨迹。作为基线,他们还评估了OlympicCoder-7B,这是另一个基于Qwen2.5-Coder的派生模型,使用约10k个Codeforces问题的约100k个轨迹进行了微调。
结果表明,使用HARDTESTS的所有46.6k个示例训练的模型优于OlympicCoder-7B(使用10k个问题的100k个轨迹训练),这表明训练问题的质量和多样性比训练样本的数量更重要。有趣的是,使用较小但更精心策划的子集(13k个过滤后的轨迹)训练的模型无法匹配使用更大、未过滤数据的模型的表现,这表明在教师蒸馏设置中,数据规模主导了轨迹正确性。
在自蒸馏实验中,研究团队从Qwen3-4B采样了5个轨迹,并使用HARDTESTGEN的测试进行过滤。他们选择了4989个问题,其中至少有一个Qwen3-4B生成的程序通过测试,至少有一个程序未通过测试。他们创建了3个用于自微调的数据集,每个数据集包含每个问题的一个轨迹。"bad 5k"为每个问题随机采样一个不正确的轨迹。"good 5k"随机采样一个正确的轨迹。"random 5k"随机采样一个轨迹,无论其正确性如何。他们使用这3个数据集进一步微调Qwen3-4B,并比较结果模型的性能。
结果显示,使用HARDTESTGEN测试标识为不正确的样本进行自蒸馏的模型在pass@k上下降更显著。使用随机选择的数据进行自蒸馏可能会在pass@1上造成更大的损害,尽管在pass@10上有轻微的改进。相比之下,使用HARDTESTGEN测试验证的5k子集进行自蒸馏导致pass@1的下降较小,在pass@5和pass@10上有显著增益,这表明验证器对自蒸馏很重要。
在强化学习方面,验证器反馈对于蒸馏是可选的,但对于强化学习是必需的。为了研究验证器质量如何影响强化学习,研究团队使用相同的问题集、相同的训练设置和不同的测试用例训练Qwen3-4B。他们选择了约5k个同时存在于HARDTESTS和TACO中的问题进行训练。他们使用一个基于Code-R1的修改版veRL进行GRPO训练。当程序通过所有测试时,它获得1的奖励,否则获得0的奖励。
如图3所示,HARDTESTS的验证奖励曲线在强化学习训练期间普遍高于TACO的验证奖励曲线。这表明对于相同的问题,HARDTESTS提供了更好的奖励。在LiveCodeBench-105上评估时,使用TACO测试的强化学习会损害模型的整体性能,而使用HARDTESTS的强化学习会提高模型的整体性能。
**总结与启示**
研究团队提出了HARDTESTGEN,一个基于LLM的测试合成管道,用于生成高质量的测试用例,并创建了HARDTESTS,一个包含47k个问题和显著更高质量测试的竞赛编程数据集。他们调查了测试用例质量何时以及多大程度上影响LLM后训练,表明HARDTESTGEN生成的更难测试确实可以在多种情况下帮助LLM后训练。
虽然HARDTESTS的测试质量比基线高,但它们仍然不如人类编写的测试用例。此外,HARDTESTGEN假设存在标准解决方案,这在某些编程领域可能不成立。研究团队在附录中简要讨论了一个没有标准解决方案时合成测试的初步想法。另一个限制是,被测试的代码限于使用标准I/O进行输入和输出的单个文件。然而,许多现实世界的编程问题更为复杂,例如SWEbench中的编程问题可能涉及文件I/O或网络I/O。研究团队将探索将HARDTESTGEN应用于这些场景作为未来的工作。
这项研究的重要性在于,它不仅提供了一个更好的编程能力评估工具,而且深入探讨了测试质量如何影响AI模型的训练过程。随着AI编程助手变得越来越强大,确保我们有可靠的方法来评估和提高它们的能力变得尤为重要。HARDTESTS数据集和HARDTESTGEN管道将是这一领域未来研究的宝贵资源。
好文章,需要你的鼓励
这项研究利用大语言模型解决科学新颖性检测难题,南洋理工大学团队创新性地构建了闭合领域数据集并提出知识蒸馏框架,训练轻量级检索器捕捉想法层面相似性而非表面文本相似性。实验表明,该方法在市场营销和NLP领域显著优于现有技术,为加速科学创新提供了有力工具。
un?CLIP是一项创新研究,通过巧妙反转unCLIP生成模型来增强CLIP的视觉细节捕捉能力。中国科学院研究团队发现,虽然CLIP在全局图像理解方面表现出色,但在捕捉细节时存在不足。他们的方法利用unCLIP生成模型的视觉细节表示能力,同时保持与CLIP原始文本编码器的语义对齐。实验结果表明,un?CLIP在MMVP-VLM基准、开放词汇语义分割和视觉中心的多模态任务上显著优于原始CLIP和现有改进方法,为视觉-语言模型的发展提供了新思路。
这项研究介绍了RPEval,一个专为评估大语言模型角色扮演能力而设计的新基准。研究团队从法国里尔大学开发的这一工具专注于四个关键维度:情感理解、决策制定、道德对齐和角色一致性,通过单轮交互实现全自动评估。研究结果显示Gemini-1.5-Pro在总体表现上领先,而GPT-4o虽在决策方面表现出色,但在角色一致性上存在明显不足。这一基准为研究人员提供了一个可靠、可重复的方法来评估和改进大语言模型的角色扮演能力。
这篇论文介绍了LegalSearchLM,一种创新的法律案例检索方法,将检索任务重新定义为法律要素生成。研究团队构建了LEGAR BENCH数据集,涵盖411种犯罪类型和120万案例,并开发了能直接生成关键法律要素的检索模型。实验表明,该模型在准确率上超越传统方法6-20%,且在未见犯罪类型上展现出强大泛化能力。这一突破为法律专业人士提供了更高效、精准的案例检索工具。