– 代理会话日,2月19日

AI 在 VS Code 中的工作原理

Visual Studio Code 内置的 AI 功能由 GitHub Copilot 和大型语言模型 (LLM) 提供支持。这些功能涵盖多个界面,从您键入时的内联建议到实现整个功能的自主智能体。本文档解释了核心架构、关键概念以及所有 AI 功能的连接方式。有关动手教程,请参阅 快速入门。有关实用技巧,请参阅 最佳实践

AI 功能一览

VS Code 在各种交互界面中提供 AI,每个界面都适用于不同的任务

  • 智能体:自主会话,遵循完整的 智能体循环,读取文件、执行跨多个文件的协调更改、运行命令并迭代,直到任务完成。智能体端到端地处理多步骤任务,从实现功能到架构级别的重构和框架迁移。
  • 聊天:一个对话界面,您可以在其中提问、探索想法或获取解释。在提问模式下,模型使用只读工具回答问题,而不会修改您的代码。
  • 内联聊天:一个轻量级的聊天界面,直接在编辑器中打开,用于快速、集中的编辑。
  • 内联建议:代码建议,在您键入时以幽灵文本的形式出现。这些使用专门的补全模型,不涉及智能体循环或工具。 下一编辑建议 (NES) 更进一步,预测您的下一次编辑应该发生在哪里
  • 智能操作:集成到您的工作流程中的一键式 AI 操作,例如生成提交消息或修复诊断错误。

语言模型

VS Code 使用大型语言模型 (LLM) 来支持其 AI 功能。您可以选择通过您的 GitHub Copilot 计划使用多个模型,或自带模型。

每个模型都有不同的优势和劣势。有些模型针对速度进行了优化,适用于简单的补全。另一些模型具有更大的上下文窗口或更好的推理能力,使其成为复杂任务的理想选择。您可以根据特定任务的需求随时切换模型。

LLM 的关键特征

  • 非确定性:相同的提示每次都可能产生不同的结果。这是设计使然,反映了模型从概率分布中采样的过程。
  • 上下文相关性:响应的质量取决于提示中提供的上下文的质量和相关性。
  • 知识边界:模型在特定日期之前的数据上进行训练,并且可能为超出其训练数据的超出主题产生过时或不正确的信息。Copilot 通过网络搜索和工作区索引等工具来缓解此问题。

了解更多关于 选择和配置语言模型的信息。

智能体循环

当您给 AI 编码助手一个任务时,它通常遵循一个智能体循环。这种模式在现代 AI 助手中很常见。在 VS Code 中,智能体是计划和采取行动的系统,而 语言模型生成告知这些行动的响应。

在每个步骤中,智能体评估其进展并选择下一个行动。它可能会打开一个文件来理解 API,进行编辑,然后运行一个命令来验证更改是否有效。每个行动的输出成为下一个决策的输入。

Diagram showing the agentic loop: User prompt -> Agent reasoning -> Tool calls (read files, edit code, run tests) -> Agent updates based on tool results -> Final output for user review

智能体循环通常涉及三个高级阶段

  1. 理解。 智能体读取文件、搜索代码库并查找文档,以了解需要更改的内容。
  2. 行动。 智能体修改代码、运行终端命令、安装依赖项或通过工具调用外部服务。
  3. 验证。 智能体运行测试、检查编译器错误并检查其自身的更改。如果出现问题,它将继续迭代。

智能体使用 语言模型来推理最佳行动方案。但是,如果没有与环境交互的能力,例如您的代码或 VS Code 环境,模型仅限于提供通用响应。借助 智能体工具,智能体在每个步骤中发出工具调用,以收集信息并采取行动,例如读取文件、进行代码更改、运行终端命令和联系外部服务。

智能体将这些行动链接在一起,直到完成任务。回答有关您代码库的问题可能只需要读取几个文件。实现新功能通常会循环编辑、运行测试、诊断故障和再次编辑,直到测试通过。

您在整个过程中都保持控制。发送新消息以重定向智能体、添加上下文或建议不同的方法。有关查看更改和管理智能体行为的更多信息,请参阅 保持控制

在后台,VS Code 将当前上下文组合成一个提示并将其发送到语言模型。模型用文本、代码编辑或工具请求来响应。当工具运行时,其输出会添加到上下文中,以便进行下一次迭代,此循环会重复,直到任务完成。

自定义智能体循环

智能体循环并非一刀切,并且可能因每个项目而异。有不同的选项可以个性化智能体的行为,例如自定义智能体、智能体技能、指令或钩子,以优化智能体循环以适应您的项目或团队。

一个 自定义智能体 允许您为智能体定义不同的角色,每个角色都有自己的指令、可用工具、语言模型,并可以选择性地移交给另一个智能体。内置的 Plan 智能体专门用于创建功能实现计划。它只能访问只读工具来执行深入的研究和分析,并且会概述详细的实现方法,而不会更改代码库。

借助 智能体技能,您可以教导智能体特定领域或任务的新能力,并且它可以根据任务的相关性动态调用这些技能。例如,创建一个安全审计技能,其中包含有关如何分析代码以查找安全问题的说明以及检查已知漏洞数据库的工具。

了解更多关于 AI 自定义选项的信息。

上下文

上下文是模型在生成响应时可以看到的一切。它包括对话历史记录、工作区中的文件内容、工具输出、自定义指令以及您明确添加的任何引用。

上下文很重要,因为模型只能推理它能看到的内容。包含相关文件、清晰指令和专注历史记录的提示比没有上下文的模糊提示产生更好的结果。

VS Code 会自动收集上下文并让您控制要包含的内容

  • 自动上下文:您正在编辑的文件、您的工作区索引、git 状态和对话历史记录。
  • 显式上下文:使用 #file#codebase#web 和其他 #-提及 将模型指向特定信息。
  • 持久上下文自定义指令 允许您将项目特定的上下文添加到聊天请求中,而无需重复。

上下文窗口

上下文窗口是模型在单个请求中可以处理的总信息量。它包括所有内容:系统提示、自定义指令、对话历史记录、文件内容、工具输出和您当前的消息。不同的模型具有不同的上下文窗口大小。

当上下文窗口填满时,VS Code 会自动总结对话的较早部分以腾出空间。这意味着对话早期重要细节可能会被压缩或丢失。您也可以在聊天输入中键入 /compact 以手动触发压缩,而无需等待上下文窗口填满。可选地,在命令后添加自定义指令以指导摘要,例如 /compact focus on the API design decisions

为了有效地使用上下文窗口限制

  • 为新任务启动新会话。 会话 是一个具有自己上下文窗口和历史记录的独立对话。每个会话从头开始,因此不要为不相关的任务重用单个对话。
  • 有选择地使用上下文。 添加整个代码库并不总是很有帮助。引用与任务相关的特定文件。
  • 使用自定义指令来获取持久规则。 您在 自定义指令 中添加的规则包含在每个请求中,因此您不会在对话被总结时丢失它们。

VS Code 如何组合上下文

当您发送消息时,VS Code 会从多个来源构建一个语言模型提示

Diagram showing the context window as a container with seven layers: system instructions, customizations, user message, conversation history, implicit context, explicit references, and tool outputs, with an arrow sending the assembled prompt to the language model.

  • 系统指令:内置指南,定义智能体的行为。
  • 自定义设置:您设置的 AI 自定义设置,包括自定义智能体、技能和自定义指令。
  • 用户消息:您发送给智能体的当前消息。
  • 对话历史记录:当前会话中交换的消息。
  • 隐式上下文:您正在编辑的文件、当前选择、可见错误和 git 状态。
  • 显式引用:使用 #-提及的文件、编辑器上下文、网络内容和其他来源。
  • 工具输出:文件读取、终端命令、代码库搜索结果和其他工具调用期间的输出。

这是模型看到组装的提示。它之外的一切对模型来说是不可见的。这就是为什么使用 #file 引用特定文件比要求模型没有看到的代码产生更好的结果的原因。

了解更多关于 向聊天添加上下文工作区索引的信息。

工具

工具是让模型在您的开发环境上采取行动的机制。VS Code 包含用于读取和写入文件、运行终端命令、搜索您的代码库和导航编辑器的内置工具。

除了内置工具之外,您还可以扩展智能体可以执行的操作

  • MCP 服务器:通过模型上下文协议 (MCP) 连接到外部服务,MCP 是一种开放标准,用于为 AI 模型提供访问外部工具和数据源的权限。
  • 智能体技能:教导智能体特定领域或任务的新能力,并且它可以根据任务的相关性动态调用这些技能。例如,创建一个安全审计技能,其中包含有关如何分析代码以查找安全问题的说明以及检查已知漏洞数据库的工具。
  • 钩子:在智能体循环的特定点自动运行命令,例如在每次编辑后格式化代码。

了解更多关于 智能体可用的工具的信息。

智能体类型

智能体根据您何时需要结果以及您希望有多少监督在不同的环境中运行

  • 本地智能体 在 VS Code 中交互式运行。您可以看到每个步骤并可以实时引导智能体。最适合您希望亲自动手的任务。
  • 后台智能体 在您的机器上自主运行。移交任务并在智能体完成时继续其他工作。
  • 云智能体 在 GitHub 的基础设施上运行。它们创建分支、实施更改并为您的团队打开拉取请求进行审查。
  • 第三方智能体 连接 Anthropic 和 OpenAI 等外部 AI 提供商。您可以随时在智能体类型之间移交会话。

Diagram showing the different agent types: Local agents (interactive in VS Code), Background agents (autonomous on your machine), Cloud agents (run on GitHub's infrastructure), and Third-party agents (connect external AI providers).

了解更多关于 代理和代理会话 的信息。

保持控制

AI 生成的输出需要审核。VS Code 包含多种机制来确保您控制哪些更改会应用到您的代码库。

  • 在应用编辑前进行审核。 代理以差异视图显示文件更改。您可以审核每个更改,接受或拒绝单个编辑,并在保存之前修改代码。了解更多关于 审核代码编辑 的信息。

  • 使用检查点进行回滚。 代理会话在工作进展时创建检查点。如果代理走错了方向,请返回到先前的检查点并尝试不同的方法。了解更多关于 检查点 的信息。

  • 批准工具调用。 VS Code 在运行终端命令或使用具有副作用的工具之前会要求您的批准。您可以控制哪些工具可以自动运行,哪些需要确认。

  • 信任边界。 VS Code 强制执行文件访问、URL 访问、终端沙箱和 MCP 服务器交互方面的安全边界。了解更多关于 AI 安全 的信息。

在提交之前始终审核 AI 生成的代码。验证它是否处理了边缘情况,遵循了您的项目约定,并且没有引入安全问题。

AI 的局限性

AI 是一种强大的工具,但它具有需要理解的重要限制。

非确定性。 相同的提示每次都可能产生不同的结果。这意味着当你两次询问相同的问题时,你可能会得到不同的代码建议、解释或方法。这是正常的,反映了模型从概率分布中采样的过程。

不正确的输出。 模型可能会生成看起来正确但包含错误、使用已弃用 API 或无法处理边缘情况的代码。始终测试 AI 生成的代码,特别是对于影响安全性、数据完整性或关键流程的逻辑。

知识边界。 模型使用某个日期之前的数据进行训练。它们可能不知道最近的框架版本、新发布的 API 或您项目的更改。使用 #web 赋予 Copilot 访问当前信息的能力,并使用 #file 引用特定文件,以便将响应置于您的实际代码中。

上下文限制。 当对话变得冗长时,模型将失去对早期上下文的访问权限。如果响应开始下降,请启动新会话并为当前任务提供新的上下文。

提示注入。 文件、工具输出或网页中的恶意内容可能会尝试重定向代理的行为。这就是 VS Code 包含 工具批准门控和信任边界 的原因。了解更多关于 AI 安全 的信息。

与 AI 合作的最有效方法是将它的输出视为草稿:作为起点很有用,但始终需要您的审核和判断。

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