Heterogeneous Prompting and Execution Feedback for SWE Issue Test Generation and Selection
本文介绍了 e-Otter++,一种通过利用异构提示和执行反馈来自动创建复现测试,从而克服软件工程问题中代码缺失或错误挑战的新型测试生成器,在 TDD-Bench Verified 基准测试上实现了 63% 的最先进失败转通过率。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下你是一名正在一个庞大且混乱的图书馆(即软件代码)中破解谜题的侦探。一位读者(开发者)来到你面前说:“这本书出了点问题,但我无法准确说明是什么,我也拿不出具体的错误发生实例。”
在软件世界中,这被称为 SWE 问题。通常,为了修复一个 Bug,你需要一个“复现测试”(reproduction test)——即一个特定的脚本,它能说明:“如果你执行 X 操作,库就会崩溃。”这能证明 Bug 的存在。但通常情况下,这些脚本尚未存在。
这篇论文介绍了一种新的侦探工具,名为 e-Otter++。它的任务是仅仅通过阅读对问题的混乱描述,就能自动编写出那个“崩溃脚本”(测试),甚至在实际修复方案被写出来之前。
以下是 e-Otter++ 的工作原理,通过简单的类比进行解释:
1. 问题所在:“盲目”的侦探
通常,如果你要求一个聪明的 AI(大语言模型)编写一个测试,它会尝试进行猜测。如果你只问它一次,它可能会猜错。如果你用完全相同的指令问它 10 次,它可能只会给你 10 个略有不同的、错误的猜测版本。这就像问一个朋友描述一部他们只看过一次的电影;如果你问他 10 次,他可能只是在重复同一个错误。
2. 第一个技巧:“异质提示词”(化装舞会)
为了获得更好的猜测,e-Otter++ 不仅仅是向 AI 提出 10 次相同的问题。相反,它会改变提问的方式,就像给 AI 换上不同的服装或赋予不同的视角。
- “面具”(Masks): 想象 AI 正在观察一个拼图。有时,e-Otter++ 会遮住拼图的一部分(代码上下文),让 AI 必须基于更少的信息进行猜测。其他时候,它则只展示特定的碎片。这迫使 AI 以不同的方式观察问题。
- “变形”(Morphs): 想象 Bug 报告是用晦涩的术语编写的。e-Otter++ 会要求 AI 以不同的风格重写报告:
- “标准化者”(The Standardizer): 将混乱的笔记转化为正式、结构化的报告。
- “简化者”(The Simplifier): 移除令人困惑的技术术语,使其易于理解。
- “丢弃者”(The Dropper): 移除可能具有误导性的特定代码片段(例如告诉 AI 使用一个该库实际上并不拥有的工具)。
- “预思考者”(The Pre-Thinker): 先要求 AI 猜测一个解决方案,然后利用这个猜测来编写测试。
通过混合这些“面具”和“变形”,e-Otter++ 生成了一个庞大且多样化的潜在测试池。这就像让 10 个不同的人描述一个犯罪现场,但给每个人提供不同的线索和不同的说话方式。这增加了其中至少有一个人猜对的可能性。
3. 第二个技巧:“执行反馈”(试运行)
一旦 AI 生成了一个测试,e-Otter++ 并不会盲目信任它。它会在“旧代码”(有 Bug 的版本)上运行该测试。
- 目标: 测试必须失败。但它必须因为“正确的原因”而失败。
- 问题: 有时测试失败是因为低级错误(比如拼写错误),而不是因为真正的 Bug。
- 解决方法: e-Otter++ 有一个“评论家”(另一个 AI)来观察失败情况。如果测试失败的原因不对,评论家会说:“不,那不是 Bug。这是出错的具体行,以及你需要额外查看的一些代码。”然后,系统会利用这些新信息重写测试。它会不断循环这个过程,直到测试能够完全按照 Bug 描述的要求发生失败。
4. 第三个技巧:“替代补丁”(虚拟修复)
这是最难的部分:要判断一个测试是否“好”,它需要在“新代码”(修复后的版本)上通过。但修复方案还没写出来!如何挑选出最好的测试呢?
e-Otter++ 使用了一个聪明的变通方法:
- 它要求另一个 AI 系统(称为 Agentless)生成一系列“虚拟修复”(surrogate patches)。这些并不是完美的修复,但已经很接近了。
- 它将所有候选测试在这些虚拟修复上运行。
- 如果一个测试在虚拟修复上通过了,那么它很可能是一个好的测试。
- 最后,e-Otter++ 根据哪个测试覆盖了代码中最重要的部分,来选出唯一的最佳测试。
结果:巨大的飞跃
该论文在两个主要基准测试(TDD-Bench 和 SWT-bench)上测试了该系统。
- 此前的最优水平: 顶尖系统只能在 37% 到 38% 的时间内生成有效的测试。
- e-Otter++: 通过使用这些新技巧(改变提问方式并使用虚拟修复来过滤答案),e-Otter++ 在一个基准测试中将成功率提高到了 63%,在另一个基准测试中提高到了 52.5%。
为什么这很重要
作者表示,这主要在两个方面提供了帮助:
- 对于人类: 它自动化了“测试驱动开发”(在修复 Bug 之前编写测试)中枯燥的部分,使开发者更容易确认 Bug 并修复它们。
- 对于 AI Agent: 许多 AI 编程 Agent 依赖这些测试来了解它们是否修复了 Bug。通过提供更好的测试,e-Otter++ 也在帮助其他 AI Agent 更好地完成工作。
简而言之,e-Otter++ 是一种更聪明、更具创造力且更严谨的方式,用于要求 AI 在无需人类预先编写证明的情况下,编写出“软件 Bug 存在且已被修复”的证据。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。