与 Devin 相处一个月的思考 [译]

我们在给 Devin 分配了 20 多个任务后的感受。

2024 年 3 月,一家新的 AI 公司横空出世,拥有令人瞩目的背景:由 Founders Fund 领投的 2100 万美元 A 轮融资,并获得 Collison 兄弟、Elad Gil 以及其他科技大咖的支持。其团队成员都是国际信息学奥赛(IOI)金牌获得者——那些能够解决大多数人都难以理解的编程难题的顶尖人才。他们的产品 Devin,号称是一名“全自动化”软件工程师,可以像人类同事一样与你聊天,能够学习新技术、调试成熟代码库、部署完整应用,甚至还能训练 AI 模型。

早期的演示非常有说服力。在一段 视频 中,Devin 独立完成了一个 Upwork 的赏金任务,安装并运行了一个 PyTorch 项目,全程无需人工干预。1 公司声称他们在 SWE-bench 基准测试中,Devin 能够端到端地解决 13.86% 的真实世界 GitHub 问题——这个数值几乎是之前系统的 3 倍。由于只有少数用户能最先使用,Twitter 上充斥着对它如何颠覆软件开发的热切讨论。

Answer.AI,我们的团队经常尝试各种 AI 开发工具,而 Devin 给我们的感觉确实有些与众不同。如果它真的能兑现哪怕一半的承诺,都足以改变我们的工作方式。然而当时 Twitter 上虽然一片火热,我们却几乎找不到关于实际使用它的详尽案例。于是我们决定亲自试试,针对各种真实应用场景来测试它。这篇文章就是我们的故事——一次对 2024 年最受关注的 AI 产品之一进行全面、真实的使用尝试。


什么是 Devin?

Devin 的特别之处在于它的基础架构。与大多数 AI 助手不同,Devin 通过 Slack 与用户交互,并自行启动一个计算环境。当你与 Devin 聊天时,你实际上是在和一个拥有完整计算环境(包括 Web 浏览器、代码编辑器和 Shell)的 AI 对话。它可以安装依赖项、阅读文档,甚至能预览自己创建的 Web 应用。下面的截图展示了通过 Slack 给 Devin 分配任务的一种方式:

在 Slack 中发起对 Devin 的任务

它的体验被设计得就像和同事聊天一样:你描述需求,Devin 就开始工作。在 Slack 中,你可以看到它如何思考问题,它需要时会索要凭证,并会分享最终完成工作的链接。在幕后,Devin 运行在一个 Docker 容器中,既能安全地进行各种实验,又能保护你的系统。此外,Devin 还提供了一个 Web 界面,你可以在其中访问它的环境,实时观看它在 IDE、Web 浏览器等工具之间的操作。下面是该 Web 界面的截图:


初步的成功

我们第一个测试的任务很简单但具有实际意义:将 Notion 数据库中的数据拉取到 Google 表格中。Devin 在这个过程中表现出了令人惊喜的能力。它能够浏览 Notion API 文档,理解所需步骤,并指导我如何在 Google Cloud Console 中设置相关凭证。它不仅仅是把 API 用法直接甩给我,而是一步步告诉我每个菜单和按钮该怎么点,这比我自己去翻文档要省力许多。整个过程大约花了一小时,但我实际上只花了几分钟与它互动。最终,Devin 给了我一个链接,打开后正好是一个排版完美的 Google 表格,里面装着所需数据。

它产出的代码虽然略显冗长,但可以正常运行。这种场景让人感受到未来的可能——AI 可以自动处理那些占用大量开发者时间的“胶水代码”。Johno 也有类似的积极体验,他让 Devin 制作了一个行星跟踪器,用来驳斥有关木星和土星历史位置的各种说法。而更令人印象深刻的是,他完全在手机上进行这项操作,Devin 负责创建环境并写代码。


扩大测试范围

在经历了最初的成功之后,我们开始更深入地尝试 Devin 的异步能力。我们设想让 Devin 在我们开会时自动编写文档,或在我们专注于设计工作时为我们调试问题。然而,随着测试范围的扩大,问题开始浮现:一些看起来相对简单的任务往往要花上几天而不是几小时,Devin 可能会卡在技术死胡同里,或者产出过于复杂且难以使用的解决方案。

更让人担忧的是,Devin 经常对根本无法完成的任务“一条路走到黑”。比如,当我们要求它在同一个 Railway 部署中同时运行多个应用(Railway 并不支持这么做)时,它没有指出这个限制,反而花了一整天尝试各种方法,并“幻觉”出许多不存在的功能。

最让人沮丧的并不是它的失败本身——任何工具都有局限——而是我们为了挽救它那些失败尝试所花费的时间和精力。


