跳至内容
AI 代理
人工智能

使用 Devin 进行软件开发:设置与首次 Pull Request(第 1 部)

了解 Devin 如何协助您的编码任务。在本教程的第一部分中,我们将从一个现有仓库入手,并探索 Devin 环境中的可用功能。
Marie Fayard's photo
Marie Fayard
已更新 · 12分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。

我想大家都听说过 Devin,这位所谓的“AI 初级软件工程师”,据说能克隆您的仓库、添加新功能、运行测试,并在您喝完早咖啡之前就发起一个 pull request。

和如今所有 AI 一样,不亲自试试很难判断它到底有多好,所以我决定自己动手。我让 Devin 跑完了完整软件开发生命周期的每一个阶段,并写下了四篇教程,希望能帮助其他开发者把它的价值发挥到最大。

您可以在这里访问 Devin 系列的所有教程:

  1. 设置与首次 Pull Request(第 1 部)
  2. 用 Devin 交付一条垂直切片(第 2 部) 
  3. 集成、测试与 CI/CD(第 3 部) 
  4. 安全、部署与运维(第 4 部)

如果您的 GitHub 主页是被遗忘仓库的“墓地”,那您并不孤单。我的主页也堆满了半成品实验。在接下来的四篇教程中,我们会让 Devin 在我被搁置的 fp-ts 习题仓库上大显身手,把去年的 clone-and-run 习题改造成现代的、基于浏览器的学习平台。

先快速说明一下这四篇教程的计划,然后其余内容我们将进入实操。

本系列教程将涵盖什么

我们将“复活”我 GitHub 墓地中的一个副项目,因为 Devin 在面对真实代码、真实测试和一些可供推理的历史时表现最佳,而不是一个空仓库。

这个项目是fp-ts-exercises,收集了一些小挑战,用于在 TypeScript 中讲解函数式编程概念(如 Option、Either 等)。它目前是一个 clone-and-run 的仓库:学习者把它拉到本地,编辑文件,并在自己的终端中运行测试。

我的目标是把这些练习变成一个基于浏览器的交互式操练场,让用户可以阅读讲解、在页面内的编辑器中调整代码,并即时看到测试通过(或失败)。学习者还可以登录保存自己的进度。

注意:我是在编写这些教程的过程中与 Devin 一起更新了仓库。上面的链接展示的是 2023 年 4 月、我搁置项目前的代码状态。最新代码请见这里。

我们的四部分计划如下:

  1. 第 1 部——设置与首次 Pull Request
    • 注册 Devin,连接 GitHub。
    • 让 Devin 清理仓库:升级依赖、创建新的 lint 规则和脚本,并打开它的第一个 PR。
  2. 第 2 部——交付功能
    • 使用 Devin 规划新的浏览器 UI 和 API。
    • 构建页面,设置数据库、密钥,并让 Devin 打开功能 PR。
  3. 第 3 部——集成、测试与 CI/CD
    • 引入 Vitest/Playwright 测试,并让 Devin 保持它们为绿色。
    • 生成 GitHub Actions 流水线,把工单关联至 Jira,并将 Devin 连接至 Slack。 
    • 探索 Wiki 功能。
  4. 第 4 部——安全、部署与运维
    • 添加认证,部署我们的应用,并接入 Sentry 进行错误监控。

到最后,旧的 CLI 仓库应该会变成一个打磨精良的 Web 应用!

在开始动手之前,先给 Devin 做个整体介绍。如果您已经了解 Devin 是什么以及如何工作,可以直接跳到设置部分。

什么是 Devin?

Devin 是 Cognition 开发的一款云托管、全自主的编码代理。您把它放进一个仓库后,它会开启沙盒化的 shell、编辑器和浏览器,然后在不触碰您本地机器的前提下,端到端地规划并执行任务。

它于 2024 年 3 月发布,Cognition 的博客文章称,Devin 在 SWE-bench 基准上关闭了 13.86% 的真实 GitHub 问题,远超此前 1.96% 的 SOTA。实际上,这意味着在一个精心挑选的子集(570 个问题)上,它在无人帮助的情况下修复了来自 Django、scikit-learn 等热门项目的 79 个 Bug。

