课程大纲
课程大纲系列主页
学习进度已完成 0/7

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 Kinney95%Session Management Guide(2025-07)
用户触发的 /compact任意手动控制

压缩期间会发生:

  1. 较早的对话轮次被总结
  2. 工具结果被压缩
  3. 最近的上下文完整保留
  4. 模型收到一个"上下文已被压缩"的信号

压缩的代价

最近研究确认自动压缩会带来质量下降:

  • 上下文从 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%代码库级别修改

缓解策略

  1. 检查点提示继续之前,请回顾当前需求和约束。
  2. 会话重置:新任务开新会话(/clear
  3. 严格收窄范围:把大任务拆成聚焦的小任务
  4. 使用子代理:把探索委派给 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)
200K 上下文怎么花:预算、压缩与会话退化 | 资讯狗 | Zixungou