微信扫一扫,关注公众号

  • 科技行者

  • 算力行者

见证连接与计算的「力量」

首页 教电脑"看例子学编程":斯坦福团队开发CodeARC基准测试,让AI像人类一样从输入输出中推理程序逻辑

教电脑"看例子学编程":斯坦福团队开发CodeARC基准测试,让AI像人类一样从输入输出中推理程序逻辑

2025-07-14 09:46
分享至:
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-
2025-07-14 09:46 科技行者

这项由斯坦福大学Anjiang Wei领导,联合伊利诺伊大学香槟分校、MIT、英特尔和Visa研究院共同完成的研究发表于2025年3月的arXiv预印本平台(论文编号:arXiv:2503.23145v1),想要深入了解的读者可以通过该编号在arXiv网站上查阅完整论文。

当你第一次看到一个复杂的魔方,没有任何说明书,只能观察别人操作几次,然后就要自己复原出同样的图案,这会是什么感觉?这正是计算机科学家们想要人工智能掌握的一种能力——从少量的输入输出例子中,推理出背后的程序逻辑,这个过程被称为"归纳式程序合成"。

归纳推理是人类智能的核心特征之一,就像我们能够从几个例子中识别出规律,然后将这种规律应用到新的情况中。比如,当孩子看到几组数字配对(2对应4,3对应9,4对应16)后,很快就能推断出这是平方关系,并正确回答5对应什么。现在,研究人员希望大型语言模型也能具备这种能力,不依赖自然语言描述,仅仅通过观察程序的输入输出行为就能重构出程序本身。

传统的人工智能编程任务通常依赖自然语言描述,比如"写一个函数计算两个数的最大公约数"。但在现实世界中,程序员经常面临的挑战更像是逆向工程:给你一个没有源代码的程序(比如一个二进制可执行文件),你需要通过运行它、观察它的行为来理解它的工作原理,然后重新实现一个功能相同的程序。这种情况在软件维护、安全分析和系统兼容性开发中非常常见。

以往的评估方法就像给学生出题时只提供标准答案,然后看学生能否一次性猜对。具体来说,研究人员会给模型10个固定的输入输出例子,然后要求模型写出一个程序,最后用一些预设的测试用例检验程序是否正确。这种方法存在几个明显的问题:首先,仅仅10个例子往往不足以完全描述一个复杂程序的行为,就像仅凭几个数据点很难准确描绘一条复杂曲线;其次,如果模型的第一次尝试失败了,它没有机会获得反馈并改进,这与真实的程序开发过程相去甚远;最后,现有的测试基准大多局限于特定领域,比如字符串处理或SQL查询,而不是通用的编程任务。

为了解决这些问题,研究团队创建了一个名为CodeARC(代码抽象和推理挑战)的新评估框架。这个框架的设计理念更接近真实世界的逆向工程场景:AI模型可以像侦探一样主动"询问"目标程序,通过输入新的测试用例来观察程序的反应,然后基于这些观察结果不断改进自己的理解和实现。

CodeARC的工作流程可以比作一个优秀的厨师学习新菜谱的过程。厨师首先品尝几口成品菜肴(初始的输入输出例子),然后可以主动尝试不同的食材搭配(查询新的输入输出),观察味道的变化。当厨师认为自己理解了配方后,就做出一道菜让专家品尝(提交程序给测试系统)。如果专家发现味道不对,会指出具体哪里有问题(提供反例),厨师就可以据此调整配方并重新尝试。

在这个框架中,AI模型扮演的角色就像是那位学习的厨师。它首先观察一些基本的输入输出例子,然后可以主动生成新的测试输入来查询目标函数的行为。当模型认为自己理解了函数逻辑后,它会编写一个候选程序。系统会使用一个"差分测试预言机"来检验这个程序是否正确。这个预言机就像是严格的美食评委,它会自动生成各种测试用例,比较候选程序和真实函数的输出。如果发现不一致,它会提供具体的反例,让模型知道在什么情况下自己的程序出错了。

