diff --git a/docs/comparison/context-compression-deep-dive.md b/docs/comparison/context-compression-deep-dive.md index 4c694946..963fb2f8 100644 --- a/docs/comparison/context-compression-deep-dive.md +++ b/docs/comparison/context-compression-deep-dive.md @@ -257,7 +257,75 @@ Anthropic 工程团队在长任务 harness 开发中发现:**模型在上下 --- -## 工具定义膨胀:134K tokens 的教训(来源:[Anthropic Engineering Blog](https://www.anthropic.com/engineering/advanced-tool-use),2025-11-24) +## 八、压缩后的 UI 行为:清屏 vs 保留 + +压缩不仅是后端操作——**用户看到什么**直接影响对 Agent 状态的认知。各 Agent 在压缩后的 UI 处理策略差异显著。 + +### Claude Code:压缩后清屏 + 显示摘要标记 + +从 v2.1.86 二进制分析,Claude Code 压缩后的 UI 流程: + +> **注**:`us()`、`LU$()`、`F$()` 为混淆后的函数名(逆向推断),`isCompactSummary`、`isVisibleInTranscriptOnly`、`pendingPostCompaction` 为 strings 提取的确定性属性名,可信度更高。 + +``` +compact_start → 显示 "Compacting conversation" 旋转器 + → 压缩完成 + → 设置 pendingPostCompaction = true + → 重新追加会话元数据 + → 旧消息替换为 isCompactSummary + isVisibleInTranscriptOnly 标记的摘要消息 + → 屏幕清空旧对话,仅显示 "Summarized conversation" 标记 + → compact_end → 清除旋转器 +``` + +**关键代码(反编译提取)**: + +```javascript +// 压缩后的消息标记 +F$({ + content: summary, + isCompactSummary: true, // ← 标记为压缩摘要 + isVisibleInTranscriptOnly: true, // ← 仅在 transcript 视图中可见 + summarizeMetadata: { + messagesSummarized: originalCount + } +}) + +// UI 渲染:检测到 summarizeMetadata 时显示特殊组件 +if (message.summarizeMetadata) { + // 渲染 "Summarized conversation" 标记(非完整对话历史) +} +``` + +**设计原因**: +1. **状态一致性**——屏幕显示的内容与模型上下文保持同步,避免用户引用"模型已忘记"的消息 +2. **心理重置**——视觉清空给用户一个"干净起点"信号,与 Anthropic 描述的 Context Reset 理念一致 +3. **减少误导**——如果保留旧消息,用户会以为模型"记得"全部细节,但实际上只有压缩摘要 + +### 各 Agent 压缩后 UI 行为对比 + +| Agent | 压缩后清屏? | 用户看到什么 | 来源 | +|------|------------|------------|------| +| **Claude Code** | **是** | "Summarized conversation" 标记 + 新的空白对话区域 | 二进制分析 v2.1.86 | +| **Kimi CLI**(Web UI) | **是** | 仅保留最后一轮用户消息起的内容 | 源码:`useSessionStream.ts` `CompactionEnd` handler | +| **Gemini CLI** | 否 | 内联显示 "Chat history compressed from X to Y tokens" | 源码:`compressCommand.ts` → `ui.addItem()` | +| **Qwen Code** | 否 | 继承 Gemini(内联压缩状态消息) | 源码:`compressCommand.ts`(分叉) | +| **Aider** | 否 | 后台静默替换消息列表,无可见变化(verbose 模式下显示一行日志) | 源码:`base_coder.py` L1002-1034 | +| **Codex CLI** | 否 | 显示警告:"Long threads and multiple compactions can cause the model to be less accurate" | 二进制分析:`compact.rs` → `WarningEvent` | +| **Goose** | 未知 | 未找到压缩后 UI 行为的源码证据 | — | +| **Copilot CLI** | 未知 | 未找到压缩后 UI 行为的源码证据 | — | + +### 设计权衡分析 + +| 策略 | 优势 | 劣势 | +|------|------|------| +| **清屏**(Claude Code、Kimi) | 状态一致、心理重置、防误导 | 用户失去视觉上下文回溯、可能中断思路 | +| **保留**(Gemini、Qwen、Aider、Codex) | 视觉连续性、可回溯历史、不中断流程 | 用户可能误以为模型"记得"全部内容 | + +> **核心洞察**:清屏与否反映了两种不同的设计哲学——**状态准确性**(显示的 = 模型知道的)vs **视觉连续性**(保留用户的阅读上下文)。Claude Code 和 Kimi CLI 选择了前者,其他 Agent 选择了后者。没有绝对的对错——这取决于用户对 Agent 状态感知的期望。 + +--- + +## 九、工具定义膨胀:134K tokens 的教训(来源:[Anthropic Engineering Blog](https://www.anthropic.com/engineering/advanced-tool-use),2025-11-24) 上下文压缩不仅要处理对话历史——**工具定义本身就是上下文膨胀的主要来源**: diff --git a/docs/tools/claude-code/07-session.md b/docs/tools/claude-code/07-session.md index e1bed2e6..2aac121d 100644 --- a/docs/tools/claude-code/07-session.md +++ b/docs/tools/claude-code/07-session.md @@ -4,10 +4,12 @@ ### 上下文压缩 当对话历史接近上下文窗口限制时,Claude Code 自动压缩早期对话内容,保留关键信息: -- 自动触发:接近 token 上限时 +- 自动触发:接近 ~95% token 上限时 - 手动触发:`/compact` 命令 - Hook 支持:PreCompact/PostCompact 事件允许自定义压缩前后行为 +**压缩后 UI 行为**:压缩完成后清空屏幕旧对话,仅显示 "Summarized conversation" 标记——屏幕内容与模型上下文保持同步。详见[压缩后 UI 行为分析](../../comparison/context-compression-deep-dive.md)。 + ### 会话恢复 ```bash # 恢复最近会话