参加你附近的 ,了解 VS Code 中的 AI 辅助开发。

让聊天成为您工作区中的专家

要在聊天中询问有关整个代码库的问题,您可以在聊天提示中引用 @workspace#codebase。根据问题,聊天会智能地检索相关文件和符号,然后在其回答中以链接和代码示例的形式引用它们。

@workspace#codebase 之间有什么区别?

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

  • @workspace

    • 聊天参与者,专门回答有关代码库的问题。
    • 控制用户提示并使用代码库提供答案。
    • 无法调用其他工具。
    • 只能在询问模式下使用。
    • 示例:"@workspace how can I validate a date?"
  • #codebase

    • 根据用户提示执行代码库搜索并将相关代码作为上下文添加到聊天提示的工具。
    • LLM 仍处于控制状态,可以将其与其他工具结合用于编辑场景。
    • 可在所有聊天模式下使用(询问、编辑和代理)。
    • 示例:"add a tooltip to this button, consistent with other button #codebase", "add unit tests and run them #codebase"

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

提示

启用 github.copilot.chat.codesearch.enabled,以使 #codebase 在查找相关代码片段时更有效。此设置默认启用。

提示示例

  • 在代码库中查找现有代码
    • "@workspace where is database connecting string configured?" - 解释数据库连接的配置位置和方式
    • "@workspace how can I validate a date?" - 在代码库中查找现有日期验证助手
    • "@workspace where are tests defined?" - 提供测试套件、案例以及相关引用和配置的位置
  • 为复杂的代码编辑制定计划
    • "@workspace how can I add a rich tooltip to a button?" - 提供使用现有工具提示组件与按钮元素的计划
    • "@workspace add a new API route for the forgot password form" - 概述新路由的添加位置以及如何将其连接到现有代码
  • 解释代码库中的高级概念
    • "@workspace how is authentication implemented?" - 身份验证流程概述和相关代码的引用
    • "@workspace which API routes depend on this service?" - 列出使用所选代码中服务的路由
    • "How do I build this #codebase?" - 根据文档、脚本和配置列出构建项目的步骤

使用哪些来源作为上下文?

为了回答您的问题,工作区上下文会搜索开发人员在 VS Code 中导航代码库时会使用的相同来源

  • 工作区中所有可索引文件,除了被 .gitignore 文件忽略的文件
  • 带有嵌套文件夹和文件名的目录结构
  • 一个远程代码搜索索引。这允许 Copilot 快速搜索代码中相关的代码片段,而无需构建本地索引。
  • 工作区中的符号和定义
  • 活动编辑器中当前选定的文本或可见文本
注意

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

@workspace 如何找到最相关的上下文

您的完整 VS Code 工作区可能太大,无法完全传递给 GitHub Copilot 以响应您的聊天提示。相反,@workspace 会从不同的上下文来源中提取最相关的信息,以作为 Copilot 回答的基础。

首先,@workspace 确定回答您问题所需的信息,其中还包括对话历史、工作区结构和当前选定的代码。

接下来,它使用不同的方法收集上下文,例如通过本地搜索或使用 GitHub 的代码搜索查找相关代码片段,以及使用 VS Code 的语言 IntelliSense 添加函数签名、参数等详细信息。

最后,GitHub Copilot 使用此上下文来回答您的问题。如果上下文太大,则只使用上下文中最重要的部分。响应会用文件、文件范围和符号的引用进行标记。这使您能够直接从聊天响应链接到代码库中的相应信息。提供给 Copilot 的代码片段在响应中列为引用。

管理工作区索引

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

您可以在状态栏的 Copilot 状态仪表板中查看索引类型和其状态。

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

远程索引

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

GitHub 远程索引

Copilot 会自动为工作区中任何由 GitHub 支持的存储库构建和使用远程代码搜索索引。您只需在 VS Code 中使用 GitHub 帐户登录,Copilot 就会自动开始使用任何可用的远程代码搜索索引。

状态栏中的 Copilot 条目显示当前索引状态。存储库会在第一次使用 @workspace#codebase 时自动索引。您还可以通过在命令面板 (kb(workbench.action.showCommands))) 中运行 Build Remote Workspace Index 命令来强制索引。

每个存储库只需构建一次索引。之后,索引会自动保持最新。对于中小型项目,构建索引速度很快,但如果您的存储库包含数十万个文件,则可能需要一些时间。

目前,远程索引适用于托管在 GitHub.com 或 GitHub Enterprise Cloud 上的存储库。它不支持使用 GitHub Enterprise Server 的存储库。如果 GitHub 具有相对最新的代码版本,则远程索引效果也最好,因此请务必定期将代码推送到 GitHub。

Azure DevOps 远程索引

Copilot 还可以使用 Azure DevOps 存储库的远程索引。这些索引会自动构建和维护。您只需使用您的 Microsoft 帐户登录即可。检查 Copilot 状态栏项目以获取当前索引状态或登录链接(如果您的帐户没有访问 Azure DevOps 存储库的正确权限)。

本地索引

如果您无法使用远程索引,Copilot 可以使用存储在本地计算机上的高级语义索引来提供快速、高质量的搜索结果。目前,本地索引限于 2500 个可索引文件。

构建本地索引

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

  • 项目有 750 到 2500 个可索引文件:在命令面板 (kb(workbench.action.showCommands))) 中运行 Build local workspace index 命令。此命令只需运行一次。

  • 项目有超过 2500 个可索引文件:请参阅下面的基本索引部分。

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

基本索引

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

基本索引对于许多问题应该都能正常工作。但是,如果您发现 Copilot 在回答有关代码库的问题时遇到困难,请尝试升级到远程索引

工作区索引中包含哪些内容

Copilot 会索引作为您当前项目一部分的相关文本文件。这不限于特定的文件类型或编程语言,但是 Copilot 会自动跳过一些通常与 @workspace 问题无关的常见文件类型,例如 .tmp.out 文件。Copilot 还会排除任何使用 files.exclude 设置从 VS Code 中排除的文件,或作为 .gitignore 文件一部分的文件。

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

使用工作区上下文的技巧

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

  • 在您的问题中要具体和详细,避免使用模糊或模棱两可的术语,例如“这有什么作用”(其中“这”可以解释为上一个答案、当前文件或整个项目等)。
  • 在提示中加入可能出现在您的代码或其文档中的术语和概念。
  • 查看响应中的已用引用,以确保文件相关。如有必要,迭代您的问题。
  • 通过选择代码或提及聊天变量(例如 #editor#selection#<file name>)来显式包含相关上下文。
  • 响应可以引用多个来源,例如“查找没有 catch 块的异常”或“提供 handleError 的调用示例”。但是,不要期望对您的代码库进行全面的代码分析,例如“此函数被调用了多少次?”或“纠正此项目中的所有错误”。
  • 避免假设代码之外的信息(目前),例如“谁贡献了此文件?”或“总结此文件夹的评审评论”。