Claude Code Token 砍 43% 實測:能省的前提是先量得到

重點摘要

  • 改 3 天對話習慣,實測每則回應平均 context 從 327K → 147K tokens,cache_read 從 313K → 140K,換算 API 成本 每則 $0.81 → $0.46,降 43%
  • 省 token 的真正大局不是「省幾個 token」,是 哪種工作走哪個通道:公開走訂閱、公司資料走 Azure Foundry、機敏走本地;從零開發原型用訂閱、串真資料才切——切換點是資料事件,不是階段名。
  • 底層功夫:context 是每輪重算的乘數,長 context 又貴又笨(準確率掉 13.9–85%);同事續用 /compact、換事用 /clear、怕忘的寫進檔案。API 端認真做 prompt caching、按模型選對 tier(快取門檻不按貴賤排)。
  • 讓我真的把用量砍半的,不是原理,是一支默默記帳的 hook 讓成本變可見——能省的前提是先量得到
  • 而那套「強迫記筆記」的腦子紀律 hook,成本只占每輪 0.36%,卻是防止重踩坑的不對稱投資——花得超值。

這篇是我把「Claude 怎麼用才划算」整套想法收成的一篇長文:從實測數據(省了多少、省在哪)、到分流大局(訂閱 / API / Foundry / 本地怎麼選)、到底層功夫(context 乘數、cache_read、compact/clear、API 算錢與快取),最後拆解我用一整套 Claude Code hook 把這些紀律自動化的設計。所有定價與快取數字都以官方資料核對過。

先講最反直覺的起點:我知道「長對話又貴又笨」這個原理超過一個月,但用量一直降不下來。真正讓它砍半的,不是又讀一篇原理,而是一支只負責「記帳」的 hook——它什麼都不強迫,只是讓我每天看得到自己的 context 有多肥。能管理的前提是能量測,這句老話在 token 上完全成立。我們就從那個被量出來的數字開始。

實測:三天習慣改變,省了多少?

資料來源是 Claude Code transcript 裡每則 assistant 回應的 message.usage——這是真實計費欄位,不是估算。我把「改習慣前 7 天(6/18–6/24)」對比「改習慣後 3 天(6/25–6/27)」,並正規化到「每則回應」,排除「那幾天剛好做比較多事」的干擾,單純看習慣的效果。

每則回應平均 改習慣前 (6/18–24) 改習慣後 (6/25–27) 變化
context 大小 327K tokens 147K tokens ↓ 55%
cache_read(長對話最大成本源) 313K tokens 140K tokens ↓ 55%
換算 API 成本(Opus 4.8 估價) $0.81 / 則 $0.46 / 則 ↓ 43%
fat%(context > 300K 的回應佔比) 43% 10% ↓ 3/4
max_cr(單一對話衝到的最大 context) 999K(貼著 1M 上限) 522K 不再撞頂

換成美金是多少?訂閱戶省的是另一種東西

每則省 $0.34 美金(API 等值)。以我最近的實際節奏(約 1,150 則回應/天)推算:每天約 $390、一個月約 $11,000 美金等值。但這裡要誠實:我是訂閱戶,不是按 token 付費,不會真的有一張「省了 $11,000」的帳單。這個數字的正確讀法是:

你走哪個通道 省 token 實際省到什麼
訂閱 (Max / Team) 省的是額度與速率上限——同樣月費能多撐近一倍工作量,更不容易撞 rate limit 被迫停手
API / Foundry 省的是真金白銀——那 43% 直接從帳單上消失
兩者皆是 省的是智商——context 短一半,模型不掉進 context rot,判斷更準

為什麼長對話又貴又笨:context 是乘數,cache_read 是帳單

上面那欄 cache_read 是理解整件事的鑰匙。Context(對話視窗)不是只算一次,而是每一輪都重算一次。我在對話早期讀進一個 2,000 行的檔,那 2,000 行接下來每一輪都重新帶著計費——這個「重讀歷史」的量,在帳單上的名字就叫 cache_read。所以「在對話早期讀一個大檔」會污染後面整段對話的成本。我改習慣前,平均每則回應拖著 313K tokens 的歷史在重讀;最肥時單一對話衝到 999K(貼著 100 萬 token 上限),等於每講一句話都要重付近百萬 token 的「閱讀費」。

