Claude Code 还没干活,22% 的上下文窗口已经被工具和 Agent 占了

我以为 Claude Code 的上下文大头,是聊天记录和 `CLAUDE.md`。

直到我运行了一次 `/context`。

200k 的窗口已经占用 65.4k。`System tools` 占 34.2k,`Custom agents` 占 10k。

两项合计 44.2k,相当于整个窗口的 22.1%。

真正的任务还没开始,工具定义和 Agent 摘要已经先拿走了超过五分之一的窗口。

这不是账单,也不能证明模型一定会变慢。

它证明的是:你写进输入框的提示词,只是模型实际上下文里很小的一部分。

Anthropic 为什么敢删掉 80% 的 system prompt

Anthropic 工程师 Thariq Shihipar 分享过 Claude Code 团队的一次大幅瘦身。

他们为最新一代 Claude 5 模型删除了超过 80% 的 system prompt,在内部编码评测中没有观察到可测量的损失。

这不是“提示词越短越好”。

他们删掉的主要是旧模型时代留下的补丁。

早期模型判断力有限,团队只能把最坏情况写成规则。为了防止它乱加注释,就写“不要加注释”;为了让它完善文档,又在别处写“适当补充文档”。

单独看都合理,放在同一次请求里却会互相打架。

新模型通常能猜到用户真正想要什么,但它必须先解决这些冲突,才能开始任务。

Anthropic 的新方向可以浓缩成三句话:

  • 少写只能覆盖少数情况的过程规则,让模型结合上下文判断。
  • 少堆工具调用示例,把接口和参数本身设计清楚。
  • 不把所有知识放在开头,需要时再加载 Skill、工具定义和参考文件。

不是不要上下文,而是把“全部预装”改成“按任务供给”。

我的 `/context` 里,最大的不是 `CLAUDE.md`

这次 `/context` 显示,总占用是 65.4k。`System prompt` 是 3k,`System tools` 是 34.2k,`Custom agents` 是 10k,`Memory files` 是 115,`Skills` 是 2.1k,`Messages` 是 15.9k。已经注册的 22 个 `MCP tools` 显示为 0 tokens。

这里要先校准一个口径:`/context` 里显示的 200k,是 Claude Code CLI harness 在当前会话实际采用的有效 token 预算,不等于模型官方 API 支持的最大 context window。这次会话使用的 Fable 5 在官方 API 文档中支持 1M context window,因此文中的 22.1% 只对应这次 CLI 会话的 200k 预算。

换成别的模型、网关或配置,这个比例可能完全不同。审计时应该先认清当前会话采用的窗口口径,再讨论哪些内容值得优化。

develop套件注册了 39 个自定义 Agent。进入上下文的不是 39 份完整 system prompt,而是每个 Agent 的名称和描述摘要。仅这些摘要,就占了 10k,约为整个窗口的 5%。

`System tools` 和 `Custom agents` 合计 44.2k,相当于整个 200k 窗口的 22.1%,也接近当时已使用上下文的三分之二。

相比之下,Skills 摘要一共只有 2.1k,22 个 `MCP tools` 显示为 0 tokens。

这不代表 Skill 和 MCP 没有成本。完整说明仍会在真正调用时进入上下文。它说明的是加载方式不同:一套很长的专项流程,如果只在相关任务里出现,通常比把同样的内容塞进每次会话都要经过的根规则更合理。

所以,我不会因为 Skill 数量多就先清空它们。更值得优先检查的,是那些长期常驻、彼此重叠,却很少在真实任务里发挥作用的说明和能力。

会话后来给出了单个 system tool 各占多少 token 的估算,但那是模型根据工具定义篇幅推算的,不是 `/context` 的原始测量。这也是上下文审计容易踩的坑:数字只要带上小数点,看起来就很可信。可如果没有明确的测量入口,再精确也只是估算。本文只使用这次 `/context` 中可以直接核对的数据。

上下文其实有四种成本

第二篇参考文章把上下文分为长期指令、记忆、知识与文件、工具与连接器四层。

结合这次实测,我更愿意按加载方式把它们分成四类。

常驻成本

System prompt、项目根规则、常见工具定义、Agent 名称和描述,任务开始前就已经存在。

常驻不是坏事。但每一项都应该回答:它真的值得每次都让模型看到吗?

按需成本

Skill、deferred tools、专项验证流程和详细参考资料,需要时再加载。

它们可以写得很深,但不必进入每一个无关任务。

动态成本

对话消息、读过的文件、工具返回和中间结果,会随着工作自然增长。

