AI 编程助手的技术与交互变迁:从 GitHub Copilot 到 Cursor,再到 Windsurf

大模型向量数据库数据库

当 20 多年前,我们用 Vim 编写代码时,谁能想到,有一天我们会突然遇上一款懂你的 AI 代码编辑器?你输入一个函数名,它就能迅速帮你补充完整;你敲下一行代码,它能预测接下来该怎么写;甚至你只需要用自然语言描述需求,AI 就能自动生成你所需的代码片段。那时,我们或许只觉得手动写代码是一种必然的付出,而今天,这一切都在悄然发生改变。

AI 编程助手的初步探索:GitHub Copilot 的诞生

我很难描述当我第一次用 Github Copilot 时的惊讶,它大概率能猜中你的想法,只需按下 Tab 键,接下来的代码就能自动补全,仿佛它早就知道你下一步在想什么。

picture.image

Copilot 到底是如何判断我们的代码意图呢?

Github Copilot 背后的技术力量是 OpenAI 的一个专门为编程任务设计的 Codex 模型,它继承了 GPT-3 的基础架构,但经过了大量的编程代码数据的训练,使得它能够理解代码的语法和语义,所以我们在使用过程中也可以明显感受到:数据集比较多的编程语言(Javascript)补全效果要明显优于一些历史还没有那么久远的新框架或语言(Flutter)。

在具体的项目中,要达到一个比较理想的生成效果(让开发者产生**“懂我”** 的感觉),最重要的是需要结合用户正在输入的代码片段理解关联的上下文语义,也就是如何组织输入给模型的 Prompt,让其精确理解并精准输出。Github Copilot 主要是基于当前工作的代码编辑器中的两个维度来做上下文的收集:

  1. 基于就近原则 :Copilot 会监控光标位置,并根据光标所在的行以及所在函数/类的上下文来收集相关代码。这是因为编程通常遵循一定的模式和结构,通过光标位置附近的代码,可以推测出你在做什么,并预测你想要编写的下一行代码。例如,在一个 for 循环中,光标位于循环体内,Copilot 可能推测你在编写循环体的逻辑,自动补全循环内部的语句。
  2. 多文件上下文关联: 为了能有更多信息去猜测开发者的真实意图,Copilot 还会考虑已在编辑器中打开的其它代码文件,因为它认为已经打开的文件属于刚刚编辑过,与当前编辑区域关联性较大。但如果拿全量代码作为上下文一方面会增加不必要的性能开销,另一方面会带来很多干扰信息(参考 GPT 模型的 Transformer 机制),所以 Copilot 的做法是通过 Jacobian Difference Algorithm 算法去分析出这些打开文件中有哪些与光标位置附近相关联的代码片段,将它们提取出来作为上下文补充。

通过上述分析,我们可以发现,Copilot 的核心功能定位是在代码补全上,对于在公共领域训练集中出现频繁的代码片段(如常见的工具、算法或标准库函数),它能够提供精准的补全。然而,对于业务代码库的理解不足,当面临一些业务逻辑较为复杂或者项目结构不规范的代码时,Copilot 的补全效果往往不尽如人意,尤其是在处理较为独特的业务需求时。

为了提升 Copilot 在特定项目中的表现,我们可以采取一些优化措施。一方面,规范化项目代码结构至关重要。例如,采用经典的 MVC 架构,并在每一层(如模型层、视图层和控制层)中遵循统一的框架和代码规范,可以帮助 Copilot 更好地理解代码上下文。通过保持架构一致性,Copilot 可以更准确地捕捉到相关代码片段,从而提升补全的准确性。

另一方面,在开发过程中,可以尽量将每一层中具有代表性的代码文件保持打开状态。这样,Copilot 就可以从这些文件中提取相关的上下文信息,进一步提高它对当前编写内容的理解度。例如,如果你正在编辑控制层的代码,而视图层或模型层的代码也在编辑器中处于打开状态,Copilot 会更容易推测你可能想要编写的内容,并根据这些信息提供更为精确的代码建议。

Github Copilot 用了一段时间后,发现它在体验上还是有着明显的不足:

  • 首先,它核心功能聚焦于代码补全,但对于业务代码库的理解不足,这也导致在很多场景下补全的准确率无法达到预期,我们的项目较复杂,在尝试上述的规范化等措施后,统计的不全采纳率也才 30%到 35%之间。
  • 其次,响应速度偏慢,有时会出现明显的等待时间(没有命中缓存时),丝滑感不够。