这很惊人,但这是基准测试代码(由明确的小缺陷和测试套件构成),与真实世界仍有差距。无论如何,有人认为它的表现可与初级开发者相当。

Devin 的适用场景

在以下需求中,Devin 是很好的伙伴:

  • 增量式仓库升级:它能运行测试、升级依赖并迭代修复破坏,非常适合“把这个 Node 14 项目升级到 Node 20”这类任务。
  • 范围清晰的功能工单:给它一个具有明确验收标准的 GitHub issue 或 Jira 工单,Devin 的“规划-编辑-测试”循环就会表现相当不错。
  • 非编码任务:重新生成文档、接入 CI 模板、批量格式化文件这些对人类来说枯燥的活,正适合交给代理去做。

devin 的优势与局限

不过,Devin 并不太适合:

  • 从零开始的架构设计:如果您只是说“从头给我搭一个 SaaS 平台”,它会很吃力。它需要脚手架,并且在有更多上下文时表现更好。
  • 模糊的产品决策:让它在 Stripe 与 Paddle 之间选择支付方案,它可能只是随机挑一个。
  • 超大的 monorepo:上下文限制意味着它必须频繁换入换出文件,在 10 万行规模的工作区上性能会大幅下滑。

Devin 如何工作?

包括 Devin 在内的所有现代编码代理都会运行一个循环,映射到机器人学的控制周期:

阶段

Devin“看到”的内容

关键技术

感知

读取代码文件、测试日志、终端输出、浏览器 DOM

代码索引器、日志解析器

认知 / 规划

将用户提示拆解为任务列表,推理顺序与工具

基于 LLM 的规划器,带检索增强记忆

行动

执行 shell 命令、编辑文件、点击网页界面

安全沙盒(Docker/VM),提供 Shell / 编辑器 / 浏览器工具

反思 / 学习

重新运行测试、检查差异、更新计划(或向您询问)

自我批判提示 + 向量存储记忆

持久化

保存时间线与工件,便于回放或交接

云对象存储 + 时间线 UI

devin 的工作原理

Devin 由一组分层协作的模块构成:

  • 一切从聊天界面或 Slack 机器人/Jira 工单开始,您以提示语的形式阐述目标。
  • 提示会交给规划 LLM,它将目标扩展为逐步计划,并在执行前对每一步进行自我批判。
  • 一个轻量级执行器随后为每一步选择合适的工具(shell、代码编辑器或无头浏览器),所有这一切都在严格沙箱化的工作区内运行。
    • 这个沙箱本质上是一台云端笔记本,隔离凭据,并为 Devin 提供 Bash 提示符、类 VS Code 的编辑器,以及可以点击操作的 Chrome 实例。
  • 在工作区之下是记忆层,它存储代码库的向量化快照,以及 Devin 触达的每条命令、文件差异和浏览器标签页的完整回放时间线。

devin 的运行循环

为什么这种架构这么好?首先是紧密的反馈回路:一旦测试失败或 lint 报错,Devin 就能自主迭代,直到构建变绿。

其次,沙箱设计让并行化小任务变得轻而易举,因为多个沙箱可以并行运行且互不干扰。

第三,持久化记忆让 Devin 能处理长周期迁移:代理可以维护一个持续更新的子任务清单,并在数小时或数天内逐步完成,这意味着它能比人工手动快数倍完成批量重构。

开始使用 Devin

先说正事,我们来创建账号。

注册并选择套餐

前往devin.ai,点击“Get Started”。

向导的前几步很容易跟随。我需要回答一些关于我自己、公司和团队名称的问题。如果您像我一样是独立开发者,也没问题,向导对此有适配。

接下来就是选择套餐。有两个选项:

  • Core(按用量付费):对大多数独立开发者来说,Core 计划最便宜——您需预付 20 美元,获得 9 个 ACU(Agent Compute Unit,代理计算单元)。
  • Teams:Teams 计划每月提供 250 个 ACU。这份官方文档提供了有关 ACU 和 Devin 计费模型的详细信息。

devin 定价

Core 计划的试用成本相对较低,于是我决定付 20 美元看看能走多远。 

