是的,我同意这是一个很奇特的标题。但考虑一下这一点 – 最初简单的自动完成建议已经演变成更强大的东西 – 我们现在拥有人工智能,可以动态生成整个函数,用适当的架构搭建完整的文件,甚至从头开始引导整个代码库。这些工具已经从有用的打字助手发展成为协作编码伙伴。
进展相当疯狂。无论您是新开发人员还是经验丰富的专业人士,我认为理解和适应这些功能/工具是当前的需要。随着这些工具的进步,弄清楚使用哪些工具来保持严格控制变得有点复杂。何时让人工智能掌舵。
我们应该对这些人工智能辅助编码功能给予多少控制?我在这里打个比方。您可以将人工智能辅助编码功能视为汽车的齿轮。在第一档,您可以最大程度地控制发动机,但移动缓慢 – 这就是自动完成功能。升级档位(对话助手、光标聊天、代理模式),您可以用精细的控制来换取更高的速度和自动化。
在这篇文章中,我们从三个角度探索人工智能辅助编码的演变:
-
历史叙述 – 发生了什么突破让我们走到了这一步。我认为这对于我们更深入地欣赏和理解这些工具至关重要。你们中的一些人太被宠坏了,认为这些工具是理所当然的。
-
交互模式 – 我们如何使用这些工具,它们解锁什么用户体验,以及对其使用中新兴模式的一些观察。
-
齿轮类比 – 控制与自动化 – 您愿意用多少控制和信任来换取速度。
公平警告:该博客将在介绍新的人工智能功能和历史叙述之间跳跃一些。
自动完成
代码建议时代
我于 2018 年底开始了我的编程之旅。我的第一种编程语言是 Python。我是从 Coursera 的 Python forEverybody Specialization 以及一些 sentdex 和 Corey Schafer 视频中学到的。当时,Kite 以其基于“机器学习”的代码建议引起了轰动。然而,我在 Pycharm 和 Spyder IDE 中严格控制了我的代码。
大约在同一时间,微软在 VsCode 和 Visual Studio IDE 中发布了Intellicode (2018 年至今),它可以提供有关下一个方法、变量的上下文感知建议,本质上优先考虑“Intellisense”列表中最可能的建议。
他们在 Github 上托管的几个开源项目上训练了模型。他们最初使用马尔可夫链,并在 2020 年慢慢转向基于深度学习的建议 (GPT-C)。您可以在这篇博客文章中阅读该项目的一位个人贡献者提供的更多详细信息。
其他突出的功能包括“重复编辑”检测 – 检测编辑中的模式并建议在整个代码库中自动执行类似的更改、“快速操作”和重构建议。
还可以在公司的存储库上训练 Intellicode,使其建议与团队的编码标准保持一致。 (企业部分我相信)
走向单行自动完成
微软最终推出了“全线预测”。全行代码预测意味着根据上下文预测下一个逻辑代码行。还记得编辑器中的灰色预测吗?
值得注意的是,早期的代码完成模型并不像今天的工具那样与语言无关。每个都有其专长:Intellicode 专注于 C# 和 .NET,ReSharper 专注于 C#,Eclipse IDE 专注于 Java。
多行自动完成
第一个真正的突破来自 Jacob Jackson 的 Tabnine。它是第一个集成 GPT-2 来完成代码的代码编辑器。它为未来的人工智能代码编辑器奠定了基础。我不是 100% 确定,但看起来 TabNine 是第一个支持基于本地上下文的与语言无关的多行代码完成的编辑器。
GPT-2 对不同代码库的训练启用了第一个真正与语言无关的代码完成模型。 Karpathy 的推文展示了制表符补全过去的样子。这里还有一个视频。它显示了下一行的建议以及百分比。
使用深度学习自动完成https://t.co/WenacHVj7z非常酷!我很久以前在 char-rnn 的日子里尝试过相关的想法,但当时它并不是很有用。有了新玩具(GPT-2)和更多的关注,这可能会开始发挥作用。 pic.twitter.com/XSV9O7yxpf
— 安德烈·卡帕蒂 (@karpathy) 2019 年 7 月 18 日
您可能会注意到自动完成功能始终是 Tab。
输入块级代码补全
我们显然没有块级代码完成,例如根据用户输入和上下文感知代码生成生成整个函数或方法或理解用户意图
直到OpenAI Codex模型发布。 OpenAI Codex 支持 Github Copilot。它能够以相当高的精度执行上述功能。
填入中间
到目前为止,我们讨论的自动完成仅限于从左到右的操作。这些模型只能“附加”。他们无法提前了解后缀的上下文。早期型号无法填补这一空白。
def calculate_total(items): # [gap here] return total
后来 OpenAI 引入的 Fill in the middle 技术解决了这个限制。 FIM代表中间填充。有时称为双向意识,即了解光标之前和之后。阅读此博客的许多人可能是第一次听说 FIM。
我建议阅读 Codeium 的这篇博文,以了解 FIM 的直觉。 OpenAI论文中提供了培训详细信息。
Codeium 是第一个将 FIM 集成到其扩展中的公司,击败了 Github Copilot,Github Copilot 也于 23 年 5 月开始大规模支持它。您可以开始从博客中看到“提示工程”和“上下文窗口”等术语
现代自动完成通过以下方式进一步发展:
- LSP(语言服务器协议)集成,用于实时语法信息和符号引用
- 用于跟踪函数关系的强大代码库索引
- 通过 AST 和符号表分析增强上下文感知
从简单的文本完成到上下文感知代码生成的旅程表明了我们已经走了多远,但这只是人工智能辅助编码的开始。
我们的时间线已经到了 5 月 23 日。当然,我们不想仅限于自动完成。从 2022 年底开始,我们就开始使用编码助手。现在是时候讨论编码助手了,稍后我们将回到自动完成。
迈向(对话式)编码助理和人工智能优先编辑
2022 年 11 月 30 日 – 以 GPT-3.5 为特色的 ChatGPT 研究预览
ChatGeeBeeDee 3.5 可能是人们第一次开始意识到通过法学硕士生成代码的潜力。您可以与这个聊天机器人交谈,它可以向您解释整个代码块。如果您提供足够好的提示和相关上下文,它可以提供准确的代码。
23 年 3 月,我们得到了 GPT-4 模型,它在代码生成方面非常出色。副驾驶集成了 GPT-3.5/GPT-4,用于副驾驶聊天。
23 年 7 月后,我们发布了 Llama-2,这导致了开源本地 LLM 场景的寒武纪爆发 – 在代码生成微调、角色扮演等领域。
人工智能代码编辑器的机会
很长一段时间的工作模式是将代码转储到 chatGPT (Plus) 中,编写合适的提示,然后将代码复制粘贴回我们的编辑器。它还要求您找到正确的粘贴位置。我个人在很长一段时间内都对这个工作流程感到满意 xD,因为我必须更多地查看代码并仔细阅读差异。
另一个缺点是“上下文切换”惩罚不仅限于更改窗口,还包括您可能开始浏览哈哈。 GPT3.5/4 的推出为各种人工智能编辑器带来了市场空间。为了获得更好的开发者体验,有很多问题需要解决,主要是
- 消除聊天平台和编辑器之间的上下文切换
- 从 LLM 输出实现直接代码编辑
- 找出更有效地为法学硕士提供背景的方法
- 代码库索引/更好的上下文感知以供法学硕士使用
输入光标
面临的挑战是能够以平稳且低延迟的方式完成上述所有工作。我建议查看光标的Problems-2023 博客。
Cursor 是第一个跳转到同样的平台来实现聊天体验和差异编辑生成工作流程(它们自动应用编辑并以差异格式显示)。事后看来,这对于利用 GPT-4 的炒作至关重要。快速交付并提供出色的用户体验是关键。
不久之后,Cursor 添加了部分接受和拒绝等功能、代码库上下文功能,可以在代码库中语义搜索查询。后来,他们添加了 CMD+K(行编辑)、CMD+L(聊天)工作流程。
图片来源:光标变更日志
还有其他几个项目,例如Continue Dev(也支持OSS模型)、Codeium,但他们并没有像Cursor那样早实现编辑体验。还有 diff-apply(现在是 fast-apply)加上聊天界面也很流畅,受到人们的青睐。
返回自动补全 → Copilot++
Cursor 的自动完成功能是我迄今为止使用过的最先进的自动完成功能。它就像我们讨论过的自动完成的老板 – 它经过训练(或微调?),以预测开发人员的下一步行动。非常意图驱动。 “我做了这个更改,模型应该去的下一行是第 18 行……并且模型应该知道它” 。您可以尝试重构变量的名称,它会建议进行多行重构。您可以为函数签名或部分代码编写注释,它会适当地建议完成(使用 FIM ofc)。
Karpathy 切换到 Cursor 对他们来说可能是一个转折点。但在我看来,主要的转折点是 Cursor 于 24 年 6 月下旬发布的 Sonnet 3.5。它在代码生成方面比任何其他模型都要好得多,并且更加代理(在指令跟踪和函数调用方面更好)。固化的 UI/UX 体验 copilot++ 帮助他们驾驭了 Sonnet 的浪潮。
Supermaven(主要是自动补全)
Supermaven(由 Tabnine 创始人)也有一个有竞争力的(相对于 Cursor 的)自动完成功能。我个人没有使用过它,所以根据传闻和阅读其他人的输入,它与 copilot++ 相当或稍差,但肯定更快。 SuperMaven 在发布时的特色是 100K 令牌上下文窗口(比 GPT-4 和 Sonnet(200K 上下文)还多),它有助于为更好更快的自动完成生成提供大量上下文。他们通过对普通自注意力的修改来训练自己的模型。
五年前,我创建了 TabNine,这是第一个使用深度学习的商业代码完成工具。
今天我发布了 Supermaven,这是第一个上下文窗口超过 100,000 个令牌的代码完成工具。 pic.twitter.com/kWO7DFCQys
– 雅各布·杰克逊 (@jbfja) 2024 年 2 月 22 日
他们后来添加了 Copilot++ 之类的下一步动作预测功能(包括 Cursor 可能还无法做到的跨文件跳转)、 1M 上下文窗口。
Supermaven 没有集成聊天体验——它只是一个扩展。由于 VSCode 的 API 扩展限制,他们无法添加一些功能。他们最近与 Cursor 合并。我对 Cursor 即将推出的代码库索引和自动完成体验感到兴奋。雅各布在这次采访中提到
0:49-1:14:他们的人工智能编码愿景和方法正在趋同,并且有显着的重叠
2:11-2:14:由于 VS Code 扩展限制,Super Maven 最终需要构建自己的 IDE,重复 Cursor 的工作
2:35-2:52:双方优势互补——Cursor专注于用户体验,Super Maven专注于AI模型
28:12-28:19:直接引用 Jacob 的话:“在 Super Maven 的整个过程中,我一直在想,如果还有一个我想与之联手的团队,那就是 Cursor”
我期待选项卡自动完成循环的重大升级 – 它可能能够同时预测您跨多个文件的操作。 supermaven 的 1M 长上下文模型应该改进自动完成以及光标聊天/作曲家代理模式中的上下文检测。
OSS代码编辑器
2024 年,OSS 代码编辑器和扩展出现/更受欢迎/获得资助,例如Continue dot dev(自动完成、OSS 模型、代码解释,但不应用编辑)、Aider-chat(llm 聊天 + 通过终端编辑)、Pear AI、 AIDE、avante.nvim 插件……就我个人而言,我发现只有 aider-chat 有点用起来有趣。我喜欢他们的博客。
图案
汽车的档位越低,您对发动机的控制力就越大,但您可以以较低的速度行驶。如果您感觉可以控制,请转到更高的档位。如果您不知所措或陷入困境,请转到较低的档位。当您需要获得更精细的控制以及当您需要放弃控制以加快速度时,人工智能辅助编码就是摸索。更高级别的装备为错误和信任问题留下了更多的空间。提示是方向盘(2 档以上)。
来自一小部分人的观察结果——更资深的人或在前沿工作的人更喜欢较低的档位。非技术人员更容易被更高的档位所吸引(讽刺的是)。
一档自动完成
人们非常重视通过 LLM 生成代码,但模型级 UX 解锁(“烘焙到权重”)真正让编辑感觉像一个神奇舒适的地方是自动完成。自动完成可能是人工智能代码编辑器中第一个或第二个最常用的功能 – 您会发现自己在现有代码库中工作比从头开始编码更频繁。
如果你问高级工程师(他们仍然编写代码,而不仅仅是开会),他们会说他们主要使用自动完成功能。在法学硕士仍然不好的专业领域工作的人也可能从自动完成中受益最多。
当您处理现有代码库时,您所做的编辑比编写全新代码还要多。在生产代码库中,您会发现自己经常通过模式匹配来编写新功能。生产代码比粗略的笔触需要更高的外科手术般的精确度。
您主要是跨文件进行编辑,目标是在某处插入功能或修复一些错误,可能是重构。这里输入模型的本地化上下文(还记得 supermaven 1M 上下文模型吗? )很重要。
我想说的一点是 – 自动完成说明了您希望更精细地控制自己的行为。这就像以一档驾驶汽车一样。档位越低,对汽车发动机的控制程度越高。一个好的自动完成模型可以通过弄清楚确切的上下文和意图来满足您的控制偏好。
我喜欢 Cursor 工程师将自动完成构建为更广义的“下一步行动预测”模型问题的方式。
首先,我们扩展了 Copilot++ 来预测您的下一个位置。将此与下一个编辑预测相结合,模型可以执行一系列低熵变化:
我们按 Tab 11 次,所有其他键 3 次。我们称之为游标流(出于显而易见的原因)。
我们正在努力预测您将移动到的下一个文件。您将运行的下一个终端命令。下一次编辑以您之前的终端命令为条件!下一步行动预测模型。
此外,模型应该在您需要时显示信息。无论是正确的代码还是文档。
光标应该感觉像是你意志的延伸。当你想到改变的那一刻,语言模型需要最小的意图来立即执行它。
2nd Gear – 对话式法学硕士/独立聊天
许多编程工作可以归结为三件事
- 知识
- 本地化背景
- 理解
如果您想在现有代码库中添加一个功能并且准备好实现,那么下一步就是弄清楚您想要在哪里进行更改。加粗“fuck”是因为我因为挖掘巨大的 Java 代码库来查找我想要更改的文件而患有创伤后应激障碍 (PTSD)。 (我也无法使用 AI,所以最快的方法是运行服务器并连接 Intellij 调试器。设置一些断点,然后摸索程序流程)。
这就是光标聊天等功能派上用场的地方。您可以使用 @codebase 功能在整个代码库中提出问题,该功能使用跨代码库的语义搜索来搜索相关文件。发布后,您可以提出问题来提高您对代码库的理解。
或者,如果允许复制粘贴,您可以复制相关文件或将整个代码库转储到 claude 的 200K 上下文或 1M 长上下文模型(如 Gemini 2.0 flash / 1206 exp)中,然后询问在哪里可以找到什么内容。
自动完成+聊天就像类固醇一样,尤其是当您编辑或调试内容时。我觉得这是一个“认知水平”解锁,因为你正在提高对代码的理解。
人们非常重视 2024 年 5 月的代码生成和发布,但很少关注如何使用这些工具来加深对代码库以及最终对技术本身的理解。我猜是另一篇文章的主题。
第三档 – 光标聊天 + 应用编辑
我会将 ChatGPT/Claude AI 平台复制粘贴生成的代码放在第二档。它为用户提供了更多控制权,因为他们必须手动确定更改的位置,而且速度较慢。还涉及上下文切换,它很容易更改选项卡并走上互联网弯路。
第三档可能是由 Cursor 引入的。解析 LLM 输出并在正确的位置应用编辑。强调正确的位置,因为它可以节省大量劳动力并解决上下文切换问题。
diff 格式还可以帮助我快速查看代码。这很快,而且我可以检查代码。控制仍然存在,并且不会触发您的信任问题,因为您仍然可以验证更改(并拒绝更改)
由于 GPT-4 等模型的惰性编码,这实际上是一个很难解决的问题,尽管 Sonnet 可能让开发人员变得更容易。他们关于此问题的博客已不再发布,但最初主要是通过使用统一 diff解决的。他们后来添加了推测编辑以使其更快。)
对于正在编写大量新功能或进行 0 到 1 工作的人来说,第 3 档是最佳选择。
我对 Gear 3 的建议是将您的任务划分为子任务,然后单独处理每个子任务。确保刷新每个任务的上下文窗口。提示:加号按钮
如果您在更成熟的代码库中工作,您将在 Gear 1 至 3 中操作最多。
4th Gear – 代理功能 – Windsurf Cascade 和 Composer Agent 模式
荣誉奖:Composer – 普通模式对于多文件编辑和重构很有用。它自己检测上下文,但说实话不太可靠。 Composer 代理模式解决了这个问题。
这里的事情变得有点辣。这种装备之所以成为可能,是因为像 Claude 3.5 Sonnet 这样的模型具有强大的代理能力。 “代理”——简单来说,是指模型能够自行计算、计划和主动执行子任务以完成主要任务的能力。
更具体地说,该模型可以计划子任务,做一些事情,了解中间状态,查看中间上下文,调整其执行过程并完成最终用户任务。
代理能力是通过函数调用的预训练和微调来“烘焙到权重中”的。当人们说模型是代理时,他们的意思是它能够准确地遵循您的指令(“良好的指令遵循”)并且擅长工具/函数调用。
为了擅长代理代码生成,模型显然还需要非常擅长代码生成。 Sonnet 是出色的编码技巧和 SOTA 代理性能的完美平衡。 Sonnet new 在代理代码生成方面甚至更好。它比旧的十四行诗更加积极主动。 TLDR:代理模式是模型级别的功能解锁。
您可以在上面的视频中看到 Sonnet 如何多次调用“Artifact”来完成任务。我相信这是一个打开Artifacts的工具调用。这是代理性的。
Codeium 的Windsurf似乎是第一个在编辑器级别引入适当的代理模式的编辑器。它的主要功能方式是“级联”。当我第一次使用它时,感觉就像瞥见了编码的不久的未来。
您基本上可以告诉一些高级指令,模型将继续计划和执行一堆任务,通过终端运行命令,创建文件等来完成您的任务。它显示了它自己的“代理机构”。 Windsurf 提供了一个很棒的界面来查看模型正在执行的所有操作,并像 Cursor 一样显示差异编辑。 UI/UX 方面,我认为它比光标代理模式更好。在检测上下文方面也稍好一些(基于一些个人使用情况和朋友的传闻的意见)
编辑器中的“代理模式”对于重构文件和进行多文件创建/编辑非常有用。与处于开发阶段的中间相比,当您处于 0 到 1 阶段时,它的用处更大。但在文件检测或只是不需要的代码方面经常可能会出现错误(生成大量代码,因此上下文窗口可能会让人筋疲力尽,知识截止问题)
您在这里牺牲了很多控制权来换取更快的交付速度。编辑器实现了差异视图,因此至少您可以查看更改。当我大致知道要编辑哪些文件时,我可以轻松地在光标中使用代理模式。
由于 Cascade 的吸引力,经验较少的程序员似乎更容易被 Windsurf 所吸引(尽管我觉得他们的最佳选择是第 3 档)。 Windsurf 与 Cursor 相比非常有竞争力,但它仍然需要一些改进和对某些功能的支持。光标更以高级用户为中心,并提供更多操作齿轮。
我喜欢的一种使用模式是 – 使用代理来制作功能草案(因为它可以在正确的位置创建文件),然后继续聊天+自动完成。
5th Gear – 编码代理工具
我一直对代理持怀疑态度,但在推出新的十四行诗并最近从事一个包含代理成分的项目之后 – 我意识到,如果你缩小要解决的问题的范围,代理是有效的。您获得的价值是减少人工时间。
我亲自尝试过bolt.new。它的工作原理相同。范围很明确 – 使用固执己见的前端框架进行 0 到 1 的引导(LLM 在这方面也很好)。 Bolt.new对于 0 到 1 非常有用。一旦代码库成熟,你就会开始看到收益递减。
我们还看到了 Replit Agent Devin 的出现,尽管我还没有亲自尝试过这些。这些范围更广泛 – 端到端代理。如果你愿意的话,可以称之为“人工智能软件工程师”。例如,Devin 可以浏览您的代码库、做笔记、进行更改、报告。它可以异步工作(但根据我所读到的内容,它很慢)
特工们关心的是如何失去控制以更快地完成工作。错误和事故的范围也是最大的,尤其是在范围广泛的情况下。我个人更喜欢编辑器(齿轮 1 到齿轮 4)而不是编码代理工具。
代理工具的常见陷阱和注意事项
您可以使用光标代理或风帆级联快速发货。对于独立工具也是如此。你只会很快,直到你陷入困境,而当你陷入困境时,有时可能很难调试(特别是对于经验较少的程序员或非技术人员)。由于过时的知识,模型经常会陷入循环(例如 sonnet 无法调试 nextjs 15 对 nextjs14 的重大更改)。
您必须阅读文档和 stackoverflow/gitbub 讨论,以传统方式搜索解决方案。换档 – 2 档和 3 档在这里非常有效。我的建议是提高您此时对代码的理解。了解您要解决的问题,以便更好地提示或手动解决错误。
人工智能辅助编码可以非常快,直到它不再
大多数减速发生在最后一英里的功能中 – 因此您需要了解代码中发生的情况。否则调试会很痛苦。截图来自《 70% 问题:人工智能辅助编码的硬道理》 。我强烈建议您阅读此博客,因为它提供了可操作的见解,可以帮助您更好地进行人工智能辅助编码。
隧道视野
避免狭隘视野。如果你被困在某个地方,就休息一下。缩小范围并广泛思考。与法学硕士或队友讨论替代方法,然后再次继续。
如果刚接触某个领域,请学习基础知识
可靠的说法。 “将未知的未知数转换为已知的未知数。” https://t.co/3gc0RgpIID pic.twitter.com/QZIh5gB2M0
— Varun Mayya (@waitin4agi_) 2024 年 10 月 6 日
我还建议你至少学习你正在做的任何事情的基础知识,以便更好地提示。学习基础知识意味着您能够将未知的未知数转换为已知的未知数。
现在是时候结束这篇文章了。已经很久了。
结论
人工智能辅助编码只会从这里开始改进。现在是我们充分利用它的时候了。我们已经拥有非常强大的模型,而且它们只会变得更好。在集成上下文方面需要做很多工作。抱歉,这个词在本博客中出现了 30 多次,但上下文确实是关键。
我希望齿轮的类比能够在某种程度上帮助您的日常工作流程。感谢您的阅读。如果您喜欢,请分享。