17611538698
webmaster@21cto.com

AI 驱动下的新 IDE:了解 JetBrains 如何实现

人工智能 0 768 2024-07-22 11:20:24

图片

导读:我们刚刚测试了 JetBrains AI,这是一款新的多层 LLM AI 助手,适用于其集成开发环境 (IDE) 集合。

有使用 Java 的同学一直对IntelliJ 的评价很高,最近他们对 Rider for C# 的评价也很高。

当我有机会尝试JetBrains AI(一种自称为“AI 助手”的 AI 服务)时 ,也感到非常兴奋。这款软件是 “由 OpenAI 和 Google 作为主要第三方AI提供商提供支持”。

当人工智能技术如此频繁地变化时,我不确定哪些大语言模型的能力与某些任务相匹配,或者是否用哪个是个好主意,但是不依赖某个单个供应商确实更加有意义。

现在说到使用某个 LLM,每个专业开发人员的需求都略有不同,没有一种就是单纯光是“为我编写代码”。

开发者的两种突出需求模式是“代码完成”和“解释此代码”,这对于面对不熟悉的代码库的顾问来说非常有用。

生成单元测试也是一种选择项,尽管不对自己的单元测试负责会在某种程度上违反 Agile 原则。比如我个人不喜欢在 IDE 中提供代码示例,因为我可以浏览整体,但我知道有些人却很喜欢。例如,大多数开发者发现时间和日期功能正在变得非常不直观;有时复杂的系统无法变得更简单。这些例子是非常有用的。

本文将是对 AI 助理的评论,但是我第一次在 Mac 上使用 JetBrains IDE,因此需要进行一些管理工作。我有一个该 AI 服务的“许可证密钥”,我还尝试将其移植到社区版本上。

ReSharper 运行在 Visual Studio 上,而 Rider 是一个单独的 IDE,所以我选择了后者,以便方便查看 C#。我希望 AI 服务能够附加到它上面,在这一点上,并不完全清楚。

我最终安装了 Rider 的试用版本。下面从导入设置开始,满分搞定!

图片

在下一节中,我的问题立即得到了AI回答,味道还不错。

图片

这让我更加相信编辑器厂商已经考虑了用户成长路径。它一开始这样做产品,很明显,但是,我在看到其它很多的产品没有给予自己的服务足够的关注。注册完用户后,JetBrains 给我发了邮件,这样就成功注册了一个帐户,这样我便获得了一个免费许可证来做测试了。

图片

LLM 服务现在在很大程度上被视为一种附加组件,这使得“AI”感觉像是一种附加组件。我认为这不是 IDE 制造厂商的错误做法,我相信最终,这种类型的产品将存在于操作系统堆栈或更靠后的位置。

现在,我们必须等待某个大公司争取到 LLM 的主导地位,这时将个人用户推向明确的消费者地位。

代码注释与说明


我打开了一些游戏项目的代码,后面将要求AI做出解释:



static private List archetypes = new List();...public static List FetchArchetypes() { if (!archetypes.Any()) { ArchetypeTemplates tt = BackEnd.DataLoader.LoadGameData("Archetypes.json"); foreach (ArchetypeTemplate t in tt.Archetypes) { archetypes.Add(new Archetype(t)); } }

return archetypes;}


其中,Archetype 是游戏中的结构。最初,我将其作为 JSON 文件中的数组读取,并在本地重新创建该列表结构。

如果列表已经创建,我只需传递该列表即可。

    那么 AI 认为这是在做什么?它返回了一个全面的答案,其中包括以下两个亮点:

    • “最后,该方法返回 Archetypes 列表,其中包含基于 JSON 文件中的模板创建的 Archetype 实例。Archetype 类似乎代表游戏中的特定原型,此方法用于根据 JSON 文件中的数据填充所有原型的列表。”

    • “在这个特定方法中,值得注意的是,只有当原型列表为空时,才会执行数据加载和对象实例化。这意味着一旦原型被提取一次,对此方法的后续调用将返回相同的列表,而无需进行任何额外处理。这是一种常见模式,适用于加载或对象创建是一个繁重的过程,并且生成的数据在应用程序的生命周期内不会发生变化的情况。”


    所以,这里有几个好东西。AI 已经弄清楚了所讨论的 Archetype 可能用于游戏。这非常重要,在快速尝试理解代码时,理解意图和实用性很重要。

    AI 已经认识到我使用了后期实例化,为什么我要使用它,以及它是一个真正的模式。 它甚至还明白读取 JSON 文件是在其他地方完成的,但我们依赖于输入。

    然后,我直接从上下文菜单中请求AI进行代码重构建议:

    图片

    它建议将加载操作分解为单独的方法,以简化代码。我非常认可,几乎每个开发人员都会同意这一有效改进。

    它也可能还会抱怨代码里缺乏错误检测。

    代码完成

    下面让我们再尝试一些代码完成功能。我将使用 C# FlagsAtribute 来尝试Copilot 完成示例。


    下面的一段摘自于一篇技术文章:“当您想要高效地存储标志集(即一组使用按位运算操作的布尔值)时,可以使用 C# 中的 FlagsAttribute。”


    以下是一个简单的代码示例:


    [Flags] public enum Pets{  None = 0,  Dog = 1,  Cat = 2,  Bird = 4,  Rabbit = 8,  Other = 16}


    Flags 值以二进制幂增加,可以构建成一个集合。

    我删除了原有代码,并要求助手使用签名再重新生成它。它给了我生成了相关选项。首先检查标志是否在当前集合中的方法。它给出了这个函数主体:


    public bool CheckFullGameFlags(FullGameFlags flag){ return (InGameFullFlags & flag) != 0;}


    这是原来有的代码:

    public bool CheckGameFlag(FullGameFlags flag) => (InGameFullFlags.HasFlag(flag));


    虽然它没有给出现代级的 C# 方法,但HasFlag 正确地计算出了我想要将传入的Flag与集合进行比较。InGameFullFlags从上面的代码中找到了本地集合。

    然后我给了它 SetFullGameFlag 的免费签名。同样,命名约定中有足够的内容用于提示,我想添加新的 Flag:

    图片


    我再次点击曲线并使用“使用 AI 实现”,它生成了下面的代码,它还附带了完整的解释。

    void SetFullGameFlag(FullGameFlags flag){   InGameFullFlags = InGameFullFlags | flag;}


    这和我所拥有的是相同的(除了表达式主体标记⇒外):

    public void SetGameFlag(FullGameFlags flag) => InGameFullFlags |= flag;

    最后,对 ClearGameFlag 也做同样的操作,这只是对设置进行按位取反。再次,得到了完全正确的结果。

    我很高兴地将结果直接写入编辑器,作为代码完成直接搞定。而通过在侧面板中写入了帮助信息,AI 附带了大量的解释说明文字。

    结论


    总体来说,我认为 AI 助手的表现令人钦佩;对于许多开发者来说,AI 可能只是对 IDE 的一种期待,并不怎么太前实用。现在是时候改变想法了。


    此外, AI 助手的注册登录仍然是一个小麻烦,但这种情况最终会改变。我很快就启动并运行了整个 IDE 与 AI 助手,而且运行速度相当地快。


    在某种程度上,“Hi,看看!我们有人工智能”已经是当前 IDE 的标品了,因为操作环境在不断扩大,而大家的期望一步步在形成。


    相信到明年,其中大部分AI特性将作为 IDE 体验的一部分存在,就像今天使用的剪切和粘贴一样。

    作者:万能的大雄

    评论