课程大纲
200K 上下文怎么花:预算、压缩与会话退化
200K 上下文怎么花:预算、压缩与会话退化
本文基于 Florian BRUNIAUX 的英文原版改编,原文地址:https://cc.bruniaux.com/guide/architecture 许可:CC BY-SA 4.0
这篇你能拿走什么
很多人遇到 Claude Code "突然变笨",第一反应是换模型;其实大部分时候问题出在上下文:被堆满了、被自动压缩了、或者被失败堆栈污染了。这篇把上下文预算、压缩阈值、会话退化拐点、失败漂移都摊开讲清楚,让你下次知道是该 /compact、/clear,还是该重新启动。
前置条件
- 已完成本系列前面的章节
- 知道自己的 Claude Code 版本(不同版本压缩阈值可能不同)
200K Token 预算拆解
可信度:80%(Tier 2 - 部分官方)
Claude Code 在固定上下文窗口中运行,约 200K tokens(随模型变化)。这 200K 不是全给你用:
text┌─────────────────────────────────────────────────────────────┐ │ CONTEXT BUDGET (~200K tokens) │ ├─────────────────────────────────────────────────────────────┤ │ System Prompt (~5-15K) │ │ • Tool definitions │ │ • Safety instructions │ │ • Behavioral guidelines │ │ │ │ CLAUDE.md Files (~1-10K) │ │ • Global ~/.claude/CLAUDE.md │ │ • Project /CLAUDE.md │ │ • Local /.claude/CLAUDE.md │ │ │ │ Conversation History (variable) │ │ • Your prompts │ │ • Claude's responses │ │ • Tool call records │ │ │ │ Tool Results (variable) │ │ • File contents from Read │ │ • Command outputs from Bash │ │ • Search results from Grep │ │ │ │ Reserved for Response (~40-45K) │ │ • Claude's thinking │ │ • Generated code/text │ │ │ │ USABLE = Total - System - Reserved ≈ 140-150K tokens │ └─────────────────────────────────────────────────────────────┘
实战意味着:别把 CLAUDE.md 写成万字长文。每多 5K 全局指令,可用上下文就少 5K。
系统提示里有什么
可信度:100%(Tier 1 - Anthropic 透明度承诺公开)
Anthropic 把系统提示作为透明度承诺的一部分公开发布(约 5-15K tokens),定义:
- 工具定义:Bash / Read / Edit / Write / Grep / Glob / Task / TodoWrite
- 安全指令:内容政策、拒答模式
- 行为准则:任务优先、MVP 优先、不做过度工程
- 上下文指令:如何收集和使用项目上下文
注意:Claude.ai / Mobile / API / Code CLI 各自的系统提示不完全相同。Claude Code 的提示是 agentic coding assistant 模式,会主动收集项目上下文。
自动压缩:什么时候触发
可信度:75%(Tier 2 - 社区验证 + 研究支持)
不同来源给的阈值不一样,列在一起看:
| 来源 | 报告阈值 | 说明 |
|---|---|---|
| VS Code extension | ~75% 使用量(剩余 25%) | GitHub #11819(2025-11) |
| CLI version | 剩余 1-5% | 比 VS Code 更保守 |
| PromptLayer 分析 | 92% | 历史观察 |
| Steve Kinney | 95% | Session Management Guide(2025-07) |
用户触发的 /compact | 任意 | 手动控制 |
压缩期间会发生:
- 较早的对话轮次被总结
- 工具结果被压缩
- 最近的上下文完整保留
- 模型收到一个"上下文已被压缩"的信号
压缩的代价
最近研究确认自动压缩会带来质量下降:
- 上下文从 1K 涨到 32K,LLM 在复杂任务上表现会下降 50-70%
- NoLiMa benchmark 中,12 个模型有 11 个在 32K tokens 时低于其短上下文表现的 50%
- 反复压缩循环会丢失细微差别并破坏引用关系
- 高上下文场景下,注意力机制会承受检索负担
社区共识:在逻辑断点手动 /compact,优于等自动压缩触发。
推荐策略
| 上下文比例 | 动作 | 理由 |
|---|---|---|
| 70% | 警告 - 计划清理 | 提前感知 |
| 85% | 建议手动交接 | 防止自动压缩导致能力下降 |
| 95% | 强制交接 | 严重质量下降 |
会话退化:什么规模开始崩
可信度:70%(Tier 2 - 实践者研究、arXiv 研究)
Claude Code 的有效性会在某些条件下可预测地下降:
| 条件 | 观察阈值 | 症状 |
|---|---|---|
| 对话轮次 | 15-25 轮 | 丢失早期约束的跟踪 |
| Token 累积 | 80-100K | 忽略会话早期的需求 |
| 问题范围 | 同时 >5 个文件 | 修改不一致、遗漏文件 |
按范围划分的成功率(实践者研究):
| 范围 | 成功率 | 示例 |
|---|---|---|
| 1-3 个文件 | ~85% | 单模块 bug 修复 |
| 4-7 个文件 | ~60% | 跨组件重构 |
| 8+ 个文件 | ~40% | 代码库级别修改 |
缓解策略:
- 检查点提示:
继续之前,请回顾当前需求和约束。 - 会话重置:新任务开新会话(
/clear) - 严格收窄范围:把大任务拆成聚焦的小任务
- 使用子代理:把探索委派给 Task 工具,保留主上下文
失败触发的上下文漂移
这是一种独立于上下文大小的退化模式:反复的工具失败。当一个工具调用失败而 Claude 重试时,错误输出会累积在上下文里。堆栈跟踪、重试噪声、错误消息会稀释原始意图——后续尝试会沿着错误叙事走,而不是沿着任务目标走。上下文窗口没满,但信噪比已经下降。
这与压缩漂移不同。压缩漂移是上下文太大;失败漂移是有限窗口内的上下文质量下降。
救场办法:失败后重注入意图
在每次命令失败后重新注入核心任务指令,而不是只在 /compact 后这样做。PostToolUse hook 可以用原始任务和约束的浓缩版本为重试提示加前缀:
bash# PostToolUse hook: re-inject intent after failures if [[ "$CLAUDE_TOOL_EXIT_CODE" != "0" ]]; then echo "REMINDER: The current task is: $ORIGINAL_TASK_SUMMARY. Ignore the above error if non-blocking and continue toward that goal." fi
来源:Nick Tune - Workflow DSL: Domain-Driven Claude Code Workflows(2026-03-01)。
上下文保留策略一览
| 策略 | 何时使用 | 方式 |
|---|---|---|
| 子代理 | 探索性任务 | Task 工具做隔离搜索 |
| 手动 compact | 主动清理 | /compact |
| 清空会话 | 需要重新开始 | /clear |
| 精确读取 | 知道需要什么 | 读精确文件,而不是目录 |
| CLAUDE.md | 持久化上下文 | 把约定存入 memory 文件 |
实战注解
我自己用 Claude Code 一年里学到最有价值的一件事:会话太长就重启,别死撑。当你发现 Claude 开始忘记你十几轮前定的约束、或者反复犯同一个错时,99% 的情况是上下文噪声太多。不要继续在原会话里"修复它的记忆",那只会更脏。直接 /clear、把核心约束写进 CLAUDE.md,然后重启。
第二个经验:失败漂移真的存在。我有过一次让 Claude 跑测试,连续失败 5 次后它开始绕圈子改不相关的文件——不是它笨了,是错误堆栈把"原始任务"挤到了上下文边缘。后来我加了一个 PostToolUse hook 在每次失败后重注入任务摘要,再没出现过这种情况。
可信度回顾
- Tier 1(官方 100%):系统提示组成、上下文窗口存在性
- Tier 2(70-90%):200K 预算拆解、自动压缩阈值、会话退化数据、失败漂移现象
- Tier 3(推断):本篇没有 Tier 3 内容
阈值数字(75%/85%/92%/95%)来自不同观察源,差异本身就是信号——说明 Anthropic 没有公开精确数字,且可能因模型而异。
常见问题
Q:CLAUDE.md 越大越好吗? A:相反。CLAUDE.md 直接挤占可用上下文,每多 5K 全局指令就少 5K 可用空间。只放跨会话稳定的约定,临时偏好放 prompt 里。
Q:自动压缩之后内容丢了能找回吗?
A:会话历史在压缩前的版本是不可逆的。如果某个细节重要,要么提前 /compact 由你控制,要么在压缩前把它显式写进 CLAUDE.md 或代码注释。
Q:怎么确认我现在已经压缩了多少? A:CLI 版本会在压缩时给一个"上下文已被压缩"的信号;可以在 hook 里捕获 transcript 文件大小变化,但精确百分比 Anthropic 没公开。
来源与许可
- 原作者:Florian BRUNIAUX;Claude(Anthropic)参与贡献
- 英文原版地址:https://cc.bruniaux.com/guide/architecture
- 源文件:
FlorianBruniaux/claude-code-ultimate-guide / guide/core/architecture.md - 本文基于 CC BY-SA 4.0 改编:保留署名、来源链接,衍生作品同样以 CC BY-SA 4.0 公开
- 内容版本:原作 v1.1.0 / Claude Code v2.1.34(2026-02)