Skip to main content
Skip to content

管理GitHub Copilot的上下文

Copilot了解如何管理对话上下文、长时间会话期间发生的情况,以及如何保持对上下文窗口的控制。

关于上下文窗口

使用 GitHub Copilot时,发送的每个消息、来自每个工具调用及其结果的每个响应 Copilot,以及定义 Copilot行为的系统说明都保存在 上下文窗口中。 上下文窗口是生成响应时 AI 模型可以一次性考虑的总信息量。

上下文窗口具有固定大小(以标记为单位),该大小因模型而异。 令牌通常由短的、常用的单词和多音节单词的片段组成。 随着对话的进行,上下文窗口将填满:

  • 系统说明和工具定义:用于说明 Copilot 行为方式的内置说明以及所有可用工具的架构。 这些始终存在,并占用上下文窗口的固定部分。
  • 消息:你发送的每个提示。
  • Copilot“回应:一切都 Copilot 给你说回来了。
  • 工具调用和结果:读取文件、运行命令或搜索代码库时 Copilot ,请求和输出将添加到上下文中。 工具结果可能特别大,例如,如果工具读取长文件或运行生成大量输出的命令。

这些都会在上下文窗口中累积。 在长会话或复杂会话中,上下文窗口可以填满。

上下文窗口为何重要

上下文窗口允许 Copilot 在决定如何响应提示时考虑对话的前面部分。 上下文窗口中的所有内容都可供Copilot在处理任务时引用。

这意味着,在很长的会话中, Copilot 可能无法同时保存整个对话历史记录。 Copilot 具有上下文管理功能,可以让你根据需要持续进行对话。

检查上下文使用情况

上下文使用情况的控件因客户端和界面而异。 例如:

  • 在Copilot CLI和GitHub Copilot app中,使用/context检查当前会话的使用情况。
  • 在受支持的 IDE 中,查找位于 Copilot 聊天输入区域内或其下方的上下文窗口指示器。 例如,该 Visual Studio Code指示器是一个小圆圈。 在其他一些 IDE 中,使用情况显示在由 提供的会话信息对话框中。

在以下情况下,可能需要检查上下文使用情况:

  • 你正在进行长时间的会话,想知道剩余多少空间。
  • Copilot 似乎忘记了先前谈话的内容。
  • 你希望了解压缩是否已发生,或者可能很快就会发生。 请参阅 压缩。

管理上下文窗口

可以通过监视使用情况、压缩旧消息和控制大型工具输出来管理上下文窗口。

注意

可用控件因客户端和界面而异。

当无法通过可用的命令和设置有效地管理上下文窗口时,可能需要考虑其他策略,例如将对话分解为较小的会话,或者通过提示 Copilot 截断或汇总它们来减小工具输出的大小。 此外, Copilot 可以将工作委托给子代理,这些子代理的上下文窗口与主代理分开。 这有助于使主代理的上下文保持聚焦。

使用 /context 命令的上下文

在某些界面中,可以使用 /context 斜杠命令可视化当前上下文窗口使用情况。 输出的第一行显示当前活动模型,以及当前正在使用的令牌数在模型上下文窗口总容量中的占用情况。 输出结果的其余部分显示以下内容:令牌使用情况以及上下文窗口的百分比:

  • 系统提示:基本系统提示。
  • 自定义说明:加载的自定义说明(仅当存在时显示)。
  • 系统工具:内置工具定义。
  • MCP 工具:MCP 服务器提供的工具定义。
  • 消息:对话历史记录。
  • 可用空间:未使用的上下文仍可用。
  • 缓冲区:为模型的响应和留出空间预留的容量。

管理大型工具输出 Copilot CLI

为了防止单个工具响应消耗过多的上下文窗口,默认情况下,大于 20 KiB 的工具输出将保存到临时文件中。 模型接收文件路径和预览,而不是完整输出。 这适用于所有工具,包括 MCP 服务器提供的工具。

若要更改限制,请先将 COPILOT_LARGE_OUTPUT_THRESHOLD_BYTES 设置为正数个 UTF-8 字节,然后再启动 CLI。 增加限制会使对话和后续工具调用的上下文更少。

压 实

压缩是一个使 Copilot 能够支持长时间会话而不触及上下文窗口限制的过程。

压缩的可用性、行为和控件因客户端和界面而异。 例如:

  • 在Copilot CLI和GitHub Copilot app中,可以自动进行压实,也可以使用/compact触发。
  • 在 Visual Studio Code 和 JetBrains IDEs 中,可以使用 Copilot Extension 手动压缩会话。

压缩发生时

压缩的确切阈值和行为因客户端及其配置而异。

对于 Copilot CLI,当对话达到上下文窗口容量约 80% 时,Copilot CLI 会自动开始在后台压缩上下文。 这留出大约 20% 的缓冲余量,以便在压缩进行时,工具调用可以继续运行。 如果在压缩完成之前上下文已填充到大约 95%,Copilot CLI 将短暂暂停以等待压缩完成,然后再继续。

在 GitHub Copilot app 和 Copilot CLI 中,你可以随时通过输入 /compact 命令手动触发压缩。 如果要开始新的工作阶段并想要主动释放上下文空间,这非常有用。 如果改变想法,请按 Esc 取消手动压缩。

压缩发生的位置

压缩在大多数受支持的客户端(包括Copilot CLI、GitHub Copilot app、Copilot cloud agent、Visual Studio Code、Visual Studio、JetBrains IDEs和 Eclipse)中可用,但不在 Xcode IDE 中提供。

压缩的作用

压缩运行时, Copilot:

  1. 拍摄当前聊天历史记录的快照。
  2. 使用特殊提示将完整对话发送到 AI 模型,要求其生成结构化摘要。 在摘要中概述对话的目标、完成工作的内容、关键技术细节、重要的文件和下一步计划。
  3. 将旧的对话历史记录替换为摘要,并保留任何原始用户说明以及任何计划或待办事项列表的当前状态。
  4. 保留在后台运行压缩时添加的任何消息。

结果是将对话历史记录压缩为更小的摘要,从而释放了大多数用于新工作的上下文窗口。 Copilot 使用此摘要来保持连续性(它知道讨论的内容、决定的内容以及下一步操作),即使原始消息已被替换。

压缩不保留什么

压缩是一个汇总过程,因此一些细节不可避免地丢失。 摘要会捕获关键点,但细化的详细信息(如每条消息的确切措辞、每个命令的完整输出或长时间对话中做出的次要决策)可能不包括在内。 如果需要 Copilot 回忆会话初期的某个非常具体的细节,压缩后可能不会保留该信息。

无法撤消已完成的压缩。

在没有压缩的情况下会发生什么

如果没有压缩,一旦上下文窗口填满,Copilot 就只能简单地回退到从对话历史记录中删除旧消息,而不进行任何摘要或记录。 这意味着突然失去上下文,无法 Copilot 知道已删除的消息中的内容。 压缩通过用智能摘要替代历史记录,而不是抛弃它,从而避免了此问题。

Checkpoints

检查点可以是压缩生成的保存摘要、用于文件编辑的还原点,也可以是可从中派生对话的点。 这些是不同的功能,其可用性和操作因客户端和图面而异。

在本文的其余部分中,检查点是指保存的压实摘要,例如在Copilot CLI中创建的带编号、带标题的文件。

检查点有用时

  • 查看所发生的事情:经过长时间的会话和多个压缩,对话的早期阶段不再处于活动上下文中。 检查点允许你回顾Copilot在每个压缩中执行的操作。
  • 验证连续性:如果您想在 Copilot 继续之前检查其摘要是否准确地反映了您之前的工作,您可以查看最新的检查点。
  • 调试混淆:如果 Copilot 似乎忘记了决策或正在朝与早期工作相矛盾的方向前进,检查检查点可以揭示出在压缩期间保留了哪些内容,以及哪些可能被总结得与预期不同。

注意

在大多数客户端(包括 Copilot CLI)中,会自动创建检查点摘要。 无需管理它们 -- 如果需要,它们就在那里。 对于大多数会话,您通常无需查看检查点。

查看 的检查点

若要查看当前会话中的所有检查点,请输入:

Copilot prompt
/session checkpoints

这会列出每个检查点及其编号和标题:

Checkpoint History (3 total):
  3. Refactoring authentication module
  2. Implementing user dashboard
  1. Initial planning and setup

使用检查点号查看任何检查点的完整内容。 例如,若要查看检查点 2,请输入:

Copilot prompt
/session checkpoints 2

使用长时间运行的会话

使用自动压缩可以继续在长时间运行的会话中工作,而无需担心达到上下文窗口的限制。 有时,这非常有用,有时你可能希望启动新的会话。

当长时间会话很有用时

长时间运行的会话在以下情况中效果良好:

  • 你正在处理一个多阶段任务,例如构建一个需要框架、实现、测试然后创建拉取请求的功能。
  • 你正在对某个问题进行迭代,希望 Copilot 能保留已尝试的内容和失败的方法的上下文。
  • 你正在代码库中进行探索性工作,并随着时间的推移与Copilot建立共享理解。

何时启动新会话

当需要以下情况时,启动新会话会更好:

  • 切换到无关的任务。 Copilot 不需要之前工作的上下文,一个清晰的上下文窗口意味着为新任务提供更多的空间。
  • 对话经历了许多压缩,你觉得重要的上下文正在摘要过程中丢失。
  • 你想要一个新的开始,例如,如果工作方向错误,你宁愿重新开始,而不是让 Copilot 尝试将早期决策与新的方法调和。

在某些客户端和界面中,可以恢复上一个会话以延续现有对话上下文继续,而不是重新开始。 恢复方法和检查点可用性因客户端和界面而异。