skill 也會吃上下文






如果你看到別人分享的 skill 就都順手安裝起來,久而久之感覺模型表現越來越差,那麼今天介紹的自製工具很適合你。
我在整理 Claude Code、Claude Desktop、Codex 這幾套工具的時候,一直很在意一件事:我們很常把 skill 當成「多裝一個能力」,但很少回頭看它吃掉多少 context window。
所以我做了一個小工具:skill-context-cost。
先跑 doctor,不要先整理
最直接的用法是先跑 doctor:
npx github:dawson54068/skill-context-cost doctor
它會掃你本機常見的 agent 設定檔位置,然後給一份診斷報告。
例如它會看:
- Claude Code 的
~/.claude/skills、專案裡的.claude/skills、plugins - Claude Desktop 的 local agent mode skills
- Codex CLI / desktop 的
~/.codex/skills、專案裡的.codex/skills - Claude Code 會一直載入的
CLAUDE.md - Codex 會一直載入的
AGENTS.md
ChatGPT web 的自訂指令、GPTs、Projects 這類設定是帳號層級;但 ChatGPT desktop 的 Work/Codex 可以讀取你授權的本機資料夾,Codex desktop 的 skill 設定位置也跟 Codex CLI 一致,所以工具應該支援 desktop 一起掃。這版目前先掃 Codex 的 ~/.codex/skills 與專案 .codex/skills,ChatGPT web 只列為限制說明。
跑完以後,它不只告訴你 token 數,還會把問題分級:error、warn、info、ok。
我自己最在意的是 Biggest wins 那段——它會直接列出「先改哪裡最划算」。
為什麼 skill 多了會拖累模型
skill 的設計本來是平常只看簡介、需要時才打開完整說明:平常只讓模型看到 skill 名稱跟 description;真的用到時,才讀完整的 SKILL.md 跟 references。
這個設計很合理。問題是:description 還是會進上下文。
你裝 5 個 skill,可能沒感覺。
你裝 50 個、100 個,或又混了 Claude Code、Claude Desktop、Codex、專案層級 skill、plugin skill,就會開始出現三種成本。
第一個是 startup cost。
也就是你還沒打任何字,模型就先讀了一串「我有哪些 skill、什麼時候該用它們」。這些 token 會佔掉 context window(模型這次對話能同時放在桌面上的資訊空間),也會讓模型一開始就要在更多選項裡判斷。
第二個是 routing cost。
skill 的 description(用途與觸發條件短說明)寫太長、太像教學文章,模型要花更多注意力判斷「現在到底該不該用它」。更糟的是,幾個 skill 如果描述很像,模型可能會選錯,或乾脆不用。
第三個是 invoked cost。
真的觸發 skill 以後,完整 SKILL.md 會被讀進來。如果那份檔案動不動 5,000 tokens 以上,而且很多內容其實只有少數情境才需要,這就不是「裝了能力」,而是把一本手冊整本塞進工作台。
這個工具實際量什麼
skill-context-cost 主要量兩件事。
第一件事:startup cost。
它會估算每個 session 開始時,因為 skill 清單、description、always-loaded file 被放進上下文,大概吃掉多少 token,以及佔 context window 幾%。
第二件事:invoked cost。
它會估算某個 skill 真的被叫起來時,完整 SKILL.md 會再吃掉多少 token。
scan 跟 doctor 差在哪裡
如果你想先看目前的 context 佔用情況,用 scan:
npx github:dawson54068/skill-context-cost scan
scan 會列出 startup cost,也會列出 invoked cost。也就是每次開場先吃掉多少 token、以及某個 skill 被觸發後,完整 SKILL.md 會再吃掉多少 token。
如果你想直接看改善建議,用 doctor:
npx github:dawson54068/skill-context-cost doctor
doctor 會在 scan 的基礎上,再把問題分級成 error、warn、info、ok,並列出 Biggest wins。所以它比較適合拿來決定「先改哪裡最划算」。
我會怎麼整理 skill
我現在會用這個順序看。
第一步,先跑 doctor:
npx github:dawson54068/skill-context-cost doctor
先不要憑感覺砍。很多時候你以為最大的 skill 不一定最值得先改,因為它可能很少被啟動;真正一直扣血的是 description 跟 always-loaded file。
第二步,看 Biggest wins。
如果它說某個 description 太長,我會先把 description 改回兩件事:
- 這個 skill 做什麼
- 什麼時候該用它
其他教學、流程、範例,都移到 SKILL.md body 或 references/*.md。
第三步,看大型 SKILL.md。
如果一份 SKILL.md 已經超過 5,000 tokens,我會問一個很實際的問題:模型每次觸發這個 skill,都真的需要讀完整份嗎?
通常答案是否定的。
比較好的分法是:
SKILL.md放流程骨架跟判斷規則references/*.md放長表格、案例、細節說明- 只有需要時才讓模型讀 reference
第四步,看不需要自動觸發的 skill。
有些 skill 其實只想手動叫,不希望模型自己判斷何時啟動。這種可以設定 disable-model-invocation: true。
README 裡也寫了:這類 skill 不會出現在模型的可選清單裡,所以 startup cost 算 0。
這不是叫你把所有 skill 都關掉,而是把「只有人會明確點名的工具」從自動選單裡拿掉。
目前還沒有發佈到 npm;發佈後才可以用:
npx skill-context-cost scan
npx skill-context-cost doctor
你也可以限定 app:
npx github:dawson54068/skill-context-cost --app claude-code
npx github:dawson54068/skill-context-cost --app claude-code,codex
目前 --app 支援這幾個值:
claude-code, claude-desktop, codex, chatgpt
如果你想看全部:
npx github:dawson54068/skill-context-cost --all
如果要丟給其他腳本處理:
npx github:dawson54068/skill-context-cost --json
Claude tokenizer 沒有公開,所以 Claude 相關數字是估算。README 裡寫得很清楚:誤差大概在 ±10% 內,但相對排名是可靠的。
也就是不要拿 873 tokens 跟 912 tokens 計較;但如果某個 skill 是其他 skill 的 10 倍,那就真的該看。
doctor 會抓哪些問題
doctor 不是只報數字,它會給改善建議。
它會抓的問題包含:
- skill 沒有
description - description 超過 1,024 字元
- startup entry 超過大約 100-token 預算
SKILL.md超過 5,000 tokens,建議移到references/*.md- Codex skill list 超過 8,000 字元上限
- 不同來源有重複 skill 名稱
~/.claude/skills跟~/.codex/skills裡同名 skill 內容不同CLAUDE.md、AGENTS.md這類 always-loaded 檔案太大
我喜歡它把建議分成幾個層級。
有些是錯誤,像 skill 沒 description。這會讓模型不知道何時該載入它。
有些是警告,像 description 太長。它不會讓 skill 失效,但會在每次啟動時都扣一次上下文。
有些只是資訊,像 Claude 跟 Codex 裡同名 skill 內容不一樣。這可能是你刻意分開,也可能是兩份檔案早就不同步了。
context window 不是垃圾桶
現在模型上下文越來越大,很容易讓人鬆懈。
Claude Code 這種環境裡,1M context window 看起來很大;但如果你把全域規則、專案規則、skill description、plugin skill、歷史記憶、工具說明全部堆進去,模型還沒開始工作,就已經背了一堆行李。
更大的上下文不是沒有代價的。
它會影響成本,也會影響注意力分配。模型看到的選項越多,越需要花力氣判斷哪些跟現在的任務有關。
skill-context-cost 做的不是幫你「少裝 skill」。
它比較像 du -sh:以前你知道磁碟會滿,所以會看哪個資料夾最大;現在 context window 也會被吃掉,所以也該知道誰在吃。
一句話總結:skill 是能力,但 description 是每次開場都要付的入場費。
- skill-context-cost:https://gitlab.com/andrew54068/skill-context-cost