ChatGPT 人工智能 GPT4 伦理 生成式 医疗 监管 安全 机器学习 深度学习 神经网络 计算机视觉 强化学习 模型 算法 应用 开发 研究 工具 平台 框架 数据集 训练 部署 安全 合规 培训 投资 LLM,llm AI,ai,Ai 大模型 大语言模型 制图 生图 绘图 文生图 文生视频 生成式AI AGI 世界模型 sora chatGPT,chatgpt,ChatGpt claude openai Llama deepseek midjourney 红熊猫模型 Red panda,panda Stable Diffusion,StableDiffusion,stable DALL- E 3 DALL E DALL Flux,flux 扩散模型 混元大模型 文心一言 通义千问 可灵 Pika PixelDance 豆包 月之暗面 零一万物 阶跃星辰 搜索增强 MiniMax Talkie Agent prompt fastai LangChain TTS 微调 提示词 知识库 智能体
# 热门搜索 #
搜索
展示下我怎么用Cursor写代码
2755点击    2024-10-31 15:15

在与 AI 及 AI 编程相关的论坛中,我经常看到经验丰富的软件开发人员讨论像 Cursor 这样的编程工具是否有价值,是否值得订阅


在使用 Cursor 作为我个人和工作项目日常工具几个月后,我有了一些切身体会。现在我来分享一下这个工具是否 “必须拥有”,以及如何快速从这个工具中获得好处。如果你想尝试 Cursor,我的这些经验或许能帮到你。你可能已经尝试过 Cursor,发现效果并不好,没关系,你可以根据我的建议再试试,说不定会有意想不到的好处。


声明:Cursor 并没有赞助我,我也不是产品评论员。我既不是在支持这个产品,也不是在抨击它,我只是在分享自己的使用经验。


我已经写了 36 年代码了,涉及多种语言,但在职业生涯中主要专注于 C 语言为主的计算机游戏引擎和 Go/Python/JS 的 Web 开发。我希望读者能够同样舒适高效地处理大型代码库,能够在自己选择的语言中编写和调试代码等。我会给那些希望 AI 教他们编程概念或为他们编写远远超出他们水平的代码新手非常不同的建议!


对我来说,AI 助手的吸引力在于为我处理模板和重复任务,让我能够专注于解决特定问题的有趣逻辑。我对自动生成大量代码并不特别感兴趣;我对 “写出的代码行数” 作为效率指标持高度怀疑态度。我宁愿花更少的时间编写相同数量的代码,花更多时间思考边界情况、可维护性等。

好了,不啰嗦了,咱们开始。


#01

什么是 Cursor?


Cursor 是 Visual Studio Code(VS Code)的一个分支,其核心 UI 中集成了由 LLM 提供支持的功能。它是一款专有产品,提供免费版和订阅选项;但是,定价表并没有涵盖实际订阅者的权益及其与竞争产品的比较。我会根据自己的理解在下面讨论特性时尝试澄清这一点,快速总结如下:


  • Tab 补全:这是一个专有的微调模型集合,不仅在编辑器中提供代码补全,还导航到下一个推荐操作,全部由 Tab 键触发。仅限订阅用户使用。


  • 行内编辑:这是一个基于聊天的界面,用于对选定代码进行编辑,提供简单的差异视图,使用诸如 GPT 或 Claude 等基础模型。免费和付费用户均可使用。


  • 聊天侧边栏:这也是一个基于聊天的界面,用于在侧边栏视图中进行更大的编辑,允许更长的讨论空间、跨多个文件的代码示例建议等,使用诸如 GPT 或 Claude 等基础模型。免费和付费用户均可使用。


  • Composer:这也是一个专门用于跨代码库重构的基于聊天的界面,生成多个文件的差异供你翻阅和批准,同样使用诸如 GPT 或 Claude 等基础模型。免费和付费用户均可使用。


Tab 补全


尽管其他基于 LLM 的编码工具专注于聊天体验,但在我使用 Cursor 的过程中,Tab 完成功能与我的日常编码实践最为契合,并节省了最多时间。显然,这个功能经过了大量的思考和技术研究,不仅能为一行、几行或整个函数建议补全,还能建议下一个编辑所需的下一行。这样就可以实现部分更改,然后通过反复按 Tab 键自动完成整个文件中相关的更改。


