AIコーディング 2026.05.13

Claude Codeトークン消費を22〜45%削減する5つの方法【2026年版】実測コード付き

タグ:Claude / コスト削減 / プロンプト最適化 / 開発効率

コンテキスト肥大化の主な原因

問題のあるパターン:
1. バグ修正に1,000行のファイル全体を貼り付け → 5,000トークン消費
2. リポジトリ全体を自動読み込み → node_modules含む数十万トークン
3. 50往復のセッションを継続 → 履歴が毎回コンテキストに
4. システムプロンプトを毎回送信 → キャッシュなしで重複課金

実際の削減効果:
  削減前: 1質問あたり平均8,000トークン → 月$18.00(Sonnetで日100質問)
  削減後: 1質問あたり平均4,400トークン → 月$9.90(同条件)
  削減率: 45%、月額節約: $8.10

技法1: 関連部分だけを渡す

# ❌ NG: ファイル全体を貼り付け
cat src/utils/payment.ts  # 1,000行 → 5,000トークン

# ✅ OK: 関連関数だけを抽出
sed -n '150,180p' src/utils/payment.ts  # 30行 → 200トークン

# ✅ Better: バグのある行前後だけを表示
grep -n "calculateTax" src/utils/payment.ts  # 行番号確認
awk 'NR>=155 && NR<=175' src/utils/payment.ts  # その前後20行だけ

技法2: .claudeignoreで自動除外

# .claudeignore
# ← プロジェクトルートに置く

node_modules/
.git/
dist/
build/
*.log
*.lock
coverage/
.env
*.min.js
__pycache__/
*.pyc

効果: node_modules/ だけで数万〜数十万トークン削減。

技法3: Prompt Cachingでシステムプロンプトを再利用

# cached_claude.py
# 同じコードベースの説明を毎回送る場合はキャッシュを使う(90%オフ)

import anthropic

client = anthropic.Anthropic()

CODEBASE_SUMMARY = """
## プロジェクト概要
- Next.js 15 + TypeScript + Prisma + PostgreSQL
- 認証: Auth.js v5
- デプロイ: Vercel + Neon DB
- テスト: Vitest + Playwright

## ディレクトリ構成
src/
  app/          # App Router pages
  components/   # React components
  lib/          # Utilities and helpers
  server/       # Server Actions

## 重要なルール
- サーバーコンポーネントをデフォルトに
- "use client" はイベントハンドラが必要な場合のみ
- 全入力はZodでバリデーション
"""

def ask_claude_cached(question: str) -> str:
    """コードベース説明をキャッシュして質問コストを削減"""
    response = client.messages.create(
        model="claude-sonnet-4-5",
        max_tokens=2048,
        system=[
            {
                "type": "text",
                "text": CODEBASE_SUMMARY,
                "cache_control": {"type": "ephemeral"}  # ← キャッシュ有効化
            }
        ],
        messages=[{"role": "user", "content": question}]
    )
    
    usage = response.usage
    cache_read = getattr(usage, "cache_read_input_tokens", 0)
    savings = cache_read * 0.9  # キャッシュ読み込みは90%オフ
    print(f"キャッシュ節約: {cache_read}トークン({savings:.0f}トークン分相当のコスト削減)")
    
    return response.content[0].text

# 2回目以降はCODEBASE_SUMMARYのキャッシュが効く
answer1 = ask_claude_cached("Prismaでユーザーを取得するServer Actionを書いて")
answer2 = ask_claude_cached("Zodでメールアドレスを検証するスキーマを書いて")  # キャッシュ適用

技法4: CLAUDE.mdでコンテキスト管理のルール化

<!-- CLAUDE.md -->
## コンテキスト節約ルール

### ファイル読み込み
- ファイル全体ではなく該当関数のみを読む
- バグ修正: 問題のある行 ±15行を対象とする
- 新機能: 関連するファイルのimport部分と型定義だけ先に確認

### セッション管理
- 長いセッション(50往復超え)は新セッションで開始
- 新セッション冒頭: 「前提: [2〜3行の要約]」を最初に伝える

### 禁止事項
- node_modules/ を読み込まない
- *.lock ファイルを参照しない

技法5: セッション要約で履歴を圧縮

# session_compressor.py
# 長いセッションを要約して新セッションに引き継ぐ

def compress_session(session_messages: list[dict]) -> str:
    """会話履歴を3行に圧縮する"""
    full_text = "\n".join(
        f"{'User' if m['role'] == 'user' else 'Claude'}: {m['content'][:500]}"
        for m in session_messages[-20:]  # 直近20往復
    )
    
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # 要約は安いモデルで
        max_tokens=300,
        messages=[{"role": "user", "content": f"""
以下の会話を3行以内で要約してください:
- 作業していた機能/バグ
- 決定した実装方針
- 未解決の課題

会話:
{full_text}"""}]
    )
    return response.content[0].text

# 使用方法
summary = compress_session(old_session_messages)
# 新セッションでは: 「前提: [summary]」を最初に送るだけ

あわせて読みたい

参考ソース