而 Cursor 的横空出世让我对 AI 编辑器有了新的认知。

AI 编程助手的智能化进化:Cursor 的崛起

首先我们来理解一下“熵”这个概念。熵是用来描述信息系统中不确定性的量度,当一个事件的结果是高度确定的(比如 100%会发生),它的熵就低,反之,熵就比较高。

而 Cursor 的设计理念则从代码补全,全面升级到智能代码编辑,也就是通过 Cursor Tab(按下Tab键)来最大化利用代码的低熵特性:

  • 将那些可预测性强的下一步编辑(例如跳转到特定行、修改某些显而易见的内容)用 Tab 键一键完成。
  • 降低用户在这些简单操作上的认知负担和时间消耗。

picture.image

由此可见,Cursor 不再局限于代码补全,它聚焦于打造**“零熵编辑”体验:按下 Tab,直达目标** 。每次按下 Tab,用户获得不仅是完成进度的推进,更是对“工作流”流畅性的直观感受。而 Cursor 团队将“让用户尽可能多按 Tab”视为内部目标,以确保每一次按键都能推动用户更接近编辑完成。它的多行编辑就是另一个能深刻体现这种思想的特性,当编辑某一行代码的细节时,它认为后续的代码行中相似结构的修改属于可预测性的低熵操作,因此按下 Tab,直达目标。

picture.image

此外,我们能感知到 Cursor 预测的速度非常快,相较于 Copilot 明显的延迟感,Cursor 做到了又快又准 ,它是如何做到的这一点?这里就需要提到 Cursor 的两项关键技术点:

  • MOE(Mixture of Experts)模型组
    目前的大模型(GPT、Claude)普遍采用大型 Transformer 架构,每次前向传播时都会激活所有的参数,计算成本与参数规模线性相关。而 Cursor Tab面临的一个挑战就是如何处理大量的代码和上下文信息,并在低延迟的情况下给出快速的预测。Cursor 选择了舍弃使用通用大模型,转而训练一组针对不同任务的专家模型来解决这一问题:

由于每个专家模型针对特定任务,参数量远远小于通用大模型,经过路由判断后,每次预测可能只需要激活其中的一到两个专家模型,在不影响效果的情况下计算成本却大幅度降低,从而实现了 Cursor Tab所需的高性能、低延迟能力。

+ **专家分工**
:每个专家模型根据代码的不同上下文或结构,专注于特定的代码片段。例如,一些专家可能专门负责处理函数调用,另一些则专门处理声明或控制流结构(如循环或条件语句)。
+ **路由机制**
:在输入送给 MOE 模型组之前,会经过一个专门设计的路由器,它根据输入的上下文决定哪些专家需要被激活。在
 `Cursor Tab`
中,当开发者编写代码时,路由器会评估代码的上下文,并选择相关专家模型进行处理。例如,在处理代码段的注释时,可能会选择一个专注于自然语言理解的专家;而在处理数学公式时,可能选择一个擅长处理计算相关的专家。
  • 推测编辑(Speculative Edits)技术
    在标准的LLM推理中,每个token依赖于所有先前生成token的上下文。下一个token(n+1)在当前token(n)可用之前无法生成。

picture.image

咱们写过程序的都知道,这是一种串行机制,要提升计算速度,最好的方式就是将串行该并行,这就是推测编辑技术的思路。它不仅仅基于当前状态生成下个token,而是根据当前的输入和上下文,预先预测接下来的几个操作或修改。为什么它的精确度能做到足够高呢,一方面它利用了代码序列这种可预测性和结构化的特性,另一方面它不仅仅是在每个生成步骤上进行单一操作,而是累积多次编辑历史,并根据历史信息做出智能推测。

最最关键的是:由于它通过推测生成了多个候选操作,当模型意识到推测的内容不符合用户的实际意图时,它会立即进行修正,重新生成符合当前上下文的代码。这与传统的生成式模型不同,传统模型可能会产生不合适的输出,而推进式解码能通过不断调整,减少生成错误。 picture.image

通过 MOESpeculative Edits这两项技术,Cursor真正实现了它的理念:“零熵编辑”体验:按下 Tab,直达目标 。当然,除了 Cursor Tab之外,Cursor还在编程环境上做了许多创新,例如,它设计了Code Diff特性,将chat中生成的代码应用到项目中时,会通过智能化的diff显式帮助开发的同学有效识别重要变化,减少不必要的验证工作。

picture.image

