让聊天成为你工作空间中的专家

当聊天能深入理解整个代码库,而不仅仅是单个文件时,它会更有帮助。工作区上下文是使AI能够跨项目搜索、理解组件连接方式并基于实际代码提供答案的底层机制。这使你能够提出诸如“认证处理在哪里?”或“我如何添加新的API端点?”等广泛问题,并根据你的具体代码库获得准确答案。

本文将解释工作区上下文的工作原理,如何管理工作区索引以获得最佳效果,以及如何使用@workspace以及#codebase在你的提示中利用它。

工作区上下文背后的智能会根据项目规模和设置自动调整,确保无论你是在小型个人项目还是大型企业代码库中,都能获得准确的结果。

工作空间上下文的工作原理

VS Code 采用智能搜索策略,为你的问题找到最相关的代码。它不是采用单一方法,而是根据项目规模和可用资源自动选择最佳方法。VS Code 可能会同时运行多种策略,然后选择最快产生效果的方案。

背景资料有哪些?

Workspace 上下文搜索与开发者在 VS Code 代码库中导航时使用的相同来源:

  • 工作区中所有可索引的文件(工作区索引),除了被.gitignore文件
  • 目录结构,包含嵌套文件夹和文件名
  • 代码符号和定义(类、函数、变量)
  • 当前在主动编辑器中选中的文本或可见文本

工作区索引可以由GitHub远程维护,也可以存储在你的机器本地。详情请参见工作区索引部分。

重要

.gitignore如果你打开文件或在被忽略的文件中选择了文本,则会被绕过。

搜索策略

对于小型项目,整个工作区可以直接包含在聊天上下文中。对于较大的项目,VS Code 采用不同策略,寻找最相关的信息,以便包含在聊天上下文中。

以下步骤概述了 VS Code 如何构建工作区上下文:

  1. 确定回答你问题需要工作区中哪些信息,包括对话历史、工作区结构和当前编辑选择。

  2. 通过多种方法从工作区索引中收集相关代码片段:

    • GitHub的代码搜索
    • 本地语义搜索,寻找符合你问题含义的代码,而不仅仅是精确关键词
    • 基于文本的文件名和内容搜索
    • VS Code 的语言 IntelliSense 可以添加函数签名、参数等细节。
  3. 如果得到的上下文太大无法放入上下文窗口,则只保留最相关的部分。

工作空间索引

VS Code 中的聊天使用索引快速且准确地搜索代码库中的相关代码片段。该索引可以由 GitHub 维护,也可以存储在您的本地机器上。

远程索引是基于你在 GitHub 或 Azure DevOps 上仓库的已提交状态构建的。这意味着你本地工作空间中未提交的任何更改都不会被包含在远程索引中。

当你有本地未提交的更改时,VS Code 采用混合方法,结合远程索引和本地文件追踪。VS Code 检测自索引提交以来被修改的文件,并实时读取编辑器中的当前文件内容。

您可以在 VS Code 状态栏的 Copilot 状态仪表盘查看所使用的索引类型及其索引状态。

显示Copilot状态菜单中工作区索引状态的截图。

远程索引

VS Code 可以使用远程代码搜索索引,使 AI 能够快速搜索你的代码库,即使是大型代码库。远程代码搜索目前适用于使用 GitHub 或 Azure DevOps 仓库的工作空间。

GitHub 远程索引

VS Code 会自动构建并使用远程代码搜索索引,覆盖你工作空间中任何 GitHub 支持的仓库。用你的 GitHub 账户在 VS Code 中登录,聊天会自动开始使用任何可用的远程代码搜索索引。

仓库首次被自动索引@workspace#codebase用于聊天。你也可以通过在命令面板中运行“构建远程工作区索引”命令(⇧⌘P(Windows,Linux Ctrl+Shift+P)来强制索引。

每个仓库只需建立一次索引。之后索引会自动保持最新。对于中小型项目,构建索引较快,但如果你的仓库包含数十万个文件,可能需要一些时间。如果GitHub拥有相对最新的代码版本,远程索引效果最佳,因此务必定期将代码推送到GitHub。

目前远程索引适用于托管在 GitHub.com 或 GitHub Enterprise Cloud 上的 GitHub 仓库。但不支持 GitHub Enterprise Server 的仓库。

Azure DevOps remote indexing

VS Code 也可以为 Azure DevOps 仓库使用远程索引。这些索引是自动构建和维护的。用你的 Microsoft 账户在 VS Code 中登录进行聊天,开始使用远程索引。请查看 Copilot 状态栏中的当前索引状态,并获取登录链接,如果你的账户没有访问 Azure DevOps 仓库的权限。

地方指数

如果你无法使用远程索引,比如因为你没有使用GitHub或Azure DevOps仓库,VS Code可以使用存储在本地机器上的高级语义索引,提供快速且高质量的搜索结果。目前,本地索引限制为2500个可索引文件。

要建立本地指数:

  • 该项目可索引文件少于 750 个:VS Code 会自动构建高级本地索引。

  • 该项目包含750到2500个可索引文件:在命令调色板中运行Build本地工作区索引命令(⇧⌘P(Windows,Linux Ctrl+Shift+P)——该命令只运行一次。

  • 该项目拥有2500多个可索引文件:使用基础索引

如果有很多文件变动,比如切换 git 分支时,建立初始本地索引或更新索引可能需要一些时间。你可以在状态栏的 Copilot 状态仪表盘中监控当前的本地索引状态。

基本索引

如果你的项目没有远程索引,且有超过2500个可索引文件,VS Code会退回使用基础索引来搜索代码库。该索引使用更简单的算法搜索代码库,并且优化为本地化,适用于更大的代码库。

基础索引对于多种类型的聊天提示应该完全有效。不过,如果你发现聊天无法为关于代码库的问题提供相关答案,可以考虑升级到远程索引

工作区索引中包含的内容

VS Code 索引你当前项目中相关的文本文件。这不限于特定文件类型或编程语言,但 VS Code 会自动跳过一些通常与工作区问题无关的常见文件类型,例如.tmp.出文件。

工作区索引还会排除所有被 VS Code 排除的文件,使用

files.exclude
  • 在VS代码中打开
  • 在VS Code Insiders中开放
或者是.gitignore档案。

VS Code 目前也不会索引二进制文件,如图片或 PDF。

在聊天中使用工作区上下文

当你在聊天中提出与工作区相关的问题时,确定工作区上下文的行为取决于你使用的代理:

  • 代理/计划

    使用代理时,代理会根据你的提示自动执行Agent代码库搜索。这意味着在初步搜索确定工作空间上下文后,根据结果,代理可能会进行更多更有针对性的搜索,以收集回答你问题所需的信息。

    你不需要明确引用#codebase但如果你想确保工作区上下文被用在你的问题中,也可以这么做。如果你的提示词不明确,可能会被理解为不需要工作区上下文,这很有用。

  • 在Ask中,VS Code会对你的提示进行意图检测,以判断是否需要工作空间上下文。如果需要工作区上下文,VS Code 会进行代码库搜索,并将相关代码片段添加到聊天上下文中。

    你不需要明确引用#codebase但如果你想确保工作区上下文被用在你的问题中,也可以这么做。如果你的提示词不明确,可能会被理解为不需要工作区上下文,这很有用。

  • 编辑

    在编辑中,VS Code 会对提示词进行意图检测,判断是否需要工作空间上下文。如果需要工作区上下文,VS Code 会进行代码库搜索,并将相关代码片段添加到聊天上下文中。与使用代理不同,不进行后续搜索。

    你不需要明确引用#codebase但如果你想确保工作区上下文被用在你的问题中,也可以这么做。如果你的提示词不明确,可能会被理解为不需要工作区上下文,这很有用。

使用工作区上下文的技巧

你提问的方式会显著影响上下文的质量和回答的准确性。为了优化效果,请考虑以下建议:

  • 问题要具体且详细,避免使用模糊或含糊的术语,比如“这有什么用”,因为“这个”可能被解读为最后一个答案、当前文件或整个项目。
  • 在提示中融入可能出现在代码或文档中的术语和概念。
  • 通过选择代码、引用文件或#提及上下文项(如调试上下文、终端输出等)明确包含相关上下文。
  • 响应可以调用多个引用,例如“查找无捕捉块的异常”或“提供 handleError 调用示例”。不过,不要期待代码库中会有全面的代码分析,比如“该函数被调用了多少次?”或“修复本项目中的所有错误”。
  • 当询问代码以外的信息,如“谁为此文件做出贡献?”或“为此文件夹的审阅注释摘要”时,务必在使用代理时配置相关工具或MCP服务器

私人仓库

为了为私有仓库启用更多工作区搜索功能,我们需要额外的权限。如果检测到还没有这些权限,启动时我们会请求。一旦获批,我们将安全地存储该会话以备将来使用。

模态窗口请求为私有仓库进行额外认证。

GitHub Copilot信任中心了解更多关于安全、隐私和透明度的信息。

常见问题解答

它们有什么区别@workspace以及#codebase?

从概念上讲,两者都有@workspace以及#codebase让你能够就整个代码库提出问题。不过,使用方式上有一些不同:

  • @workspace聊天参与者

    @workspace参与者是专门回答关于你代码库问题的主题专家。语言模型将整个聊天提示交给参与者,参与者利用对代码库的了解给出答案。语言模型在使用聊天参与者时无法执行额外处理或调用其他工具。聊天提示只能包含一个聊天参与者。

  • #codebase是一个聊天工具

    #codebaseTool 专注于在你的代码库中搜索相关信息。这是语言模型在回答你的聊天提示时可以选择调用的众多工具之一。语言模型可以决定调用#codebase多次使用工具,与其他工具交错使用,以收集回答你问题所需的信息。聊天提示可以包含多个工具。

推荐使用它#codebase在你的聊天提示中,因为它提供了更多的灵活性。