“技能装太多会挤占上下文”——这话经常听到。一半是对的,一半是错的。

按官方文档的说法,技能列表用的是模型上下文窗口的 1%这样一份固定预算,无论再往里加多少技能,都会在那里封顶。它并不会膨胀。真正发生的是“不再被调用”——一旦超出预算,Claude Code 会从调用次数最少的技能开始删掉说明,只留下名字。失去了说明的技能,就再也对不上你的请求。

不会报错。也不会变慢。它只是悄无声息地不再被使用。本文要讲的,就是把这一点也包括在内,如何用数字而不是猜测看清“此刻究竟是什么占着上下文”,以及看清之后先削哪一样。

技能加多了的时候,究竟会发生什么

列表预算固定为上下文窗口的 1%。溢出的部分被削掉的不是 token,而是“说明”

预算之内
全部都带着说明

名字加说明整段载入。即便请求的措辞有些偏差,也能靠关键词被捞出来

刚一溢出
按用得少的顺序丢说明

常用的技能保留全文。从偶尔才用的那些开始失去说明

只剩下名字时
明明存在,却不会被选中

它还留在列表里。但没人说得清它是干什么用的,于是对不上任何请求

来源:Claude Code 官方文档《Skills》

1. 技能不会无限膨胀——列表在 1% 的预算处封顶

为了让 Claude 知道有哪些技能可用,Claude Code 会把技能的名字与说明列成一份清单载入上下文。预算就是在这里开始起作用的。官方文档写道“列表里始终包含所有技能的名字,但技能较多时,Claude Code 会缩短说明,好让它装进列表的字符预算”,并把这份预算定为“模型上下文窗口的 1%”

换成数字就一目了然。如果模型的上下文窗口是 100 万 token,分给技能列表的就是其中的 1%。剩下的 99% 是留给对话、文件和工具结果的。装 50 个技能也好,装 100 个也好,这 1% 纹丝不动。

那么多出来的部分去了哪里?说明被削掉了。官方连削减的顺序都写明了——“列表溢出时,Claude Code 会从调用次数最少的技能开始丢弃说明,让常用的技能保留全文”

这才是实务上最可怕的地方。吃亏的是“偶尔才用的技能”,而它们往往正是“等你忘干净了才需要用的技能”。每季度一次的迁移步骤、一年做几回的发布作业——恰恰是这类东西最先失去说明。

预算是可以改的。在 skillListingBudgetFraction 里写上相对于上下文窗口的比例(例如 0.02 就是 2%),就能给列表加大空间。单条说明也有上限,说明与触发条件合计 1,536 个字符是默认值(可用 skillListingMaxDescChars 更改)。官方之所以建议“把主要用途写在开头”,正是因为超过这个上限,后面的部分会被截断。

2. 测量的工具有三个——各司其职

要停止猜测、改看数字,工具有三个。/context 早就有了,而 /usage 的提示词缓存那一行是 v2.1.251(2026年8月28日)/skill-doctorv2.1.252(8月31日)才加进来的新东西。三者分工不同,都值得记住。

/context
现在装着什么

列出占着窗口的内容明细。Skills 那一行报告的是预算生效之后的大小,因此与模型实际收到的量一致

/usage
它消耗掉了多少

除了本次会话的 token 与费用,还给出提示词缓存的状态,以及按技能、子智能体、MCP 服务器分列的用量

/skill-doctor
哪些技能值回了票价

给出每个技能的成本与被调用的频率,并给一次都没被调用过的打上标记。连从哪里下手删都会指出来

这里是有先后顺序的。先用 /context 看明细,再用 /usage 确认它实际花了多少,最后用 /skill-doctor 锁定要削的候选。反过来做,就成了没有依据地乱删一气。

另外,关于 /context 的 Skills 一行,官方连过去的行为都写了出来——v2.1.196 之前统计的是全部说明的字符数,有时会显示出比所设预算大好几倍的数值。如果你“技能在吃上下文”的印象来自旧记忆,那个数字本身就可能比实情更大

3. 让 Claude Code 点名没人用的技能

/skill-doctor 从 Claude Code v2.1.252(2026年8月31日)起可用。官方的说明是“可以查看每个技能的成本与被调用的频率,据此决定削掉哪些”。它的行为上有 4 点需要先记牢。

/skill-doctor 的前提

  • 在交互式会话里会打开 /plugin 管理器的 Stats 标签页。 加了 -p 的非交互模式则以文本输出
  • 随附技能与组织下发的技能不在范围内。 只列出你自己加的那些
  • 一次都没被调用过的技能会被打上标记,连从哪里删都会显示出来
  • 从手机或浏览器远程操作时无法执行,会返回错误

读结果时只要记住一件事就不会走偏。“一次都没被调用”并不等于“不需要”。如上一节所说,不被调用的原因,有可能是说明被削掉了,因而没人找得到它