差分测试预言机的工作原理颇为巧妙。它不是简单地用固定的测试用例集合,而是根据候选程序的具体实现动态生成测试用例。这就像一个聪明的老师,不会给所有学生出同样的题目,而是根据每个学生的答案特点设计针对性的问题来检验他们的理解。比如,如果一个学生的数学公式在正数情况下是对的,老师就会特意测试负数情况;如果程序在处理普通列表时正确,测试工具就会尝试空列表、重复元素或特殊数据类型。

为了构建一个全面的评估基准,研究团队从三个知名的编程竞赛和练习平台收集了1114个Python函数:HumanEval(78个函数)、MBPP(131个函数)和APPS(905个函数)。这些函数涵盖了从简单的数学计算到复杂的算法问题,代码长度从2行到74行不等,平均约9.5行。重要的是,研究团队只保留了函数的实现代码,完全去除了所有的自然语言描述,确保模型必须纯粹依靠输入输出行为来推理程序逻辑。

特别值得注意的是,研究团队创建了两个版本的基准测试。在"注释版本"中,函数保持原有的描述性名称(如`is_palindrome`),这些名称可能给模型提供关于函数功能的提示。在"匿名版本"中,所有函数都被重命名为通用的标识符`solution`,这样就完全消除了名称提示,更纯粹地测试模型的归纳推理能力。这种设计让研究人员能够量化函数名称对模型性能的影响。

研究团队对18个不同的大型语言模型进行了全面评估,包括开源模型(如LLaMA系列、Qwen系列)和闭源模型(如GPT-4、Claude等)。评估设置相当严格:每个模型最多只能观察30个输入输出例子(包括最初的10个),最多只能调用2次测试预言机来检验自己的程序。这个限制模拟了现实场景中的资源约束,迫使模型必须高效地利用有限的查询机会。

实验结果揭示了这项任务的挑战性。即使是表现最好的模型OpenAI的o3-mini,在匿名版本上也只达到了52.7%的成功率,在注释版本上达到59.5%。这意味着即使是最先进的AI系统,也有将近一半的情况无法正确推理出程序逻辑。更令人惊讶的是,专门针对推理任务优化的模型(如o3-mini、o1-mini、DeepSeek-R1)明显优于传统的语言模型,这表明归纳程序合成确实需要特殊的推理能力。

模型规模对性能的影响也很明显。在同一系列的模型中,参数量更大的版本通常表现更好,这符合"涌现能力"的观察——某些复杂能力只有在模型达到一定规模后才会显现。但有趣的是,这种规模效应在不同模型系列中表现不一致,一些针对多模态任务优化的大模型在纯文本的编程任务上反而表现平平。

匿名化处理对所有模型都造成了性能下降,但下降幅度相对温和(通常在5-10个百分点之间)。这个结果有两重含义:一方面,函数名确实提供了有用的信息,帮助模型更快理解程序的意图;另一方面,性能下降不太严重,说明优秀的模型确实具备了一定的纯归纳推理能力,不完全依赖语义提示。

更深入的分析揭示了现有评估方法的一个关键缺陷。研究人员发现,在最强的o3-mini模型生成的程序中,有67.6%能够通过最初的10个输入输出例子,但只有38.9%能够通过更严格的差分测试。这28.7%的差距清楚地表明,仅仅10个例子往往不足以唯一确定一个程序的完整行为。就像数学中的插值问题:给定几个点,可能有无数条不同的曲线都能通过这些点,但只有一条是我们真正想要的。

这个发现为CodeARC的交互式评估协议提供了强有力的支持。通过允许模型主动查询更多例子并获得反馈,系统能够更准确地评估模型的真实能力。传统的静态评估方法可能会高估模型的性能,因为它们无法检测到那些在有限例子上看起来正确但实际逻辑错误的程序。

为了进一步验证交互式元素的价值,研究团队进行了两个关键的消融实验。第一个实验测试了不同数量的输入输出例子对性能的影响。结果显示,当可观察的例子数量从10个增加到20个再到30个时,模型的成功率持续提升。这证明了更多的观察数据确实有助于模型更准确地理解目标函数。