使用它的一种方式是将其视为一个加强版的代码重构工具。例如,假设我有一段变量名称采用 under_score 命名法的代码,我想将其转换为 camelCase 命名法。只需重命名一个变量的一个实例,然后通过所有应该更新的行按 Tab 键即可,包括其他相关变量。许多繁琐且易出错的任务可以通过这种方式自动化,而无需编写脚本:



有时,Tab 补全会独立找到一个 bug 并提出修复。许多时候,当我在 Python 或 Go 中添加依赖项时,它会建议导入。如果我用引号括起字符串,它会适当地转义内容。与其他工具一样,它还可以根据函数签名和可选文档字符串编写整个函数:



总体而言,这个工具让我感觉它在读我的想法,猜测我的下一步动作,让我少考虑代码,多考虑架构。


另外值得注意的是:补全的速度非常快,我从未感到等待建议的延迟。它们基本上在我停止输入的瞬间就出现。如果等待时间太长,我肯定无法接受。


那么,我对 Tab 补全功能有什么不满呢?一个小烦恼是:有时我未能及时看到建议,继续输入,补全就消失了。一旦它消失,就没有办法让它再出现,只能输入其他内容,希望能有新的建议。


另一个恰恰相反:有时补全完全错误,我会有意地拒绝它。随后,但非常少见,我会接受一个完全不同的补全,而先前拒绝的建议也会悄然应用。这已经导致一些难以追踪的 bug,因为我没有意识到错误的逻辑被接受了。虽然我并没有发现这些情况频繁到足以抵消 Tab 补全带来的生产力提升,但确实会影响效率。


行内编辑、聊天侧边栏和 Composer


据我了解,这些功能在与基础模型的交互上都非常相似 —— 我几乎专门使用 Claude 3.5 Sonnet—— 而差异在于用户界面。


行内编辑可以通过选择一些代码并按 Ctrl-K/Cmd-K 调用。我输入所需的更改,并在文件中获得一个漂亮的差异,可以选择接受或拒绝。我主要用这个来实现函数内部的代码或进行小规模重构。


一个很好的例子是,如果我循环执行一些任务,并且想将它们并行化,那么这种方法就非常有效:



聊天侧边栏通过 Ctrl+L/Cmd+L 打开,提供更多的空间进行多轮对话,尽管我对目前为止测试过的 LLM 模型有一个小的不满,那就是它们总是首先返回代码,而不是在存在歧义时请求澄清。


建议的代码有一个应用按钮,会在当前选定文件中创建一个差异。这对于在单个文件中进行更大的重构或基于我当前打开的文件创建一个全新文件很有用。如果有额外的文件相关,它们可以手动添加到上下文中,但 Cursor 会尝试根据查询及其在后台生成的索引来猜测哪些文件是相关的。


这里有一个例子,它将一个应用程序的数据库 API 转换为一个 REST API,以访问它,带有参数验证和正确的 HTTP 状态代码,然后编写一个客户端库以访问该 REST API:



另一个例子是,我在使用聊天侧边栏将客户端库从 Python 转换为 Go。注意,松散类型的 Python 是如何转换为定义良好的结构体类型和符合 Go 的习惯用法,包括错误处理!这根本不是一对一的重写:



最后,Composer 专门用于跨文件重构。这也是我使用最少的功能,但它为一次查看多个文件差异提供了更好的用户体验。


#02

.cursorrules 文件


我直到在我认为过于简陋的文档中遇到这个功能时才意识到它的存在,但各种聊天模式总是包括位于工作区根目录的 .cursorrules 文件的内容,以提供额外的上下文。我一直在尝试使用这个功能来告知 LLM 仓库的编码标准、常用包和其他文档。


这个功能可能有助于解决我在使用 Cursor 时遇到的一大障碍:除非代码风格和模式已经存在于你正在编辑的同一文件中,否则它不会遵循编码风格。例如,在可汗学院,我们使用一个专有库来在 Go 中在函数之间传递上下文。这用于记录、HTTP 请求等,因此 LLM 需要能够使用它。这在过去一直很困难,但也许一个写得好的 .cursorrules 是一个好的第一步。


目前的一个局限性是每个工作区只能有一个这样的文件,因此像我们这样的包含多种语言代码的单一代码库将比一个包含少量风格一致的代码的小型仓库更难设置。


此外,文档建议 .cursorrules 文件仅用于聊天模式,而不适用于 Tab 补全。然而,我已经尝试在工作区中将该文件固定在一个选项卡中,并确认通过这种方式至少可以将其包含在 Tab 补全的上下文中。


