---

本文是《理解和部署Agentic AI》系列的一部分：

* [Agentic AI系列1：Devin和Agent Cursor使用体验对比](/devin-vs-agent-cursor.html)
* [Agentic AI系列2：从智者到行者——Agentic AI的范式革命与技术架构](/agentic-ai.html)
* Agentic AI系列3：搏一搏，&#36;20变&#36;500：一小时魔改Cursor变身Devin（本文）
* [Agentic AI系列4：使用Cursor作为AI的通用入口](/cursor-ai-entry.html)

---

在[上一篇文章](https://yage.ai/devin-vs-agent-cursor.html)中，我们提到了Devin这种可以全自动进行编程的Agentic AI。相比于其他Agentic AI工具，比如Cursor和Windsurf，它有几个核心优势，尤其是流程规划、自我进化、更多的工具使用和全自动的工作方式。这让Devin显得是一个下一代的工具，和现有的Agentic AI工具拉开了一个身位。

但是在用了它一段时间之后，我的Builder's Mindset又开始蠢蠢欲动，驱使我魔改了Windsurf和Cursor，让它们也能实现Devin 90%的功能。我也把魔改的方式开源了，让你也可以在一分钟之内就把Cursor或者Windsurf变成Devin。而这篇文章主要是介绍魔改的具体思路，用这个例子来演示，Agentic AI时代，不论是构建还是拓展，是一件多么有效率的事情。为了讨论简便起见，我们下面都先用Cursor来指代这一类工具，而到最后讨论一下，如果想要用Windsurf的话，需要做哪些微小的改动。

| 工具                  | 流程规划              | 自我进化        | 工具拓展        | 全自动执行       | 价格         |
|---------------------|---------------------|-------------|--------------|--------------|------------|
| Devin               | 有（自动、完善）        | 有（自我学习）     | 多            | 支持           | $500/月     |
| Cursor（魔改前）     | 有限                 | 无            | 工具集不全        | 手动确认         | $20/月      |
| Cursor（魔改后）     | 接近Devin            | 有          | 接近Devin，可扩展          | 仍需确认或绕过      | $20/月     |
| Windsurf（魔改后）   | 接近Devin       | 有，但需间接实现    | 接近Devin，可扩展 | 支持Docker容器全自动执行 | $15/月  |

## 流程规划和自我进化

在上一篇文章中也提到，Devin的一个非常有意思的变化是，它更像一个有章法的实习生。它知道先做一个计划出来，然后在执行的过程中不断地更新计划的进度。这一方面，让我们作为AI Manager能够更轻松地掌握AI当前的进度;另一方面，也让它不至于偏离原有的计划，实现更高的思维深度和任务完成质量。

这个功能看起来很厉害，其实用Cursor是很容易实现的。

对于Cursor来说，它有一个特殊的文件，叫做`.cursorrules`，放在打开文件夹的根目录上面。它的特殊之处在于，它让你可以改变Cursor对于后台LLM的prompt。换言之，这个文件里的所有内容都会作为prompt的一部分，发给后端的AI，比如GPT或者Claude。这给我们的定制化带来了非常大的灵活性。

比如我们可以把计划的内容放在这个文件里，这样每次我们跟Cursor对话的时候，它都会得到一份最新版的计划。同时在这个文件里，我们也可以给它更详细的指令，比如让它任务开始的时候先思考和制定一个计划，每次做完一步之后都要更新这个计划。由于Cursor可以利用更改文件的agent，而`.cursorrules`本身就是一个文件，因此这就实现了一个闭环。它每次都会自动地读取这个文件的内容，了解最新动态，在经过思考之后，把更新后的进度和下一步的计划写到这个文件里，让我们始终能够得到最新的更新。

而自我进化的功能也可以使用类似的思路来实现。在`.cursorrules`这个文件里，我们加入prompt，让Cursor在被用户更正它的行为之后思考刚才犯的错误，有没有什么可以复用的经验教训记录下来。如果有的话，就更新`.cursorrules`这个文件相关的章节。通过这种方式，也可以让它积累出针对每一个project的特定知识。

一个典型的例子就是，现在的LLM，由于knowledge cutoff date相对较早，很多都不知道有GPT-4o这个模型。如果你让它调用GPT 4o的话，它会自己把o去掉，认为这里是打错了。那如果你更正它：“其实已经有了这个模型，只是你不知道而已”的话，它就会把这个教训记在.`.cursorrules`相关的章节里面，以后就不会再犯这样的错误了，通过这种方式就实现了学习和提升。但是这一点仍然取决于prompt到底有没有效，有些时候它确实也会漏掉这一点，不一定会把我们觉得有必要记成笔记的知识记下来。这种情况下，我们也可以用自然语言去nudge它一把，直接跟它说，你要把这点记下来。用这种更直接的方式也可以实现AI的经验积累和成长。

因此，仅仅使用.`.cursorrules`这个文件，加上一些prompting的技巧，我们就可以给现有的Agentic AI编程工具加上Devin非常厉害的流程规划和自我进化的能力。

这里面如果使用Windsurf的话，有一个不同的地方在于，可能是为了安全考虑，它是不允许AI直接更改`.windsurfrules`这个文件的。因此我们需要把它拆成两个部分，一个部分比如叫`scratchpad.md`，总之使用另外一个文件名。而在`.windsurfrules`这个文件里提及：当你每次进行思考前，你要先看一眼Scratchpad，并且在里面更新计划。这种间接的方式可能效果没有直接放在.`.cursorrules`里面那么好，因为它毕竟还是需要AI去调一个Agent，再根据反馈的结果进行思考，但试下来也是可以工作的。

## 更多工具的使用

相比于Cursor，Devin的一个很大的优势是它可以使用更多的工具。比如可以调用浏览器进行搜索，可以浏览网页，甚至可以调用它自己的大脑，用LLM的智能对内容进行分析。这些在Cursor里都是不支持的，但好消息是，因为我们可以通过`.cursorrules`直接控制给Cursor的prompt，而且它又有运行命令的能力，因此这又构成了一个闭环。我们可以事先准备好一些写好的程序，比如Python库或者命令行，然后在`.cursorrules`里面向它介绍这些工具的用法，这样它就可以learning on the fly，自然而然的学会如何使用这些工具来完成它的任务。

而事实上，这些工具本身也可以使用Cursor在一两分钟内写出来。比如对于网页浏览这个工具，我在[开源的项目](https://github.com/grapeot/devin.cursorrules)里就用Cursor做了一个参考实现。其中有一些需要注意的技术决策，比如为了实现对含有JavaScript内容的网页的抓取，我们在这里不使用Python自己的request库，而是使用playwright之类的浏览器。同时，为了更好地跟LLM沟通，方便它对后续内容的理解和抓取，我们并没有单纯地使用beautiful soup来提取这个网页的文本内容，而是将它按照一定规则转化成了markdown格式，因而保留了它的class name和超链接等等更细节的基础信息，通过这样的方式，在更底层的方面支持LLM撰写后续的爬虫。

类似的，对于搜索的工具，有一个小坑是，不论是Bing还是Google，它们的API的搜索质量都远远不如客户端，这主要是历史原因造成的，API和网页端分别是不同的组来负责，但是duckduckgo则没有这样的问题，因此我们使用的参考实现用的是duckduckgo的免费API。

对于Cursor使用自己的脑力进行深入分析，这件事情相对复杂一些。一方面，Cursor确实有一定程度的这样的能力，比如在上面的两个工具里，当我们把网页的内容打印在stdout上面的时候，它会作为Cursor prompt的一部分交给LLM，因此它就可以对这些文本内容做出智能的分析。但从另一个角度来说，Devin有一个独特的能力，它可以用LLM对相对大量的文本做批量处理，这个Cursor是做不到的，所以为了让它有这样的能力，我们额外实现了一个工具，非常简单，就是把我们的API key事先在系统里设置好，然后让这个工具去调用GPT或者Claude或者我们本地的LLM的API，通过这样的方式来让Cursor拥有用LLM批量处理文本的能力。在我的参考实现中，我使用的是我自己本地的一个vllm cluster，但改动起来也非常简单，只需要把base_url那行去掉就可以了。

但是即使经过了这样的改动，我们仍然有两个工具，由于Cursor本身的限制没有办法实现：

1. Devin看起来是有理解图像的能力的，这是为什么它可以进行前端交互和测试的原因，但是由于Cursor的限制，我们没办法把一个图像作为输入传给后端的AI，这个需要它在自己的实现上进行改动才可以。
2. Devin在数据抓取方面，非常神奇的不会被反爬虫算法判定成机器人，但是我们的网页获取工具在抓取数据的时候经常就要captcha，或者直接就被封了。这个也许是可以解决的，我也还在探索，但是确实是Devin的一个独特的优势。

## 全自动执行

最后一个非常有意思的特性是全自动执行。Devin因为是在一个完全虚拟化的云端环境中执行，因此我们可以放心地让它执行各种命令，而不用担心它被LLM攻击或者抽风运行什么危险的命令。就算你把整个系统都删了，只要开一个新的container，又是一条好汉。但Cursor则由于在本机宿主系统上运行，则有很强的安全顾虑。这是为什么在Cursor的agent mode里面，我们每执行一个命令之前，都需要手工去确认。对于相对简单的任务，这样是可以接受的，但由于我们现在有了复杂的流程规划和自我进化的能力，Cursor也可以有能力去完成长时间的复杂的任务，因而这种交互方式就显得不适应Cursor的能力了。

为了解决这个问题，我目前还没找到基于Cursor的解决方法（更新：12/17/2024 Cursor也加入了这个功能，叫Yolo Mode，但还不支持在Docker里开发），但是Windsurf对这个是有所考量的，甚至我觉得从它的设计里面可以看出，它从一开始就是想奔着Devin这种产品形态走，而现有的代码编辑器只是它的一个中间形态而已。更具体的说，Windsurf有一个功能是直接和一个Docker container连起来，在那里面跑，或者如果我们有一个配置文件的话，它可以直接帮你新起一个Docker container，做一些初始化，然后把你本地的一个文件夹映射过去。因此它执行的所有命令除了对本地文件夹的更改以外，全都是在Docker container里面进行的，对宿主系统没有任何影响，因而安全性得到了极大的提高。[[示例配置]](https://github.com/grapeot/devin.cursorrules/blob/master/.devcontainer/devcontainer.json)[[文档]](https://docs.codeium.com/windsurf/advanced#dev-containers-beta)

在这个基础上，它又引入了黑白名单机制，对于黑名单上的命令一概自动拒绝执行，对于白名单上的命令一概予以放行。对于二者都不在的命令，则由LLM智能判断，对宿主系统是否有风险，比如如果它要删除文件夹中的某个文件的话，它会让用户确认，但是一般的`pip install`之类的命令，它会直接放过。但注意这个特性似乎只有在Docker container里面运行的时候，才会被启用。如果我们是在宿主系统中运行命令的话，体验仍然和Cursor很像，还是需要频繁地按确认。同时，自动的命令执行也需要在配置中进行开启。[[文档]](https://docs.codeium.com/windsurf/cascade#terminal-commands)

## 小结

因此我们可以看出，虽然Devin的产品形态和设计理念确实非常先进，但是从技术壁垒上来说，它和现有的Agentic AI的工具之间的沟壑并没有我们想象的那么大。使用基于15到20美元每个月的流行工具，比如Cursor和Windsurf，我们完全可以在一小时内实现Devin 90%的功能，并且用它来完成以魔改前做不到的复杂任务。比如我给Cursor布置了一个任务，是分析一下近5年来热门科技股票的收益率，做一个深度的数据分析，它给了一个非常[详尽完善的报告](https://yage.ai/cursor_stock/)。另外，我又让Windsurf抓取我的博客前100篇文章的发贴时间，并且把它用github贡献图这样的方式可视化出来，它也可以全自动的完成。像这两种任务用传统的cursor和Windsurf都是没办法做出来的，只有用Devin才可以，但是在做了这个简单的更改之后，我们用一个月只要是20美元的工具，也可以实现一个月500美元的工具的效果。我甚至做了一个更深度的实验，作为一个完全不懂前端的dev，花了一个半小时做出来了一个有前端后端五脏俱全的[招聘网站](https://github.com/grapeot/WeiLaiKeJi/)。这个效率和Devin相当接近甚至更高了。

最后，在文中提到的所有文件都可以在[这个github repo](https://github.com/grapeot/devin.cursorrules)下载，只需要把里面的内容拷到你当前工程的文件夹下面就可以了。

<script async data-uid="49b08a3e73" src="https://yage-ai.kit.com/49b08a3e73/index.js"></script>
