agentic_huge_data_base / wiki
页面 jcode · 6.1 上下文压缩管理器·DeepWiki 中文全文译文

6.1 · 上下文压缩管理器(Compaction Manager)

代理式研究运行时 · 本章是 jcode DeepWiki 中文译文的独立章节页,保留原始链接、源码锚点、模块标签和章节层级。

项目jcode 章节6.1 状态全文译文 模块记忆与上下文、界面与交互、测试、发布与运维、检索、召回与索引
源码线索
  • crates/jcode-compaction-core/Cargo.toml
  • crates/jcode-compaction-core/src/lib.rs
  • crates/jcode-tui-mermaid/src/mermaid_tests/part_01.rs
  • crates/jcode-tui-mermaid/src/mermaid_viewport.rs
  • docs/SECURITY_DEPENDENCIES.md
  • scripts/security_preflight.sh
  • src/agent/compaction.rs
  • src/agent_tests.rs
  • src/compaction.rs
  • src/compaction_tests.rs
模块标签
  • 记忆与上下文
  • 界面与交互
  • 测试、发布与运维
  • 检索、召回与索引
  • 模型调用与提供方适配

中文译文

上下文压缩管理器(中文译文)

原始 DeepWiki 页面:https://deepwiki.com/1jehuang/jcode/6.1-compaction-manager
翻译时间:2026-05-27T08:45:26.019Z
翻译模型:deepseek-chat
原文字符数:9749
项目:jcode (jcode)

---

压缩管理器

相关源文件

以下文件被用作生成此维基页面的上下文:

  • crates/jcode-compaction-core/Cargo.toml
  • crates/jcode-compaction-core/src/lib.rs
  • crates/jcode-tui-mermaid/src/mermaid_tests/part_01.rs
  • crates/jcode-tui-mermaid/src/mermaid_viewport.rs
  • docs/SECURITY_DEPENDENCIES.md
  • scripts/security_preflight.sh
  • src/agent/compaction.rs
  • src/agent_tests.rs
  • src/compaction.rs
  • src/compaction_tests.rs
  • src/import_tests.rs
  • src/lib.rs
  • src/memory.rs
  • src/memory_agent.rs
  • src/memory_tests.rs
  • src/sidecar.rs
  • src/tool/memory.rs
  • src/tool/webfetch.rs
  • src/tool/websearch.rs
  • src/tui/app/conversation_state.rs
  • src/tui/info_widget_memory_render.rs
  • src/tui/ui_tests/diagrams/part_01.rs
  • src/tui/ui_tests/diagrams/part_02.rs

CompactionManager(压缩管理器)负责管理对话上下文窗口,确保大语言模型(LLM)代理能在其 Token 限制内持续运行。它实现了一种后台摘要策略,将对话历史压缩为简洁的摘要,使代理能够"遗忘"原始消息历史,同时保留必要的上下文、操作和用户偏好 src/compaction.rs:1-16

核心机制与阈值

管理器会跟踪 Token 使用量是否超出预算(默认 200,000 Token)src/compaction.rs:99-100。它使用核心 crate 中定义的几个阈值来决定何时以及如何缩减上下文:

阈值操作
COMPACTION_THRESHOLD80%触发后台摘要 crates/jcode-compaction-core/src/lib.rs:9
CRITICAL_THRESHOLD95%触发同步的 hard_compact_with 紧急回退 crates/jcode-compaction-core/src/lib.rs:13
MANUAL_COMPACT_MIN10%手动触发压缩所需的最低级别 crates/jcode-compaction-core/src/lib.rs:16

管理器维护一个 compacted_count(已压缩计数),表示会话历史中已被成功摘要的前导消息数量,在构建下一个 API 载荷时应跳过这些消息 src/compaction.rs:68-68

上下文流图

此图展示了在代理运行时循环中,CompactionManager 如何与消息历史及大语言模型(LLM)提供者交互。

graph TD
    subgraph "代理运行时循环"
        A["Agent::run_turn"] --> B["CompactionManager::ensure_context_fits"]
    end

    subgraph "压缩逻辑"
        B --> C{"检查 context_usage_with"}
        C -- "< 80%" --> D["CompactionAction::None"]
        C -- "80% - 95%" --> E["生成后台任务"]
        C -- "> 95%" --> F["hard_compact_with (同步)"]

        E --> G["CompactionAction::BackgroundStarted"]
        F --> H["CompactionAction::HardCompacted"]
    end

    subgraph "后台任务 (Tokio)"
        E -.-> I["Provider::complete_simple (SUMMARY_PROMPT)"]
        I -.-> J["check_and_apply_compaction"]
        J -.-> K["更新 active_summary 和 compacted_count"]
    end

来源: src/compaction.rs:65-138crates/jcode-compaction-core/src/lib.rs:5-16src/compaction.rs:41-47

压缩模式

系统支持三种不同的操作模式,这些模式决定了摘要的触发逻辑 src/compaction.rs:11-17

1. 反应模式(默认)

最简单的模式,当 observed_input_tokens(观察到的输入 Token)或估计的字符数超过 80% 阈值时严格触发压缩 src/compaction.rs:13

2. 主动模式