第二个实验测试了不同数量的测试预言机调用对性能的影响。研究人员比较了允许1次、2次和3次测试的情况,发现每增加一次测试机会,模型的成功率都会显著提升。这个结果特别重要,因为它证明了反馈和迭代改进在程序合成中的关键作用。真实的编程工作很少是一次性成功的,而是一个不断测试、调试和改进的迭代过程。

论文中的一个案例研究生动地展示了这种交互式过程的价值。在这个例子中,模型需要判断一个列表中的元素是否都是唯一的(没有重复)。模型首先通过额外的查询测试了一些边界情况,比如包含不同数据类型的列表。然后,它实现了一个基于逐对比较的算法。然而,当测试系统提供一个包含不可哈希元素(如列表)的反例时,模型的程序崩溃了,而真实函数能够正确抛出类型错误。

面对这个反馈,模型展现了真正的学习能力。它意识到问题出在数据类型处理上,然后重新思考解决方案。在第二次尝试中,模型采用了基于集合的方法(`len(lst) == len(set(lst))`),这种方法在遇到不可哈希元素时会自然地抛出类型错误,与目标函数的行为完全一致。这个过程展示了AI模型如何通过反馈进行自我纠正和改进。

为了提升模型在这项任务上的性能,研究团队还探索了微调技术。他们采用了一种创新的"知识蒸馏"方法:首先让一个强大的教师模型(GPT-4o)在知道正确答案的情况下演示解题过程,包括如何查询有用的测试用例、如何分析结果、如何编写程序等。然后,让学生模型(LLaMA-3.1-8B-Instruct)学习这些演示,但在实际测试时不给它正确答案。

这种微调方法在注释版本上取得了31%的相对性能提升,在匿名版本上也有9.5%的提升。这个结果表明,通过学习高质量的推理过程,较小的模型也能在一定程度上掌握归纳程序合成的技能。但是,提升的幅度仍然相对有限,说明这项任务的核心难点不仅仅是缺乏训练数据,而是需要深层的推理能力。

研究团队还对比了两种不同的差分测试工具:PYNGUIN和MOKAV。这两个工具采用不同的策略生成测试用例,但都能有效地发现候选程序和目标函数之间的差异。使用多个测试工具的设计增强了评估的鲁棒性,减少了单一工具可能存在的盲点。

从技术角度来看,CodeARC的设计解决了程序等价性检查这个根本性难题。理论上,判断两个程序是否完全等价是一个不可决定的问题,即不存在算法能够在所有情况下给出正确答案。但是,差分测试提供了一个实用的近似解决方案:虽然无法保证100%的准确性,但可以通过大量随机测试用例来发现绝大多数的差异。这种方法在软件测试领域已经得到广泛应用,被证明是发现程序错误的有效手段。

这项研究的意义远超出了学术界的兴趣。归纳程序合成能力在多个现实应用中都有重要价值。在软件维护领域,当开发人员需要理解没有文档的遗留代码时,这种能力可以帮助快速重构或移植系统。在网络安全领域,分析恶意软件的行为模式需要从二进制代码中推断程序逻辑。在自动化编程工具开发中,让AI助手能够从用户的示例中学习编程意图,将使编程变得更加直观和高效。

此外,这种能力还与更广泛的人工智能发展目标相关。归纳推理是人类智能的核心特征之一,也是实现真正通用人工智能的关键能力。如果AI系统能够像人类一样从少量例子中抽象出规律,并将这些规律应用到新的情况中,那么它们在很多领域的表现都会得到显著提升。

研究结果也揭示了当前大型语言模型的一些局限性。尽管这些模型在自然语言理解和生成方面表现出色,但在需要严格逻辑推理的任务上仍有很大改进空间。特别是,模型往往难以处理需要精确边界条件处理的程序逻辑,这在安全关键应用中是一个重要问题。

