Press "Enter" to skip to content

将人工智能整合到集成开发环境(IDE)中

人工智能已经展示了在编码任务中的巨大潜力,例如回答问题、生成代码片段、解释代码和检测问题等。然而,目前使用像ChatGPT这样的Web用户界面,并且过分依赖复制/粘贴方法的做法可能会很麻烦且效率低下。为了最大程度地发挥人工智能在编码中的优势,必须在现代集成开发环境(IDE)中更紧密地集成人工智能能力。可以探索几种想法来实现这种无缝集成,其中一些已经在像IntelliJ IDEA这样的IDE中实现,而其他的则仍然是未开发的机会。

这种集成有两个主要概念:人工智能操作和人工智能助手(聊天用户界面)。

人工智能操作

人工智能操作是利用人工智能实现预期结果的任务。每个人工智能操作应该是以下两种情况之一:

  1. 准备一个提示和上下文,使用人工智能处理数据,收集结果并以最便捷的形式呈现给用户,或者将更改提交到代码中。
  2. 准备一个提示和上下文,调用人工智能助手,让用户完成工作。
  3. 做一些复杂的1和2情况的混合。

人工智能操作可以通过不同的方式进行:

  • 由用户请求触发(例如,作为重构)
  • 由系统服务根据计划,在后台或在适当时候启动(例如,代码分析操作)

人工智能代码意图

在现代IDE的世界中,一个越来越流行的强大功能是“意图”概念。这些意图为用户提供根据特定上下文对其代码执行预定义操作的能力。例如,想象一下,与一个“for”语句一起工作,在该上下文中,有各种各样的意图可用,例如“转换为while”、“反转顺序”或“使用Streams”等。使用意图非常有优势,因为它可以快速进行重构和代码操作,简化开发过程。

然而,开发意图并不是一件容易的事情,因此IDE供应商会将它们硬编码并捆绑到各自的IDE中。虽然一些IDE允许开发人员创建自己的意图,但这个任务非常具有挑战性,需要对IDE平台有深入的了解,编写大量代码,并创建插件来部署新开发的意图。

幸运的是,随着像ChatGPT这样的LLM的出现,请求与代码相关的操作变得更加简单。只需提供代码片段和提示,LLM就可以轻松执行所需的操作。例如,如果您向LLM提供一个循环,并使用“反转循环方向”的提示,它将轻松地在给定的代码片段上执行指定的转换。

您将获得与硬编码意图相同的结果:

因此,自然而然地,我们可以引入人工智能意图,它基本上是绑定到某个上下文的命名人工智能提示。上下文可以是文件、类、语句、特定方法等。因此,人工智能意图应该提供一个提示,向IDE请求上下文,使用人工智能处理数据,收集结果,并以最便捷的形式呈现给用户,或者将更改提交回代码中。

人工智能意图的优势:

  1. 几乎可以使用简单语言完成任何重构。提示可以非常简单,例如“使用format替换”(例如Java的PrintStream.println(String))的知名API,或者可以更复杂,对于较不常见的API,需要更多的指令。
  2. 不需要硬编码此类意图
  3. 不需要编写插件来分发此类意图
  4. 此类意图可以很容易地由用户配置。
  5. 不需要使用聊天界面,尤其是对于重复的操作
  6. 减少LLM令牌流量以节省成本

使用注解定义人工智能代码意图

一个令人兴奋且创新的功能是将人工智能意图直接集成到API中,使用注解的方式。通过引入声明性的人工智能意图,开发人员可以向IDE指示每个类、字段或方法的可用意图,并通过语言模型(如LLM)的帮助指定执行特定意图的适当提示。这些声明性的人工智能意图可以由框架/库的作者提供,并且对支持它们的所有开发人员都无缝访问。

作为一个说明性的例子,让我们来看一下“使用格式替换”AI意图,它使开发人员能够将println(String)调用替换为更高效的printls()调用,该调用接受格式和参数列表作为输入:

将此意图应用于调用:

System.out.println("i = " + i);

结果:

System.out.printf("i = %d%n", i);