删之前,先点名叫一次那个技能最稳妥。点名能用、自动却选不中,那就不是不需要,而是说明输给了预算。对策不是删除,而是重写说明(把主要用途挪到开头),或者调高预算。

4. 比容量更要命的是缓存未命中

从这里开始,话题换到与上下文“大小”不同的另一个轴上。同样大小的对话,缓存有没有起作用,账单会截然不同。

从 Claude Code v2.1.251(2026年8月28日)起,/usage 的会话栏里会出现提示词缓存的一行。官方登载的实例是这样的。

Prompt cache (main):   14 requests · 91% of input tokens from cache ·
2 misses (last 6m 10s ago, 310.2k tokens re-cached) ·
1 expected rebuild (compaction or tool-result clearing) ·
warm (1h TTL, last activity 40s ago)

读法的要点有 3 个。

MISSES
5% 且 2,000 token

本来能从缓存读到的内容,重新读取的量超过这个数,该次请求才算作未命中。小幅替换不会计为未命中

EXPECTED REBUILD
自己弄坏的那部分

因压缩或清除旧的工具结果,Claude Code 自己改写了对话时,不计为未命中,而是作为预期内的重建单独统计

WARM / COLD
在寿命之内还是之外

已缓存的前半部分是否还活着。冷掉的情况下会显示放置了多久

v2.1.260 之后,若对最近的未命中有迹可循,还会把原因一并写出来(例如 likely cause: tool definitions changed)。加了 MCP 服务器、换掉了技能——这类改动会改写靠近对话开头的部分,于是让它后面的全部缓存失效。“动手干活之前先把配置调好”便宜,道理就在这里。

有一点需要注意。这一行看的只是主对话,不包含子智能体。如果你的用法是把重活丢给子智能体,这里的数字就不是全貌。

5. 缓存的寿命未必是 1 小时

这一点直接关系到账单,知道的人却不多。提示词缓存的寿命,会随合约形态与所处情形而变。

订阅
1 小时

中间隔个午休,回来的时候缓存还活着

开始动用额外用量额度之后,或经由 API 密钥与云服务商
5 分钟

只是稍微离开一下就冷了。下一条消息就要把全部上下文重读一遍

来源:Claude Code 官方文档《Manage costs effectively》(缓存寿命的规定)

官方写道“寿命在订阅下是 1 小时,一旦开始动用额外用量额度(usage credits)就降到 5 分钟。经由 API 密钥或云服务商时默认为 5 分钟”触到上限、进入额外额度的那一刻,缓存的寿命就变成了原来的十二分之一——也就是说,“触到上限之后”变的不只是单价,缓存的效果也跟着变了。另外,对于想一边用额外用量额度、一边保住 1 小时寿命的情况,官方给出的办法是自己指定 TTL

6. MCP 默认延迟加载。为什么 CLI 依然更轻

“装了 MCP 服务器就会吃上下文”,如今前提也变了。按官方的说法,MCP 的工具定义默认是延迟加载的,在 Claude 用到某个具体工具之前,进入上下文的只有工具名与服务器的说明

即便如此,官方仍写道ghawsgcloudsentry-cli 这类 CLI 工具在上下文效率上依然更好。理由很干脆,因为 CLI 根本不会追加任何工具列表。Claude 可以直接执行命令,连名字都不必载入。

实务上的结论就出来了。同一件事若用 CLI 也能做到,那么选择 MCP 的理由就该在上下文之外(认证的集中管理、结构化的结果、权限控制等)。“看着好像挺方便就装上了”的服务器,可以用 /mcp 看一遍列表,把它们列为削减候选。

7. 每一轮都必定加载的东西——CLAUDE.md 与对话本身

技能和 MCP 都是有条件才加载的,但有两样东西是无条件每次都加载的

一样是 CLAUDE.md。它在会话开始时被读入上下文,所以写在里面的工作流步骤,在你干着毫不相干的活儿时也一直赖着不走。官方给出的对策是“把针对特定工作流的详细指示挪进技能里”,甚至给出了具体目标——“CLAUDE.md 以 200 行以内为宜,只写要点”。道理是技能只在被调用时才加载,同样的内容便不会变成常驻负担。

另一样是对话本身。官方的说明很到位——“Claude Code 每次请求都会发送整段对话,而 Claude 每用一次工具,就会再发一次带上该工具结果的请求”。所以在开了一整天的会话里问上一行的问题,也会引发整段对话那么多的用量。有缓存在,单价会降下来,但不会归零。

这直接关系到 /clear/compact 的分工。官方写道/compact 会读取要总结的那段对话,因此对大上下文做压缩,本身就是一次很大的请求。如果要的不是接着干而是重新开局,/clear 不花钱”“先压缩一下再说”并不是免费的。该在什么时候按下去,在Claude Code 的 /compact 该定期手动执行吗里有详细讨论。