更關鍵的是:長 context 不只貴,還會讓模型變笨。Chroma 對 18 個前沿模型(含 Claude Opus 4、GPT-4.1、Gemini 2.5)的實測顯示,每一個都隨輸入變長而退化——即使「需要的資訊 100% 在 context 裡」,準確率仍隨長度掉 13.9% 到 85%。這叫 context rot。所以省 token 同時是讓模型保持聰明。另外兩個失效模式:lost in the middle(關鍵埋中段準確率掉 30%+,重要指令放開頭、當前問題放最後)、context poisoning(混進一個幻覺會被當前提複製,該截斷到污染點之前重啟)。

三個動作:繼續、compact、clear 怎麼選

動作 對之前對話做了什麼 能否接著聊同一件事
繼續聊 全部逐字帶著 能,但越疊越大、越慢、越貴、越笨
/compact 壓縮 換成一份摘要(有損,細節掉、重點留) 能,thread 不斷
/clear 清除 全部丟掉(只剩 CLAUDE.md、auto memory 重載) 不能,這次記憶歸零

原則:同一件事還要繼續且馬上繼續,用 compact;要停一陣、換事、或 context 已經很肥,先寫筆記再 clear。我那 43% 的省下,核心就是把「繼續聊到 999K」這個壞習慣,換成勤 clear。

5 層記憶模型:Note 與 Brain 是兩條垂直的軸

clear 之所以敢用,是因為「該留的」不靠 context 留,而靠下面這套外接記憶。把記憶拆成五層,各管各的存活週期:

存什麼 活多久 / 何時載入
Context 這次對話的一切 clear 就沒;每輪都在、每輪算錢
Note 接手筆記 做到哪、下一步 任務做完即丟;叫它讀才讀
MEMORY.md 你是誰、偏好、專案狀態 跨所有對話;每次開對話自動載
Brain 腦子檔 踩過的坑 + 領域知識 永久跨專案;宣告 Domain Brain 才載
Skill 正確做法的模板 永久;用到才呼叫

最容易混淆的是 Note 跟 Brain,它們是兩條互相垂直的軸:Note 答「這次做到哪」(短期、綁任務、會過期);Brain 答「這類事怎麼做才不踩坑」(永久、跨專案)。clear 時 Note 把工作進度帶過去、Brain 把教訓帶過去——不是二選一,兩個都寫但寫不同東西,一個搬狀態、一個搬智慧。這也是後面那套 hook 存在的全部理由:確保「經驗 → Brain」這條路徑不會因為健忘而斷掉。

Context × Loop:乘數效應在迴圈裡會放大

/loop 或排程反覆跑時,單輪成本是「context 大小 × 1」,但帶著肥大 context 的迴圈是「context 大小 × 迭代次數」。所以每一輪開始前把 context 收乾淨,比一路累積更省也更準:每次迭代讀回精簡狀態檔(Note)→ 做這一輪 → 寫回狀態檔 → 收掉工作 context。狀態活在檔案裡,活躍 context 保持小而新鮮,這就是 long-running agent 能跑幾十輪不退化的關鍵。同理,像 ccbot 那種「review → triage → 逐條修」一次幾十條 finding 的流程,該被當成一個「UI 工具」逐條決策,而不是用來長壓 context 的容器——一個 finding 就是一個任務邊界,分批做、批次之間 clear。

分流:哪種工作走哪個通道(比省 token 更上層)

講完「進了通道怎麼省」,要往上拉一層:很多人把「用 AI 怎麼划算」想成「省 token」,其實真正的重點在更上層——哪種工作該走哪個通道。把通道分對、把資料分流對,比你在單一通道裡省那幾個 token 重要太多。

第一件要釐清的事:「訂閱 vs API」不是「機密與否」的軸。訂閱和 API 都是把資料送到 Anthropic 雲端,差別是計費方式與資料條款,不是「資料會不會外洩」。真正的機密分流靠第三、第四個選項。先把三條軸分開:

  • 機密軸:本地 ↔ 雲端。決定資料能不能離開公司。
  • 信任邊界軸:Anthropic 自己的雲 ↔ 你既有的雲(Azure/AWS/GCP)。Foundry 讓資料留在公司已核准的 Azure 邊界。
  • 計費 + 模式軸:訂閱(互動、固定費)↔ API(程式化、按量、商用條款)。
資料類型 走哪 為什麼
公開 / 不重要 訂閱 便宜;公開資料不怕被拿去訓練
內部但機密(已在 Azure) Azure Foundry(或商用 API) 留 Azure 邊界、預設不訓練、可開 ZDR
機敏 / 涉密 / 不確定 本地 / 地端 LLM 絕不上雲;default-deny,不確定就當機敏