还有许多其它的特性,例如 @Codebase可以基于完整仓库来交流,并且它对于项目仓库的理解甩开Copilot的 @Workspace好几条街。 Cursor Composer(目前只是实验特性)则支持了多文件协同编辑能力,极大缓解了大型项目中,我们常常需要在多个文件之间频繁切换和修改的效率痛点。大家可以多使用和感受,会不断有新的惊喜。

AI 编程助手的多元化发展:Windsurf的异军突起

按理说,Cursor 的设计理念和目前所呈现的效果已经相当全面,几乎涵盖了智能编程助手所需的所有核心功能。事实上,Cursor 的出现给 GitHub Copilot 带来了不小的压力,自从 Cursor 面世后,Copilot 的版本更新速度显著加快,这也印证了市场对更智能、更高效工具的迫切需求。那么,在 AI 编程编辑器领域,是否还有进一步的突破空间呢?Windsurf 的异军突起给了我们答案。

很多时候,AI 编程所带来的极致“爽感 ”往往依赖于其对我们项目仓库的深刻理解。虽然 Cursor 在简单到中等复杂的项目环境中表现出色,但在管理具有复杂依赖关系的大型代码库时,它常常会遇到瓶颈。而在这一点上,Windsurf 显然表现得更加出色。Windsurf 的第一个核心特色就是其 深度且全面的上下文意识(Full contextual awareness),它能够智能地从代码库的各个部分提取相关的代码片段,而无需开发者主动引用或指定相关上下文。这种高度的智能理解,特别是在浏览庞大代码库时,大大提升了生产力

picture.image

从以上演示可以看出,我并没有明确指定任何上下文,但当我提出需求后,Windsurf 通过智能工作流自动完成了相关任务。每一步都需要我进行确认,而这一点也彰显了 Windsurf 另一个独特的优势:AI 工作流已深度整合了各类工具,如创建目录、移动文件、安装第三方依赖等。无需跳脱当前场景,用户便可在统一的编程环境中完成所有操作,提供了一种无缝衔接的工作体验。

Windsurf 的 Full contextual awareness特性还体现在其实时操作理解和预测上。当我在编辑器中修改一个变量名时,Windsurf 能够预测我接下来可能的操作,并将这些上下文信息智能地注入到其他场景中。换句话说,用户不需要在切换到新的场景时重新构造上下文,极大提升了工作流的流畅性。举个例子,以下演示中,我修改了一个变量名后,Windsurf 自动识别并修改了关联代码。在此基础上,当我在聊天窗口输入“continue”时,它继续帮助我完成相应的修改任务。

picture.image

这一切的设计理念在 Windsurf 中被称为 Cascade,即通过结合对代码库的深刻理解、广泛的高级工具集和对开发者操作的实时感知,形成一个强大且无缝的协作工作流程。这样的设计不仅提升了编程效率,更让 AI 编程助手超越了传统的工具角色,创造出一种更加人性化和流畅的编程体验。

与 Cursor 的**“零熵编辑”** 体验相比,Windsurf 的全方位实时感知能力 再进一步。这并不意味着 Windsurf 在所有方面都超越了 Cursor(例如其代码补全的速度和准确度目前仍不如 Cursor),而是在编程体验的理解和理念上不断向前推进,促成了 AI 编程助手的多元化发展。

结语

AI 编程助手的多元化发展正在重新定义开发者的工作方式。从 GitHub Copilot 到 Cursor,再到 Windsurf 的崛起,我们看到了一场关于编程工具智能化、集成化和高效化的革命。每一款工具都在不断推陈出新,挑战着现有的工作流程,并为开发者带来更高效、更智能的编程体验。而 Windsurf 的**“全方位实时感知”** 则为我们提供了更深层次的理解和创新,它不仅帮助开发者自动获取并整合上下文,还通过智能工作流的方式,打破了传统工具的局限,提升了协作性和操作的流畅性。

未来的编程助手将不再是单一的代码补全工具,而是具备深度理解、智能预测和无缝协作的全能平台。随着这些工具逐渐走向成熟,我们可以预见,开发者的编程体验将变得更加直观、高效和富有创造力。AI 编程助手的发展不仅是技术的进步,更是对开发者需求的深刻洞察,它让我们看到了编程世界的新机遇,也为未来的技术创新奠定了坚实的基础。

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
火山引擎大规模机器学习平台架构设计与应用实践
围绕数据加速、模型分布式训练框架建设、大规模异构集群调度、模型开发过程标准化等AI工程化实践,全面分享如何以开发者的极致体验为核心,进行机器学习平台的设计与实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论