深入分析:究竟哪里出了问题?

此时,我们团队感到困惑。Devin 一方面能高效地处理 API 集成、搭建可用的应用,另一方面却在一些看起来更简单的任务上栽了跟头。这仅仅是运气不好?还是我们用错了方式?

在一个月的时间里,我们系统地记录了它在以下几类任务中的表现:

  1. 从零开始创建新项目

  2. 执行研究类任务

  3. 分析和修改现有项目

结果相当令人失望:20 个任务中,14 个失败,3 个成功(其中还包括之前的 2 个初始成功),3 个结果不确定。更要命的是,我们无法预判哪些任务会成功。与早期成功示例类似的任务,结果往往也会出乎意料地失败。
我们在附录中提供了这些任务的更多细节。下面是我们在各类任务中对它的总体总结:


1. 从零开始创建新项目

按理说,这是 Devin 的“拿手好戏”。在官方演示视频里,它能够自主完成 Upwork 的赏金任务;我们自己最初的成功案例也表明它似乎能胜任“绿地开发”。但现实往往比想象更复杂。

举个例子:我们试图让它与一个叫做 Braintrust 的 LLM 可观测性平台进行集成,目标是生成并上传一些合成数据。理想情况是一个精简而专注的解决方案,但 Devin 产出的却是一大堆“代码拼盘”——层层抽象让简单操作变得复杂不堪。我们最后放弃了 Devin 的产物,改用 Cursor 进行一步步的迭代,效率反倒更高。另一个例子是,我们让它把我们的 AI 笔记应用与 Spiral.computer 做整合。结果代码混乱不堪,远比我们从头写要费解。

更具代表性的是我们想让它做网络爬虫:要求 Devin 通过 Google Scholar 链接抓取某位作者最近 25 篇论文。对拥有浏览器访问权、能写代码的 Devin 而言,这应该是 Playwright 之类工具能轻松胜任的基本场景。然而它却陷入了反复解析 HTML 的死循环,根本没能走出来。


2. 研究类任务

既然 Devin 在具体的开发任务上有时会失利,也许它在研究性任务上会表现更好?然而结果也只能说是差强人意。它虽然能完成一些简单的文档检索(就像我们在最开始的 Notion/Google Sheets 集成中看到的那样),但在更复杂的问题上就会力不从心。

例如,当我们请它研究“带精确时间戳的转录内容摘要”这个特定技术挑战时,它只是泛泛地列举了一些并不相关的内容,根本没能抓住我们所面临的核心问题。它看似给出了示例代码,但这些例子并不具备真正的实用价值。即便它似乎有所进展,往往也是假象。比如,当我们让它创建一个最小的 DaisyUI 主题示例时,它输出的看上去像是能正常运作,但实际上我们后来才发现,界面配色依然是默认主题的效果,所谓自定义主题根本没被应用。


3. 分析并修改现有代码

Devin 在已有项目上暴露出的问题尤其让人担忧。这类任务需要 AI 理解上下文,并在现有代码的基础上保持一致性,这应该是一个“AI 软件工程师”最核心的技能。

我们在使用 nbdev 项目时的尝试尤其具有代表性。让它把一个 Python 项目迁移到 nbdev,结果 Devin 连最基本的 nbdev 设置都没搞明白,尽管我们已经给了它完整的文档。更让人疑惑的是,它对笔记本文件的处理方式——不是直接编辑笔记本,而是先生成 Python 脚本,再去操作笔记本,平白增加许多没必要的复杂度。尽管它偶尔能提供一些有价值的注释或思路,但最终产出的代码却几乎没法用。

安全审查的场景同样如此。我们让它检查一个不足 700 行代码的 GitHub 仓库是否有安全漏洞,它的反馈过度夸张,列举了许多子虚乌有的问题。这类分析或许用单次聚焦的 LLM 调用就足够了,并不需要 Devin 这种复杂流程。

在调试方面也出现类似情况。当我们排查为什么脚本里的 SSH key 转发一直不起作用时,Devin 只盯着脚本本身,完全没考虑问题可能出在脚本之外。它的这种“隧道视野”让它没办法帮助我们找出真正的问题所在。再比如,当我们让它在用户输入和数据库中的值之间做冲突检查时,一位团队成员尝试了好几个小时,但 Devin 的方案都没法用,最后他只用大约 90 分钟就自己把功能写完了。


团队反思

在对 Devin 进行了一个月的密集测试后,我们团队坐在一起,试图为这一切做出总结。以下这些反馈最能代表我们的心声:

