在VS Code中追求“极度智能”
2023年11月13日,由Chris Dias发布,@chrisdias
如果你上周观看了GitHub Universe,你会看到在整个开发者工作流程中人工智能的巨大进步、创新和愿景。我们在这篇博客文章中想要做的是聚焦于过去几个月在Visual Studio Code上取得的进展,这些进展有助于实现这一更广泛的愿景。
"非常聪明"
我最喜欢马特·达蒙和本·阿弗莱克的经典电影《心灵捕手》中的一句台词是"my boy's wicked smaaahtt"(用波士顿口音读出来效果更佳)。
这句话是由摩根(Casey Affleck,Ben的兄弟)在威尔(Matt Damon)通过逐页逐字回忆美国历史的事实,打断了查基(Ben Affleck)和一个过于自信的“一年级研究生”之间的对峙后说出的。可以说,威尔通过他读过的所有书籍得到了训练,并能够根据对话回忆起这些内容。
人工智能类似于威尔——它了解大量文本。但人工智能所缺少的——人类拥有而人工智能没有的——是特定交互的上下文,以便给出最佳答案。在威尔的情况下,因为他还能“读懂房间”,他可以利用他的书本知识来返回一个精心设计的反驳。
大型语言模型(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:
-
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
当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 模型拥有最佳的上下文和基础。今天,我们通过在 提议状态 中添加 chat participant 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的使用,以便用户了解参与者使用了多少请求和令牌。
聊天参与者API仍然是提议的,我们正在寻求关于如何改进它的反馈,目标是在不久的将来最终确定API。您今天就可以尝试一些东西,最好的开始方式是从我们的聊天参与者扩展性示例开始。我们迫不及待地想看到您为开发者创造的AI驱动的创新。
便利性
我们对参与者及其带来的无限可能性感到非常兴奋,但我们也想谈谈我们正在添加到VS Code中的那些由Copilot驱动的便捷小交互,这些交互直接融入您的常规工作流程中。您不应该为了利用AI而重新学习您的编辑器。
智能操作
智能操作无缝集成在您的VS Code流程中(例如,在快速修复和上下文菜单中),并且它们完全不需要您编写任何提示。最强大的智能操作是/fix
。这里有一个相对简单的TypeScript快速排序算法,其中有一个错误提示“'number'类型的参数不能赋值给'never'类型的参数”。点击灯泡并选择使用Copilot修复。
此选项会打开内联聊天,其中填充了/fix
以及错误信息。在幕后,我们引入了额外的VS Code诊断上下文,这使得Copilot能够提供修复——更新left
和right
数组以使用正确的类型声明。
我们注意到/fix
对于像shell这样的语言特别有用,因为传统的工具有时会有所欠缺。
为了使建议更加清晰,Copilot 将尝试解释为什么提出特定的修复。我们很高兴了解到用户在大约60%的情况下接受了Copilot的建议修复。有时修复可能与灯泡附近的源代码无关,而是需要安装缺失的依赖项——在这种情况下,/fix
提出了一个可以在集成终端中运行的命令。
类似于/fix
,/doc
智能操作也深受用户欢迎。要使用/doc
,请选择一段代码,右键点击,然后选择Copilot > 生成文档。Copilot 将为您的代码生成文档注释,我们认为您会对文档的质量感到惊讶。
生成提交和拉取请求消息
有时候意图非常明确。在这种情况下,与AI的互动体验几乎感觉像是魔法。我现在最喜欢的功能是让Copilot自动生成提交信息。在安装了Copilot的源代码视图中,您会在提交信息字段旁边看到一个新的闪光图标。点击这个闪光图标,Copilot就会自动填写信息!
我对这次体验感到非常兴奋,我甚至在几天前使用vscode.dev/github编辑Markdown时提交了这个提交,因为Copilot扩展还没有web enabled。
回到我们的流程,让我们继续并创建一个拉取请求。我已经安装了GitHub Pull Requests and Issues扩展,它知道Copilot Chat扩展的存在。当我创建一个PR时,标题和描述旁边会出现另一个闪亮的图标。选择它,Copilot会自动写一个很好的描述!
这是另一个AI可以帮助你提高生产力的领域,通过自动处理你每周重复10次或100次的简单但繁琐的任务。
说什么?!
最后,打造一个真正智能的AI意味着让交互尽可能轻松。
在过去的几年里,我们在语音识别技术方面取得了很大的进步。我们知道很多人都渴望将语音助手与先进的LLM结合起来。现在,你可以在VS Code中同时使用这两者。
新的VS Code Speech扩展为VS Code带来了语音转文本支持。安装后,您将在所有自然语言输入对话框中看到一个麦克风图标。选择它,向Copilot提问,并享受这种神奇的功能。
你觉得这些苹果怎么样!?我告诉过你我的孩子非常聪明!
该扩展目前仍处于预览阶段,仅支持英文,但我们将在未来几个月内继续更新,增加新的语言和功能。
更聪明地工作,而不是更努力
以上所有功能及更多内容现在都可以在VS Code中使用!您只需安装GitHub Copilot扩展即可。您还可以在我们的文档中了解更多关于Copilot Chat功能的信息。
谢谢!
克里斯和VS Code团队
快乐的 智能 编程!