.cursorrules 是 Cursor 中的一个特殊文件,需放在打开文件夹的根目录。它具有以下重要作用:
在上一篇文章中也提到,Devin的一个非常有意思的变化是,它更像一个有章法的实习生。它知道先做一个计划出来,然后在执行的过程中不断地更新计划的进度。这一方面,让我们作为AI Manager能够更轻松地掌握AI当前的进度;另一方面,也让它不至于偏离原有的计划,实现更高的思维深度和任务完成质量。这个功能看起来很厉害,其实用Cursor是很容易实现的。对于Cursor来说,它有一个特殊的文件,叫做.cursorrules,放在打开文件夹的根目录上面。它的特殊之处在于,它让你可以改变Cursor对于后台LLM的prompt。换言之,这个文件里的所有内容都会作为prompt的一部分,发给后端的AI,比如GPT或者Claude。这给我们的定制化带来了非常大的灵活性。比如我们可以把计划的内容放在这个文件里,这样每次我们跟Cursor对话的时候,它都会得到一份最新版的计划。同时在这个文件里,我们也可以给它更详细的指令,比如让它任务开始的时候先思考和制定一个计划,每次做完一步之后都要更新这个计划。由于Cursor可以利用更改文件的agent,而.cursorrules本身就是一个文件,因此这就实现了一个闭环。它每次都会自动地读取这个文件的内容,了解最新动态,在经过思考之后,把更新后的进度和下一步的计划写到这个文件里,让我们始终能够得到最新的更新。
相比于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写代码,遇到一个让人抓狂的问题——一开始AI输出的代码还挺正常,可是越聊到后面,它突然开始"放飞自我":生成的代码乱七八糟,目录结构完全不对,命名风格也很混乱...那会我还不知道.cursorrules这个"宝藏",只能一遍遍地提醒AI:"要用这个框架","放到那个目录","按这个规范写"。直到我发现了Cursor的隐藏功能,才彻底解决了这个困扰...[heading2]一、什么是.cursorrules[content]简单来说,.cursorrules就是一个需要放在项目根目录的"说明书"。想象一下,你请了个助手帮你整理房间。第一次你得告诉他:"衣服要叠好放衣柜""书本要按大小排列""零食要放储物盒"...但如果你把这些要求写成一份"整理指南",助手每次来都能按照这个指南操作,是不是就不用重复说了?.cursorrules就是这样的存在——你提前把编码规则、项目结构、注意事项写在这个文件里,AI就会自动按照这些"要求"来帮你写代码。