现已推出!阅读 10 月份的更新功能和修复。

在 VS Code 中追求“超强智能”

2023 年 11 月 13 日,作者:Chris Dias,@chrisdias

如果您上周收看了 GitHub Universe,您将看到在整个开发工作流程中人工智能取得了巨大的进展、创新和愿景。我们在这篇博文中想要做的是关注过去几个月围绕 Visual Studio Code 的进展,这些进展有助于实现这一更广泛的愿景。

“超强智能”

我最喜欢的 Matt Damon 和 Ben Affleck 的经典电影“心灵捕手”中的一句台词是 “我的男孩超聪明”(用波士顿口音念出来,才能体会到其中的韵味)。

这句话是由摩根(凯西·阿弗莱克,本的兄弟)说的,当时威尔(马特·达蒙)打断了查基(本·阿弗莱克)和一个过于自信的“一年级研究生”之间的争执,他逐页逐字地回忆了美国历史上的事实。可以说,威尔是被他读过的所有书籍训练出来的,并且能够根据谈话内容回忆起这些书籍。

AI 类似于威尔——它了解很多文本。但 AI 所缺少的——人类所拥有的而 AI 不具备的——是特定交互的上下文,以便给出最佳答案。在威尔的情况下,因为他也能“察言观色”,所以他可以利用自己的书本知识来进行精心策划的反驳。

大型语言模型 (LLM) 在某个时间点接受过公共存储库数据的训练。这意味着它们对您当前的代码一无所知。它们了解一般的代码,但它们没有必要的信息来准确地回答有关代码的问题,或者建议遵循您工作空间形式和功能的新代码。

为了解决这个问题,GitHub Copilot Chat 会发送代码片段,帮助模型更好地回答问题(这被称为检索增强生成,或“RAG”)。通过查看最相关的代码,答案会得到改善。但是,可以发送给 LLM 的代码量(以及通过提示进行的指导)是有限的。对于小型项目,这通常不是问题。但请考虑任何大型源代码存储库,您会很快意识到将所有文件的全部内容发送给模型是不可能的。获得更好答案的解决方案是使用合理的时间量,发送使用合适资源量的相关上下文。为了帮助解决这个问题,并解锁更多其他场景,我们在 Copilot Chat 中添加了“参与者”的概念。

参与者

聊天参与者是领域专家,他们可以根据自己的方式回答用户查询——通过在查询处理中充分利用 AI 或通过以传统方式将其转发到后端服务。参与者还可以为大型语言模型提供访问特定领域工具的权限。借助 LLM,参与者可以选择一个工具并定义如何调用它。此类聊天参与者的一个示例是@workspace@workspace 参与者了解您的工作空间,可以回答有关工作空间的问题。在内部,参与者由不同的工具提供支持:GitHub 的知识图谱与语义搜索、本地代码索引和 VS Code 的语言服务相结合。

聊天参与者可以由客户端或服务提供。在 GitHub Universe 上,展示了一个服务端参与者,github.com 聊天体验中的“文档代理”,它知道如何搜索在存储库中找到的文档(即将在 VS Code 中推出)。

客户端参与者可以通过传统的 VS Code 扩展提供。有关详细信息,请参阅 可扩展性 部分,但让我们先看一下 VS Code 中当前可用的两个聊天参与者:@workspace@vscode

@workspace

@workspace 参与者知道如何收集有关工作空间中代码的上下文,可以帮助您浏览它、查找相关的类、文件等。假设您在 VS Code 存储库 中,并且您想要了解更多关于负责当前 ICodeEditor 的服务的信息;您可以像这样使用参与者

@workspace participant answering question about detecting running extensions

自然语言用于询问@workspace 参与者“我使用什么服务类来获取当前的 ICodeEditor”。从那里开始,参与者执行以下操作,以获得发送给 LLM 的恰到好处的上下文

  • vscode 存储库已通过 GitHub Search Blackbird 服务 进行了索引。@workspace 参与者使用此索引作为工具来利用存储库知识图谱。@workspace 参与者运行语义搜索,返回相关的代码片段和元数据。GitHub 搜索服务已索引前 10,000 个 GitHub 存储库,并计划添加更多存储库。

  • @workspace 参与者使用的下一个工具是在本地索引上进行词法文本搜索,以查找额外的代码,例如本地、未提交的更改以及 Copilot 聊天历史记录。

  • 然后,@workspace 使用了最后一个工具——VS Code 的语言智能,以添加重要的详细信息,如函数签名、参数,甚至内联文档。

所有这些上下文部分都被@workspace 参与者进行排名、切片和汇总,然后发送给 LLM 以回答问题。

由于拥有所有必要的上下文,@workspace 参与者可以回答开发人员更有可能提出的问题。例如,与代码不同部分如何交互相关的问题

  • @workspace 如何安排通知?”

或者需要了解相关代码、依赖项和设计模式的问题

  • @workspace 添加表单验证,类似于新闻简报页面”

