在当前的AI编程领域,推动能力飞跃的大模型如Claude 3.5 Sonnet,其「智能」水平已然跨越了许多界限。然而,影响AI编程效果的另一个关键因素是上下文长度。
Claude 3.5 Sonnet提供最长200k token的上下文长度,这对于对话模型来说是相当充足的,甚至可以轻松处理5万、10万字的书籍。然而,对于包含数十个、上百个代码文件的编程项目来说,这样的上下文长度仍显不足。此外,当前大模型按输入和输出的token数收费,边际成本并非为零。
基于以上两个特性,Cursor、Windsurf等AI编程工具进行了大量优化,目标如下:
尽量准确获取任务相关代码,节约上下文长度,以实现多步骤任务的调优,提升用户体验。
尽量减少读取「不必要」的代码内容,以便于任务调优和节约成本。
在这些局限和目标条件下,Cursor与Windsurf采取了不同的调优策略来提升产品体验。然而,这种「调优」往往是取舍的结果,各自可能牺牲部分用户体验。
本文旨在帮助读者理解这两款工具的「调优」方式和逻辑,掌握这种取舍后,我们可以更好地利用不同产品的优劣势,在不同场景下选择合适的工具和使用方式,以实现最佳任务效果。
基于最近的使用经验和对Cursor 0.43.6与Windsurf 1.0.7版本的评测,得出以下结论:
在agent模式下,执行初级任务的表现优于常规的Cursor Composer模式,因为agent模式会基于任务理解代码库,找代码文件,读代码,再一步步执行操作完成任务。
Windsurf的agent在理解任务和执行多步操作的能力上,调优效果优于Cursor Composer模式下的agent。
Cursor agent模式下,默认读取一个代码文件的前250行,如果不够,偶尔会主动续读,增加250行;在部分要求明确的情况下,Cursor会执行搜索,每次搜索结果最多为100行代码。
Windsurf每次读取代码文件200行,如果发现不够,会尝试再次读取,最多尝试3次,共读取600行。
在Cursor中,如果@某个代码文件,Cursor会尽量完整读取(测试临界点2000行)。
Windsurf的@代码文件与Cursor的@代码文件逻辑不同。在Windsurf中,@某个代码文件仅表示帮助Windsurf找到了对应的文件,但并不会完整读取。
如果你理解自己在做什么,执行的任务与哪个代码文件有关,那么Cursor中@将获得更好的效果。如果@codebase,当前判断是Cursor会用小模型执行对每个代码文件的理解并总结,未能完整纳入必要的代码。
以上结论基于我日常高频使用Cursor、Windsurf的体感(500+小时),并结合一次针对性的测试。在这次测试中,我使用了一个长达1955行的视频字幕文件。字幕文件的优势在于有时间戳且内容上下文紧密,便于判断AI编程工具的读取情况。
为了验证是否真实「读」,我在每500行中间随机插入了一些与内容无关的信息,以便事后确认Cursor、Windsurf的读取程度。
Round 1:Cursor Composer Normal模式未主动查找字幕文件,任务直接失败。
Round 2:Cursor Composer Agent模式下,找到并读取字幕文件,但只读了250行。
Round 3:Windsurf Cascade,默认agent模式,找到并读取字幕文件,读了三次,但也只读了600行。
Round 4:Cursor Compose模式,主动@代码文件,Cursor完整读取全部内容,首次获得正确结果,并通过后续问题确认其真实读取。
Round 5:Cursor Compose模式,主动@codebase,Cursor大致总结了视频内容,但后续问题回答错误,判断为小模型总结。
Round 6:Windsurf Cascade,主动@代码文件,获得的总结依然只有600行,说明没有完整读取。
每个代码文件最好控制在500行以内(Cursor agent读两次的范围)。
在代码文件的前100行写清楚该文件的功能和实现逻辑(通过注释的方式,便于agent索引)。
如果你是新手,在项目初始状态下,或面对简单项目,使用Windsurf效果更佳。
如果项目复杂,单个文件长度超过600行,且对项目熟悉,能准确@对应文件,最好使用Cursor。
频繁重新开始对话(如每完成一个新功能或解决一个bug),避免带入过长的上下文,以免污染项目。
频繁记录项目状态和结构到特定文档中(如readme.md),在重启对话时能快速帮助Cursor/Windsurf了解产品状态,避免带入过多上下文。