当它能做的任务非常小、需求非常明确时,我自己动手可能会更快,还能保持我的风格。它似乎难以在更大的任务中节省时间,尤其是那些我可能希望通过它来提高效率的任务,它常常搞砸了。所以,我感觉还没有一个我真正想用它的场景。
—— Johno Whitaker

开始时我对它的表现充满期待,觉得我只要稍微调整一下就行。可随着调整的内容越来越多,我最后发现,还不如干脆自己一步步写,这样效率更高。
—— Isaac Flath

Devin 无法正确使用我们在 AnswerAI 里非常重要的一些内部工具,这加剧了其他问题,让它的使用体验十分不理想。尽管我们已经向它提供了大量文档和示例。我在使用像 Cursor 这样的工具时就很少遇到类似问题,因为这类工具能让我以更加渐进的方式给出提示和引导。
—— Hamel Husain

相较 Devin,那些以开发者为主导、AI 辅助的工作流(例如 Cursor)似乎更能避免我们在 Devin 身上经历的诸多问题。


结论

与 Devin 的这一番接触,让我们看到了“自动化 AI 开发”所追求的目标:流畅的用户体验,通过 Slack 交流、异步观察它的工作进程、让它自动搭建环境并安装依赖。偶尔确实会让人惊艳。

但问题在于:它很少真的能“稳定地”发挥作用。 在我们测试的 20 个任务中,14 个失败,3 个不确定,仅 3 个成功。更令人困惑的是,我们无法判断哪些任务能成功,连与早先成功例子类似的任务都会莫名其妙地陷入困境,浪费大量时间。原本看起来大有可为的“自治”特性,反而成了它的拖累——面对根本无法完成的需求时,它会拼命尝试好几天,完全忽视那些最根本的限制。

这也呼应了我们在 AI 工具领域反复看到的模式:社交媒体上的热度、公司估值,与真正的产品实用性往往没有必然联系。我们发现最可靠的信息来源,还是用户在真实场景中落地产品和服务的具体案例。就目前而言,我们仍会使用那些让人类占主导、AI 充当辅助的工具,因为它们在我们的开发流程中更加高效可控。


附录:与 Devin 相关的任务清单

下表罗列了我们交给 Devin 的项目,按以下主题归类:
(1) 创建新项目
(2) 研究类任务
(3) 分析现有代码
(4) 修改现有代码


1. 创建新项目

项目名称

状态

描述

反思

Planet Tracker

成功

我想驳斥一些关于木星和土星历史位置的说法,想做个行星跟踪器。

Devin 做得很好。我其实是全程在手机上用 Slack 和它聊天,它最终把项目完成了。

从 Notion 迁移数据到 Google 表格

成功

我让 Devin 把 Notion 的一些信息提取出来,然后放到一个 Google 表格里。这个项目是我和 Devin 互动的第一个项目,最后执行得不错。

这是我和 Devin 的第一次交互,结果非常符合预期,这在当时是一次全新的体验,让我对 Devin 感到相当惊喜。

在 Railway 上同时部署多个应用

不确定

我让 Devin 将多个应用部署到一个 Railway 项目上,以便它们共用一个本地数据库做测试。

后来发现这个需求本身就不太可能实现(如果我没理解错的话),但 Devin 还是花了大量时间去尝试各种方法,还出现了对 Railway 功能的幻觉。

生成合成数据并上传到 Braintrust

失败

我想测试一个叫 Braintrust 的 LLM 可观测性平台,让 Devin 帮我生成一些测试用的合成数据并上传。

Devin 写出的代码过于繁杂,让人难以理解,而且在修复错误的过程中也陷入了困境。最后我们改用 Cursor,采用一步步迭代的方式,反而效率更高。

在两个应用间创建集成

失败

我让 Devin 把我的 AI 笔记工具 Circleback 与 Spiral.computer 做集成,并给了它一些文档。

代码质量很差,像是一团乱糟糟的“意面代码”。看完后我觉得还不如自己写更快,索性就放弃了。

爬取 Google Scholar 链接下的论文

失败

要求 Devin 用 Playwright 程序化地抓取指定作者最近 25 篇论文,如果遇到付费墙则跳过。

它陷入了无限循环,一直在尝试解析 HTML,无法摆脱困境,最后任务处于半途而废的状态。

创建最简化的 HTMX 批量上传示例应用

失败

我让 Devin 参考 HTMX 文档的“批量编辑”示例,再用我写的 FastHTML 进行最小可行的移植。

生成的示例既无法运行,也不算简单。比如它用到了并不存在的请求对象成员,还添加了大量多余的东西(如不会起作用的提示、内联 CSS 等)。

为 FrankenUI 主题配色匹配 DaisyUI 主题

