Skip to main content

智能上下文压缩

智能上下文压缩功能通过总结对话的早期部分来帮助管理长对话。当上下文窗口接近其限制时,这可以防止重要信息丢失。此功能默认启用



工作原理

当您与 Roo Code 的对话不断增长时,可能会接近底层 AI 模型的上下文窗口限制。当这种情况发生时,通常会删除较早的消息以腾出空间。智能上下文压缩旨在通过以下方式防止这种突然的信息丢失:

  1. 总结: 使用 AI 模型压缩对话的早期部分。
  2. 保留要点: 目标是在减少总体 token 数量的同时,保留被总结消息中的关键信息。
  3. 保持连贯性: 这使得 AI 能够对整个对话(即使是超长对话)有更连贯的理解。
  4. 斜杠命令连续性: 包含在第一条消息中的斜杠命令会在压缩过程中保留。

重要注意事项:

  • 总结影响: 虽然如果您使用检查点来回溯,原始消息会被保留,但总结后的版本是用于持续 LLM 调用的内容,以保持上下文的可管理性。
  • 成本: 执行总结的 AI 调用会产生成本。此成本包含在 UI 中显示的上下文压缩指标中。

配置

智能上下文压缩默认启用,并提供多个配置选项:

  1. 打开 Roo Code 设置(Roo Code 面板右上角的 图标)。
  2. 导航到上下文管理设置部分。
  3. 配置可用选项:
    • 自动触发智能上下文压缩:默认启用,控制是否自动进行压缩(位于“上下文”设置中)
    • 触发智能上下文压缩的阈值:一个百分比滑块(默认 100%),根据上下文窗口使用情况确定何时激活压缩(位于“上下文”设置中)
    • 自定义上下文压缩提示:自定义 Roo 在压缩时使用的提示(位于“上下文管理”设置中)
    • 压缩模型:压缩使用您当前活跃的对话提供商/模型。
智能上下文压缩设置

智能上下文压缩配置选项:自动触发开关、阈值滑块和自定义提示定制。

控制并理解上下文压缩

Roo Code 提供了多种方式来控制和理解智能上下文压缩功能:

控制上下文压缩

  • 自动阈值:“上下文”设置中的阈值滑块允许您定义上下文窗口使用率的百分比(例如 80%)。当对话达到此容量水平时,Roo Code 将尝试自动压缩上下文。

  • **自定义提示:**修改用于压缩的提示,以更好地适应您的工作流程或强调应保留的内容。

  • 手动触发:在任务顶部,上下文栏的右侧提供了一个压缩上下文按钮。这允许您随时启动上下文压缩过程。

    Manual Condense Context button in expanded task view

    手动压缩上下文按钮(用黄色箭头突出显示)易于访问,可手动控制。

了解上下文压缩活动

  • **上下文压缩指标:**当发生上下文压缩时,Roo Code 会显示:
    • 上下文压缩前后的上下文令牌计数。
    • 上下文压缩 AI 调用所产生的成本。
    • 一个可展开的摘要,详细说明被压缩的内容(此信息是聊天历史记录中可见的 ContextCondenseRow 组件的一部分)。
A completed context condense row showing token counts and cost

为什么这个视图很重要:它是您了解什么发生了变化、花费了多少以及 Roo 将继续处理什么的审计跟踪。

  • 视觉指示器:
    • 当上下文压缩处于活动状态时,聊天界面中会显示一个进度指示器(“正在压缩上下文...”)。

    • 任务标题也会显示当前的上下文压缩状态。

    • ContextWindowProgress 条提供了令牌分布的直观表示,包括当前使用情况、为 AI 输出保留的空间、可用空间以及原始令牌数量。

  • 界面清晰度:“压缩上下文”按钮包含一个解释其功能的工具提示,支持所有语言。

有效上下文压缩技巧

自定义上下文压缩提示

您可以自定义上下文缩减提示,以更好地适应您的特定领域或用例。如果您发现默认的压缩过程丢失了特定于您工作流程的重要信息,这将特别有用。

要自定义提示:

  1. 进入 Roo Code 设置( 图标)
  2. 打开上下文管理
  3. 找到自定义上下文压缩提示编辑器
  4. 输入您的自定义提示,指示 Roo 必须保留什么

例如,如果您正在进行复杂的调试会话,您可以添加如下说明:

  • “始终完整保留错误消息和堆栈跟踪”
  • “保留所有变量名及其最后已知值”
  • “跟踪所有尝试过的解决方案及其结果”

这种自定义确保上下文压缩过程保留对您的特定用例最关键的信息。


自动错误恢复

当 Roo Code 遇到上下文窗口限制错误时,它现在会自动恢复,以保持您的工作流程:

错误恢复的工作原理

  1. 错误检测:Roo Code 检测来自多个提供商(OpenAI、Anthropic、Cerebras 等)的上下文窗口错误
  2. 自动截断:系统自动将上下文减少 25%
  3. 重试机制:截断后,Roo Code 重试您的请求(最多达到内置重试限制)
  4. 继续:Roo 无需手动干预即可重试

这种自动恢复确保:

  • 您不会因上下文限制错误而丢失工作
  • 长对话可以顺利进行
  • 系统智能地管理上下文,无需手动重启

恢复触发时机


技术实现

令牌计数

Roo Code 采用了一套精密的令牌计数系统,其特点包括:

  • 在可用时优先使用原生令牌计数接口(例如 Anthropic 的 API)
  • 当 API 调用失败时,回退到 tiktoken 估算
  • 为不同内容类型提供精确的计数:
    • 文本内容:采用基于单词的估算,并计入标点符号和换行符的开销
    • 图像内容:采用保守估算,每张图像按 300 个令牌计算
    • 系统提示:为结构性元素计入额外开销

上下文窗口管理

  • 默认情况下,上下文窗口的 30% 会被预留(其中 20% 用于模型输出,10% 作为安全缓冲),剩余 70% 可用于对话历史。
  • 该预留比例可通过特定模型的设置进行覆盖
  • 系统会自动计算可用空间,同时维持此预留比例

错误处理策略

为何不能使用其他模型/提供商进行压缩(以及为何这反而是优点)

压缩始终使用您当前对话所使用的提供商/模型。

使用不同模型进行压缩可能会降低摘要质量,尤其是在历史记录包含工具调用、工具结果或其他结构化内容时。保持压缩与当前模型/提供商一致,可避免因不同工具/格式预期之间的“转换”而导致的错误。

自定义压缩提示的存储方式(高级)

您的自定义压缩提示采用与其他提示模板相同的 support-prompt 覆盖机制进行存储:customSupportPrompts.CONDENSE

  • 如果您之前使用的是旧版 customCondensingPrompt,Roo 会自动将其迁移至该位置。
  • 重置操作会清除此覆盖,使 Roo 回退到内置的默认压缩提示。