我填写了支付信息,并看到可以设置自动充值阈值的选项,以便 Devin 在任务进行中自动补充 ACU,避免中途停止。我没有启用这个功能,而且此时也不太建议开启。稍后您可以在设置中再启用,先试一项任务,看看用量如何。您也可以为每次会话设置 ACU 限额,避免超预算。

速算:$20 / 9 ACU ≈ 每 ACU $2.25。Teams 订阅($500/月)把单价降到 $2.00,并预装 250 个 ACU,但只有当您预计 Devin 每月运行 30+ 小时才会更划算。

连接 Github(可选连接 Jira 与 Slack)

接下来需要连接 GitHub 账号,并授予 Devin 访问仓库的权限。

将 devin 连接到 github

我只给了 Devin 访问我们的 fp-ts 习题仓库的权限,因为它只需了解这个仓库。您也最好这么做,以避免任何意外的代码修改。

完成后,我可以选择连接项目管理系统。Devin 似乎支持与 Jira、GitHub Issues 和 Linear 的集成。

devin 可与 Jira、GitHub Issues 和 Linear 集成

点击 Jira 选项会打开此模态框,黄色的说明指出,最好让 Devin 使用一个特定的服务账号,并且只访问一个工作区,即便这意味着您需要为此创建一个专用的 Jira 账号。

devin 与 jira 的集成

请注意,Jira 集成也可以在稍后通过设置添加,因此此阶段并非必须。

您还可以选择与 Slack 集成,但我暂时跳过了。

第一个任务:升级一个过时的仓库

好了,既然已经设置完毕,我们直接进入有趣的部分。看看 Devin 到底有多能打!

编写提示

初始设置完成后,我们会来到这样一个页面:

devin 首页

毫不意外,一切都从提示开始。我把所有小图标都悬停看了一遍,了解可用功能,然后写下了我的提示。

提示: 几年前,我启动了一个名为 fp-ts-exercises 的仓库,旨在帮助开发者使用 fp-ts 库在 TypeScript 中学习函数式编程。它包含一系列本地练习,涵盖 Option、Either 等概念。学习者会克隆仓库、完成习题,并运行测试检查答案。

我想按以下目标对该项目进行现代化升级并重新发布:

更新并重构现有代码库

  • 更新所有依赖,并确保与最新版本的 fp-ts 兼容
  • 改进结构、可读性和开发者体验
  • 替换任何过时的工具或模式(例如,如合适则从 Mocha 迁移到 Vitest)

这不是一个很好的提示,但这正是我想测试的点。AI 代理的输出质量取决于它收到的输入,一个模糊的目标可以有多种解读。在 Devin 的场景下,沟通不畅的成本不低。如果执行边界和预期产出定义不清,而您又让它做一个半复杂的任务,就会浪费大量 ACU。 

我想测试的是“发送”按钮旁边那个“小魔法笔”图标。这是一个“分析提示(Analyze prompt)”功能,可在发送前帮您优化提示,从而更好地发挥 Devin 的能力。

我点了它,它会改写我提示的部分内容,并指出可以改进的地方。

反馈很好,于是我稍微修改了提示,补充了额外要求。当时我还没有设置 lint 或单元测试,于是我指定要在第一个问题的解答上运行学习者测试,以确保应用按预期运行。

提示:我想对我的 fp-ts-exercises 仓库进行现代化升级并重新发布,它用于帮助开发者使用 fp-ts 库在 TypeScript 中学习函数式编程。仓库包含本地练习,涵盖 Option 和 Either 等概念。学习者克隆仓库、完成练习,并运行测试以检查答案。目标是更新项目并改善开发者体验。请执行以下事项:

  • 将所有依赖更新至最新版本,并确保与最新的 fp-ts 版本兼容。
  • 重构现有代码库,以提升结构、可读性和整体开发者体验。
  • 替换任何过时的工具或模式。例如,从 Mocha 迁移到 Vitest,或提出其他合适的工具更新。请为您提出的任何工具更改提供理由。
  • 确保在更新和重构后,所有现有练习和测试均能正常运行。

您可以运行 npm run solution -- option 01 来确保测试通过,一切按预期工作。

请说明您将采取哪些步骤来执行更新和重构。在进行重大更改之前,请先提出您的方案并获取反馈。

