本文为2987字,建议阅读2分钟
世界第一位人工智能软件工程师Devin推出不到三天,Cognition公司今天又发布了Devin的技术报告,惊喜的是Devin表现出的复杂推理能力确实很震撼,似乎我们离AGI没那么遥远,失望的是Cognition技术报告中坦诚鉴于测试Devin基准数据集在互联网上很受欢迎,Devin 的底层模型将包含来自这些存储库的数据,这让我们对Devin真实推理能力要打一个大大的?号了
Cognition 的目标之一是让专门从事软件开发的 AI 代理 Devin 能够成功地将代码贡献给大型、复杂的代码库
为了评估 Devin,Cognition选择求助于 SWE-bench,这是一个由 GitHub 问题和拉取请求组成的软件工程系统的自动化基准测试。Cognition相信 SWE-bench 是一个不错的选择,因为它确定性地评估(通过单元测试)系统解决现实世界代码库中问题的能力,这与 HumanEval 等仅限于独立功能的基准测试不同
在 SWE-bench 中,Devin 成功解决了 13.86%* 的问题,远远超过了之前最高的无协助基线 1.96%。即使提供了要编辑的确切文件(“辅助”),之前最好的模型也只能解决 4.80% 的问题
Cognition在
https://github.com/CognitionAI/devin-swebench-results
上提供评估工具和 Devin 的代码编辑
背景
SWE-bench 是一个包含 2,294 个问题和从 GitHub 上流行的开源 Python 存储库中抓取请求的数据集。其目标是测试系统编写真实代码的能力
每个 SWE-bench 实例都包含一个 GitHub 问题和解决该问题的拉取请求。拉取请求必须包含一个单元测试,该测试在代码更改之前失败并在代码更改之后通过(称为“未能通过”测试)。 diff 分为两部分,patch 和 test_patch,分别包含代码更改和测试更改
然后,要求正在评估的系统根据 GitHub 问题描述和存储库(问题发生时)生成差异。如果在修补编辑后所有单元测试都通过,则该示例被认为是成功的。
资料来源:swebench.com
在 SWE-bench 中,LLM 要么获得要编辑的正确文件集("辅助");要么由一个单独的系统根据与问题文本的相似性检索要编辑的文件("非辅助")。作为代理,Devin 不会接收任何文件列表,而是自行导航文件,这更类似于“无协助”LLM
正确解决 SWE 基准示例具有挑战性。更难的 PR 需要更改数十个文件、保持向后兼容性和/或进行大量复杂的推理。即使有辅助,最好的 LLMs 也只能达到 4.80% 的成功率。
方法
采用 SWE-bench 来评估代理,这是比 LLMs 的原始评估更通用的设置。
设置
使用标准化提示端到端地运行代理,要求它仅在给出 GitHub 问题描述的情况下编辑代码。在运行期间,不会向代理提供任何其他用户输入
该存储库被克隆到代理的环境中。只在 git 历史记录中保留基本提交及其祖先,以防止信息泄露给代理。值得注意的是,我们删除了 git Remote,以便 git pull 不起作用
在测试开始之前搭建好Python conda环境
将 Devin 的运行时间限制为 45 分钟,因为与大多数代理不同,它具有无限期运行的能力。如果需要,它可以选择提前终止。
评估
一旦代理运行退出,将所有测试文件重置为原始状态,以防代理修改测试。获取文件系统中的所有其他差异并将它们提取为补丁
为了确定哪些文件是测试文件,采用测试补丁中修改的所有文件的集合
将代理的补丁应用到存储库,然后应用测试补丁
运行SWE-bench提供的eval命令并检查所有测试是否通过。
可以在 https://github.com/CognitionAI/devin-swebench-results 找到改编的评估工具的代码
结果
在随机选择的 25% 的 SWE 基准测试集(2,294 个中的 570 个)上对 Devin 进行了评估。这样做是为了减少完成基准测试所需的时间,这与作者在原始论文中使用的策略相同
Devin 成功解决了 570 个问题中的 79 个问题,成功率为 13.86%。这甚至比之前最好的辅助系统(Claude 2)的 4.80% 还要高得多
该图中的基线在“辅助”设置中进行评估,其中为模型提供了它需要编辑的确切文件。基线在“无辅助”设置中表现较差,其中单独的检索系统选择 LLM 的文件进行编辑(最佳模型是 Claude 2 + BM25 检索,有 1.96%)
因为无协助或协助都不能与代理设置严格比较,在代理设置中,Devin 获得整个存储库并可以自由浏览文件,因此选择更强的数字进行基线比较。端到端运行代理对于 SWE-bench 来说是更自然的设置,因为它更类似于现实世界的软件开发。预计未来在这种情况下会有更多代理结果
分析
多步骤规划
Devin 可以执行多步骤计划来接收来自环境的反馈。 72% 的通过测试需要 10 分钟以上才能完成,这表明迭代能力有助于 Devin 取得成功
定性例子
对Devin的结果进行了一些定性分析。回想一下,Devin 仅获得了问题描述和克隆存储库作为输入
示例 1: ✅ scikit-learn__scikit-learn-10870
Devin 最初对描述感到困惑,并按照描述在 return self 之前添加了 self.lower_bound_ = max_lower_bound 。这实际上是不正确的,因为该变量尚未定义
根据问题描述中提供的测试代码,Devin 随后更新了测试文件:
但在运行测试并收到错误后,Devin 更正了该文件:
修复后,Devin 重新运行测试以使其通过并成功退出
这个例子很有趣,有几个原因:
尽管不准确,但Devin仍然非常严格地遵循原始问题的指示。这表明与用户的偏好过度一致
鉴于能够在其环境中运行测试,Devin 能够纠正其错误。对于软件开发人员来说,能够进行迭代至关重要,代理也应该能够做到这一点
示例 2: ✅ django__django-10973
Devin 识别出正确的文件 django/db/backends/postgresql/client.py ,并进行完整的编辑:
在这里,Devin 能够成功修改一大块代码。 SWE-bench 中的许多成功编辑都包含单行差异,但 Devin 能够同时处理多行
示例 3: ❌ sympy__sympy-17313
这是一个艰巨的任务,涉及修改计算机代数系统,以便能够正确处理地板函数(floor)和天花板函数(ceiling)对象与可指定为正或负的数值之间的比较运算符。这需要复杂的逻辑推理和多重演绎步骤
Devin 错过了要编辑的正确类,编辑的是 frac 类,而不是 floor 类和 ceiling 类。除此之外,当需要修改 __lt__ 、 __le__ 和 __ge__ 时,Devin 仅编辑比较运算符之一 __gt__ ,这个编辑与正确相距甚远
正确的差异可以在这里找到:https://github.com/sympy/sympy/pull/17313/files。 diff 相当复杂,有大量的边缘情况处理和大量的单元测试,并且需要对 sympy 代码库有深入的了解。 (请注意,每个测试都必须通过才能通过 SWE 基准实例。)
示例 4: ❌ scikit-learn__scikit-learn-10774
此任务涉及向存储库中的所有数据集添加额外的返回选项功能。 Devin 能够成功地对多个数据集进行此编辑;一个例子如下所示。
Devin 设法对数据集 california_housing.py 、 covtype.py 、 kddcup99.py 和 mldata.py (原始 PR 实际上排除了这些数据集)进行了类似的编辑。不幸的是,Devin 错过了两个数据集 lfw.py 和 rcv1.py ,因此测试最终失败。后续打算提高 Devin 编辑多个文件的能力。
测试驱动实验
一项额外的实验,向 Devin 提供最终的单元测试以及问题陈述。在这种“测试驱动开发”设置中,100 次抽样测试的成功通过率提高到 23%。 (请注意,对测试本身的任何更改都会在评估之前被删除。)
该结果与 SWE-bench 的其他结果无法比较,因为代理可以访问地面实况测试补丁。尽管如此,测试驱动开发是软件工程中的常见模式,因此这种设置是 SWE-bench 的自然扩展。人类为智能体提供有针对性的测试以使其通过是人类工程师和智能体协作的自然方式,预计未来会看到更多测试驱动的智能体。
Devin 通过测试新解决的问题示例
✅ django__django-13321:Devin 通过在函数之前添加打印语句,然后运行单元测试,然后根据打印语句编辑文件来解决此问题。测试用例的存在使 Devin 的调试变得很容易
✅ django__django-16983:新的单元测试断言会发出确切的错误消息:“‘filter_horizontal[0]’的值不能包含 […]”。如果不知道错误的确切措辞,就不可能通过测试。这凸显了基准测试的一个问题,并表明如果没有测试补丁就不可能获得完美的分数
注意事项
鉴于开源存储库在基准测试中的受欢迎程度,Devin 的底层模型将包含来自这些存储库的数据。然而,我们所比较的基线(Claude、GPT、Llama 等)面临着类似的数据污染问题(,所以这个测试的靠谱程度大家自行脑补)
此外,还需要努力防止代理查找有关这些 PR 的外部信息并可能复制差异。在测试设置期间,从存储库中删除了 Github 远程和所有未来的提交,以便代理无法直接访问这些内容。能够访问互联网的代理可能会通过其他方法找到外部信息;手动检查了 Devin 的成功运行,以确保这种情况没有发生。
结语
代理仍处于起步阶段,还有很大的改进空间
⭐星标AI寒武纪,好内容不错过⭐
用你的赞和在看告诉我~
信不信由你
热门跟贴