8. 什么都没做,用量却在往前走

“我只是离开了一会儿,用量却在往前走”——这是有具体原因的,官方也把它们列了出来。它们的形状都是共通的:即便处在空闲状态,也会有新的一轮开始,并把全部上下文发送出去。

空闲时推着用量往前走的东西

  • 定时任务——会话闲着也会按间隔触发,每触发一次就发送全部上下文
  • 来自其他会话的消息——空闲时会作为新的一轮投递过来。把 crossSessionInbound 设为 hold 就能改成暂存
  • 目标进展的确认——等待后台作业期间会起一轮确认。在两次提示之间最多 3 次
  • 智能体团队的每一名成员——在结束之前会一直消耗 token
  • 缓存过期——休息回来的第一条消息要把全部上下文重读一遍

关于智能体团队,官方还给出了具体的倍数。文档写道“智能体团队在成员以计划模式运行时,会用掉约为普通会话 7 倍的 token”。原因是每名成员都持有自己的上下文窗口,因此大致与人数成正比。官方的建议同样干脆:成员用 Sonnet,团队保持小规模,做完就关掉。

作为参照,官方把企业导入时的平均值列为每人每个工作日约 $13、每月 $150 到 $250,并写道90% 的使用者每个工作日不到 $30。如果你自己的数字大幅偏离这个区间,那么上面某一项很可能正在起作用。

9. 测完之后,先削什么

看到数字之后,就按效果从大到小动手。把官方列出的对策,按见效快慢重新排一遍,就是下面这样。

立刻见效、免费
换到不相干的工作时按 /clear

旧的上下文会在此后的每一条消息上继续计费。先 /rename 再清除,之后还能用 /resume 回来

把配置改一次
把 CLAUDE.md 压到 200 行以内

特定作业的步骤挪进技能。常驻加载的东西变少,对所有会话都有效

收窄输出
钩子与子智能体

与其让它读 1 万行日志,不如让钩子只返回相关的那几行。啰嗦的处理关进子智能体那一侧

压低单价
让模型与思考量匹配手上的活

大部分编码用 Sonnet 就够。简单的活儿用 /effort 把思考量调低

顺序是有意义的。第一条今天就见效,而且不花钱。第二条改一次就对所有会话生效。第三条和第四条是配置与习惯的事,见效要花点时间。删技能没有排在前面,是因为如前面几节所见,那里其实很少成为最大的原因。

反过来说,动手之前先测这一条是不会动摇的。官方的 /usage给占最近用量 10% 以上的行为打上标记(上下文过长、缓存未命中等)。删掉没被打标记的东西,体感不会变。

FAQ

Q1. 技能装到几个才算安全?
个数没有上限。真正起作用的是能不能装进列表的字符预算(上下文窗口的 1%)。同样是 10 个,说明写长了就会溢出,写短了就装得下。与其数个数,不如看 /context 的 Skills 一行和 /skill-doctor,那样更准确。

Q2. 一次都没被调用过的技能可以删掉吗?
删之前,请先点名叫一次。点名能用、自动却选不中,那就不是不需要,而是说明输给了预算。这种情况下的对策不是删除,而是重写说明(把主要用途挪到开头)或者调高预算。

Q3. 勤按 /compact 会更省钱吗?
不会。压缩会读取要总结的那段对话,所以在大上下文下它本身就是一次很大的请求。不需要接着干的场合,/clear 更便宜(成本为零),也更可靠。

Q4. 缓存命中率达到多少才算好?
官方没有给出及格线,所以请看变化而不是绝对值。工作方式没变、命中率却掉了下来,那多半是在此之前改了配置(MCP、技能、工具定义)。v2.1.260 之后,这一行会推断并显示原因。

Q5. MCP 服务器应该少装一些吗?
工具定义默认是延迟加载的,所以仅仅放着不用的负担比以前小了。不过,同样的事情如果用 gh 这类 CLI 也能做到,那还是 CLI 更轻(完全不会追加工具列表)。用不上的服务器可以用 /mcp 关掉。

Q6. 用子智能体能省下上下文吗?
能。官方也建议把啰嗦的处理(跑测试、取文档、处理日志)交给子智能体,细节留在它那边的上下文里,只把摘要送回来。不过 /usage 的缓存一行只看主对话,所以在以子智能体为主的用法下,那些数字并不是全貌。

Q7. /skill-doctor 用不了。
需要 Claude Code v2.1.252 以上。另外从手机或浏览器远程操作时无法执行,会返回错误。在交互式会话里它会打开 /plugin 管理器的 Stats 标签页,所以想要文本输出的话,请加上 -p 以非交互模式运行。

出处