@vscode

VS Code 可以通过多种方式进行自定义,甚至 VS Code 团队成员也会在发现一些隐藏的功能时感到惊喜。为了帮助我们的用户和团队成员一样充分发挥 VS Code 的强大功能,我们创建了@vscode 参与者。

此参与者了解 VS Code 的所有内容,可以帮助您缩短自然语言与 VS Code 命令和自定义之间的差距。@vscode 参与者在内部使用提供对其所有设置和命令索引的访问权限的工具,我们正在添加一个工具,以便该参与者也可以使用 VS Code 的 文档。现在,您可以提出模糊的问题,例如“@vscode vscode 模拟打开文件时那个东西的名字是什么?如何禁用它?”

@vscode participant answering question about preview editors

请注意,在响应中有一个“在设置编辑器中显示”按钮。这是因为@vscode 参与者不仅了解 VS Code 的工作原理,而且还拥有一个工具来调用设置编辑器或命令面板。

此外,命令面板现在支持相似性搜索,因此您在搜索命令时不再需要知道命令的确切名称。您不再需要使用独特的 VS Code 行话来解锁团队每月发布的所有好东西。

这仅仅是@vscode 参与者的开始。我们计划支持更多场景,使用户能够更好地理解和完全控制 VS Code。

斜杠命令

聊天参与者还可以提供我们所谓的“斜杠命令”,它们是参与者提供的特定功能的快捷方式。回答问题时的一项任务是确定意图,了解您想要做什么。

我们可以推断“使用 Node.js Express Pug TypeScript 创建一个新工作空间”意味着您想要一个新项目,但“@workspace /new Node.js Express Pug TypeScript”是明确的、简洁的,可以节省您输入时间。

New slash command

一旦意图明确,@workspace 参与者就有更大的机会满足用户的需求,尽管自然语言本身存在歧义。@workspace 可以提议目录结构,用户可以单击提议的文件以预览它们。有一个“创建工作空间”按钮,将在新文件夹中生成这些文件。

@workspace /new results displaying project tree and Create Workspace button

可扩展性

“VS Code 只不过是一个外壳,你需要扩展来让它闪耀!”——这通常是微软团队在 VS Code 扩展上工作的座右铭,他们自豪地炫耀自己在 VS Code 成功中的作用。我们,作为 VS Code 核心团队,完全同意他们的观点——没有丰富的扩展生态系统,VS Code 就不会是今天的样子!AI 也不例外,虽然 Copilot 增强了核心 AI 体验,但我们的愿景是,我们生态系统中的所有扩展都可以参与进来,让 LLM 模型拥有最佳的上下文和基础。今天,我们通过添加 聊天参与者 API提议状态 中为这一愿景奠定基础。

聊天参与者 API 允许扩展提供参与者,这些参与者可以回答用户提出的具体问题。@workspace@vscode 参与者都是使用此 API 实现的。通过聊天参与者,用户可以在保持编辑器流程的同时,将来自内部和外部循环工具的丰富且最新的信息引入 AI 对话中。参与者就像某个领域的专家,当用户在提示中明确提到 @participant 时,该提示将转发给提供该特定参与者的扩展。

参与者可以使用 Markdown 来进行简单的文本和图像响应,或者通过文件树或按钮来进行更具交互性的体验。例如,当参与者建议为用户创建一个新的工作区时,文件树可以用作预览。参与者可以为每个响应提供后续行动,可以将其想象为关于如何进一步进行对话的建议。为了提供流畅的用户体验,整个 API 是基于流的。如前所述,参与者可以引入斜杠命令,即特定功能的快捷方式。例如,@docker 参与者可能会贡献一个 /generate 斜杠命令,从而产生以下示例用户提示 "@docker /generate a DOCKERFILE for workspace"。当前的语法明确简洁,可以节省时间。但是,我们正在努力进行意图检测,以便让 VS Code 核心能够根据用户的自然语言提示自动选择正确的参与者和斜杠命令。

想象一下在 VS Code 中安装一个了解所有关于 Azure 或 Docker 的聊天参与者。或者你可能只需要一个 使用图像生成作为工具的 DALL-E 参与者 来呈现一只可爱的动物,以肯定你正在做得很棒。

DALL-E generated image of cute cat providing an affirmation

参与者可以引入任何特定于领域的內容,同时访问该领域的工具。例如,1ES 代表 One Engineering System,是微软内部的工程系统。1ES VS Code 扩展贡献了一个 @1es 参与者,它可以回答微软内部工程师的特定问题。@1es 参与者动态规划并展示它实际在做什么。它使用 LLM 模型中公开的某些数据,但它也识别微软内部的具体情况并将两者结合起来,以提供最佳答案。

@1es participant answering a question about CFS, a Microsoft internal initiative

由于参与者拥有当前的上下文,因此它可以继续讨论。

@1es participant providing more details about using CFS

