同样的活为什么你的额度烧得快:用 /context 和 /skill-doctor 给 agent 瘦身

入门进行中Claude Code今天更新

这篇解决什么问题

同样一个活,为什么有人的额度烧得特别快?原因之一:你给 agent 装的东西,它每次干活都要先读一遍。

agent 每一轮发给模型的,除了你那句 prompt 和聊天历史,还有一块固定的前置内容:你装的规则文件、skill 清单、MCP 工具定义,全在里面。哪怕这一轮一个 skill 都没用到,这些照样发,模型照样得先过一遍。缓存能让这部分便宜一些,但上下文窗口就那么大,它该占多少还是占多少。

更麻烦的是选错工具。有篇论文叫 RAG-MCP 做过实验:把所有工具一股脑列给模型让它自己挑,挑对的只有 13.6%;先筛出相关的几个再给它,挑对的到了 43%。没用的东西堆在上下文里,模型是会变愚钝的。所以下次感觉「降智」,先查一下最近是不是装多了。

这篇给一套四步瘦身流程,全部用 Claude Code 自带的命令,Codex 的等价做法放在最后。我拿自己一个产品仓库跑了一遍,前后数字都在文中。

/skill-doctor 是 Claude Code 2.1.261(2026-09-05)新加的命令,版本低于这个先升级。/context 老版本就有。

前置条件

  • Claude Code 2.1.261 或更高,claude --version 查看
  • 至少装过几个 skill 或 MCP 服务器(没装过的话,这篇暂时用不上)
  • 可选:Codex CLI,用来看最后一节

原理:装的东西分三种,占上下文的方式不一样

