SmellBench: Towards Fine-Grained Evaluation of Code Agents on Refactoring Tasks
本文介绍了 SmellBench,这是一个旨在通过注入真实世界的代码异味来评估代码智能体在重构任务上表现的新型基准测试,研究表明当前的顶尖模型在跨文件理解方面存在困难,且在消除这些可维护性问题方面的成功率仅处于中等水平。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
大局观: “乱糟糟的房间”问题
想象你有一个非常聪明的机器人助手(一个代码智能体/Code Agent),它能够编写代码、修复漏洞并整理文件。你要求它清理一个乱糟糟的房间(重构代码)。
大多数针对这些机器人的测试只会问:“你把椅子挪开了吗,以便能走过门口?” 如果机器人移动了椅子,你也确实能走过去,测试就会判定为“通过!”
但本文认为这还远远不够。机器人可能确实移动了椅子,但在移动的过程中,它可能撞倒了台灯,把衣服堆在了地板上,还堵住了窗户。这个房间虽然可以使用(你可以走过去),但长期居住下去会是一场灾难。这就是开发者所说的**“代码异味”(Code Smells)**——那些虽然现在能运行,但由于结构笨拙、混乱或组织不当,会导致未来出现麻烦的代码。
SmellBench 是一种全新的测试,旨在观察这些 AI 机器人是否真的能把房间清理干净,而不仅仅是检查门是否还开着。
他们是如何构建测试的(“受控混乱”工厂)
研究人员意识到,寻找现实世界中混乱的代码就像是在沙滩上寻找一颗特定的沙粒一样困难,而且这种“混乱”往往与其他事物(如新功能或 Bug 修复)混合在一起。
因此,他们建立了一个工厂来制造完美的受控混乱:
- 洁净的房间: 他们从 7 个著名的、整洁且组织良好的 Python 项目(如
pandas或numpy)开始。可以将这些视为纯净、组织严密的库。 - 注入异味: 他们没有等待混乱自然发生,而是使用 AI 故意 把代码搞乱。他们注入了 7 种特定类型的“异味”(例如试图做太多事情的“上帝类/God Class”,或者从未被使用的“死代码/Dead Code”)。
- 标准答案(Ground Truth): 因为混乱是他们亲手制造的,所以他们完全知道在破坏之前,那个整洁的版本长什么样。这就是他们的“答案解析”。
结果: 一个包含 294 个特定“混乱”场景的数据库,难度从易到难不等,涵盖了 7 种不同类型的代码丑陋程度。
7 种“代码异味”(乱糟糟的房间场景)
本文重点关注了 7 种代码变乱的方式。以下是它们在日常生活中的对应关系:
- 特征侵入 (Feature Envy): 一个人(一个函数)总是不断地向邻居家借东西,而不是使用自己的东西。类比:你一直借邻居的锤子,因为你自己没有,尽管你明明有一个工具箱。
- 上帝类 (God Classes): 单个个体试图承担公司的所有工作(烹饪、会计、安保和人力资源)。类比:一个清洁工试图同时修理水管、教数学并烤面包。
- 数据丛集 (Data Clumps): 无论去哪里都随身携带同一组物品(钥匙、钱包、手机),即使你只需要其中一件。类比:为了换个灯泡而拎着一整个工具箱。
- 散弹式修改 (Shotgun Surgery): 你想改变一个小地方(比如墙壁的颜色),但你必须跑遍 10 个不同的房间去做。类比:更改产品的价格需要你分别更新收据、网站、发票和运输标签。
- 死代码 (Dead Code): 房间里没人坐也不用的家具。类比:书架上堆满了你 10 年前读过的、再也不会碰的书。
- 接口隔离 (Interface Segregation): 一个有 50 个按钮的遥控器,但你只用其中的 3 个。类比:餐厅的菜单强迫你在点一杯水的同时,必须同时点一份牛排、一份沙拉和一份甜点。
- 深度内联 (Deep Inlining): 一个食谱写着“执行步骤 1,这意味着执行步骤 2,这意味着执行步骤 3……”全部写成了一个巨大的段落。类比:一张地图上的路线指令写在指令内部,导致根本无法遵循。
实验:机器人能清理干净吗?
研究人员将这些混乱的代码片段交给了 2 个流行的 AI 智能体(OpenHands 和 Qwen Code),它们由 6 个不同的“大脑”(如 Claude、GPT 和 DeepSeek 等大语言模型)驱动。
规则如下:
- AI 必须找到混乱之处。
- AI 必须修复混乱。
- AI 必须确保代码仍然可以正常运行(通过测试)。
结果(令人震惊的部分):
即使是最好的组合(Qwen Code + Claude Sonnet 4.5),在消除异味方面的得分也仅为 50.34%。
- “门”的测试(功能正确性): 机器人在这方面表现出色。大多数机器人都能保持“门开着”(代码仍能运行)。它们在 80-90% 的情况下能通过基础测试。
- “洁净房间”的测试(重构质量): 机器人在这里失败了。它们通常解决了眼前的问题,但却让房间变得更乱。它们很难看到全局,尤其是当混乱涉及多个文件时(例如“散弹式修改”这种异味)。
核心发现: AI 擅长让代码“能跑”,但目前还不擅长让代码“既漂亮又易于维护”。
为什么这很重要
本文的结论是,我们不能仅仅询问 AI:“代码运行了吗?” 我们需要询问:“代码干净吗?”
他们引入了一种新的评分方式,使用一个“裁判 AI”来评估:
- 它通过测试了吗?(门开了吗?)
- 它找对修复位置了吗?(它看对房间了吗?)
- 代码真的变好了吗?(房间变整洁了吗?)
底线是: 现在的 AI 智能体就像是热情的实习生,他们可以搬动家具,但经常会留下满地的灰尘。他们正在进步,但在能够独立专业地“重构”(清理)复杂的软件系统之前,还有很长的路要走。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。