背景:AI编程的上下文重要性
当前,AI编程能力的大幅提升主要依赖于大模型的智能水平,例如Claude 3.5 Sonnet的突破性进展。然而,另一个关键影响因素是上下文长度。
Claude 3.5 Sonnet支持最长200k token的上下文长度,这对于对话模型来说已经足够,但对于包含几十甚至上百个代码文件、每个文件长达数百至上千行的编程项目来说,仍显不足。此外,大模型按输入和输出的token数收费,边际成本不小。
这些特性促使Cursor和Windsurf等AI编程工具进行优化,目标如下:
- 尽量准确地获取任务相关代码,节省上下文长度,实现多步骤任务的优化,提升用户体验。
- 尽量减少读取“不必要”的代码内容,既为了任务优化,也为了节约成本。
在以上局限和目标的条件下,Cursor和Windsurf采取了不同的优化策略,这些策略往往是局部最优解,各自会牺牲部分用户体验。
因此,本文旨在帮助理解和分析它们的优化方式与逻辑,从而在不同场景下灵活切换工具和使用方式,实现任务的最优解。
结论:WindSurf适合起步,Cursor适合调优
基于最近的使用经验和12.15对Cursor0.43.6与WindSurf1.0.7版本的实际评测,得出以下结论:
1. 对新手而言,初始执行基础任务时:WindSurf > Cursor Agent > Cursor Composer normal
- 在agent模式下,执行初级任务的表现优于常规的Cursor Composer模式,因为agent模式会基于任务理解代码库,定位代码文件,读取代码,再一步步执行操作完成任务。
- WindSurf的agent在理解任务和执行多步操作的能力上,优化效果优于Cursor Composer模式下的agent。
2. Agent模式的主要缺陷是不完整读取代码文件,导致复杂项目和长代码文件的问题
- Cursor agent模式下,默认读取一个代码文件的前250行,如果不够,偶尔会主动续读,增加250行;在部分要求明确的情况下,Cursor会执行搜索,每次搜索结果最多为100行代码。
- WindSurf每次读取代码文件200行,如果发现不够,会尝试再次读取,最多尝试3次,共读取600行。
3. Cursor与WindSurf在单个代码文件时,执行逻辑不同,Cursor远优于WindSurf
- Cursor中如果@某个代码文件,Cursor会尽量完整读取(测试临界点2000行)。
- WindSurf的@代码文件和Cursor的@代码文件不是一个逻辑。在WindSurf中,@某个代码文件仅仅是帮助WindSurf找到对应文件,但并不会认为该文件很重要而进行完整读取。
4. 在理解项目结构的情况下,Cursor中@单一代码文件效果远优于@codebase
- 如前所述,如果你理解自己在做什么,知道要执行的任务与哪个代码文件相关,那么Cursor中@将获得更好的效果。如果@codebase,目前的判断是Cursor会用自己的小模型执行对每个代码文件的理解并总结,它没有完整将必要的代码纳入上下文。
测试过程
以上所有结论来自于我日常高频使用Cursor、WindSurf的体验(500+小时),再加上一次针对性的测试。在这次测试中,我使用了一个长达1955行的视频字幕文件。字幕文件的优势在于有时间戳且内容上下文结偶,我很容易判断AI编程工具到底读取了多少内容,它无法“猜”。
为了验证是真的“读取”,还是通过RAG的方式总结的,我在每500行中间随机穿插了一些与内容无关的信息,用于事后确认Cursor、WindSurf的读取程度,包括: