Skip to content

Context Mode 通过四个机制解决 AI 编程助手的上下文膨胀问题。沙盒执行让原始数据不进对话(315 KB → 5.4 KB);会话持久化用 SQLite 记录每次操作,压缩后自动恢复;代码思维要求 LLM 写脚本分析而非读文件搬运;输出压缩砍掉填充词和客套话,只保留技术实质。四个机制叠加,把有效会话时间从 30 分钟延长到 3 小时。

问题全景

用 Claude Code 帮你写代码时,上下文窗口被两头消耗:

输入端:每次工具调用都往对话里塞原始数据。读文件(5 KB/个 × 50 个 = 250 KB)、跑测试(8 KB)、grep 结果(12 KB)、GitHub API 返回(20 KB)……

输出端:AI 的回答充满废话。"Let me help you with that!"、"Great question!"、"Let me take a closer look at this..."——这些客套话每个消耗 20-50 tokens。

半小时后,40% 的上下文窗口被吃光。Compaction 触发,AI 忘了你在干嘛。

Context Mode 的四个机制分别堵住四个漏洞:

┌─────────────────────────────────────────────┐
│              Context Window                  │
│                                              │
│  ┌─────────┐  ┌──────────┐  ┌────────────┐ │
│  │ 工具输出  │  │ AI 废话   │  │  会话历史  │ │
│  │ 250 KB   │  │ 50 KB    │  │  100 KB   │ │
│  └────┬─────┘  └────┬─────┘  └─────┬──────┘ │
│       │              │              │        │
│   沙盒执行        输出压缩      会话持久化   │
│   ↓ 5.4 KB       ↓ 15 KB     ↓ SQLite    │
│                                              │
│         + 代码思维(替换工具调用)            │
└─────────────────────────────────────────────┘

功能一:沙盒执行(Context Saving)

原理

每个 ctx_execute 调用在独立子进程(沙盒)中运行。脚本的原始输出(日志、API 响应、页面快照)永远不会进入对话上下文——只有你用 console.log() 打印的结果才会被送回来。

Before vs After

# Before:直接读文件,50 个文件 = 250 KB 上下文
Read("src/components/App.tsx")    → 8 KB
Read("src/components/Header.tsx") → 5 KB
Read("src/components/Footer.tsx") → 4 KB
... × 50 个文件

# After:沙盒执行脚本,只有结果 = 3.6 KB
ctx_execute("javascript", `
  const files = fs.readdirSync('src/components')
    .filter(f => f.endsWith('.tsx'));
  files.forEach(f => {
    const lines = fs.readFileSync('src/components/' + f, 'utf8')
      .split('\\n').length;
    console.log(f + ': ' + lines + ' lines');
  });
`)
# 输出:
# App.tsx: 120 lines
# Header.tsx: 45 lines
# Footer.tsx: 38 lines
# ...

关键约束

  • 只进 stdoutconsole.log() 的内容进入对话,console.error()stderr、文件写入都不进
  • 独立进程:每个调用是全新进程,没有状态残留
  • 11 种语言:JavaScript、TypeScript、Python、Shell、Ruby、Go、Rust、PHP、Perl、R、Elixir
  • Bun 优先:检测到 Bun 运行时自动使用,JS/TS 执行速度提升 3-5 倍

适合用沙盒的场景

场景传统方式沙盒方式
统计代码行数Read 每个文件1 个脚本搞定
分析 Git 日志Bash 跑 git log(输出 10 KB+)脚本过滤,只输出你关心的
检查依赖版本Read package.json + lock 文件脚本只打印版本号
解析 API 响应Fetch + 读全部 JSON脚本提取目标字段

功能二:会话持久化(Session Continuity)

原理

Context Mode 在后台维护一个 SQLite 数据库,记录会话中的每个事件:文件编辑、git 操作、任务状态、错误信息、用户决策。当会话压缩(compaction)触发时,这些记录不会丢失——Context Mode 构建一个优先级分层的 XML 快照(≤2 KB),通过 SessionStart Hook 自动恢复。

事件记录(23 种类别)

优先级事件类型
P1 Critical文件变更、任务状态、计划、规则、用户提示
P2 High决策、Git 操作、错误、约束、阻塞项、被拒绝的方案
P3 NormalMCP 工具调用、子代理、技能、外部引用
P4 Low意图、角色、数据引用

压缩时发生了什么

1. PreCompact Hook 触发
2. 从 SQLite 读取所有事件记录
3. 按优先级构建 XML 快照(P1 全部保留,P4 可能省略)
4. 快照写入 session_resume 表(≤ 2 KB)
5. Claude 压缩对话上下文
6. SessionStart Hook 触发
7. 从 session_resume 读取快照
8. 注入为 <session_knowledge> 指令
9. AI 从上次的进度继续

效果

压缩前:"帮我把 App.tsx 的状态管理从 useState 改成 useReducer" 压缩后:AI 依然记得要改 App.tsx、改成 useReducer、以及你之前讨论的 reducer 结构方案。

TIP

如果使用 --continue 恢复上一次会话,数据保留并继续追加。如果开新会话,之前的 Session 数据立即清理——干净的开始。

功能三:代码思维(Think in Code)

核心理念

不要让 LLM 读文件理解代码——让它写脚本分析代码。

这是 Context Mode 最具颠覆性的理念:改变 AI 编程助手的工作方式。传统方式下,AI 是"数据搬运工"——读文件、分析输出、再告诉你结论。Context Mode 要求 AI 成为"代码编写者"——写一个脚本完成分析,只把结果送回来。

50 文件 → 1 脚本

# 传统方式:读 50 个文件到上下文
Read("src/auth/login.ts")     → 理解认证逻辑
Read("src/auth/register.ts")  → 理解注册逻辑
Read("src/auth/middleware.ts") → 理解中间件
... × 50
# 上下文消耗:700 KB

# 代码思维:写 1 个脚本
ctx_execute("typescript", `
  const glob = require('glob');
  const files = glob.sync('src/**/*.ts');
  const results = files.map(f => {
    const content = fs.readFileSync(f, 'utf8');
    const funcs = (content.match(/export\\s+(?:async\\s+)?function\\s+(\\w+)/g) || []);
    return { file: f, functions: funcs.length };
  }).filter(r => r.functions > 0);
  console.log(JSON.stringify(results, null, 2));
`)
# 上下文消耗:3.6 KB

为什么这是一种范式转变

传统 AI 编程工具把 LLM 当作"万能翻译器"——把代码读进来,理解后用自然语言解释给你听。这导致两个问题:

  1. 上下文爆炸:理解一个项目可能要读几百个文件
  2. 理解不精确:LLM 读多了会混淆、遗漏

代码思维要求你(通过 Context Mode 的路由指令强制)改变习惯:分析任务写脚本,LLM 负责生成脚本和解读结果。

这是"人在做架构决策,AI 在执行"的古法编程哲学——只不过这次,AI 执行的不是业务代码,而是分析脚本。

功能四:输出压缩(Output Compression)

原理

Context Mode 在 Hook 层拦截 AI 的输出,自动删除:

删除的内容例子
填充词just, really, basically, actually, simply
客套话"Let me help you with that!", "Great question!"
冗余解释"This is because..."(当原因已从上下文可知时)
对冲表达"It might be worth considering..." → 直接说建议
重复总结文末再复述一遍已说过的要点

保留的内容:

保留的内容例子
技术实质代码片段、错误信息、配置值
操作指令"运行 npm install 然后检查 tsconfig.json"
警告涉及安全、不可逆操作时自动扩展说明

效果

输出 token 减少 65-75%,且不损失技术准确性。

安全边线

输出压缩不是无脑删减。以下情况会自动"扩展"(保留完整说明):

  • 安全警告("这个改动会暴露 API Key")
  • 不可逆操作("删除数据库后无法恢复")
  • 用户困惑时(AI 判断用户可能不理解时保留解释)

四个功能如何协同

用户提问

[输出压缩] AI 回答更精简(-65% 输出 token)

[代码思维] AI 写脚本而非读文件(-90% 工具调用)

[沙盒执行] 脚本在沙盒运行(-98% 输入数据)

[会话持久化] 关键信息记录到 SQLite

Compaction 触发 → 恢复 ≤ 2 KB 快照 → 继续工作

官方数据:有效会话时间从 ~30 分钟延长到 ~3 小时

FAQ

Q: 这四个功能可以单独开/关吗?

不能。它们是 Context Mode 的核心设计,作为整体工作。沙盒执行是 MCP 工具的行为,由路由指令引导 AI 使用;会话持久化由 Hook 自动运行;输出压缩也是 Hook 层的行为。你只能通过卸载 Context Mode 来关闭它们。

Q: "代码思维"需要 AI 自觉遵守吗?

部分是。Context Mode 的路由指令文件(CLAUDE.md、GEMINI.md 等)会告诉 AI "优先用 ctx_execute 写脚本分析,不要直接 Read 大量文件"。在 Hook 支持完整的平台上(Claude Code、Gemini CLI),PreToolUse 还会拦截过大的工具输出。但最终 AI 是否真的写脚本而不是读文件,还是取决于它自己的判断。

Q: 输出压缩会不会改变技术内容的准确性?

官方承诺不会。压缩只删除"装饰性"文本(填充词、客套话),代码块、错误信息、配置指令原样保留。如果删减后内容有歧义,会保留更长的版本。