結論から言う
Claude Code のコストが高い原因の大半は、キャッシュヒット率の低さにある。キャッシュがヒットすれば同じトークンが1/10の価格になる。ミスすれば10〜20倍のコストがかかる。Anthropic のエンジニアリングブログ「Lessons from building Claude Code: Prompt Caching is Everything」で公開された内容をもとに、実践的な対策をまとめる。
仕組み:プレフィックスマッチング
Claude Code がモデルに送るリクエストは、常に以下の順序で構成される。
システムプロンプト + ツール定義 → プロジェクトドキュメント (CLAUDE.md) → セッションコンテキスト → メッセージ
API はこのシーケンスを先頭から順にキャッシュする。次のリクエスト時に先頭部分が一致していれば、前回の計算結果を再利用する。これがキャッシュヒット。
重要な原則:プレフィックスの1バイトでも変わると、そこ以降のキャッシュはすべて無効化される。
Anthropic の設計思想は「変化頻度が低いものほど前に置く」。システムプロンプトとツール定義はほぼ変わらないので先頭に。CLAUDE.md は時々変わるので中間に。メッセージは毎ターン変わるので末尾に。この構造により、新しいターンは末尾への追記だけで済み、それ以前のキャッシュは維持される。
キャッシュを破壊する4つの操作
1. 会話中のモデル切り替え(最大の影響)
Opus で作業中に /model で Haiku に切り替えて簡単なタスクを処理し、また Opus に戻す——よくある節約のつもりの操作。
実態:キャッシュはモデルに紐づいている。 1回の切り替えで積み上げたキャッシュがすべてゼロになる。再構築コストは、Opus にそのまま答えさせた場合のコストを上回ることが多い。
Anthropic 内部の対処法:メイン会話は1つのモデルで通す。別モデルが必要な場合はサブエージェントを使い、独立したコンテキストとキャッシュで処理させる。
2. セッション中のツール設定変更
MCP ツールの追加・削除・パラメータ変更はすべてキャッシュを破壊する。ツール定義はキャッシュされたプレフィックスの一部だからだ。
Claude Code が未使用のツール定義を残し続けるのはこのため。余分なトークンコストより、キャッシュ無効化のコストの方がはるかに大きい。
Plan Mode も同じ理由で、プランニングモード移行時に実行ツールを削除するのではなく EnterPlanMode/ExitPlanMode という特殊ツールを追加する。ツールセットを変えないことでキャッシュを維持する。
MCP ツールが多い場合、Claude Code は遅延ロードを使う:最初はツール名と1行の説明だけのスタブを読み込み、実際に呼び出しが必要になった時点でフルスキーマを取得する。
3. 頻繁な新規セッション起動
claude を起動するたびにキャッシュはゼロから始まる。「2〜3回質問して終了、また起動」という習慣ではキャッシュの恩恵を受けられない。
4. アカウントの切り替え
キャッシュはアカウントごとに分離されている。複数アカウントをローテーションすると、切り替えのたびにキャッシュがリセットされる。
コスト削減の実践
会話を長く続ける
会話が長くなるほどキャッシュが厚くなり、後半のメッセージが安くなる。不必要に新規セッションを開かない。
コンテキストウィンドウの溢れを心配する必要はない。Claude Code にはCache-Safe Forkingという自動圧縮機能がある。圧縮リクエスト自体が同じシステムプロンプトとツール定義を再利用するため、キャッシュチェーンが維持される。長い会話はコストが上がるのではなく、むしろ下がる。
--resume で前のセッションを継続する
claude --resume
前回のセッションを復元し、キャッシュチェーンを引き継ぐ。再構築コストがかからない。Claude Code で最も見落とされているコスト削減の習慣の一つ。
モデルを途中で切り替えない
別モデルが必要なら、そのタスク専用の別会話を開く。メインセッションのキャッシュチェーンを守ることの方が、安いモデルへの切り替えで得られる節約より価値がある。
MCP ツールはセッション開始前に設定する
セッション中の追加・削除は避ける。
クイックリファレンス
| 操作 | キャッシュへの影響 | コストへの影響 |
|---|---|---|
| 会話中のモデル切り替え | 完全無効化 | 最大20倍 |
| MCP ツールの追加・削除 | 完全無効化 | 10〜20倍 |
| 新規セッション起動 | ゼロから開始 | 最初のターンはフル価格 |
| アカウント切り替え | 完全無効化 | 10〜20倍 |
| 長い継続会話 | 蓄積される | 後半ほど安くなる |
--resume 使用 |
チェーン継続 | ほぼ無料 |
補足:なぜ Anthropic はこれを公開したか
Claude Code のサブスクリプションはメッセージ数ではなくトークン消費量で課金される。キャッシュヒット率が高いユーザーは同じクォータでより多くの作業をこなせる。ヒット率が低いユーザーは数倍の速さでクォータを消費する。
Anthropic がこのブログを書いた理由は明確だ:「クォータが足りないのではなく、使い方が非効率なのだ」というメッセージ。
一つ興味深い実装の詳細がある。Claude Code はシステムプロンプトを変更して状態情報(現在時刻、ファイル変更など)を更新することをしない。代わりに <system-reminder> タグをメッセージ内に挿入する。プロンプトを変更するとキャッシュが壊れるからだ。プロンプトを不変のインフラとして扱い、メッセージを流動的な情報レイヤーとして使う設計になっている。
参考
著者:Jessie(EvoLink)— EvoLink は Claude Desktop 向けのゲートウェイ統合を提供しています: https://docs.evolink.ai/en/integration-guide/claude-desktop