失败

我希望 Devin 能根据 FrankenUI 的配色做一套 DaisyUI 和 highlight.js 的主题,让它们在同一个应用里无缝融合。

Devin 只是把 DaisyUI 现有的一些主题映射到 FrankenUI,但颜色对不上,还产出了一大堆我看不懂的代码。最后我完全放弃,因为不知如何处理那些复杂的改动。


2. 研究类任务

项目名称

状态

描述

反思

研究如何制作一个 Discord Bot

成功

我让 Devin 调查如何用 Python 写一个 Discord Bot,每天汇总消息并发邮件,如果可能的话还想用 Claudette。并要求它用 notebook 形式提供示例

Devin 先生成了一份 Markdown 格式的研究笔记(虽然我没让它这么做),不过里面的分步骤规划还挺有用。最终代码不算完全正确,但给我提供了可行的思路。

有关带准确时间戳的转录文本摘要的研究

失败

我想给转录文本打上精确时间戳,并在摘要中也保留这些时间戳,方便做 YouTube 章节等。这个问题比较复杂,需要一定的 AI 工程研究。

Devin 只是复述了一些与我需求不甚相关的概念,并没有深入探讨我真正面对的核心难点。它给的示例代码对实际问题也毫无帮助。

创建一个最小化的 DaisyUI 主题示例

失败

我让它做一个非常精简的 DaisyUI 主题示例,以便我能在此基础上扩展。

Devin 起初忽略了我要在 FastHTML 中使用的请求,后来经过多次提示才改过来。它给了一个似乎能跑的示例,但其实主题根本没起作用,看到的颜色都是默认配色。


3. 分析现有代码

项目名称

状态

描述

反思

执行一个代码库的安全审查

不确定

我给了 Devin 一个 GitHub 仓库,只有不到 700 行代码,让它写下潜在的安全隐患,并用 Markdown 写好相关笔记。

Devin 虽然指出了一些安全问题,但有许多都是凭空杜撰。或许这类工作用一个聚焦的 LLM 调用就足够了,没必要用像 Devin 这种流程更复杂的工具。

审查博客文章并创建一个含改进的 Pull Request

失败

我让 Devin 帮我审阅一篇博客文章,并通过 PR 提交它的改进方案。

最终它没能搞懂我用的是 Quarto 这个静态网站生成器,也无法正确处理一些原本在项目中很清晰的结构(比如 front matter),所以它搞砸了。

审阅一个应用并给出改进建议

失败

让它看一个我之前提到的计时应用,看看有没什么改进的可能性。

给出的建议意义不大,经不起推敲。

调试脚本中 SSH key 转发不起作用的问题

不确定

我以为脚本有问题,就让 Devin 来排查。

问题其实不在脚本里,但 Devin 一直围绕脚本打转,从未暗示过问题可能在其他地方,所以最后也没帮上忙。


4. 修改现有项目

项目名称

状态

描述

反思

在 nbdev 项目中做一些变更

失败

我有个用 FastHTML 和 nbdev 写的简单计时应用,想通过 API 路由与苹果快捷指令集成。

Devin 虽然勉强往前推进,但总是无法正确使用 nbdev 的机制。它还会无端地生成 Python 脚本去操作笔记本,多此一举。不过它有时能给我一些好点子。最终我用的是别人写的模板。

将一个 Python 项目迁移到 nbdev

失败

我让 Devin 把某个项目迁移到 nbdev(这里省略了详细的提示)。

它完全糊涂了,基本的 nbdev 设置都没搞清楚,似乎也没好好看我提供的文档。

把 MonsterUI 引入一个 FastHTML 应用

失败

我希望 Devin 能把 MonsterUI 集成到我的应用当中。

它没法处理 nbdev 风格的仓库,始终会出各种问题。

给应用添加一个检测用户输入和数据库之间冲突的功能

失败

我让 Devin 添加一个功能:对比用户输入与数据库的已有值,如果有冲突就给出提示界面。

我花了好几个小时配合 Devin 调整,仍旧没有成功,最后自己写了大约 90 分钟就搞定了。

为 FastHTML Gallery 中的每个示例生成一个 LLMs context 文件

失败

我让 Devin 给 FastHTML Gallery 下的每个示例生成一个 llms 文本文件

一开始我还以为它做得不错,因为它生成了 Markdown 文件并把示例都合并到 llms context 文件里,但实际上文件格式不符合要求,也用错了依赖(自己引入了 markdown 包而不是已用的 markdown2),还夹带了一堆不需要的东西。


脚注

Footnotes

  1. 这段演示后来被这个 视频 彻底质疑了。