Appearance
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
# ...关键约束
- 只进 stdout:
console.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 Normal | MCP 工具调用、子代理、技能、外部引用 |
| 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 当作"万能翻译器"——把代码读进来,理解后用自然语言解释给你听。这导致两个问题:
- 上下文爆炸:理解一个项目可能要读几百个文件
- 理解不精确: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: 输出压缩会不会改变技术内容的准确性?
官方承诺不会。压缩只删除"装饰性"文本(填充词、客套话),代码块、错误信息、配置指令原样保留。如果删减后内容有歧义,会保留更长的版本。