Ai logo

JetBrains AI

Supercharge your tools with AI-powered features inside many JetBrains products

AI Assistant JetBrains AI News Personal productivity

完成不可完成的补全任务:JetBrains IDE 中 AI 补全的现状

Read this post in other languages:

代码补全一直是 JetBrains IDE 中的突出功能,可以帮助开发者更快速、更智能地编写代码,并减少错误。 但要是它能做的更多呢? 要是它不但可以预测下一个元素,还可以预测整行代码,甚至可以补全代码块呢? 这就是我们一直以来努力的方向。

我们在 AI 方面投入了大量时间和精力,因此我们的代码补全功能已发展得无比强大,比以往任何时候都更精确、快速和智能。

在这篇博文中,我们决定分享 JetBrains IDE 中 AI 代码补全的原理,它的发展历程以及即将取得的激动人心的进展。 我们开始吧!

什么是 JetBrains AI 代码补全?

JetBrains 通过两种方式提供 AI 代码补全:

  • 内置在 JetBrains IDE 中的本地全行代码补全:直接在您的机器上运行,无需连接互联网即可提供实时建议,这种方式可以确保快速提供专门针对您的项目上下文的建议。
  • 由 JetBrains AI Assistant 提供的基于云的 AI 代码补全:使用云资源提供更精确的代码补全,这种方式所利用的计算能力要比本地资源可以提供的计算能力更强大。

这两种方式共同确保您既能在本地获得快速的上下文感知建议,又能在需要时获得更强大的云驱动协助。

我们的方式将建议的质量和速度放在首位。 我们认识到开发者需要快速、准确的补全来确保其工作顺利完成。 因此,我们将系统设计得更加简洁、干扰更少。 与其他使用多行补全对您狂轰滥炸的工具不同,我们的 AI 补全经过专门调校,在您需要的时候提供简洁、相关的建议。

一年过去了 – 全行代码补全的表现如何?

继 2023.3 和 2024.1 中的里程碑式发布之后,我们的指标保持稳定并持续增长,数据表明,每天会执行数百万次补全操作、接受率达到 35% 或以上,明确取消率只有 5%,这使其成为基于 IntelliJ 的 IDE 中表现最好的代码补全产品之一。 代码补全开箱即用,支持超过 11 种主流语言和多种框架,并采用轻量化本地模型。

2024.2 版本主要是针对全行代码补全的用户体验改进,扩展了整个管道。 但我们也改进了质量和红色代码筛选。 此外,我们还发布了对 Rider、CLion、RustRover 和 Terraform 的支持。

基于云的 AI 代码补全呢?

此主题涉及的内容过于庞杂,无法一一介绍,因此,我们将尽量总结一些我们收到的主要用户反馈,然后再探讨我们是如何克服客户发现的问题的。

  • 建议频率有限
    在之前的版本中,我们采取了保守的方式,即只有用户按下 Enter 键时才会触发代码补全。 采用这种设计的原因是大量 LLM 需要相当长的时间进行处理。 但我们意识到这种方式不够实用,因为用户在编码过程中不会频繁地按 Enter 键。 有趣的真相:一个开发者一天按 Enter 键的次数平均只有 70 次左右。
  • 难以阅读大段的灰色多行建议
    想象一下,您正在编写一小段简单的函数,而补全功能却建议了非常庞大的代码块,这让您很难看到文本光标后的下一行。 较长的补全需要更多时间来检查和集成,因此可能打乱工作流。
  • 建议不可预测
    除了上述问题之外,还存在的一个问题是,模型有时生成的建议并不完全符合用户预期。 虽然很多建议是准确的,但仍存在提供扩展枚举变量创建、中间出错或以对话方式响应的情况。 大量 LLM 需要几秒钟才能生成建议,因此用户会察觉到延迟。 为了获得高效的体验,代码补全必须快速作出响应。

我们是如何修正这些问题的呢?

当然是采用了“从头重新编写”这种旧但管用的办法。 毕竟我们也是开发者! 🙂

不开玩笑,我们确实决定使用全行代码补全中的 IDE 端管道以及专门针对代码补全进行训练的新 JetBrains 内部 LLM 完全重新编写云补全。 这一过程很艰难,但我们最终设法修正了上述所有问题!🎉

对于基于 IntelliJ 的 IDE,从 2024.2 版 AI Assistant 开始,我们引入了重新设计的管道和新的内部 LLM:

  • 对于 JavaPythonKotlin,从 2024.2 版本开始引入
  • 对于 Go,从 2024.2.1 版本开始引入
  • 对于 PHP、JavaScript/TypeScriptCSS 和 HTML,从 2024.2.2 开始引入

我们会在 2024.3 版本中将所有语言切换到高级管道和新模型。

以下是我们已实施的部分基本改动:

高亮显示文本,而不再以灰色显示

为了方便阅读模型生成的大段建议,我们现在会高亮显示建议的代码。 这一改动旨在减轻开发者的认知负担。 通过使用可以感知语法的高亮显示,建议现在的观感与手写代码十分相似,因此更易于快速浏览和评估。

更加智能、速度更快的 JetBrains 内部 LLM

大模型通常更擅长处理各种类型的任务,而定制的代码模型则在处理专门的任务方面表现更优。 定制代码模型的优点还包括控制能力更强、无需进行提示工程,以及延迟更低。 这些优点在我们这里已得到验证。 通过训练相对较小、高度专业化的模型并增强推理机制,我们显著提高了代码补全的准确性和速度。 请密切关注我们的后续博文,我们将在其中分享有关此模型的更多详细信息。

更多位置和谨慎的单行/多行选择

为了增加显示的建议数量,现在输入期间即可触发补全,而不只是需要按下 Enter 键才会触发。 我们还限制了可以显示多行补全的位置。 通过采用更加保守、依赖语言的策略,我们确保了基于云的代码补全在保持直观和人性化的同时,生成代码的总量不变。 我们致力于在今后的更新中完善这一策略并扩展其功能。

重新设计了多行补全用户体验

我们完全重新设计了多行建议的显示方式,特别是与 IDE 内弹出窗口补全结合使用的情况(之前无法实现这一功能)。

部分接受

这是我们的用户一直在问的问题! 现在,您可以按词例或逐行接受补全建议。

  • 逐字接受 – ⌥ → / Alt + Right
  • 逐行接受 – ⌘ → / Ctrl + Right
  • 与之前一样,您可以通过 ⇧ ⌥ / / Shift + Alt 明确调用补全。

提升了项目意识并重新设计了上下文收集

通过离线和在线评估对不同的检索增强生成 (RAG) 策略进行评估后,我们选择了运行稳定、可预测的策略。 建议现在利用整个项目的上下文提供相关的高质量代码块。 借助对推理的完全控制,我们能够避免诸如缩进不正确之类的细微不一致问题,并过滤掉不想要的建议。

新的云补全好用吗?

非常好用!

没有什么比在线日志更棒了。 根据 2024 年 8 月收集的数据,我们已经通过用户反馈和使用指标看到了一些积极的成果。 我们看一下针对 Java、Python 和 Kotlin 的三种不同设置:

  • JetBrains AI Assistant 2024.1 中的旧版基于云的 AI 代码补全
  • JetBrains AI Assistant 2024.2 中的新版基于云的 AI 代码补全
  • 2024.2 中的本地全行代码补全

这种比较只能得出大致的结果。 此外,全行只能是单行,而 AI Assistant 既可以是单行,也可以是多行。 

对新版云补全的接受率普遍高于全行补全,一直优于旧版的云补全。

用户明确取消新版云补全的频率比之前低很多。

与旧系统相比,从开始输入到显示建议的整体补全延迟也大大缩短。

2024.2 中显示的每日补全次数已远远超过 2024.1 版本中的次数。 通过生成更加相关的建议,它的表现始终优于速度更快的本地模型。

但我们有意缩短了新版云补全的平均补全长度。 我们会更加慎重地提供多行补全,确保不会干扰您阅读代码或思考解决方案。 我们计划在测试过程中完全确认多行建议会得到正面评价后逐步在更多位置显示多行建议。

您已经可以在 2024.2 版的 IntelliJ IDEA、PyCharm、WebStorm 和 GoLand 中试用新补全。 在下一个版本中,我们将侧重于解决与非 AI 补全的“Tab 快捷键冲突”问题、放宽严格的筛选条件、多行质量和数量、触发位置,以及调整建议中的代码量。 我们一直在努力,您可以在 2024.3 版本的 EAP 中查看更新!

后续计划

我们将继续完善本地和云补全,包括为云补全添加更多多行建议、为本地补全引入多行建议、支持更多语言、提高模型质量、增强用户体验等。

我还想借此机会感谢每一位提交过反馈和报告过问题的用户 – 您的贡献直接促成了改进和功能的完善。 感谢各位,并希望大家继续提供反馈! 您可以在这篇博文的评论中、AI Assistant 插件页面上或 YouTrack 上分享您的想法。

JetBrains 补全团队全体成员 ❤️

本博文英文原作者:

Kirill Krylov

Kirill Krylov

image description