我们还添加了一个 API,允许扩展访问 LLM,并可以选择使用 LLM 来处理和回答用户查询。今天,这个 API 仅限于那些实现了参与者的扩展。聊天参与者 API 将确切的用户提示传递给贡献的参与者,并且通过 LLM 访问,参与者可以方便地将这些语言提示转换为特定的后端 API 调用。我们将谨慎透明地处理此 API 的使用,以便用户了解参与者使用了多少请求和令牌。

聊天参与者 API 仍然是 建议 的,我们正在寻求关于如何改进它的反馈,目标是在不久的将来最终确定 API。你今天就可以尝试一些东西,最好的开始方式是查看我们的 聊天参与者扩展性示例。我们迫不及待地想看到你为开发人员创建的基于 AI 的创新。

便利性

我们对参与者及其带来的无限可能性感到非常兴奋,但我们也希望讨论一下我们正在为 VS Code 添加的便捷的小型 Copilot 支持的交互,就在你日常工作流程中。你不应该为了利用 AI 而重新学习你的编辑器。

智能操作

智能操作无缝地集成到你的 VS Code 流程中(例如,在快速修复和上下文菜单中),并且它们不需要你编写任何提示。最强大的智能操作是 /fix。这是一个相对简单的 TypeScript 快速排序算法,其中有一个错误提示 "Argument of type 'number' is not assignable to parameter of type 'never'"。点击灯泡,选择**使用 Copilot 修复**。

Quick Fix light bulb menu with Fix using Copilot selected

此选项将打开一个内联聊天,其中填充了 /fix 以及错误消息。在幕后,我们引入了额外的 VS Code 的诊断上下文,然后让 Copilot 提供修复 - 更新 leftright 数组以使用正确的类型声明。

Copilot proposed fix shown in a diff view

我们注意到,/fix 对像 Shell 这样的语言特别有用,因为传统的工具有时会缺乏。

Copilot proposed fix for a shell command

为了帮助使它的建议更清晰,Copilot 会尝试解释为什么它提出了一个特定的修复。我们很高兴地了解到,用户接受 Copilot 建议的修复约 60% 的时间。有时修复可能与灯泡附近的源代码无关,而需要安装一个缺少的依赖项 - 在这种情况下,/fix 会建议一个可以在集成终端中运行的命令。

/fix 类似,/doc 智能操作很受用户欢迎。要使用 /doc,请选择一段代码,右键单击,然后选择**Copilot** > **生成文档**。Copilot 将为你的代码生成一个文档注释,我们认为你会对文档质量感到惊讶。

/doc command with a generated JSDoc comment

生成提交和拉取请求消息

有时意图非常明确。在这种情况下,与 AI 的体验可能感觉几乎是神奇的。我现在最喜欢的是让 Copilot 自动生成提交消息的能力。在安装了 Copilot 的源代码视图中,你将在提交消息字段旁边看到一个新的闪光图标。选择闪光,Copilot 将填充消息!

Source Control input box with sparkle to generate commit message

我对这种体验非常兴奋,我甚至在几天前使用 vscode.dev/github 编辑 Markdown 时做了这个提交,因为 Copilot 扩展还没有 启用 Web

Commit message wishing that Copilot worked in VS Code for the Web

回到我们的流程,让我们继续前进并创建一个拉取请求。我安装了 GitHub 拉取请求和问题 扩展,它知道 Copilot Chat 扩展的存在。当我创建一个 PR 时,标题和描述旁边还有一个闪光图标。选择它,Copilot 会自动编写一个不错的描述!

GitHub Pull Request and Issue extension Create view with sparkle to generate title and description

这是 AI 可以帮助你提高工作效率的另一个领域,它可以自动处理你每周做 10 次或 100 次的简单但繁琐的任务。

你说什么?!

最后,打造一个真正智能的 AI 意味着让交互尽可能轻松。

在过去几年中,我们行业在语音识别技术方面取得了很大进步。我们知道很多人一直渴望将语音助手与高级 LLM 相结合。现在,你可以在 VS Code 中一起使用它们。

新的 VS Code Speech 扩展将语音到文本支持带到 VS Code。安装完成后,你将在所有自然语言输入对话框中看到一个麦克风图标。选择它,向 Copilot 提问,然后享受神奇的体验。

Copilot chat input box with Speech extension microphone button

你喜欢这些苹果吗?我告诉你,我的孩子真的很聪明!

Copilot chat answer to best code editor for node and express app

该扩展仍处于预览阶段,目前仅支持英语,但我们将在未来几个月继续用新语言和功能更新它。

效率优先,而不是工作量优先

以上所有功能以及更多功能今天都可以在 VS Code 中使用!你只需要安装 GitHub Copilot 扩展。你可以在我们的 文档 中了解更多关于 Copilot Chat 功能的信息。

谢谢!

Chris 和 VS Code 团队

祝您 智能 编码愉快!