让聊天成为您工作区中的专家
当聊天深入理解您的整个代码库而不仅仅是单个文件时,它会变得更有帮助。工作区上下文是底层机制,使 AI 能够搜索您的项目,了解组件如何连接,并提供基于您实际代码的答案。这使您能够提出诸如“身份验证在哪里处理?”或“如何添加新的 API 端点?”等宽泛问题,并根据您的特定代码库获得准确答案。
本文解释了工作区上下文的工作原理,如何管理您的工作区索引以获得最佳结果,以及如何使用 @workspace
和 #codebase
在您的提示中利用它。
工作区上下文背后的智能会自动根据您的项目大小和设置进行调整,确保无论您是在小型个人项目还是大型企业代码库上工作,都能获得准确的结果。
工作区上下文的工作原理
VS Code 使用智能搜索策略来查找与您问题最相关的代码。它不是使用单一方法,而是根据您的项目大小和可用资源自动选择最佳方法。VS Code 可能会并行运行多种策略,然后选择产生最佳结果且速度最快的一种。
上下文使用了哪些来源?
工作区上下文会搜索开发人员在 VS Code 中浏览代码库时会使用的相同来源
- 工作区中所有可索引文件(工作区索引),除了被
.gitignore
文件忽略的文件 - 包含嵌套文件夹和文件名的目录结构
- 代码符号和定义(类、函数、变量)
- 活动编辑器中当前选定的文本或可见文本
工作区索引可以由 GitHub 远程维护,也可以存储在您的本地机器上。有关详细信息,请参阅工作区索引部分。
如果您打开了文件或在被忽略的文件中选择了文本,则 .gitignore
会被绕过。
搜索策略
对于小型项目,整个工作区可以直接包含在聊天上下文中。对于大型项目,VS Code 使用不同的策略来查找最相关的信息,以将其包含在您的提示的聊天上下文中。
以下步骤概述了 VS Code 如何构建工作区上下文
-
确定回答您问题所需的哪些工作区信息,也包括对话历史记录、工作区结构和当前编辑器选择。
-
通过使用各种方法从工作区索引中收集相关的代码片段
- GitHub 的代码搜索
- 本地语义搜索以查找与您问题含义匹配的代码,而不仅仅是精确的关键字
- 基于文本的文件名和内容搜索
- VS Code 的语言 IntelliSense 以添加函数签名、参数等详细信息。
-
如果生成的上下文太大而无法放入上下文窗口,则只保留最相关的部分。
工作区索引
VS Code 中的聊天使用索引来快速准确地搜索您的代码库以获取相关的代码片段。此索引可以由 GitHub 维护,也可以存储在您的本地机器上。
您可以在 VS Code 状态栏的 Copilot 状态仪表板中查看正在使用的索引类型及其索引状态。
远程索引
VS Code 可以使用远程代码搜索索引,使 AI 能够快速搜索您的代码库,即使是大型代码库。远程代码搜索目前适用于使用 GitHub 或 Azure DevOps 仓库的工作区。
GitHub 远程索引
VS Code 会自动为您工作区中任何由 GitHub 支持的仓库构建和使用远程代码搜索索引。在 VS Code 中使用您的 GitHub 帐户登录,聊天将自动开始使用任何可用的远程代码搜索索引。
首次在聊天中使用 @workspace
或 #codebase
时,仓库会自动索引。您还可以通过在命令面板 (kb(workbench.action.showCommands))
) 中运行 Build Remote Workspace Index 命令来强制索引。
每个仓库只需要构建一次索引。之后,索引会自动保持最新。对于小型和中型项目,构建索引速度很快,但如果您的仓库包含数十万个文件,则可能需要一些时间。如果 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 个可索引文件之间:在命令面板 (
kb(workbench.action.showCommands))
) 中运行 Build local workspace index 命令 - 这应该只运行一次。 -
项目超过 2500 个可索引文件:使用基本索引。
构建初始本地索引或更新索引(如果许多文件已更改,例如切换 git 分支)可能需要一些时间。您可以在状态栏的 Copilot 状态仪表板中监控当前的本地索引状态。
基本索引
如果您的项目没有远程索引并且有超过 2500 个可索引文件,VS Code 将退回到使用基本索引来搜索您的代码库。此索引使用更简单的算法来搜索您的代码库,并针对大型代码库的本地工作进行了优化。
基本索引对于许多类型的聊天提示应该都能正常工作。但是,如果您发现聊天难以针对您的代码库问题提供相关答案,请考虑升级到远程索引。
工作区索引中包含哪些内容
VS Code 会索引属于您当前项目的相关文本文件。这不限于特定的文件类型或编程语言,但是 VS Code 会自动跳过一些通常与工作区问题不相关的常见文件类型,例如 .tmp
或 .out
文件。
工作区索引还会排除使用 files.exclude 设置从 VS Code 中排除的任何文件,或属于 .gitignore
文件的任何文件。
VS Code 目前也不索引二进制文件,例如图像或 PDF。
在聊天中使用工作区上下文
当您在聊天中提出与工作区相关的问题时,确定工作区上下文的行为取决于您正在使用的聊天模式
-
代理模式
在代理模式下,代理会根据您的提示自动执行代理式代码库搜索。这意味着在执行初始搜索以确定工作区上下文后,根据结果,代理可能会决定执行额外的、更有针对性的搜索,以收集回答您问题所需的信息。
您不需要在提示中明确引用
#codebase
工具,但如果您想确保您的问题使用了工作区上下文,则可以这样做。如果您的提示模棱两可,并且可能被解释为不需要工作区上下文,则这很有用。 -
问答/编辑模式
在问答和编辑模式下,VS Code 会对您的提示执行意图检测,以确定它是否需要工作区上下文。如果需要工作区上下文,VS Code 会执行代码库搜索并将相关的代码片段添加到聊天上下文中。与代理模式不同,不会执行后续搜索。
您不需要在提示中明确引用
#codebase
工具,但如果您想确保您的问题使用了工作区上下文,则可以这样做。如果您的提示模棱两可,并且可能被解释为不需要工作区上下文,则这很有用。
使用工作区上下文的技巧
您提问的方式可以显著影响上下文的质量和响应的准确性。为了优化结果,请考虑以下提示
- 在您的问题中要具体和详细,避免使用“这是做什么的”等模糊或含糊的术语,其中“这”可能被解释为上次的答案、当前文件或整个项目。
- 在您的提示中包含可能出现在您的代码或其文档中的术语和概念。
- 通过选择代码、引用文件或 #提及上下文项(例如调试上下文、终端输出等)来明确包含相关上下文。
- 响应可以从多个引用中提取,例如“查找没有 catch 块的异常”或“提供 handleError 如何调用的示例”。但是,不要期望对您的代码库进行全面的代码分析,例如“此函数被调用了多少次?”或“纠正此项目中的所有错误”。
- 当询问代码之外的信息时,例如“谁贡献了这个文件?”或“总结此文件夹的评论”,请务必在代理模式下配置相关的 工具或 MCP 服务器。
常见问题
@workspace
和 #codebase
有什么区别?
从概念上讲,@workspace
和 #codebase
都允许您询问有关整个代码库的问题。但是,它们的使用方式有一些差异
-
@workspace
是一个聊天参与者@workspace
参与者是专门回答有关您的代码库问题的专家。语言模型将整个聊天提示交给参与者,参与者利用其对代码库的知识提供答案。语言模型在使用聊天参与者时无法执行任何额外的处理或调用其他工具。聊天提示只能包含一个聊天参与者。 -
#codebase
是一个聊天工具#codebase
工具专门用于在您的代码库中搜索相关信息。它是语言模型在回答您的聊天提示时可以选择调用的众多工具之一。语言模型可以决定多次调用#codebase
工具,并与其他工具交错使用,以收集回答您问题所需的信息。聊天提示可以包含多个工具。
建议在您的聊天提示中使用 #codebase
,因为它提供了更大的灵活性。