#03

我的工作流程发生了变化


像 Cursor 这样的工具最令人兴奋的地方并不是我可以更快地编写代码,因为说实话,实际编写代码并不是瓶颈;事实上,我经常需要放慢自己的速度,以避免过于关注代码,而忽视了要解决的高层问题。真正的价值在于改变我编码的方式。


这项技术仍处于早期阶段,但我发现它已经改变了我的工作方式,并且我预计在不久的将来还会发生以下变化:


  • 我不太可能去寻找新的库或框架。不,我不会开始编写自己的加密库,但对于小型工具,让 LLM 根据我的特定需求编写它们比引入一个通用库要简单得多。这些库往往从小而轻量开始,之后因为开放并被许多人使用,积累了我不需要的功能。


  • 许多库的存在只是为了减少模板代码,这在平衡我编写和维护这些模板代码的时间时似乎是一个必要的权衡,但现在我可以让 LLM 为我处理这些模板代码,感觉这种成本就不那么值得了。而且成本可能相当高:你尝试过让一个 Node。js 项目在编写一年或更久后运行吗?你不妨从头开始。


  • 我也不再担心在自己的代码中是否遵守 DRY(不要重复自己)。过早定义抽象会导致很多技术债务,因此能够在不尝试将其拉入函数或类的情况下创建大量代码让我有更多灵活性,我知道如果我以后需要重构共享逻辑,LLM 也能帮我。


  • 我更愿意使用不太熟悉的语言或框架。例如,我多年来一直涉足 R,尤其是在可视化数据方面。然而,坦率地说,我对此并不擅长。我对 dplyr 的理解不深,而且似乎总有十几种不同的方法来完成同一任务。现在我描述我想要的可视化,便能得到正确的数据处理和 ggplot 可视化。过去需要一个小时或更长时间的任务,现在只需五分钟,所以我不太可能放弃并改用 Python 来完成。


  • 也许有一天我会用 Rust 写点东西。很有可能。


  • 我发现自己在小组件上快速迭代,然后再将它们集成到更大的代码库中。这部分是为了绕过 LLM 在处理大型代码库时的局限性,但它也开启了我之前未曾考虑过的有趣工作方式。如上面的例子,我可以在像 Python 这样动态类型的语言中原型化一些逻辑,解决技术细节,然后立即转换为类型良好的 Go,以便集成到 Web 应用程序中。我可以让 LLM 自动生成测试数据,或者为我模拟后端以编写前端。为何在我仍在验证想法时,要承担在成熟代码库中工作的代价?


#04

总结


我是否会在几年后继续使用 Cursor,或转向其他工具,我现在无法确定。但我确定的是,在写这篇文章时,Cursor 是最好的 LLM 编程助手,我建议你试试。


文章来自于微信公众号“AI大模型实验室”,作者“李木子”


关键词: AI , Cursor , AI编程 , 人工智能
AITNT资源拓展
根据文章内容,系统为您匹配了更有价值的资源信息。内容由AI生成,仅供参考
1
AI工作流

【开源免费】n8n是一个可以自定义工作流的AI项目,它提供了200个工作节点来帮助用户实现工作流的编排。

项目地址:https://github.com/n8n-io/n8n

在线使用:https://n8n.io/(付费)


【开源免费】DB-GPT是一个AI原生数据应用开发框架,它提供开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Multi-Agents框架协作、AWEL(智能体工作流编排)等多种技术能力,让围绕数据库构建大模型应用更简单、更方便。

项目地址:https://github.com/eosphoros-ai/DB-GPT?tab=readme-ov-file



【开源免费】VectorVein是一个不需要任何编程基础,任何人都能用的AI工作流编辑工具。你可以将复杂的工作分解成多个步骤,并通过VectorVein固定并让AI依次完成。VectorVein是字节coze的平替产品。

项目地址:https://github.com/AndersonBY/vector-vein?tab=readme-ov-file

在线使用:https://vectorvein.ai/(付费)

2
微调

【开源免费】XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。它帮助开发者提供一个简单易用的平台,可以对大语言模型(LLM)和多模态图文模型(VLM)进行预训练和轻量级微调。XTuner 支持多种微调算法,如 QLoRA、LoRA 和全量参数微调。

项目地址:https://github.com/InternLM/xtuner