您可以在 Pull Request 中提交更改以供审查。

果不其然,这次分析提示后弹出了“Prompt looks good!”的提示。

提示优化 devin

界面

我发送了提示,Devin 立刻开始“思考”。

UI 乍看有点复杂,不过一旦了解各部分用途,导航起来其实不难。我们来分解一下。

左侧是可折叠的活动会话面板,如果您希望一次专注一个会话,可以收起它。 

有一个类聊天界面,您可以跟随 Devin 的推理并与之交互。 

屏幕右侧是一个带多个标签的面板:Progress、Shell、Browser 和 Editor。这些标签展示 Devin 在不同环境下的具体推理与执行步骤。

逐个点击可以看到它在 shell 中的步骤(比如克隆仓库)、在浏览器中的操作(导航到 GitHub 仓库页面),以及在 Editor 中的操作(一个类 VSCode 的编辑器,包含仓库的所有文件,稍后它会在这里修改我们的代码)。Progress 标签会高亮它正在执行的步骤。

屏幕右上角还有一组标签:Timelapse、IDE 和 Browser。这些是您可以导航和使用的视图。当前选中的 Timelapse 标签展示了 Devin 的进度与操作,如上所述。交互式时间回放功能(您可以看到底部的“Live”和进度条)允许您回放会话。IDE 标签会打开一个在线的类 VSCode IDE,您可以修改代码,甚至提交到 GitHub。

规划与 Devin 的推理

Devin 思考了几分钟,分析了整个仓库,并在每一步都解释了它的操作。注意高亮的“Devin 克隆了仓库,建议设置 Devin 工作区”的消息。我们稍后会回到这个问题。

devin 输出

随后它给出了一个计划,表示信心较高,并让我确认:

我对这个计划很满意,就点了 Confirm。Devin 立刻开始动工。

您能看到聊天界面底部那个“Agent”下拉菜单吗?菜单里的另一个选项是“Ask”。此功能不会打断 Devin 的工作,但允许您与它互动。我决定测试一下,让它添加 lint 和 TypeScript 编译检查脚本。

devin

工作已经开始了,但它告诉我会确保添加这些脚本(结果确实添加了!)。

Pull Request

我没有精确计时,但几分钟后它就准备好了一个 PR,描述详尽准确。

devin 提交的 pull request

让我惊喜的是,它主动做得比“确保第一个解答的测试通过”更多。它不仅测试了第三个解答,还测试了第一个练习,并检查测试失败(这是预期的,因为还没有学习者完成该练习)。

我审阅 PR 时就怀疑我的 lint 和 TypeScript 编译脚本会失败。比如,我的 package.json 中缺少了 "type":"module"。

我不确定为什么 Devin 在写完这些脚本后没有运行它们来确认是否可用。是因为我没有明确要求?还是因为我在它开始工作后才加了这些需求?

我决定用在线代码编辑器修复 Devin 的疏漏,大约花了 5 分钟。我在终端里把每个命令都跑了一遍,修复后看起来一切都如预期工作。

我本可以把修复交给 Devin,但自己处理更快。大概五分钟里,我运行脚本、确认了 lint 和编译失败,并定位了原因。又过两分钟,补丁就到位,所有检查都通过了。起草一个详细提示、等待 Devin 运行、再审查它的输出,反而更费时间。

在人机协作中找“最佳分工点”是一门微妙的艺术:当一个微调显然是低垂果实时,我宁愿自己动手,也不想打字说“请修这个”然后等待。当然,每个人都有自己的偏好,取舍会因您的经验、任务本身,乃至——说实话——当天的心情而异。

结束会话

到这个时候,我已经完成了仓库的现代化升级,而且一切如预期运作。接下来呢?我该如何结束会话?空闲时间还会继续计费吗?

此时界面有点令人困惑。右侧会话菜单有两个选项:让 Devin 睡眠,或终止会话。

终止 devin 会话

终止 devin 会话

我查了文档,得知 Devin 在睡眠时不会消耗 ACU,并会在约 0.1 个 ACU 的空闲后自动进入睡眠。

我还问了文档的 AI 机器人“睡眠”和“终止”的区别:

devin 的睡眠 vs 终止 

答案相当清楚。我们这次的工作已经完成,于是我终止了会话。

在 Devin 工作区中设置我们的仓库

还记得 Devin 规划工作时在聊天里给我们的高亮消息吗?它让我们在 Devin 的机器上设置仓库,这样每次想在上面工作时就不用再克隆了。但我们为什么要这么做呢?每个新会话都会从一台全新的虚拟机开始,所以如果不进行设置,Devin 每次都得:

  • 从零开始了解我们的代码库
  • 安装所有依赖和工具
  • 学习我们的项目结构和约定
  • 把宝贵时间浪费在环境搭建上,而非实际工作

因此,设置我们的仓库会更省钱省时。它也更一致,因为每个会话都从同样的配置启动,Devin 清楚如何运行、测试和 lint 我们的代码。

此功能可在您团队的导航面板中找到,步骤依然相当直观易懂。

我们先指定拉取仓库最新版本的命令:

您可以输入自定义命令,点击“Verify Command”按钮会在您面前的终端里自动运行。几秒内即可看到成功或失败。

我跳过了密钥设置步骤,因为我们目前没有。安装和维护依赖也是相同的流程,命令成功后该步骤会标记为完成。

后续步骤也大同小异,所有步骤完成(或不适用则跳过)后,您的配置就会被保存。

会话用量与回顾

到目前为止,我们用 Devin 完成了一个简单任务、创建并合并了 PR,还为未来的会话设置好了仓库。我们来看一下本次会话的数据。点击会话顶部的小图标,会打开一个包含会话洞察的模态框:

Devin 上的 ACU 使用情况

我们的会话大小为 XS,按 Devin 的尺寸指南来看相当不错。

如果您点击“Generate Insights”按钮并等待几秒,就能看到有关会话的一些总体信息、Devin 采取的具体步骤以及它遇到困难的地方。

我也很关心我们用了多少 ACU。有点奇怪的是,套餐页面显示我还剩 8.73 个 ACU,尽管我已经用了 9 个中的 1.7 个 ACU(见Core 区域内的蓝色高亮)。

而“Usage & Limits”页面则正确显示我们用了 1.7 个 ACU,还剩 7.3 个 ACU。

18 小时后我再看,套餐页面也显示剩余 7.3 个 ACU,因此其信息更新会有些延迟。请务必以“Usage & Limits”页面为准,避免意外!

值得吗?

我们来算一算。

1.7 个 ACU × $2.25/ACU = 本次会话 $3.83。

我大概花了20 分钟用于编写提示和审阅。要是全程手动,远不止这个时间,而且我会在每一步都拖延,因为这种任务对我来说格外无聊。花一杯卡布奇诺的钱,Devin 替我干完了活。这笔交易我随时愿意做。

接下来做什么?

好的,我们已经:

  • 创建了账号
  • 连接了 GitHub 仓库
  • 在 Devin 的机器上为后续会话设置好了仓库
  • 运行了第一次依赖升级任务
  • 审阅了会话指标与用量

起步不错!在下一篇教程中,我们会更深入地挑战 Devin 的能力,让它规划并实现完整功能,包括 API 和数据库集成。

如果您已经准备好继续,请点击下方列表的第二项进入第二篇教程:

  1. 设置与首次 Pull Request
  2. 用 Devin 交付一条垂直切片(第 2 部) 
  3. 集成、测试与 CI/CD(第 3 部) 
  4. 安全、部署与运维(第 4 部)

Marie Fayard's photo
Author
Marie Fayard

我是一名具有产品思维的技术负责人,专注于帮助早期初创公司从首个原型成长到实现产品与市场匹配,并持续向前发展。我对人们如何使用技术充满好奇,热爱与创始人及跨职能团队紧密合作,将大胆的想法变为现实。不在打造产品的时候,我会在世界的新角落寻找灵感,或在瑜伽馆放松减压。

主题
AI 代理
人工智能

用这些课程构建 AI 代理:

课程

AI 智能体入门

1 小时 30 分钟
146.4K
了解 AI 智能体的基础、组成部分及实际应用——无需编程。
查看详情开始课程

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。
查看更多