在上一篇文章中,我们提到了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在一两分钟内写出来。比如对于网页浏览这个工具,我在开源的项目里就用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本身的限制没有办法实现:
- Devin看起来是有理解图像的能力的,这是为什么它可以进行前端交互和测试的原因,但是由于Cursor的限制,我们没办法把一个图像作为输入传给后端的AI,这个需要它在自己的实现上进行改动才可以。
- 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里面进行的,对宿主系统没有任何影响,因而安全性得到了极大的提高。[示例配置][文档]
在这个基础上,它又引入了黑白名单机制,对于黑名单上的命令一概自动拒绝执行,对于白名单上的命令一概予以放行。对于二者都不在的命令,则由LLM智能判断,对宿主系统是否有风险,比如如果它要删除文件夹中的某个文件的话,它会让用户确认,但是一般的pip install
之类的命令,它会直接放过。但注意这个特性似乎只有在Docker container里面运行的时候,才会被启用。如果我们是在宿主系统中运行命令的话,体验仍然和Cursor很像,还是需要频繁地按确认。同时,自动的命令执行也需要在配置中进行开启。[文档]
小结
因此我们可以看出,虽然Devin的产品形态和设计理念确实非常先进,但是从技术壁垒上来说,它和现有的Agentic AI的工具之间的沟壑并没有我们想象的那么大。使用基于15到20美元每个月的流行工具,比如Cursor和Windsurf,我们完全可以在一小时内实现Devin 90%的功能,并且用它来完成以魔改前做不到的复杂任务。比如我给Cursor布置了一个任务,是分析一下近5年来热门科技股票的收益率,做一个深度的数据分析,它给了一个非常详尽完善的报告。另外,我又让Windsurf抓取我的博客前100篇文章的发贴时间,并且把它用github贡献图这样的方式可视化出来,它也可以全自动的完成。像这两种任务用传统的cursor和Windsurf都是没办法做出来的,只有用Devin才可以,但是在做了这个简单的更改之后,我们用一个月只要是20美元的工具,也可以实现一个月500美元的工具的效果。我甚至做了一个更深度的实验,作为一个完全不懂前端的dev,花了一个半小时做出来了一个有前端后端五脏俱全的招聘网站。这个效率和Devin相当接近甚至更高了。
最后,在文中提到的所有文件都可以在这个github repo下载,只需要把里面的内容拷到你当前工程的文件夹下面就可以了。
Comments