在 VS Code 中追求极致智能
2023年11月13日,作者:Chris Dias,@chrisdias
如果您上周关注了 GitHub Universe 大会,您一定看到了整个开发者工作流程中人工智能取得的巨大进步、创新和愿景。在这篇博文中,我们重点介绍过去几个月围绕 Visual Studio Code 所做的改进,这些改进旨在实现这一宏伟愿景。
“绝顶聪明”
在马特·达蒙和本·阿弗莱克主演的经典电影《心灵捕手》(Good Will Hunting)中,我最喜欢的台词之一是 “我的伙计绝顶聪明”(用波士顿口音读出来更有韵味)。
这句台词出自摩根(凯西·阿弗莱克饰,本的弟弟)之口。当时威尔(马特·达蒙饰)通过逐页、逐字地复述美国历史知识,平息了查基(本·阿弗莱克饰)与一位过于自负的“一年级研究生”之间的冲突。你可以说威尔是由他读过的所有书培养出来的,并且能够根据谈话内容回想起这些知识。
AI 和威尔很像——它了解海量的文本。但 AI 缺少的是人类所具备的、为了给出最佳答案而必不可少的“交互情境”。而在威尔的例子中,因为他还能“看懂局面”,所以他能运用自己的书本知识,完成一次精准的反击。
大语言模型(LLM)是在特定时间点对公共仓库数据进行训练的。这意味着它们对您当前的代码一无所知。它们了解一般的代码知识,但缺乏必要的语境来准确回答关于这些代码的问题,也无法根据您工作空间的形式和功能来建议新的代码。
为了解决这个问题,GitHub Copilot Chat 会发送代码片段,帮助模型更好地回答问题(这被称为检索增强生成,即“RAG”)。通过查看最相关的代码,答案会变得更准确。但是,发送给 LLM 的代码量(以及通过提示词进行的引导)是有限制的。对于小项目,这通常不是问题。但考虑到任何大型源代码库,你很快就会意识到,将每个文件的内容发送给模型是不可能的。获得更好答案的解决方案是在合理的时间内,利用适当的资源发送相关的上下文。为了帮助实现这一点并解锁许多其他场景,我们在 Copilot Chat 中增加了“参与者”(participants)的概念。
参与者
聊天参与者是领域专家,他们可以通过各种方式回答用户查询——既可以完全利用 AI 处理查询,也可以通过将其转发给后端服务的方式进行传统处理。参与者还可以为大语言模型提供特定领域的工具访问权限。在 LLM 的帮助下,参与者可以选择工具并定义如何调用它。@workspace 就是这样一个聊天参与者的例子。@workspace 参与者了解您的工作空间,并能回答关于它的问题。在内部,该参与者由不同的工具驱动:GitHub 的知识图谱结合语义搜索、本地代码索引以及 VS Code 的语言服务。
聊天参与者可以由客户端或服务提供。在 GitHub Universe 大会上,演示了一个服务端参与者,即 github.com 聊天体验中的“文档代理”(Docs Agent),它知道如何搜索仓库中的文档(即将登陆 VS Code)。
客户端参与者可以通过传统的 VS Code 扩展来提供。关于这一点,我们将在可扩展性部分详细说明,但现在让我们先看看 VS Code 中目前可用的两个聊天参与者:@workspace 和 @vscode。
@workspace
@workspace 参与者知道如何收集关于工作空间代码的上下文,可以帮助您导航代码、查找相关类、文件等。假设您正在 VS Code 仓库中,想了解更多关于负责当前 ICodeEditor 的服务的信息;您可以这样使用该参与者:

使用自然语言询问 @workspace 参与者“我使用什么服务类来获取当前的 ICodeEditor”。此后,参与者执行以下操作,以获取适量的上下文发送给 LLM:
-
vscode 仓库已由 GitHub Search Blackbird 服务建立索引。
@workspace参与者将此索引作为工具来利用仓库知识图谱。@workspace参与者运行语义搜索,返回相关的代码片段和元数据。GitHub 搜索服务已对前 1 万个 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 假打开文件时的那个东西叫什么?怎么禁用它?”。

请注意,响应中有一个在设置编辑器中显示(Show in Settings Editor)按钮。这是因为 @vscode 参与者不仅了解 VS Code 的工作原理,还拥有调用设置编辑器或命令面板的工具。
此外,命令面板现在支持相似性搜索,因此在搜索命令时,您不再需要知道它的确切名称。您不再需要说出独特的 VS Code 行话,就能解锁团队每月发布的所有好功能。
这仅仅是 @vscode 参与者的开始。我们计划支持越来越多的场景,让用户能够更好地理解并全面掌控 VS Code。
斜杠命令
聊天参与者还可以提供我们所说的斜杠命令(slash commands),它们是参与者提供的特定功能的快捷方式。回答问题时的任务之一是确定意图,理解您想要做什么。
我们可以推断“创建一个带有 Node.js Express Pug TypeScript 的新工作空间”意味着您想要一个新项目,但“@workspace /new Node.js Express Pug TypeScript”更明确、更简洁,并为您节省了输入时间。

一旦意图明确,@workspace 参与者就有更好的机会满足用户的需求,尽管自然语言本身存在歧义。@workspace 可以建议目录结构,用户可以点击建议的文件进行预览。还有一个创建工作空间(Create Workspace)按钮,可以在新文件夹中生成这些文件。

扩展性
“VS Code 只是一个外壳,你需要扩展插件才能让它大放异彩!”——这是微软 VS Code 扩展开发团队开会时常说的口号,他们为自己在 VS Code 成功中所扮演的角色感到自豪。我们作为 VS Code 核心团队完全同意他们的看法——没有丰富的扩展生态系统,VS Code 就不会有今天的成就!AI 也不例外,虽然核心 AI 体验因 Copilot 而焕发光彩,但我们的愿景是让生态系统中的所有扩展都能参与进来,并允许 LLM 模型获得最佳的上下文和落地支持。今天,我们通过在提议状态下添加 聊天参与者 API,为这一愿景奠定了基础。
聊天参与者 API 允许扩展提供参与者,以回答用户的特定问题。@workspace 和 @vscode 参与者都是使用此 API 实现的。通过聊天参与者,用户可以将来自其内部和外部循环工具的丰富且最新的信息带入 AI 对话中,同时保持在编辑器流程中。参与者就像某个领域的专家,当用户在提示词中明确提到 @参与者时,该提示词会被转发给提供该特定参与者的扩展。
参与者可以使用 Markdown 回复简单的文本和图像,或者使用文件树或按钮进行更具交互性的体验。例如,当参与者建议为用户创建新工作空间时,可以使用文件树进行预览。参与者可以为每个响应提供后续建议,想象它们是关于如何进一步进行对话的提案。为了提供流畅的用户体验,整个 API 都是基于流的。如前所述,参与者可以引入斜杠命令——即特定功能的快捷方式。例如,@docker 参与者可能会提供 /generate 斜杠命令,从而得到以下用户提示示例:“@docker /generate 一个 DOCKERFILE”。目前的语法明确且简洁,是一种方便的时间节省工具。不过,我们正在致力于意图检测,以允许 VS Code 核心根据用户的自然语言提示自动选择正确的参与者和斜杠命令。
想象一下,在 VS Code 中安装一个了解 Azure 或 Docker 的聊天参与者。或者,您可能只需要一个 使用图像生成作为工具的 DALL-E 参与者,为您展示一只可爱的小动物,肯定您工作出色。

参与者可以带来任何特定领域的内容,同时访问该领域的工具。例如,1ES 代表 One Engineering System,是微软的内部工程系统。1ES VS Code 扩展提供了一个 @1es 参与者,可以为微软内部工程师回答特定问题。@1es 参与者会动态规划并展示它正在执行的操作。它使用 LLM 模型中可用的一些公共数据,但也识别微软内部的细节,并将两者结合起来以提供最佳答案。

并且因为参与者拥有当前的上下文,它可以继续讨论。

我们还在添加一个 API,允许扩展访问 LLM,并可以选择使用 LLM 来处理和回答用户的查询。目前,此 API 仅限于实现参与者的扩展。聊天参与者 API 将精确的用户提示传递给参与者,并且通过 LLM 访问,参与者可以方便地将这些语言提示转换为特定的后端 API 调用。我们将谨慎且透明地处理此 API 的使用,以便用户了解参与者使用了多少请求和 token。
聊天参与者 API 仍处于提议阶段,我们正在寻求关于如何改进它的反馈,目标是在不久的将来最终确定该 API。您现在就可以进行尝试,最好的开始方式是参考我们的 聊天参与者扩展性示例。我们迫不及待地想看到您为开发者创造的 AI 驱动的创新。
便利性
我们对参与者及其带来的无限可能性感到非常兴奋,但我们也想谈谈我们在 VS Code 中添加到您日常工作流程中的那些由 Copilot 驱动的小型便捷交互。您不应该为了利用 AI 而被迫重新学习您的编辑器。
智能操作
智能操作已无缝集成在您的 VS Code 工作流中(例如,在“快速修复”和上下文菜单中),并且您无需编写任何提示词。最强大的智能操作是 /fix。这里是一个简单的 TypeScript 快速排序算法,其中有一个错误提示:“'number' 类型不能分配给 'never' 类型的参数”。点击灯泡并选择使用 Copilot 修复。

此选项打开包含 /fix 以及错误消息的内联聊天。在后台,我们引入了额外的 VS Code 诊断上下文,然后让 Copilot 提供修复方案——更新 left 和 right 数组以使用正确的类型声明。

我们注意到,/fix 对于 shell 等语言特别有用,因为这些语言的传统工具有时会缺乏支持。

为了帮助使其建议更清晰,Copilot 会尝试解释为什么要提出特定的修复方案。我们很高兴地得知,用户接受 Copilot 建议修复方案的比例约为 60%。有时修复方案可能与灯泡附近的代码无关,而是需要安装缺失的依赖项——在这种情况下,/fix 会建议一条可以在集成终端中运行的命令。
与 /fix 类似,/doc 智能操作在用户中也很受欢迎。要使用 /doc,请选择一段代码,右键点击,然后选择 Copilot > 生成文档。Copilot 将为您的代码生成文档注释,我们认为您会对文档的质量感到惊讶。

生成提交和拉取请求消息
有时意图非常明确。在这种情况下,AI 的体验几乎感觉像是魔法。我目前最喜欢的是 Copilot 自动生成提交消息的功能。在安装了 Copilot 的源代码视图中,您会在提交消息字段旁边看到一个新的闪烁图标。选择该图标,Copilot 就会为您填入消息!

我对这个体验感到非常兴奋,我甚至在前几天使用 vscode.dev/github 编辑 Markdown 时就用了这个提交功能,因为 Copilot 扩展程序尚未在 Web 上启用。
回到我们的流程,让我们继续创建一个拉取请求。我安装了 GitHub Pull Requests and Issues 扩展,它知道 Copilot Chat 扩展的存在。当我发起 PR 时,标题和描述旁边会有另一个闪烁图标。选择它,Copilot 就会自动写出一段很好的描述!

这是 AI 可以帮助您提高生产力的另一个领域,通过自动处理您每周执行几十次甚至几百次的简单而繁琐的任务。
什么情况?!
最后,打造一个真正智能的 AI 意味着让交互尽可能轻松。
过去几年,我们在语音识别技术方面已经非常出色。我们知道很多人一直渴望将语音助手与高级 LLM 结合起来。现在,您可以在 VS Code 中同时使用它们。
新的 VS Code Speech 扩展为 VS Code 带来了语音转文字支持。安装后,您会在所有自然语言输入对话框中看到一个麦克风图标。选择它,向 Copilot 提问,然后享受魔法吧。

这难道不棒吗!?我告诉过你,我的伙计绝顶聪明!

该扩展目前仍处于预览阶段,且仅支持英语,但我们将在未来几个月内继续用新的语言和功能更新它。
更聪明地工作,而不是更辛苦地工作
以上所有内容及更多功能现已在 VS Code 中提供!您只需安装 GitHub Copilot 扩展即可。您可以在我们的文档中了解更多关于 Copilot Chat 功能的信息。
谢谢!
Chris 和 VS Code 团队
祝智能编码愉快!
