2024 年 3 月,一家新的 AI 公司以令人瞩目的支持进入人们的视野:由 Founders Fund 领投的 2100 万美元 A 轮融资,并得到了包括 Collison 兄弟、Elad Gil 和其他科技界知名人士在内的行业领导者的支持。其背后的团队?国际信息学奥林匹克竞赛金牌得主——他们是那种能够解决我们大多数人甚至都无法理解的编程问题的人。他们的产品 Devin,承诺成为一个完全自主的软件工程师,可以像人类同事一样与你聊天,能够完成从学习新技术、调试成熟代码库到部署完整应用程序,甚至训练 AI 模型的所有工作。
早期的演示令人信服。 展示了 Devin 如何独立完成 Upwork 上的一个悬赏任务,在无人为干预的情况下安装并运行了一个 PyTorch 项目。该公司声称,Devin 能够在 SWE-bench 基准测试中端到端地解决 13.86% 的真实世界 GitHub 问题——比之前的系统好约 3 倍。最初只有一小部分用户可以访问它,这导致了关于它将如何彻底改变软件开发的令人兴奋的推文。
作为 Answer.AI 团队中经常尝试 AI 开发工具的一员,我们觉得 Devin 有些与众不同。如果它能实现其承诺的一半,它就能改变我们的工作方式。但虽然 Twitter 上充满了热情,我们却找不到很多关于人们实际使用它的详细记录。因此,我们决定对它进行全面测试,针对各种真实世界的任务进行测试。这是我们的故事——一个彻底的、真实的尝试,旨在与 2024 年最受炒作的 AI 产品之一合作。
什么是 Devin?
Devin 的独特之处在于其基础设施。与典型的 AI 助手不同,Devin 通过 Slack 运行并启动自己的计算环境。当你与 Devin 聊天时,你是在与一个可以访问完整计算环境的 AI 对话——该环境配有网络浏览器、代码编辑器和 shell。它可以安装依赖项、阅读文档,甚至可以预览它创建的 Web 应用程序。以下是启动 Devin 执行任务的一种方式的屏幕截图:
这种体验旨在让你感觉像是在与同事聊天。你描述你想要什么,然后 Devin 开始工作。通过 Slack,你可以观看它思考问题,在需要时请求凭据,并分享已完成工作的链接。在幕后,它运行在 Docker 容器中,这为它提供了安全试验所需的隔离,同时保护你的系统。Devin 还提供了一个 Web 界面,它还允许你访问其环境,并实时观看它使用 IDE、Web 浏览器等进行工作。以下是 Web 界面的屏幕截图:
早期的成功
我们的第一个任务很简单但很真实:将数据从 Notion 数据库提取到 Google Sheets 中。Devin 以惊人的能力解决了这个问题。它导航到 Notion API 文档,理解了它需要什么,并指导我完成了在 Google Cloud Console 中设置必要凭据的过程。它没有只是抛出 API 指令,而是引导我完成了每个菜单和按钮的点击——节省了通常需要繁琐的文档搜索时间。整个过程大约花了一个小时(但只有几分钟的人工交互)。最后,Devin 分享了一个链接,指向一个包含我们数据的格式完美的 Google Sheet。
它生成的代码有点冗长,但它能工作。这感觉像是对未来的惊鸿一瞥——一个能够处理耗费开发人员大量时间的“胶水代码”任务的 AI。Johno 在使用 Devin 创建行星追踪器来揭穿关于木星和土星历史位置的说法时也取得了类似的成功。特别令人印象深刻的是,他完全通过手机完成了这项工作,Devin 处理了设置环境和编写代码的所有繁重工作。
扩大我们的测试
在早期成功的基础上,我们充分利用了 Devin 的异步能力。我们想象着在会议期间让 Devin 编写文档,或者在我们专注于设计工作时调试问题。但是,随着我们扩大测试规模,裂缝出现了。看似简单的任务通常需要几天而不是几个小时,Devin 会陷入技术死胡同,或者产生过于复杂、无法使用的解决方案。
更令人担忧的是,Devin 倾向于推进实际上不可能完成的任务。当被要求将多个应用程序部署到单个 Railway 部署(Railway 不支持的功能)时,Devin 没有识别出这种限制,而是花了一天多的时间尝试各种方法,并虚构了一些不存在的功能。
最令人沮丧的不是失败本身——所有工具都有局限性——而是我们花了多少时间试图挽救这些尝试。
深入了解哪里出了问题
在我们的旅程中,我们感到困惑。我们看到 Devin 能够胜任 API 集成并构建功能性应用程序,但它却在看似更简单的任务中挣扎。这仅仅是运气不好吗?是我们用错了吗?
在一个月的时间里,我们系统地记录了我们在以下类别中的尝试:
- 从头开始创建新项目
- 执行研究任务
- 分析和修改现有项目
结果令人沮丧。在 20 个任务中,我们有 14 个失败,3 个成功(包括我们最初的 2 个),以及 3 个不确定的结果。更说明问题的是,我们无法辨别出任何模式来预测哪些任务会成功。与我们早期成功类似的 Tasks 会以意想不到的方式失败。我们在下面的 附录 中提供了有关这些任务的更多详细信息。 以下是我们在此过程中在每个类别中的体验总结:
1. 从头开始创建新项目
这个类别应该是 Devin 的强项。毕竟,该公司的演示视频展示了它如何自主完成 Upwork 上的悬赏任务,而我们自己早期的成功表明它可以处理全新的开发。但现实证明更加复杂。
以我们尝试与名为 Braintrust 的大语言模型(LLM)可观察性平台集成为例。任务很明确:生成合成数据并上传。Devin 没有提供重点明确的解决方案,而是生成了只能被描述为代码汤的东西——多层抽象使得简单的操作不必要地复杂化。我们最终放弃了 Devin 的尝试,并使用 Cursor 逐步构建集成,这证明效率更高。同样,当被要求在我们的人工智能笔记记录器和 Spiral.computer 之间创建集成时,Devin 生成了被一位团队成员描述为“意大利面条式的代码,比我从头开始编写的代码更难阅读”的东西。尽管可以访问这两个系统的文档,Devin 似乎使集成的每个方面都过于复杂化。
也许最能说明问题的是我们对网络抓取的尝试。我们要求 Devin 跟踪 Google Scholar 链接并抓取作者最近的 25 篇论文——对于像 Playwright 这样的工具来说,这是一个简单的任务。考虑到 Devin 浏览网页和编写代码的能力,这应该特别容易实现。但它却陷入了尝试解析 HTML 的无休止的循环中,无法摆脱自己的困惑。
2. 研究任务
如果 Devin 在具体的编码任务中遇到了困难,那么它在以研究为导向的工作中可能会做得更好吗?结果充其量是好坏参半。虽然它可以处理基本的文档查找(正如我们在早期的 Notion/Google Sheets 集成中所见),但更复杂的研究任务证明具有挑战性。
当我们要求 Devin 研究具有精确时间戳的转录摘要时(这是我们面临的一个具体技术挑战),它只是重复了表面相关的技术信息,而不是解决核心问题。它没有探索潜在的解决方案或确定关键的技术挑战,而是提供了没有解决根本问题的通用代码示例。即使 Devin 似乎取得了进展,结果通常也并非表面看起来的那样。例如,当要求创建一个最小的 DaisyUI 主题作为示例时,它生成了一个看起来可行的解决方案。然而,经过仔细检查,我们发现该主题实际上没有任何作用——我们看到的颜色来自默认主题,而不是我们的自定义。
3. 分析和修改现有代码
也许 Devin 最令人担忧的失败发生在处理现有代码库时。这些任务需要理解上下文并保持与既定模式的一致性——这些技能应该是一个 AI 软件工程师能力的核心。
我们让 Devin 处理 nbdev 项目的尝试尤其具有启发性。当被要求将 Python 项目迁移到 nbdev 时,Devin 即使在我们向其提供全面的文档的情况下也无法掌握基本的 nbdev 设置。更令人费解的是它处理笔记本的方式——它没有直接编辑笔记本,而是创建 Python 脚本来修改它们,从而为简单的任务增加了不必要的复杂性。虽然它偶尔会提供有用的注释或想法,但它生成的实际代码始终存在问题。
安全审查也显示了类似的问题。当我们要求 Devin 评估一个 GitHub 存储库(少于 700 行代码)是否存在安全漏洞时,它矫枉过正,标记了许多误报,并虚构了不存在的问题。这种分析可能最好由一个有针对性的大语言模型(LLM)调用来处理,而不是 Devin 更复杂的方法。
这种模式在调试任务中继续存在。当调查为什么 SSH 密钥转发在设置脚本中不起作用时,Devin 将注意力集中在脚本本身上,从未考虑过问题可能出在其他地方。这种管窥效应意味着它无法帮助我们发现实际的根本原因。同样,当被要求在用户输入和数据库值之间添加冲突检查时,一位团队成员花了几个小时研究 Devin 的尝试,然后放弃并在大约 90 分钟内自己编写了该功能。
作为团队的反思
经过一个月的密集测试,我们的团队聚在一起理清我们的经验。这些引言最能表达我们的感受:
它能完成的任务都是如此之小且定义明确,以至于我最好更快地用自己的方式来完成。我认为它很可能会在更大的、我可能会看到节省时间的任务中失败。因此,没有我真正想使用它的实际用例。- Johno Whitaker
我最初感到非常兴奋,因为它很接近,我觉得我可以调整一些东西。然后,随着我必须更改越来越多的内容,最终达到我最好从头开始逐步完成的程度,我慢慢感到沮丧。- Isaac Flath
Devin 很难使用 AnswerAI 的内部工具,除了其他问题之外,这使得它难以使用。尽管我们向 Devin 提供了大量的文档和示例,但这仍然是个问题。我发现像 Cursor 这样的工具不存在这个问题,在这些工具中,有更多机会以更渐进的方式将事情引导到正确的方向。- Hamel Husain
与 Devin 相比,我们发现开发人员驱动更多的流程(如 Cursor)避免了我们在 Devin 中遇到的大多数问题。
结论
与 Devin 的合作展示了自主 AI 开发的愿景。用户体验很出色——通过 Slack 聊天,观看它异步工作,看到它设置环境和处理依赖项。当它工作时,它令人印象深刻。
但问题就在于——它很少工作。 在我们尝试的 20 个任务中,我们看到 14 个失败,3 个不确定的结果,以及仅仅 3 个成功。更令人担忧的是我们无法预测哪些任务会成功。即使是与我们早期成功类似的 Tasks 也会以复杂且耗时的方式失败。看似有希望的自主性变成了一种负担——Devin 会花费数天时间追求不可能的解决方案,而不是识别根本的障碍。
这反映了我们在 AI 工具中反复观察到的模式。社交媒体的兴奋和公司估值与现实世界的实用性几乎没有关系。我们发现最可靠的信号来自用户交付产品和服务的详细故事。目前,我们坚持使用让我们在提供 AI 辅助的同时驱动开发过程的工具。
附录:Devin 尝试的任务
下表列出了我们给 Devin 的项目,按以下主题分类:(1) 创建新项目,(2) 研究,(3) 分析现有代码库,(4) 修改代码库。
1. 创建新项目
项目名称 | 状态 | 描述 | 反思 |
---|---|---|---|
行星追踪器 | 成功 | 我想揭穿一些关于木星和土星历史位置的说法 | Devin 做得很棒。我实际上是通过手机上的 Slack 与 Devin 交谈,然后它就完成了。 |
将数据从 Notion 迁移到 Google Sheets | 成功 | 我告诉 Devin 以编程方式将信息从 Notion 文档提取到 Google Sheet 中。这是我使用 Devin 执行的第一个项目,它做得很好。Devin 自己阅读了 Notion 和 Google API 文档。Devin 还引导我进入 Google Cloud 控制台,并为我提供了有关要点击的所有不同菜单的说明,这本来会花我相当多的时间!最后,我得到了一个执行该任务的合理 Python 脚本。 | 这是我与 Devin 的第一次互动,它完全按照我想要的方式执行了,这对我来说是一种全新的体验。此时,我对 Devin 非常兴奋。 |
在 Railway 上进行多应用部署 | 不确定 | 我要求 Devin 将多个应用程序部署到单个 Railway 部署中,以便我可以让不同的应用程序共享同一个本地数据库进行测试。 | 事实证明,这个任务定义不明确,因为如果我理解正确的话,实际上不可能做到这一点。然而,Devin 还是继续前进,试图做到这一点,并虚构了一些关于如何与 Railway 交互的内容。 |
生成合成数据并将其上传到 Braintrust | 失败 | 我要求 Devin 为我想测试的名为 Braintrust 的大语言模型(LLM)可观察性平台创建合成数据。 | Devin 创建了过于复杂的代码,难以理解,并且在尝试修复错误时陷入困境。我们最终使用 Cursor 逐步迭代地完成了这一步。 |
在两个应用程序之间创建集成 | 失败 | 我要求 Devin 在我的 AI 笔记记录器 Circleback 和 Spiral.computer 之间创建集成,并提供每个文档的指针。 | 我得到了非常糟糕的意大利面条式代码,比我尝试从头开始编写的代码更难阅读。所以我决定不再花更多时间使用 Devin 来完成这个特定任务。 |
通过跟踪 Google Scholar 链接进行网络抓取论文 | 失败 | 我要求 Devin 使用 playwright 以编程方式抓取 Google Scholar 上作者的最近 25 篇论文,如果遇到付费墙,可以跳过该特定文档。 | Devin 陷入了一个尝试解析 HTML 的兔子洞,它似乎无法摆脱。它陷入困境并进入休眠状态。 |
创建最小的 HTMX 批量上传示例应用程序 | 失败 | 我要求 Devin 阅读 HTMX 文档页面上的批量编辑示例,并使用该示例和伪服务器代码,为 FastHTML Gallery 创建一个最小的 FastHTML 版本的示例。 | 该示例不起作用,而且不是最小的。Devin 使用了请求对象中不存在的对象,并添加了许多不必要的东西,如 toasts(也无法工作)和内联 css 样式。 |
创建与 FrankenUI 主题匹配的 DaisyUI 主题 | 失败 | 我要求 Devin 创建 DaisyUI 和 highlight.js 主题,以便它们与 frankenui 主题匹配,并且可以在同一个应用程序中无缝使用 | Devin 将 daisyUI 预先存在的主题映射到 frankenui 主题,但在许多情况下它们匹配得不好。它还进行了大量的代码更改,我无法理解,最终我没有使用任何代码,因为我太困惑了,不知道该如何处理。 |
2. 执行研究
项目名称 | 状态 | 描述 | 反思 |
---|---|---|---|
研究如何制作一个 Discord 机器人 | 成功 | 我要求 Devin 研究如何使用 Python 构建一个 Discord 机器人,该机器人可以总结每天的消息并发送电子邮件。我还告诉它尽可能使用 Claudette 来完成此操作。最后,我告诉它将其发现写在笔记本中,并附上一些可以用来测试的小代码片段。 | Devin 以 markdown 文件的形式生成研究笔记,作为创建笔记本的中间步骤,我并没有要求它这样做。然而,看到一个关于如何实现的分步计划是非常有用的。它在笔记本中提供的代码不是 100% 正确,但作为伪代码,它可以帮助我了解如何将这些内容粘合在一起。考虑到这更多的是一个研究项目,我只想知道总体思路,所以我认为这是一个成功。 |
研究具有精确时间戳的转录摘要 | 失败 | 我在总结转录本时面临的一个问题是,我希望有与笔记相关的精确时间戳,以便我可以使用它来制作 YouTube 章节摘要或类似的内容。具体来说,从转录本中获取准确的时间戳不是问题,但很难将时间戳与摘要关联起来,因为时间戳经常被搞乱。所以这有点像一个 AI 工程研究任务。 | Devin 重复了与我的问题相关的内容,但它没有很好地进行研究或尝试解决我试图解决的问题,并给了我一些无用的代码和示例。 |
创建一个最小的 DaisyUI 主题作为示例 | 失败 | 我要求 Devin 创建一个最小的 DaisyUI 主题作为示例。我的目标是从一个起点开始,因为要求它以更完整的方式来做是不成功的。 | Devin 忽略了将其制作为 FastHTML 应用程序的请求,并且经过一些反复的沟通才使其走上这条路。最终,它创建了一个似乎可以使用不同按钮类型的应用程序。虽然它给出的链接看起来不错,但一旦我尝试修改主题,就很明显该主题没有任何作用。应用程序中的其他颜色来自默认主题。这不是一个有用的起点。 |
3. 分析现有代码
项目名称 | 状态 | 描述 | 反思 |
---|---|---|---|
对代码库执行安全审查 | 不确定 | 对于这个任务,我将 Devin 指向一个 GitHub 存储库,并告诉它评估是否存在安全漏洞。该代码库少于 700 行代码。我告诉 Devin 在 markdown 文件中记录其注释,并在必要时提供示例代码。 | Devin 确实识别出了一些安全漏洞,但它过于热衷,并虚构了一些不存在的问题。也许这对 Devin 来说不是理想的任务,因为这在对我的大语言模型(LLM)进行单次调用时效果也一样好。 |
审阅博客文章并提出改进意见的拉取请求 | 失败 | 我要求 Devin 审阅一篇博客文章,并提出修改建议的拉取请求。最终,Devin 失败了,因为它无法弄清楚我正在使用的静态网站生成器 Quarto 的工作原理。 | 我认为这个任务在像 Cursor 这样的工具中会很成功。看起来 Devin 没有很好地从项目结构和现有文件中学习,所以它搞砸了诸如前言和正确编辑博客文章所需的其他约定。 |
审阅应用程序并识别潜在的改进领域 | 失败 | 我要求 Devin 查看我之前提到的时间管理应用程序,并提出了一个开放式的任务,要求它提出任何改进建议。 | 它提供的建议没有任何意义。 |
调试为什么在设置脚本中 SSH 密钥转发不起作用 | 不确定 | 我要求 Devin 找出为什么当我在服务器上使用脚本进行设置时,SSH 密钥转发不起作用。 | 问题最终与脚本无关,我原以为脚本是问题所在,但 Devin 从未暗示或表明问题可能出在其他地方。这毫无帮助,因为它没有帮助我找出根本原因。 |
4. 修改现有项目
项目名称 | 状态 | 描述 | 反思 |
---|---|---|---|
对 nbdev 项目进行更改 | 失败 | 我有一个使用 FastHTML 和 nbdev 构建的用于时间跟踪的简单应用程序,我想通过 API 路由将其与 Apple Shortcuts 集成。 | 即使进展令人印象深刻,Devin 也无法在此环境中成功运行。我注意到一个奇怪的地方是,Devin 创建了 Python 脚本来编辑笔记本,而不是尝试编辑笔记本本身。然而,Devin 在这里给了我一些有用的注释和想法,这是我没有考虑过的。但是,它试图编写的代码没有意义。最终,我使用了别人的模板,而没有使用 Devin 的任何建议。 |
将 Python 项目迁移到 nbdev | 失败 | 我要求 Devin 将一个项目迁移到 nbdev [为简洁起见,省略了提示详细信息] | 它陷入了困境,无法弄清楚基本的 nbdev 设置。看起来它没有很好地阅读 nbdev 文档。 |
将样式包集成到 FastHTML 中 | 失败 | 我要求 Devin 将 MonsterUI 集成到我的一个应用程序中。 | Devin 无法弄清楚如何处理 nbdev 存储库。 |
添加功能以检查用户输入和数据库之间的冲突 | 失败 | 我要求 Devin 向应用程序添加一项功能,以将用户输入值与之前运行的数据库中的值进行比较,并在它们不匹配时提供一个用户界面。 | 我花了几个小时慢慢地研究如何让它正常工作,然后才放弃。我自己在大约 90 分钟内编写了这个功能。 |
使用每个 fasthtml Gallery 示例的内容生成大语言模型(LLMs)上下文文件 | 失败 | 我要求 Devin 为 fasthtml gallery 创建大语言模型(LLMs)文本文件 | 我很高兴看到它为每个示例创建了一个单独的 markdown 文件,然后最初尝试将它们汇总到 LLMs 上下文文件中。我没有想过这样做,而且一开始一切似乎都存在。当我下载并开始挖掘时,我开始发现我不喜欢的东西:LLMs 的格式不正确。即使我给了它使用 XML 标记来分隔示例的信息,它也没有使用。它添加并固定了 markdown 包的特定版本作为依赖项,并使用了该版本,而不是使用已经使用且已经是依赖项的 markdown2 包。它做了一堆 pytest 的事情并添加了一个依赖项,即使该项目没有使用 pytest。 |