让聊天成为你工作区中的专家
要在聊天中询问有关整个代码库的问题,你可以在聊天提示中引用 @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 状态仪表板中查看索引的类型及其状态。
远程索引
如果你的代码托管在 GitHub 仓库中,你可以使用 GitHub 代码搜索构建远程索引,以使 AI 能够快速搜索你的代码库,即使是大型代码库也不例外。
为你的工作区构建远程索引
-
在 VS Code 中使用你的 GitHub 帐户登录。
-
在命令面板 (
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 的调用示例”。但是,不要期望对你的代码库进行全面的代码分析,例如“此函数被调用了多少次?”或“纠正此项目中的所有错误”。
- (目前)避免假设超出代码范围的信息,例如“谁为这个文件做出了贡献?”或“总结此文件夹的审阅评论”。
相关资源
- 了解更多关于向你的聊天提示添加上下文
- 开始使用 Copilot 聊天教程
- 了解更多关于 Copilot 聊天