现已发布!阅读有关一月份的新功能和修复。

将聊天打造成您工作区的专家

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

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

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

工作区上下文的工作原理

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

上下文使用哪些来源?

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

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

工作区索引可以由 GitHub 远程维护,也可以存储在您本地计算机上。有关更多详细信息,请参阅工作区索引部分。

重要

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

搜索策略

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

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

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

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

    • GitHub 的代码搜索
    • 本地语义搜索,用于查找与您问题的含义匹配的代码,而不仅仅是精确的关键字
    • 基于文本的文件名和内容搜索
    • VS Code 的语言智能感应,用于添加函数签名、参数等详细信息。
  3. 如果结果上下文太大而无法放入上下文窗口,则只保留最相关的部分。

工作区索引

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

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

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

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

Screenshot showing the workspace index status in the Copilot status menu.

远程索引

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

GitHub 远程索引

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

存储库在聊天中首次使用 @workspace#codebase 时会自动建立索引。您还可以通过在命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))中运行构建远程工作区索引命令来强制建立索引。

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

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

Azure DevOps 远程索引

VS Code 也可以为 Azure DevOps 存储库使用远程索引。这些索引会自动构建和维护。在 VS Code 中使用您的 Microsoft 帐户登录,以便聊天开始使用远程索引。检查 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.out 文件。

工作区索引还排除了使用

files.exclude
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
设置或包含在 .gitignore 文件中的任何文件。

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

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

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

  • 代理/计划

    在使用代理时,代理会自动根据您的提示执行代理式代码库搜索。这意味着在执行初始搜索以确定工作区上下文后,根据结果,代理可能会决定执行其他、更有针对性的搜索,以收集回答您问题所需的信息。

    您不需要在提示中明确引用 #codebase 工具,但如果您想确保工作区上下文用于您的问题,可以这样做。如果您的提示含糊不清,可能会被解释为不需要工作区上下文,这一点很有用。

  • 提问/编辑

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

    您不需要在提示中明确引用 #codebase 工具,但如果您想确保工作区上下文用于您的问题,可以这样做。如果您的提示含糊不清,可能会被解释为不需要工作区上下文,这一点很有用。

使用工作区上下文的技巧

您提问的方式会显著影响上下文的质量和响应的准确性。为了优化结果,请考虑以下提示

  • 在您的问题中要具体和详细,避免使用模糊或不明确的术语,例如“这有什么作用”,其中“这”可能被解释为最后的答案、当前文件或整个项目。
  • 在您的提示中包含可能出现在您的代码或其文档中的术语和概念。
  • 明确包含相关上下文,方法是选择代码、引用文件或#-提及上下文项,例如调试上下文、终端输出等。
  • 响应可以借鉴多个引用,例如“查找没有 catch 块的异常”或“提供调用 handleError 的示例”。但是,不要期望对整个代码库进行全面的代码分析,例如“此函数被调用了多少次?”或“修复此项目中的所有错误”。
  • 当询问代码以外的信息时,例如“谁为此文件做出了贡献?”或“总结此文件夹的审阅评论”,请确保在使用代理时配置相关的工具或 MCP 服务器

私有存储库

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

Modal window asking for additional authentication for a private repository.

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

常见问题

@workspace#codebase 有什么区别?

从概念上讲,@workspace#codebase 都允许您询问有关您整个代码库的问题。但是,它们的使用方式上存在一些差异

  • @workspace 是一个聊天参与者

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

  • #codebase 是一个聊天工具

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

建议在聊天提示中使用 #codebase,因为它提供了更大的灵活性。

© . This site is unofficial and not affiliated with Microsoft.