它更适合通过拆分任务、压缩历史和结束无关会话管理。

历史遗留成本

过期记忆、重复文档、不再使用的连接器,以及旧模型时代留下的行为补丁。

它们不只是占空间,还可能继续以“当前事实”的身份影响模型。

真正麻烦的不是长,而是冲突

长上下文不一定差。

复杂任务需要完整规格、代码、测试和历史决策时,相关材料越充分,模型越有可能做对。

真正的问题是无关、过期和互相冲突的内容。

真正开始清理时,不需要记住一个专门术语。拿起任何一条长期存在的内容,问四个问题就够了:

  1. 它现在还是真的吗?
  2. 它是否与其他规则冲突?
  3. 一个能力合格的新同事是否本来就知道?
  4. 删除它,究竟会导致什么具体故障?

已经过期的规则可以删除。模型本来就知道的常识,通常也可以删除。

仍有价值、却只在少数任务里使用的内容,不该消失,而应该移到 Skill 或引用文件。

代码格式交给 formatter,质量底线交给测试,固定动作交给 Hook。

能够由工具确定执行的事情,不需要在多个说明文件里反复提醒。

优化上下文不是编辑比赛,而是重新决定每条信息应该住在哪里。

我会这样给 Claude Code 做一次体检

先看真实占用。

运行 `/context`,记录最大的几个类别。别因为某份文件看起来很长,就认定它一定是大头。

再列出常驻项。

全局规则、项目规则、已启用套件、Custom agents、MCP、记忆和连接器,都放进同一张审计清单。

然后重新安置。

每次任务都必须知道的项目陷阱留在根规则;专项流程放进 Skill;详细规范放进引用文件;能够机械验证的要求交给测试或 Hook。

最后,一次只改一个可回滚项。

暂停一个长期不用的插件,或拿掉一条疑似旧模型补丁。继续用真实任务观察错误、工具选择、重复解释和返工,再决定是否恢复。

如果条件允许,可以挑几个经常遇到的真实任务,固定输入、模型和验收标准。修改一个常驻项后重新执行,记录需要补充说明的次数、越界行为和人工返工,而不是只看 `/context` 少了多少。

删除量只是配置变化,任务结果才是优化效果。

我的记录只证明这些内容占据空间,没有做关闭 develop套件前后的同任务盲测。

所以,我不能声称删掉它就一定更快、更准或更省钱。

哪些东西不能删

“删掉 80%”很有传播力,但剩下的 20% 才决定系统能不能可靠工作。

安全、权限、数据访问、法律合规和发布确认必须明确。模型判断力变强,不等于它可以替用户决定风险。

项目里反直觉的设计、会导致事故的陷阱、可靠的构建和验证入口,也值得常驻。

同样的删减幅度不能照搬到所有模型。Anthropic 讨论的是最新一代 Claude 5。旧模型、小模型和本地模型可能仍需要更多脚手架。

插件、MCP、Agent 和 Skill 也不是越少越好。

一个经常使用、能稳定减少返工的工具,即使占一点常驻空间,也可能很划算。一个长期没有调用、描述却每次都出现的 Agent,才值得优先处理。

判断标准不是它占不占 token。

而是它带来的任务价值,是否配得上它的加载方式。

少不是目标,按需才是

这次 22% 的实测不是 Claude Code 的普遍基准,只是我这套重配置环境的一张快照。

但它改变了我优化上下文的顺序。

以前,我会先检查提示词和 `CLAUDE.md`。

现在,我会先问:

  • 哪些能力在常驻?
  • 哪些说明彼此冲突?
  • 哪些内容只是旧模型留下的补丁?
  • 哪些细节可以等任务需要时再加载?

如果你也装了不少插件、Agent、MCP 和 Skill,可以做一次最小审计:看一遍 `/context`,列出常驻项,删除一条明确冲突的规则,暂停一个长期闲置的能力,再把一份专项长流程移到按需层。

然后继续用真实任务观察一段时间。

上下文更短,不是目标。

让常驻信息具体、当前、彼此一致,让其他知识在需要时准确出现,才是上下文工程真正该追求的结果。

历史文章推荐

  • 你写的 CLAUDE.md 越长,AI 越笨
  • Claude Code 不是每次都失忆——它的自动记忆系统是怎么工作的
  • Claude入门系列03|会提示词和会创建 Skill,是两回事
Hi,我是 爱学习的Niko。17 年程序员老兵,现在每天用 AI 写代码,搞创作。这里分享学习和使用 AI 的经验、技术思考、踩过的坑、实用工具和 SKILL。关注我,一起学习。