本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

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

当聊天对您的整个代码库有深入理解时,它会变得非常有帮助,而不仅仅是单个文件。工作区上下文是使 AI 能够在整个项目中搜索、理解组件如何连接,并基于您的实际代码提供答案的基础机制。这使您可以提出广泛的问题,例如 "认证在哪里处理?" 或 "如何添加新的 API 端点?" 并基于您的特定代码库获得准确的答案。

本文解释了如何工作区上下文工作,如何管理你的工作区索引以获得最佳结果,以及如何使用@工作区#代码库在你的提示中利用它。

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

工作区上下文如何工作

VS Code 使用智能搜索策略来找到与您的问题最相关的代码。它不是使用单一的方法,而是根据您的项目大小和可用资源自动选择最佳方法。VS Code 可能会并行运行多个策略,然后选择产生最佳结果最快的那一个。

上下文使用了哪些来源?

工作区上下文搜索通过与开发人员在 VS Code 中导航代码库时使用的相同来源进行搜索:

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

工作区索引可以由GitHub远程维护,或者存储在您机器上的本地。请参阅工作区索引部分了解更多信息。

重要

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

搜索策略

对于小型项目,整个工作区可以直接包含在聊天上下文中。对于大型项目,VS Code 会使用不同的策略来找到与您的提示最相关的信息并包含在聊天上下文中。

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

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

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

    • GitHub的代码搜索
    • 局部语义搜索,找到与你问题意思匹配的代码,而不仅仅是精确的关键词
    • 基于文本的文件名和内容搜索
    • VS Code 的语言智能感知将添加函数签名、参数等详细信息。
  3. 如果生成的上下文太大而无法容纳在上下文Windows中,则只保留最相关的部分。

工作区索引

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

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

当您有本地未提交的更改时,VS Code 使用结合远程索引和本地文件跟踪的混合方法。VS Code 会检测自索引提交以来哪些文件已被修改,并且还会从编辑器中读取当前文件内容以实现实时内容。

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

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

远程索引

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

GitHub 远程索引

VS Code 会自动为工作区中的任何 GitHub 支持的代码库构建和使用远程代码搜索索引。在 VS Code 中使用您的 GitHub 账户登录后,聊天将自动开始使用任何可用的远程代码搜索索引。

仓库在第一次自动索引时@工作区#代码库 用于聊天。 你也可以通过在命令面板中运行 构建远程工作区索引 命令强制进行索引 (⇧⌘P (Windows, Linux Ctrl+Shift+P))。

索引只需在每个仓库中构建一次。之后,索引会自动保持最新。对于小型和中型项目,构建索引很快,但如果您的仓库包含成千上万的文件,可能需要一点时间。远程索引在GitHub拥有您的代码的相对最新版本时效果最佳,因此请确保定期将代码推送到GitHub。

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

Azure DevOps 远程索引

VS Code 也可以使用 Azure DevOps 仓库的远程索引。这些索引会自动构建和维护。使用你的 Microsoft 帐户在 VS Code 中登录以开始使用远程索引。查看 Copilot 状态栏项目以获取当前索引状态,并在你的帐户没有访问 Azure DevOps 仓库的正确权限时获取登录链接。

本地索引

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

要创建本地索引:

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

  • 项目有750到2500个可索引的文件:在命令面板中运行构建本地工作区索引命令(⇧⌘P(Windows, Linux Ctrl+Shift+P)- 只需运行一次。

  • 该项目有超过2500个可索引的文件:使用 基本索引

构建初始本地索引或更新索引可能需要一些时间,如果许多文件已更改,例如在切换git分支时。您可以在状态栏中的状态板的Copilot状态中监控当前的本地索引状态。

基本索引

如果您的项目没有远程索引并且有超过2500个可索引的文件,VS Code将回退到使用基本索引来搜索您的代码库。这个索引使用更简单的算法来搜索您的代码库,并针对更大的代码库进行本地优化。

基本索引对许多类型的聊天提示应该可以正常工作。然而,如果你发现聊天在为关于代码库的问题提供相关答案时遇到困难,请考虑升级到一个远程索引

工作区索引包含哪些内容

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

工作区索引还排除了使用以下方式从 VS Code 中排除的任何文件

文件排除
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
设置或其一部分.gitignore文件。

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

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

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

  • 代理/计划

    在使用智能体时,智能体会自动执行一个代理性代码库搜索,基于你的提示。这意味着在进行初步搜索以确定工作区上下文之后,根据结果,智能体可能会决定执行额外的、更针对性的搜索,以收集它需要回答你问题的信息。

    你不需要明确引用#代码库工具在你的提示中,但如果你希望确保使用工作区上下文来回答你的问题,你可以这样做。这在你的提示可能含糊不清,并且可能被解释为不需要工作区上下文时很有用。

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

    你不需要明确引用#代码库工具在你的提示中,但如果你希望确保使用工作区上下文来回答你的问题,你可以这样做。这在你的提示可能含糊不清,并且可能被解释为不需要工作区上下文时很有用。

  • 编辑

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

    你不需要明确引用#代码库工具在你的提示中,但如果你希望确保使用工作区上下文来回答你的问题,你可以这样做。这在你的提示可能含糊不清,并且可能被解释为不需要工作区上下文时很有用。

使用工作区上下文的提示

你提问的方式可以显著影响上下文质量和回复的准确性。为了优化结果,请考虑以下提示:

  • 在提问时,请具体详细,避免使用含糊或模棱两可的术语,例如“这个是什么”,因为“这个”可能会被解释为最后一个答案、当前文件或整个项目。
  • 在你的提示中包含可能出现在你的代码或其文档中的术语和概念。
  • 通过选择代码、引用文件或#-提及上下文项明确包含相关上下文,例如调试上下文、终端输出等。
  • 回复可以从多个参考中引用,例如“找到没有 catch 块的异常”或“提供 handleError 被调用的示例”。然而,不要期望对整个代码库进行全面的代码分析,例如“这个函数被调用了多少次?”或“修正这个项目中的所有错误”。
  • 当询问超出代码的信息时,例如“谁对这个文件做出了贡献?”或“总结这个文件夹的评论意见?”,请确保在使用代理时配置相关的工具或MCP服务器

私人仓库

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

模态Windows要求为私人仓库进行额外身份验证。

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

常见问题

有什么区别@工作区#代码库

从概念上讲,两者都@工作区#代码库使您能够对整个代码库提出问题。然而,您使用它们的方式有一些差异:

  • @工作区 是一个 聊天参与者

    @工作区参与者是专门解答有关您的代码库问题的领域专家。语言模型将整个聊天提示交给参与者,参与者利用其对代码库的了解来提供答案。在使用聊天参与者时,语言模型无法执行任何其他处理或调用其他工具。一个聊天提示只能包含一个聊天参与者。

  • #代码库 是一个 聊天工具

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

建议使用#代码库在你的聊天提示中,因为它提供了更多的灵活性。