与 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 集成、搭建可用的应用,另一方面却在一些看起来更简单的任务上栽了跟头。这仅仅是运气不好?还是我们用错了方式?
在一个月的时间里,我们系统地记录了它在以下几类任务中的表现:
从零开始创建新项目
执行研究类任务
分析和修改现有项目
结果相当令人失望: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),还夹带了一堆不需要的东西。 |