為什麼公司資料走 Foundry 是最佳解?因為信任邊界早就跨過了。如果你的 code 已經在 Azure DevOps、公司也接受 Azure Foundry,那走 Foundry 的 Claude 是留在同一個 Azure 邊界裡推論,不是再送到 Anthropic 自己的雲——邊際的資料暴露趨近於零,還複用你早就過關的 Azure 合約。(注意:Foundry 是功能子集,不支援 Anthropic 的 Managed Agents 與 server 端工具,純 code 生成 / 對話 / 一般 tool use 沒問題。)

切換規則:只要問 2 個問題

① 碰到「公司機密 / 內部資料 / code」嗎?
否(公開 / 通用) → 訂閱
是 → ② 真機敏 or 不確定?
  否(內部但可上 Azure) → Foundry
  是 → 假資料混合 / 本地

預設是訂閱(互動 + 公開),只有「踩到公司資料」或「要自動化」才翻到 Foundry / API。重點:這是按任務類型路由,不是每句話狂切——你開一個工作時就決定走哪條,不會中途換。

公司用的「訂閱」是商用方案,不是員工個人帳號

處理公司的東西,要用「公司開的商用訂閱」(Team / Enterprise),不是員工個人的消費級 Pro / Max。這跟資料機不機密是兩道分開的閘——就算沒機敏問題,帳戶條款與治理仍是另一關。

帳戶 處理公司(非機敏)事 為什麼
員工個人 Pro / Max(消費級) ⚠️ 不建議 消費級條款,資料預設可能被訓練;無 DPA;公司無管控/稽核;綁個人帳號,離職即失去
公司開的 Team / Enterprise ✅ 可以 商用條款、不訓練、有 DPA、admin 管控、帳號歸公司
公司 API / Azure Foundry ✅ 可以 商用條款、可自動化;Foundry 還能留 Azure 邊界

從零開發:原型用訂閱,串真資料才切 Foundry

把原理套到「從零開發一個東西」的生命週期,就是最實用的一招:原型階段沒有任何公司資料,用訂閱快速迭代;等要串接真實公司資料,才切到 Foundry。但切換點不是「原型做完了」這種階段標籤,而是一個具體的資料事件:第一次「真公司資料 / 真 schema / 真憑證 / 真專有邏輯」要進 prompt 的那一刻——在這之前,即使在寫串接用的 code,只要餵的是假資料 / mock / 通用結構,就還能留在訂閱

真機敏值要產出時,用假資料混合法:① 在自己這端把機敏欄位換成假資料 / 佔位符;② 把「假資料版」丟給雲端 LLM 產出結構、內容、框架;③ 在自己這端把真值 find-replace 換回佔位符。關鍵是佔位符要一致、可一鍵全域取代(用穩定命名如 [公司名]{{2025_範疇一排放量}})。程式碼也適用:含活憑證(API key、DB 密碼、內部 endpoint)的檔案一律先抽掉再送

API / Foundry 端怎麼算成本(含程式範例)

走 API / Foundry 時 token 直接是帳單,值得認真算。先講怎麼量——不要用 tiktoken(那是 OpenAI 的 tokenizer,對 Claude 會低估 15–20%)。用官方 count_tokens:

from anthropic import Anthropic
client = Anthropic()
resp = client.messages.count_tokens(
    model="claude-opus-4-8",
    messages=[{"role": "user", "content": open("CLAUDE.md").read()}],
)
print(resp.input_tokens)

成本公式:(input ÷ 1,000,000 × input 單價) + (output ÷ 1,000,000 × output 單價)。加上 prompt caching(同一大前綴重複用):讀取只要基礎 input 價約 0.1 倍,寫入 1.25 倍(5 分鐘)或 2 倍(1 小時)。同樣 50K 前綴重複 10 次:不快取 $2.50,有快取 ≈ $0.54,省約 78%

response = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=4096,
    system=[{
        "type": "text",
        "text": LARGE_STABLE_CONTEXT,        # 穩定的大前綴
        "cache_control": {"type": "ephemeral"},
    }],
    messages=[{"role": "user", "content": user_question}],  # 變動內容放後面
)
print(response.usage.cache_read_input_tokens)  # 驗證命中;一直是 0 = 前綴被污染