使用指数加权移动平均(EWMA)预测未来的 Token 增长 src/compaction.rs:14

  • 预测: 它跟踪一个滚动窗口的 Token 历史(TOKEN_HISTORY_WINDOW = 20)来估计增长率 src/compaction.rs:119
  • 逻辑: 如果未来几轮对话的预测上下文使用量超过阈值,它会提前开始摘要,确保在达到限制之前摘要已准备就绪。
3. 语义模式

使用嵌入向量检测主题切换 src/compaction.rs:15-16

  • 主题切换: 它维护一个每轮对话嵌入向量的滚动窗口(EMBEDDING_HISTORY_WINDOW = 10src/compaction.rs:129
  • 逻辑: 基于嵌入向量检测到的主题切换和相关性评分触发压缩。
  • 缓存: 使用每个管理器的缓存(SEMANTIC_EMBED_CACHE_CAPACITY = 256)避免对消息文本进行重复的嵌入向量查找 src/compaction.rs:132-135
  • 回退: 如果嵌入向量不可用,则回退到主动模式 src/compaction.rs:16-17

来源: src/compaction.rs:11-17src/compaction.rs:116-138crates/jcode-compaction-core/src/lib.rs:35-45

紧急操作

当上下文窗口几乎耗尽(>= 95%)时,管理器会执行紧急程序以防止 API 失败。

hard_compact_with

一个同步回退方法,立即从历史记录的前端丢弃消息 crates/jcode-compaction-core/src/lib.rs:88。它确保至少保留 MIN_TURNS_TO_KEEP(2 轮)以提供一定的连续性,即使信息丢失 crates/jcode-compaction-core/src/lib.rs:22

emergency_truncate_with

一种细粒度的清理方法,针对近期历史中的特定大内容块:

  • 工具结果截断: 大的工具输出会被截断为 EMERGENCY_TOOL_RESULT_MAX_CHARS(4000 字符)crates/jcode-compaction-core/src/lib.rs:25
  • 估算: 使用保守的 CHARS_PER_TOKEN(4)比率来估算截断的影响,当实际 Token 计数不可用时 crates/jcode-compaction-core/src/lib.rs:28

来源: crates/jcode-compaction-core/src/lib.rs:21-34crates/jcode-compaction-core/src/lib.rs:87-89

原生压缩(OpenAI)

对于 OpenAI 提供者,管理器支持一个涉及 encrypted_content(加密内容)的原生功能。这允许将摘要以提供者特定的格式存储在 Summary 结构体中 crates/jcode-compaction-core/src/lib.rs:61

当调用 messages_for_api_with 时,如果存在 openai_encrypted_content,它会被作为 OpenAICompaction 块注入到消息流中 crates/jcode-compaction-core/src/lib.rs:160-162。这允许提供者从其内部检查点恢复,而不仅仅是文本摘要。

来源: src/compaction.rs:41-47crates/jcode-compaction-core/src/lib.rs:59-64crates/jcode-compaction-core/src/lib.rs:160-162

实现细节

数据结构

CompactionManager 跟踪以下状态:

  • active_summary:最新的 Summary 结构体,包含摘要文本及其覆盖的轮次索引 src/compaction.rs:71
  • active_message_chars:未压缩后缀中字符的滚动估计值,避免每轮重新扫描历史 src/compaction.rs:77
  • pending_task:异步摘要任务的 JoinHandle src/compaction.rs:84
  • observed_input_tokens:提供者报告的实际使用量,优先于启发式方法 src/compaction.rs:102-104
摘要提示

系统使用结构化的提示(SUMMARY_PROMPT)来生成摘要,要求包含上下文我们做了什么当前状态用户偏好等部分 crates/jcode-compaction-core/src/lib.rs:47-55

Token 开销

管理器会考虑 SYSTEM_OVERHEAD_TOKENS(18,000),这保守地估计了系统提示和注册表中 50 多个工具定义的开销 crates/jcode-compaction-core/src/lib.rs:30-33

来源: src/compaction.rs:65-138crates/jcode-compaction-core/src/lib.rs:30-33crates/jcode-compaction-core/src/lib.rs:47-55

代码实体映射

此图将高级压缩概念映射到代码库中的具体结构体和函数。

classDiagram
    class CompactionManager {
        +compacted_count: usize
        +active_summary: Option~Summary~
        +observed_input_tokens: Option~u64~
        +ensure_context_fits(messages, provider)
        +hard_compact_with(messages)
        +messages_for_api_with(messages)
    }

    class Summary {
        +text: String
        +openai_encrypted_content: Option~String~
        +covers_up_to_turn: usize
        +original_turn_count: usize
    }

    class CompactionResult {
        +summary_text: String
        +openai_encrypted_content: Option~String~
        +covers_up_to_turn: usize
        +duration_ms: u64
    }

    class CompactionAction {
        <<枚举>>
        None
        BackgroundStarted
        HardCompacted
    }

    CompactionManager --> Summary : 存储
    CompactionManager ..> CompactionResult : 从任务接收
    CompactionManager ..> CompactionAction : 返回给运行时

来源: src/compaction.rs:41-47src/compaction.rs:65-138crates/jcode-compaction-core/src/lib.rs:59-64crates/jcode-compaction-core/src/lib.rs:81-89