尝试以扩展 VS Code 中的代理模式!

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

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

@workspace#codebase 有什么区别?

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

  • @workspace

    • 聊天参与者,专门用于回答有关你的代码库的问题。
    • 控制用户提示并使用代码库提供答案。
    • 不能调用其他工具。
    • 只能在询问模式下使用。
    • 示例:"@workspace 我如何验证日期?"
  • #codebase

    • 该工具根据用户提示执行代码库搜索,并将相关代码作为上下文添加到聊天提示中。
    • LLM 仍然处于控制地位,可以将其与其他工具结合用于编辑场景。
    • 可以在所有聊天模式(询问、编辑和代理)中使用。
    • 示例:"为这个按钮添加一个工具提示,使其与其他按钮 #codebase 保持一致""添加单元测试并运行它们 #codebase"

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

提示

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

提示示例

  • 在你的代码库中查找现有代码
    • "@workspace 数据库连接字符串在哪里配置?" - 解释数据库连接的配置位置和方式
    • "@workspace 我如何验证日期?" - 在代码库中查找现有的日期验证辅助函数
    • "@workspace 测试定义在哪里?" - 提供测试套件、案例以及相关引用和配置的位置
  • 为复杂的代码编辑制定计划
    • "@workspace 我如何为按钮添加富文本工具提示?" - 提供将现有工具提示组件与按钮元素一起使用的计划
    • "@workspace 为忘记密码表单添加一个新的 API 路由" - 概述在哪里添加新路由以及如何将其连接到现有代码
  • 解释代码库中的更高级别概念
    • "@workspace 身份验证是如何实现的?" - 身份验证流程概述以及相关代码的引用
    • "@workspace 哪些 API 路由依赖于此服务?" - 列出在所选代码中使用该服务的路由
    • "我如何构建此 #codebase?" - 根据文档、脚本和配置列出构建项目的步骤

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

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

  • 工作区中所有可索引的文件,但被 .gitignore 文件忽略的文件除外
  • 带有嵌套文件夹和文件名的目录结构
  • GitHub 的代码搜索索引,如果工作区是 GitHub 仓库并且已通过代码搜索建立索引
  • 工作区中的符号和定义
  • 活动编辑器中当前选定的文本或可见文本
注意

如果你打开了被忽略的文件或在其中选择了文本,.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.

远程索引

如果你的代码托管在 GitHub 仓库中,你可以使用 GitHub 代码搜索构建远程索引,以使 AI 能够快速搜索你的代码库,即使是大型代码库也不例外。

为你的工作区构建远程索引

  1. 在 VS Code 中使用你的 GitHub 帐户登录。

  2. 在命令面板 (kb(workbench.action.showCommands)) 中运行构建远程工作区索引命令。

    构建远程索引可能需要一些时间,特别是对于大型代码库。你可以在状态栏的 Copilot 状态仪表板中监控远程索引的状态。

    你只需要构建一次远程索引。每当你推送代码更改时,GitHub 都会自动保持其更新。

重要

远程索引需要一个在 GitHub 上具有 git remote 的项目。请确保你已将代码推送到 GitHub。如果 GitHub 拥有相对最新的代码版本,远程索引的效果最好,因此请确保定期将代码推送到 GitHub。

本地索引

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

构建本地索引

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

  • 项目有 750 到 2500 个可索引文件:在命令面板 (kb(workbench.action.showCommands)) 中运行构建本地工作区索引命令。此命令只需运行一次。

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

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

基本索引

如果你的项目没有远程索引并且有超过 2500 个可索引文件,Copilot 会退而求其次,使用基本索引来搜索你的代码库。此索引使用更简单的算法来搜索你的代码库,并已针对在本地处理大型代码库进行了优化。

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

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

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

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

使用工作区上下文的提示

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

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