快取是前綴完全比對,差一個字元就全 miss——常見元兇:datetime.now()、UUID、沒排序的 json.dumps()、或工具清單變動(工具一改整個快取全滅)。非即時的批量工作可走 Batches API,直接半價

各模型定價與快取門檻(官方數字)

模型 Input $/1M Output $/1M 適合的活
Fable 5 $10 $50 最難的長程推理 / agentic
Opus 4.8 $5 $25 架構決策、複雜推理、跨檔案邏輯
Sonnet 4.6 $3 $15 CRUD、API 對接、測試、文件
Haiku 4.5 $1 $5 檔案掃描、目錄盤點、簡單搜尋

「最低可快取前綴」門檻各模型不同,而且不按貴賤排——這點最反直覺:

模型 最低可快取前綴
Opus 4.8 / Haiku 4.5 4,096 tokens
Sonnet 4.6 / Fable 5 2,048 tokens

具體後果:同樣一段 3,000 token 的前綴,在 Sonnet 4.6 與 Fable 5 快取得起來,在 Opus 4.8 與 Haiku 4.5 卻會靜默不快取——你不會收到錯誤,只會發現帳單沒省到。用 Haiku 做大量小請求時,若前綴不到 4,096,拿不到任何 cache 折扣。門檻不按貴賤排,別憑感覺假設;不同模型 tokenizer 也不同,跨模型估成本一定要用該模型自己的 count_tokens 重算。

省過頭反而害事:三個要避免的過度優化

  • 壓縮砍太狠:摘要寧可先求高 recall(多留)再慢慢收。一開始壓很乾,會砍掉日後才變關鍵的細節,逼出更多來回反而更貴。
  • 為省而硬拆多輪:研究顯示同一 prompt 拆成多輪累積,品質掉 39%(context clash)。該一次講清的別硬切。
  • 濫用子代理:多代理約用 15 倍 token。廣度研究、檔案掃描很划算;緊耦合、要共享上下文的事用子代理反而又貴又糊。判準:任務價值 > token 成本才划算。

我那一整套 Hook 在做什麼:逐一拆給你看

上面講的都是「該怎麼做」,但人(包括用 AI 的我)會偷懶、會忘。所以我把這些紀律用 Claude Code 的 hook 自動化。hook 機制很單純:特定事件發生時,Claude Code 把一包 JSON 從 stdin 餵給腳本;腳本可以回傳 additionalContext 改變 AI 下一步(會花 token,等於往對話塞字)、回傳 systemMessage 把訊息秀給我看(不進 AI,不花 token)、或什麼都不回只在背後做事(記 log、發通知)。我目前掛 8 支:

Hook(觸發時機) 做什麼 分類
token-log.py(Stop) 算本輪真實 token 增量,寫 log + systemMessage 秀給我看 可觀測性
fix-detect.sh(PostToolUse) 偵測 fix: commit,注入「去更新 brain,不准做下一件事」 知識紀律
precompact.sh(PreCompact) 壓縮前掃最近 5 commit,提醒「brain 寫了嗎」 知識紀律
stop-check.sh(Stop) 比對今天 fix: commit vs brain 修改時間,有修沒記就警告 知識紀律
session-start.sh(SessionStart) touch 時間戳基準線,給 stop-check 比對 知識紀律(輔助)
walsin-driver-anchor.sh(SessionStart) 特定專案注入「身份錨定」,防 /compact 後角色崩潰 知識紀律
claude-notify(Stop / Notification) 發 Telegram 通知到手機(完成 / 需要我) 人機介面
ccbot(SessionStart) Telegram 機器人整合,用手機遠端驅動 Claude Code 人機介面

三道知識紀律關卡(fix-detect / precompact / stop-check)不是各自獨立,而是沿著「一條教訓從產生到消失」的時間軸,各對應一個偷懶藉口:修完當下「等下再寫」被 fix-detect 擋下、壓縮前「忘了還沒寫」被 precompact 救回、session 結束「這次算了吧」被 stop-check 抓出。而 stop-check 怎麼知道有沒有動過 brain?用一個無資料庫的巧招:session-start 時 touch 一根時間戳,結束時 find -newer 數出比基準線新的 brain 檔有幾個——0 個就警告。這套機制的完整設計我在 《讓 AI 不再失憶:用 Claude Code Hooks 打造大腦反饋迴路》 有更深的拆解。

真正的因果鏈:能省的前提是「量得到」

