现已发布!了解 11 月的新功能和修复。

在 VS Code 中追求“极致智能”

2023 年 11 月 13 日,Chris Dias 发布,@chrisdias

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

“极致智能”

马特·达蒙和本·阿弗莱克的经典电影《心灵捕手》中,我最喜欢的一句台词是 “我的孩子真是聪明绝顶”(用波士顿口音读出来才能达到最佳效果)。

这句台词是摩根(卡西·阿弗莱克,本的兄弟)在威尔(马特·达蒙)通过逐页、逐字地回忆美国历史的事实,化解了查克(本·阿弗莱克)和一位过于自信的“一年级研究生”之间的冲突后说的。你可以说威尔是通过他读的所有书训练出来的,并且能够根据谈话回忆起它们。

人工智能与威尔类似——它了解大量的文本。但人工智能缺少的是什么——人类拥有而人工智能没有的是,为了给出最佳答案,需要特定互动的上下文。在威尔的例子中,因为他也能“察言观色”,所以他可以使用他的书本知识来回击。

大型语言模型 (LLM) 在某个时间点接受了公共存储库数据的训练。这意味着他们对你当前的代码一无所知。他们了解一般的代码,但他们没有必要的上下文来准确回答有关代码的问题,或者提出符合你工作区形式和功能的新代码。

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

参与者

聊天参与者是领域专家,他们可以根据自己的意愿回答用户查询——通过在查询处理中充分利用人工智能,或者以传统方式将其转发到后端服务。参与者还可以为大型语言模型提供对特定领域工具的访问权限。在 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 搜索服务已索引了前 10K 个 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 得到增强,但我们的愿景是生态系统中的所有扩展都可以参与进来,并允许 LLM 模型获得尽可能最佳的上下文和基础。今天,我们通过在 提案状态下添加 聊天参与者 API,为这一愿景奠定基础。

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

参与者可以使用 Markdown 回复简单的文本和图像回复,或者他们可以使用文件树或按钮进行更具交互性的体验。例如,当参与者建议为用户创建一个新的工作区时,可以使用文件树作为预览。参与者可以为每个响应提供后续操作,可以将它们想象成关于如何进一步进行对话的建议。为了提供流畅的用户体验,整个 API 都是基于流的。正如已经提到的,参与者可以引入斜杠命令——特定功能的快捷方式。例如,@docker 参与者可能会贡献一个 /generate 斜杠命令,从而产生以下示例用户提示“@docker /generate 一个用于工作区的 DOCKERFILE”。当前的语法明确而简洁,可以节省时间。尽管如此,我们正在努力进行意图检测,以便 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 快速排序算法,其中一个错误指出“类型 'number' 的参数不能分配给类型 '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 会尝试解释为什么它提出了特定的修复。我们很高兴得知用户大约 60% 的时间接受了 Copilot 的修复建议。有时修复可能与灯泡附近的代码无关,而需要安装缺失的依赖项——在这种情况下,/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 Pull Requests and Issues 扩展,它知道 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 团队

祝您编码智能快乐!