类型举例进上下文的方式每轮大概多少
规则文件CLAUDE.md、~/.claude/rules/*.md、Codex 的 AGENTS.md、Cursor 勾了「总是应用」的规则整篇进系统提示,每轮都发看你写了多少,几百到上万 token
skill一个文件夹加一个 SKILL.md 说明书常驻的只有一行:名字加一句说明;正文等模型判断这轮用得上才读官方数字每个约 100 token
MCP 工具浏览器、抓包、数据库这类外部接口每个工具的名字、说明、参数表整个进系统提示一个工具几百 token,一个服务器几十个工具

三种里 MCP 最贵。我本机接的一个抓包工具,69 个工具,一万六千多 token;一个浏览器工具,29 个工具,九千多 token。这还只是定义,一次都没调用,它们就已经在里面了。Claude Code 现在把 MCP 工具定义做了延迟加载,/context 里会标成 MCP tools (deferred),但少接才是根本。

skill 那一行说明也不是白占的。Codex 给 skill 清单封了顶:最多占上下文的 2% 或 8,000 字符,超了先把说明截短,再截不下就直接不列。而这句说明,是模型判断要不要启用这个 skill 的唯一依据。砍掉一半,它就认不出该用的时候,装了等于没装。

第一步:跑 /context,看 token 花在哪

在项目目录里打开 Claude Code,直接敲:

text
/context

它会先给一张分类表,再逐项列出每个 MCP 工具、每个记忆文件、每个 skill 各占多少。我在 zixungou 产品仓库里跑出来的分类表:

text
| Category               | Tokens | Percentage |
|------------------------|--------|------------|
| System prompt          | 4.3k   | 0.4%       |
| System tools           | 15.2k  | 1.5%       |
| MCP tools (deferred)   | 39.6k  | 4.0%       |
| System tools (deferred)| 13.3k  | 1.3%       |
| Memory files           | 10.6k  | 1.1%       |
| Skills                 | 7.2k   | 0.7%       |
| Messages               | 1.9k   | 0.2%       |

往下翻明细,重点盯三类问题:

放错地方的规则。 我的 Memory files 里有两个文件是写短视频内容用的规则(各 1.3k),因为放在用户级规则目录,在产品仓库里每一轮也被读。这就是用不上的规则。

重复接的 MCP。 同一个 Chrome 工具,全局接了一份,项目里又接了一份,明细里能看到两组几乎一样的工具名,29 个工具、9 千多 token 浪费了两次:

text
| mcp__chrome__click            | chrome          | 257 |
| ...                           |                 |     |
| mcp__chrome-devtools__click   | chrome-devtools | 261 |

一次都没调过的大件。 抓包工具 69 个工具 16.8k,这个项目根本不抓包。

把这三类各记下来,第三步处理。

第二步:跑 /skill-doctor,找出没用过的 skill

text
/skill-doctor

它列出这个会话载入的所有 skill,每行五列:来源、常驻占用、近 7 天消耗、调用次数、上次使用时间,按上次使用从远到近排。我这个仓库的结果:58 个 skill 载入,其中 11 个从来没调用过,12 个一个多月没碰。表尾直接给结论:

text
9 skills loaded but never invoked. Each one adds to the system prompt every turn.
Disable in /skills, or remove from .claude/skills.
1 plugin skill loaded but never invoked, from andrej-karpathy-skills.
Plugin skills can't be turned off individually — disable the plugin in /plugin.

看几行明细就知道该留什么:

text
skill                       source          context  7d tokens   uses  last used
figma                       userSettings       ~140          -     0×  never
tech-article-pipeline       userSettings       ~150          -     0×  never
superpowers:brainstorming   superpowers         ~80       9.7m   105×  1 day
koubo-script                userSettings        ~40       9.3m    52×  today

真常用的集中在七八个。那 11 个从没用过的,每一轮白占一千多 token。

第三步:按三类分别处理

skill:一个月没用的挪走

如果你的 skill 是按「统一源目录加软链」管的(站内有一篇专门讲这个),删就是把软链挪走,要用再链回来:

bash
mkdir -p ~/.ai/skills-parked
# 把 skill-doctor 里 never 和超过 30 天的挨个挪
mv ~/.claude/skills/figma ~/.ai/skills-parked/
mv ~/.claude/skills/tech-article-pipeline ~/.ai/skills-parked/

不想动文件的,在 Claude Code 里敲 /skills,把不用的关掉,效果一样。插件带来的 skill 关不了单个,要在 /plugin 里停整个插件。

别按「以后可能用得上」留。skill 的正文本来就是触发才读,你留着它换来的只是清单里那一行,而那一行每轮都在发。真要用的时候链回来是一条命令的事。

规则文件:全局只留每个项目都必须遵守的

规则文件是整篇进上下文的,最该省。三条:

  • 用户级规则目录 ~/.claude/rules/ 和全局 CLAUDE.md 里,只留所有项目都要守的东西。我从 7 个砍到 4 个,后来砍到 2 个:git 工作流和安全红线。
  • 只在某类项目用的规则,挪到那个项目的 .claude/rules/ 或项目 CLAUDE.md。
  • 内容长、但不是每轮都要看的(比如某个工具的用法、某类文章的写法),改写成 skill。skill 常驻只有一行,正文按需读,这就是 skill 和规则文件的分工。

改完用 wc -c 看一眼全局规则的总量,中文大概 1.5 个字符一个 token,心里有个数。

MCP:按项目开关,全局和项目别重复

先看现在接了什么、各在哪一层:

bash
claude mcp list

Claude Code 的 MCP 有三层作用域:user(全局,所有项目都加载,存在 ~/.claude.json)、project(写在仓库的 .mcp.json,跟仓库走)、local(只在这台机器的这个项目,也存在 ~/.claude.json)。重复接的那份,删掉全局那一层,只留项目:

bash
claude mcp remove chrome-devtools -s user

这个项目用不上的大件(我这里是抓包工具),同样从全局摘掉,需要它的项目单独在 .mcp.json 里接。原则是:全局只放每个项目都会用的,其他都下沉到项目。延迟加载是兜底,少接才是根本。

第四步:再跑一次 /context,对差值

三类处理完,新开一个会话(配置改动要重启会话才生效),再跑一次 /context。我的前后对比:

分类处理前处理后动了什么
Memory files(规则块)10.6k3.9k两个短视频规则挪出全局
Skills7.2k6.4k挪走 never 和超期的
MCP tools (deferred)39.6k38k摘掉重复的 Chrome

前后两次要同一天跑。/context 的数字是估算的,同一个工具隔天会漂几十到上百 token(我看到一个工具从 695 变成 880)。隔天对比,差值里混着漂移,看不出你到底省了多少。

这一步做完顺手定个节奏:每个月跑一次,新开一个项目的时候跑一次。

Codex 怎么做

Codex 没有 /context 这种命令,但有个调试命令(官方标为实验性)能把发给模型的前置内容整个导出来:

bash
codex debug prompt-input > prompt-input.json

导出的是 JSON,skill 清单在 <skills_instructions> 那一段。我在同一个仓库里导出来看:前置内容约 3.5 万字符,其中 skill 清单 136 条、2.5 万字符,约 7 千 token,每轮都发。更要紧的是 136 条里 133 条的说明被截到半个词,就是前面说的 2% 封顶。这时候模型已经认不全该用哪个 skill 了,再多装几个,Codex 会直接把一部分从清单里拿掉并给出警告。

处理思路和 Claude Code 一样:skill 挪走没用的,AGENTS.md 只留必须的。Codex 会把全局 AGENTS.md 和项目里的拼成一份一起发,默认上限 32 KiB,中文大概一万字,超了会被截。改完再导一次对比字符数。

常见问题

skill 挪走了,用到的时候怎么办? 链回来或者从 parked 目录挪回来,一条命令。skill-doctor 的表会告诉你哪些是真常用的,那些永远不用动。

规则文件改成 skill 之后,模型会不会该用的时候不用? 会有这个风险,所以 skill 的 description 要写清楚触发条件。这一行是模型判断要不要读正文的唯一依据,写得含糊它就不触发。反过来,每轮都必须遵守的东西(比如「提交前跑测试」)不要做成 skill,就留在规则文件里。

MCP 工具延迟加载了,是不是就不用管了? 延迟加载省的是每轮发送的定义,但工具的名字和一句说明还在清单里,工具越多模型挑错的概率越高,这是 RAG-MCP 那个实验说明的事。少接才是根本。

/context 里的 Messages 才 1.9k,为什么我一会儿就 30%? 这篇讲的是固定前置部分,聊天历史才是大头。会话越长历史越长,那是另一个问题,站内「200K 上下文怎么花」那篇讲的是那一块。

同样的活为什么你的额度烧得快:用 /context 和 /skill-doctor 给 agent 瘦身 | 资讯狗 | Zixungou