CodeARC基准测试的发布为研究社区提供了一个宝贵的工具。与以往的静态评估基准不同,这个框架鼓励开发更智能的交互式AI系统。研究人员可以使用这个基准来测试各种新的方法,比如强化学习、神经符号推理、程序合成技术等。基准的开源性质也确保了研究结果的可重现性和可比较性。

从更长远的角度来看,这项研究可能会推动编程教育和工具的变革。如果AI系统能够真正理解程序逻辑而不仅仅是模仿表面模式,那么它们就能成为更有效的编程助手。程序员可以通过提供例子而不是详细规范来与AI协作,这将大大降低编程的门槛,让更多人能够参与软件开发。

当然,这项研究也面临一些挑战和限制。首先,评估框架虽然比以往更接近现实,但仍然是在相对简化的环境中进行的。真实的程序往往涉及复杂的状态管理、并发处理、错误处理等问题,这些在当前的基准中还没有完全体现。其次,目前的测试主要集中在相对较短的Python函数上,更大规模的程序合成仍然是一个未解决的挑战。

另一个重要的考虑是计算资源的限制。差分测试虽然有效,但需要大量的测试用例生成和执行,这在计算成本上比简单的静态测试要高得多。在实际应用中,需要在测试覆盖率和计算效率之间找到合适的平衡点。

隐私和安全也是需要考虑的因素。在某些情况下,目标程序可能包含敏感信息或商业秘密,不能随意暴露其输入输出行为。如何在保护隐私的同时进行有效的程序分析,是一个值得进一步研究的问题。

这项研究的方法论也具有启发性,它展示了如何将复杂的AI评估问题转化为更贴近现实的交互式任务。这种思路可能适用于其他需要多步推理和迭代改进的AI应用领域。比如,在科学假设生成、创意写作、问题解决等任务中,都可以借鉴这种允许中间反馈和迭代改进的评估框架。

研究团队的跨机构合作也值得注意。来自斯坦福大学、伊利诺伊大学香槟分校、MIT等学术机构以及英特尔、Visa研究院等工业界的研究人员共同参与,体现了产学研结合的重要性。这种合作模式有助于确保研究既有理论深度又有实际应用价值。

说到底,CodeARC不仅仅是一个新的基准测试,更是对AI系统能力评估方式的一次重要探索。它提醒我们,真正的智能不仅在于记忆和模仿,更在于从有限的信息中抽象出规律、在面对挑战时能够自我调整和改进。通过创建更贴近现实的评估环境,研究人员正在推动AI系统向更高层次的智能迈进。

这项研究开启了一个新的研究方向,但也留下了许多待解决的问题。如何让AI系统更好地处理复杂的程序逻辑?如何在保持准确性的同时提高推理效率?如何将这种能力扩展到更大规模的软件系统?这些问题的答案将在未来的研究中逐步揭晓。有兴趣的读者可以通过arXiv编号2503.23145v1查阅这篇论文的完整内容,深入了解技术细节和实验结果。

Q&A

Q1:什么是归纳式程序合成?它和普通的AI编程有什么区别? A:归纳式程序合成就是让AI仅通过观察程序的输入输出例子来推理出程序逻辑,就像看魔术表演后要猜出魔术的秘密一样。普通AI编程有自然语言描述告诉它要做什么,但归纳式程序合成完全没有文字说明,只能靠"察言观色"来理解程序要干什么。

Q2:CodeARC的交互式测试比传统方法好在哪里? A:传统方法像考试时只给标准答案让学生猜,猜错了也不知道错在哪里。CodeARC让AI可以主动"提问"(查询更多输入输出),还会在答错时给出具体的反例,让AI知道哪里出了问题。这更像真实的学习过程,可以通过反馈不断改进。

Q3:目前最好的AI模型在这个任务上表现如何?实用吗? A:即使是最强的OpenAI o3-mini模型,成功率也只有52.7%,还不到及格线。这说明让AI真正理解程序逻辑仍然是个巨大挑战。目前还不够实用,但这个基准测试为未来的改进指明了方向,也让我们更清楚地看到了AI推理能力的真实水平。

分享至
0赞

好文章,需要你的鼓励

推荐文章
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-