注意上表唯一被標成「可觀測性」綠色的那支:token-log.py。它在每輪結束時從 transcript 算出真實 token 增量,寫 log 並用 systemMessage 把數字秀在我眼前。它不阻止、不命令,只是讓「我的對話有多肥」從不可見變可見。配上一支自查腳本(我包成 token-health skill),我每天能看到兩個關鍵指標:fat%(多少比例的回應拖著 > 300K 的肥 context)與 max_cr(單一對話衝到多大)。

真正改變行為的瞬間,是我看到那行 max_cr = 999K 的時候——原來我有好幾天都把對話養到貼著 100 萬 token 上限。看到數字才會痛,痛了才會改。改法就是前面講過的老招:同一件事用 /compact,換事或太肥就先寫筆記再 /clear原理我老早就知道,但知道和做到之間,差的就是這支把數字攤在臉上的 hook。

反饋迴路(對「自己」的量測,不是對 AI 的紀律)
token-log.py 每輪記帳 → 數字落地成 log
② token-health 自查 → 看見 fat% / max_cr
③ 看到 max_cr=999K → 被嚇到
④ 勤 /clear、不養肥對話 → context 砍半,省 43%

那些紀律 Hook 花多少 token?0.36%,而且超值

會注入 context 的紀律 hook(fix-detect / precompact / driver-anchor)本身是花 token 的。花多少?我把每支注入的字串實際抓出來估 token,以改習慣後每輪平均 context(約 147K)為分母:

Hook 一次注入 占一輪比重 多久觸發
driver-anchor ~308 tok 0.21% 限特定專案,每次開 session
fix-detect ~135 tok 0.09% 只在 fix: commit 後
precompact ~84 tok 0.06% /compact 前(下一步就被壓掉,近乎 0)
stop-check 0 tok 0% systemMessage,只給人看
全部加總(上限) ~527 tok 0.36% 假設全部同時觸發的最壞情況

乘數效應不放大比重:注入是「固定重量」,driver-anchor 騎完整場 session,不管 10 輪還是 30 輪都占每輪 0.21%。跟省下來的放一起看才知道量級差多少:改習慣每輪省約 180,000 tokens,全部注入型 hook 每輪最多花約 527 tokens——比例 1 : 342

但這筆 token 不是「成本」,是不對稱投資

講到這裡要修正一個容易被誤導的框架:把這些紀律 hook 當成「要控制的成本」是錯的。對記帳 hook 而言,「能用事後讀 log 解決的就別事中注入」是對的;但對腦子紀律 hook 而言,那個注入不是副作用,就是本體——你沒辦法用「事後讀 log」逼自己更新 brain,唯一有效的就是在當下、在 context 裡擋你一下。它們存在的必要,是強化我的腦子系統,而那套腦子系統會在關鍵時刻——查一個難纏的 bug、確認整個系統的完整度——讓我不重踩已知的坑。這點價值,遠遠蓋過那 0.36%。

用會回本的方式算這筆帳:這是一個極度不對稱的賭注

量級 說明
成本側(每月) ~30K tokens 腦子紀律 hook 全部注入加總,≈ 改習慣後 0.2 輪對話
報酬側(一次) 50K–200K+ tokens 重新 debug 一個 brain 早記過的雷:重讀檔案+探索+試錯,輕鬆燒掉這麼多

而且這件事我們有實測佐證:context 是在哪幾天衝到 999K 的?就是 debug 的時候。重 debug 本身就是 context 爆炸、模型變笨的重災區。所以一個月只要 brain 救你一次,就回本還倒賺;救第二次以後全是淨賺。這還沒算「系統完整度」「不在關鍵時刻漏掉已知陷阱」這種沒法用 token 標價的價值——那才是你真正在買的東西。那 0.36% 不是要忍受的稅,是近乎免費的保險費

一句話心法

先分流,再省 token,而省 token 的前提是量得到。哪種工作走哪個通道才是大局(公開走訂閱、公司資料走 Foundry、機敏走本地);通道分對之後,底層才講 context 是每輪重算的乘數、長 context 又貴又笨、同事續用 compact、換事用 clear、API 端認真做快取。但讓行為真的改變的不是又讀一篇原理,是一支把每輪成本攤在你眼前的記帳 hook——原理給你方向,量測給你動機。至於那套強迫記筆記的腦子紀律 hook,只花 0.36%,換來的是不重踩坑——記帳教你別浪費,腦子教你別重犯,兩個都該留。

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *