跳至主要内容

管理 GitHub Copilot CLI 中的上下文

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

关于上下文窗口

当您使用 GitHub Copilot CLI 时,您发送的每条信息、Copilot 的每个响应、每次工具调用及其结果,以及定义 Copilot 行为的系统指令,全部都保存在一个上下文窗口中。上下文窗口是 AI 模型在生成响应时一次可以考虑的全部信息量。

上下文窗口具有固定大小,以 token 为单位,且不同模型大小不同。Token 通常由常用的短词以及多音节词的片段组成。随着对话的进行,上下文窗口会被以下内容填满:

  • 系统指令和工具定义:告诉 Copilot 如何行为的内置指令,以及所有可用工具的模式。这些始终存在并占用上下文窗口的固定部分。
  • 您的消息:您发送的每个提示。
  • Copilot 的响应:Copilot 对您说的所有内容。
  • 工具调用和结果:当 Copilot 读取文件、运行命令或搜索代码库时,请求和输出都会被添加到上下文中。工具结果可能会非常大——例如,工具读取了一个很长的文件或运行产生大量输出的命令时。

所有这些都会累积在上下文窗口中。在长时间或复杂的会话中,上下文窗口可能会被填满。

为什么上下文窗口很重要

上下文窗口为 Copilot 提供了对话的“记忆”。上下文窗口中的所有内容都可以在 Copilot 回答时被引用。

这意味着在非常长的会话中,Copilot 可能无法一次性容纳整个对话历史。因此,Copilot CLI 提供了上下文管理功能,使您能够在需要时与 Copilot 持续对话。

检查您的上下文使用情况

您可以通过输入 /context 斜杠命令来检查当前使用了多少上下文窗口。这会显示令牌使用情况的可视化细分,展示

  • 系统/工具:系统指令和工具定义的固定开销。
  • 消息:对话历史占用的空间。
  • 空闲空间:剩余可用于新消息的空间。
  • 缓冲区:触发自动上下文管理的保留部分。

Screenshot of the output of the '/context' CLI command.

您可能希望在以下情况下使用 /context 斜杠命令:

  • 您正处于长会话中,需要了解剩余空间多少。
  • Copilot 似乎忘记了对话的早期部分。
  • 您想了解是否已经发生压缩,或压缩即将发生。

压缩

压缩是一种过程,使 GitHub Copilot CLI 能够在不超出上下文窗口限制的情况下支持长时间运行的会话。

压缩发生时

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

您也可以随时通过输入 /compact 命令手动触发压缩。如果您即将开始新的工作阶段并希望主动释放上下文空间,这非常有用。如果您改变主意,按 Esc 可以取消手动压缩。

压缩的作用

当压缩运行时,Copilot CLI

  1. 获取当前对话历史的快照。
  2. 将完整对话发送给 AI 模型,并附加一个特殊提示,请求其生成结构化摘要。该摘要捕获对话的目标、已完成的工作、关键技术细节、重要文件以及计划的下一步。
  3. 用摘要替换旧的对话历史,同时保留任何原始用户指令以及任何计划或待办列表的当前状态。
  4. 保留在压缩后台运行期间添加的任何消息。

结果是,对话历史被压缩成一个更小的摘要,从而释放出大部分上下文窗口供新工作使用。Copilot 使用该摘要保持连续性——它知道已经讨论了什么、决定了什么以及接下来要做什么,即使原始消息已经被替换。

压缩未保留的内容

压缩是一种摘要过程,因此不可避免地会丢失一些细节。摘要捕获了关键要点,但细粒度的细节——例如每条消息的确切措辞、每个命令的完整输出,或在长对话早期做出的细微决定——可能未被包含。如果您需要 Copilot 回忆会话早期的非常具体的细节,压缩后可能没有这些信息。

没有压缩会怎样

如果没有压缩,一旦上下文窗口被填满,Copilot 将只能回退到直接删除对话历史中的旧消息——在没有任何摘要或记录的情况下移除它们。这将导致上下文突然丢失,Copilot 无法了解被删除消息的内容。压缩通过用智能摘要替代历史记录,避免了这种情况的发生。

检查点

每当压缩发生——无论是自动还是手动——都会创建一个检查点。检查点是压缩摘要的保存副本,以编号并带标题的文件形式存储在您会话的工作区中。

查看检查点

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

Copilot 提示
/session checkpoints

这会列出每个检查点的编号和标题

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

使用检查点编号可查看任意检查点的完整内容。例如,要查看检查点 2,输入

Copilot 提示
/session checkpoints 2

检查点有用的情形

  • 审查已发生的内容:在经历多次压缩的长会话后,早期的对话阶段不再位于活动上下文中。检查点让您能够回顾每次压缩时 Copilot 的操作。
  • 验证连续性:如果您想在继续之前确认 Copilot 的摘要准确捕获了您之前的工作,可查看最近的检查点。
  • 调试混乱:如果 Copilot 似乎忘记了某个决定,或走向与早期工作相矛盾的方向,检查检查点可以揭示压缩期间保留了哪些内容,以及哪些内容可能被不同于您预期的方式摘要。

注意

  • 检查点会自动创建。您无需管理它们——需要时它们就在那儿。对于大多数会话,您根本不需要查看检查点。
  • 压缩完成后无法撤销。

使用长时间运行的会话

自动压缩使您能够在长时间运行的会话中继续工作,而无需担心触及上下文窗口的限制。有时这非常有用,另一些时候您可能更倾向于启动全新会话。

长会话有用的情形

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

  • 您正在进行多阶段任务,例如构建需要搭建框架、实现、测试,然后创建拉取请求的功能。
  • 您在反复尝试解决问题,并希望 Copilot 保留已尝试和未成功的上下文。
  • 您在整个代码库中进行探索性工作,并随时间与 Copilot 共同建立共享理解。

何时开始新会话

在以下情况下,启动新会话更合适:

  • 您正切换到不相关的任务。Copilot 不需要先前工作的上下文,干净的上下文窗口意味着为新任务提供更多空间。
  • 对话经历了多次压缩,您感觉重要的上下文在摘要过程中丢失。
  • 您想要一个全新的起点——例如,工作走错方向,您宁愿重新开始,而不是让 Copilot 试图将早期决策与新方法调和。

提示

您可以随时使用 /resume 命令恢复先前的会话。这允许您从中断的地方继续,包括该会话期间创建的所有检查点。

延伸阅读

© . This site is unofficial and not affiliated with GitHub, Inc.