追求 VS Code 中的极致智能
2023 年 11 月 13 日,作者:Chris Dias,@chrisdias
如果您上周收看了 GitHub Universe,您会看到人工智能在整个开发者工作流程中取得了巨大的进步、创新和愿景。在这篇博客文章中,我们希望重点关注 Visual Studio Code 在过去几个月中为实现这一更广阔愿景所做的改进。
“极致智能”
马特·达蒙和本·阿弗莱克的经典电影《心灵捕手》中,我最喜欢的一句台词是“我那小子聪明透顶了”(请用波士顿口音读,效果更佳)。
这句话是摩根(本·阿弗莱克的兄弟卡西·阿弗莱克饰)在威尔(马特·达蒙饰)通过逐页逐字地回忆美国历史事实,化解了查基(本·阿弗莱克饰)与一位过于自信的“研一学生”之间的冲突后说的。可以说威尔是通过他所阅读的所有书籍进行训练的,并能够根据对话回忆起它们。
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
参与者“我应该使用哪个服务类来获取当前的 ICodeEditor”。从那里,该参与者执行以下操作以获取适量的上下文发送给 LLM:
-
VS Code 仓库已由 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
VS Code 假打开文件时那个东西叫什么?以及如何禁用它?”。
请注意,响应中有一个**在设置编辑器中显示**按钮。这是因为 @vscode
参与者不仅了解 VS Code 的工作原理,而且还拥有一个工具来调用设置编辑器或命令面板。
此外,命令面板现在支持相似度搜索,因此您在搜索命令时不再需要知道其确切名称。您不再需要使用独特的 VS Code 术语来解锁团队每月发布的所有优秀功能。
这仅仅是 @vscode
参与者的开始。我们计划支持越来越多的场景,让用户更好地理解并完全控制 VS Code。
斜杠命令
聊天参与者还可以贡献我们所说的**斜杠命令**,它们是参与者提供的特定功能的快捷方式。回答问题时的任务之一是确定意图,理解您想要做什么。
我们可以推断“使用 Node.js Express Pug TypeScript 创建新工作区”意味着您想要一个新项目,但“@workspace /new
Node.js Express Pug TypeScript”明确、简洁,并节省您的输入时间。
一旦意图明确,@workspace
参与者就有更大的机会满足用户的需求,尽管自然语言存在固有的歧义。@workspace
可以建议目录结构,用户可以点击建议的文件进行预览。有一个**创建工作区**按钮,它将在新文件夹中生成这些文件。
可扩展性
“VS Code 只是一个外壳,你需要扩展才能让它大放异彩!”——这是微软团队在 VS Code 扩展方面工作的常见会议口号,他们自豪地展示自己在 VS Code 成功中的作用。我们作为 VS Code 核心团队完全同意他们的观点——如果没有丰富的扩展生态系统,VS Code 不会成为今天的这个产品!AI 也不例外,虽然核心 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 参与者,它使用图像生成作为工具来呈现一个可爱的动物,以肯定您做得非常棒。
参与者可以带来任何领域特定内容,同时访问该领域的工具。例如,1ES 代表 One Engineering System,是微软内部的工程系统。1ES VS Code 扩展贡献了一个 @1es
参与者,可以为微软内部工程师回答特定问题。@1es
参与者会动态规划并展示它正在做什么。它使用 LLM 模型中一些可用的公共数据,但它也识别微软内部的特定信息,并将两者结合起来提供最佳答案。
而且因为参与者拥有当前上下文,它还可以继续讨论:
我们还在添加一个 API,允许扩展访问 LLM,并可以选择使用 LLM 来处理和回答用户查询。目前,此 API 仅限于实现参与者的扩展。聊天参与者 API 将准确的用户提示传递给贡献的参与者,并且通过 LLM 访问——参与者可以方便地将这些语言提示转换为特定的后端 API 调用。我们将谨慎和透明地处理此 API 的使用,以便用户了解参与者使用了多少请求和令牌。
聊天参与者 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 团队
愉快的智能编程!