如果IDE可以为编辑器中的某些文本元素提供渲染视图,则可以在代码中以标题的形式呈现带注释的AI意图,隐藏冗长的提示。此外,该渲染可以包含内嵌的Play按钮,允许用户通过单击执行该操作。

修复已弃用操作

声明性AI意图的另一个非常好的用途是处理已弃用的API。因此,每个已弃用的方法都可以包含定义特殊AI意图的注释,以允许将该方法重构为现代版本。在编辑/浏览代码时,可以显式调用此类AI意图。或者可以有另一个更高级的操作,将所有已弃用且正确注释的方法收集起来,并提示开发人员修复其中的一些或全部。

利用声明性AI意图来处理已弃用API的好处很多。它大大减少了维护和更新遗留代码所需的时间和工作量,促进了平稳过渡到最新技术和最佳实践。此外,它通过提供统一的方法来管理整个代码库中的已弃用方法,增强了开发人员之间的协作。

TODO操作

在许多情况下,TODO注释(如// TODO:)提供了足够的指示,使LLM能够正确生成完成此类TODO所需的代码。例如,下面的代码:

将通过LLM正确重构,使用提示“在以下代码中完成TODO”,变为:

因此,很自然地将TODO注释收集起来,并提供它们在AI操作列表中执行。类级别的TODO应该在类的任何地方提供,方法级别的TODO应该在方法范围内提供,等等。当然,一些/许多TODO无法仅使用LLM和通用提示完成,但是否调用它们取决于具体的开发人员。

如果IDE可以为编辑器中的某些文本元素提供渲染视图,则可以在代码中以内嵌按钮(如Play)的形式呈现TODO,允许用户通过单击完成该TODO。

创建方法操作

很好地让AI通过使用键入的方法名和猜测的返回类型和参数来生成方法的签名。例如,“为一个方法(空体)建议签名:splitStringUsingRegex”提示可以正确生成以下方法:

可选地,它还可以包括方法体的生成。

“创建方法”操作应该在代码编辑器中通过键入方法名并按Tab键(或其他适当的快捷键)或显式选择“创建方法”操作来调用。

建议依赖操作

LLM擅长基于用户需求生成代码。然而,生成的代码通常依赖于第三方库或框架。如果所需的依赖项尚未添加到项目中,这可能会导致编译错误。因此,手动查找和添加必要的依赖关系可能比获取代码本身更耗时。

为了解决这个问题,一个有帮助的补充是“建议依赖项”操作。该操作将允许用户请求LLM(或特定训练模型)提供有关特定类型的依赖关系(如库、Maven、Gradle等)的信息。如果找到依赖项,它们可以自动应用于项目,简化流程并节省时间。

例如,使用LLM查找“org.json.JSONObject” Maven依赖项可能得到以下建议:

这可以用来修改项目的依赖项。

建议名称操作

有很多现有的代码重构,引入新的类方法、参数或变量,如“提取方法”、“引入参数”等。在此类重构期间创建的所有新事物都应该有适当的命名。因此,很自然地利用LLM根据正在重构的代码找到建议的可能名称,并在弹出窗口中显示这些名称。名称检索需要时间,所以它不应该干扰,应该在后台执行。

建议实现操作

此操作将允许为具有空方法体的方法生成实现。如果方法名称和其参数清楚地(正如应该)定义了方法的目的,LLM可以非常好地工作。例如,对于以下空方法:

LLM正确地建议其方法体为:

此操作应在后台执行,并将结果应用于代码编辑器中,不显示任何额外的用户界面,也不会停止开发人员继续使用IDE。

可能应该有一个选项在聊天界面中启动“建议实现”操作,以便在需要时获得更多控制。

建议正则表达式操作

“建议正则表达式”操作应适用于所有字符串字面量,并使用该字符串字面量查询AI以获取正则表达式。然后,将字符串字面量替换为生成的正则表达式。

也许此操作仅适用于以“Regex”开头的字符串字面量。

例如,在以下代码中调用“建议正则表达式”操作后:

代码将被更改以包含生成的正则表达式:

解释代码操作

“解释代码”操作应使用适当的“解释代码”提示利用LLM来获取代码的描述。默认情况下,这样的解释应显示在弹出窗口中,并具有在简短和完整版本之间切换的能力。还应该有一个选项在聊天界面中启动“解释代码”操作,以便在需要时获得更多控制。

注释代码操作

“注释代码”操作应使用LLM与“解释代码”提示的一种形式,并将非常简短的代码解释插入到代码右侧作为注释。此操作应在后台执行,并将结果应用于代码编辑器中,不显示任何额外的用户界面,也不会停止开发人员继续使用代码。

解释字符串操作

此操作应适用于字符串字面量,并在弹出窗口中显示解释。如果需要其他解释或测试,应有一个选项在聊天界面中打开此解释。

LLM在识别字符串中的内容方面非常出色,因此此操作将与相当基本的提示一起工作。例如,LLM可以轻松识别:

  • 更复杂的正则表达式
  • SQL语句
  • Printf格式字符串
  • MessageFormat格式字符串
  • 等等

当LLM无法检测到字符串的格式时,应提示描述格式。

查找潜在问题操作

大多数现代IDE都包含可以检测和突出显示编译器和IDE特定代码分析工具发现的所有代码错误和警告的工具。

尽管如此,LLM可以提供一些额外的潜在问题检测,尤其是在一些非常棘手的情况下。通过适当的提示,LLM可以生成结构化的问题报告,可以是文本形式或JSON格式。因此,解析和利用该报告将非常容易。

因此,“查找潜在问题”操作可以利用LLM与适当的“在代码中查找问题”提示和上下文,解析结果,并以常见的消息列表视图呈现它们,提供常见的用户体验,包括代码导航等。

建议重构操作

“建议重构”操作应利用LLM来获取优化、修复或稍微改进的代码版本。

默认情况下,此操作应在后台执行,并将结果应用于代码编辑器中,不显示任何额外的干扰性用户界面。如果需要其他步骤、解释或测试,应有一个选项在聊天界面中打开此重构。

如果IDE可以为编辑器中的某些文本元素提供渲染视图,则可以临时渲染重构的方法,并在右侧提供快速更改变体的“上一个/下一个”按钮(如果有)。

建议提交消息操作

“建议提交消息”操作应该利用LLM基于提供的项目更改的精选列表来组成版本控制系统的提交消息。应该有一个选项在不同的消息样式之间切换,比如整体式或列举式列表。

生成文档操作

“生成文档”操作应该利用LLM以语言特定的格式(例如JavaDoc)来为方法和类编写开发者文档。

AI助手

AI助手提供了一个类似ChatGPT提供的通用聊天界面,使开发人员可以与LLM互动,获取答案和代码,并在需要时提交结果。

AI助手应该跟踪聊天的上下文,并且应该知道编辑点的位置。这使我们能够:

  • 基于现有的代码库生成代码(如果上下文窗口大小允许)。
  • 检查和修改要插入的代码,以生成有效的可编译结果。例如:
    • 如果AI助手生成了一个方法,它应该被正确地插入到类级别,要么忽略插入点的位置,要么放置在最近的有效位置。
    • 如果AI助手生成了一个代码片段,并且插入点不在方法中,它可以被包装到一个由AI建议的方法名的方法中。
    • 等等。
  • 在明确要求之前,避免生成一个类和一个main()方法。
  • 检查名称以防止生成具有重复名称的内容。
  • 重用已经存在的方法,无需生成重复内容(可能需要进行提示)。

AI助手应该直接内置一个游乐场。因此,生成的代码可以在原地进行测试和调试,而无需粘贴回来、添加main()方法、构建项目等。可以在AI助手本身或相关的窗口/视图中完成。任何缺失但需要的依赖项应该自动解决(详见“建议依赖项”操作的更多细节)。

注意:在大多数情况下,最好避免使用AI助手,当使用正确设计的提示可以实现足够好的结果时。AI助手应该在以下情况下使用:当用户明确调用它或需要进行多个与用户直接参与相关的事务才能获得所需结果,并且很难设计一些专门的用户界面。

Leave a Reply

Your email address will not be published. Required fields are marked *