Claude Code:トークンの85%を無駄にしていた真犯人と対策

Claude Code:トークンの85%を無駄にしていた真犯人と対策 AI

Claude Codeを使っていて、すぐに使用制限に達してしまう経験はありませんか?

実は、原因はあなたが書いているコードではないかもしれません。
読み込んでいるファイルが問題なのです。

Reddit上で報告された事例では、コンテキストウィンドウの85%がnode_modulesの読み込みに消費されていました。
この問題は設定ミスではありません。

Claude Codeの設計上の盲点が引き起こしています。
本記事では、この問題の本質と具体的な対策方法を解説します。

トークン消費の実態

あるユーザーはリファクタリング作業中に、わずか3回のセッションで制限に到達しました。
そこでログを確認すると、驚くべき事実が判明します。

10万トークンのうち、8万5千トークンがnode_modulesやビルド成果物、gitの内部ファイルに消費されていたのです。
実際のコード作業に使えたのは、わずか15%でした。

問題はさらに深刻です。
この状況は、設定ファイルで適切にブロックルールを設定していても発生するのです。

二重の権限システムという罠

Claude Codeには2つの独立した権限システムがあります。
しかし、それらは互いに通信しません。

一つはファイル読み込みの権限管理です。
もう一つはbashコマンドの権限管理です。

設定ファイルでRead()のブロックルールを定義しても、grepやfindといったbashコマンドには適用されません。
つまり、慎重に作成したdenyリストは、コマンドライン経由では完全に無視されるのです。

この設計は直感に反します。
ファイルシステムへのアクセスをブロックしたつもりでした。

しかし、コマンド経由では自由にアクセスできてしまいます。
セキュリティの穴と言っても過言ではありません。

具体的な解決策

幸いなことに、比較的シンプルな対策が存在します。
それは、bashコマンドの実行前にフィルタリングを行う方法です。

わずか5行のスクリプトで実装できます。
まず、検証用のスクリプトファイルを作成しましょう。

手順は以下の通りです:

  1. プロジェクトルートに.claudeディレクトリを作成
  2. その中にscriptsフォルダを配置
  3. validate-bash.shというファイルを作成

スクリプトの内容は次のようになります:

#!/bin/bash
COMMAND=$(cat | jq -r '.tool_input.command')
BLOCKED="node_modules|\.env|__pycache__|\.git/|dist/|build/"

if echo "$COMMAND" | grep -qE "$BLOCKED"; then
 echo "ERROR: Blocked directory pattern" >&2
 exit 2
fi

次に、設定ファイルでこのスクリプトをフックとして登録します。
.claude/settings.local.jsonに以下を追加してください:

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "hooks": [{
        "command": "bash .claude/scripts/validate-bash.sh"
      }]
    }]
  }
}

この設定により、bashコマンドが実行される前に検証が走ります。
そして、ブロック対象のパターンが含まれていれば、実行は中断されます。

対策の限界と補完策

この方法は完璧ではありません。
たとえば、変数内にパスを隠すような高度な回避策には対応できません。

しかし、99%の偶発的なトークン浪費は防げます。
日常的な開発作業では十分に機能するでしょう。

さらに堅牢な対策として、ripgrepの導入も検討する価値があります。
ripgrepはデフォルトで.gitignoreを尊重します。

そのため、node_modulesが.gitignoreに記載されていれば、自動的にスキップされるのです。
ripgrepをインストールすれば、Claude Codeは自動的にそれを使用します。
追加の設定は不要です。

より大きな問題

この事例が浮き彫りにするのは、技術的な不備だけではありません。
システム設計における根本的な問題です。

ユーザーはトークン使用量の内訳を確認できません。
何にどれだけ消費されているのか。
それをリアルタイムで把握する手段がないのです。

制限に達してから初めて、何かがおかしいと気づきます。
しかし、その時点では既に手遅れです。
問題の原因を特定するには、ログを詳細に分析する必要があります。

本来、こうした対策はユーザーが実装すべきものではありません。
デフォルトの挙動として組み込まれているべきです。

なぜこの問題が見過ごされたのか

興味深いことに、すべてのユーザーがこの問題に直面するわけではありません。

プロジェクト構造や作業内容によって、影響の度合いは大きく異なります。
大規模なnode_modulesを持つプロジェクトでリファクタリングを行うと、問題が顕在化しやすくなります。

一方、小規模なプロジェクトでは、ほとんど影響を受けません。
コードベース全体を検索しない作業でも同様です。

この不均一性が、問題の発見を遅らせました。
一部のユーザーは快適に使用できます。

しかし、別のユーザーは頻繁に制限に達してしまいます。
原因が特定されるまで、後者は自分の使い方が悪いのだと考えてしまうのです。

開発者としてできること

この問題に対処するために、いくつかの実践的なアプローチがあります。

適切な.gitignore管理
まず、.gitignoreを適切に管理しましょう。
node_modules、ビルドディレクトリ、環境変数ファイルなど。
プロジェクトに不要なファイルは確実に除外してください。

具体的な指示を出す
Claude Codeに対しては、具体的な指示を出すことが重要です。
「コードベース全体を探索して」という曖昧な指示は避けましょう。
代わりに、「src/components/ディレクトリのButtonコンポーネントを確認して」という具体的な指示を出すのです。

事前の計画
計画を立てることも効果的です。
作業を始める前に、どのファイルを変更する必要があるかを整理します。
そして、Claude Codeにはそれらのファイルだけを指定して作業を依頼するのです。

ドキュメントの活用
コードベース全体の探索が必要な場合は、先にドキュメントを生成させるのも一つの方法です。
次回以降、Claude Codeはそのドキュメントを参照できます。
無駄な探索を減らせるでしょう。

ツールとの付き合い方

AIツールは驚くほど強力です。

しかし、完璧ではありません。
使用する際は、その動作を理解しておく必要があります。

何がコストになるのか。
どこに制約があるのか。
これらを把握することで、効率的な使い方が見えてきます。

Claude Codeのトークン消費問題は、その好例です。
表面的には使いやすいツールです。

しかし、内部では予想外の動作をしているのです。
こうした問題を発見し、共有し、対策を講じる。

これはツールを使いこなすために不可欠なプロセスです。

まとめ

Claude Codeのトークン消費問題は、技術的には解決可能です。
bashコマンドのフィルタリング、ripgrepの使用、.gitignoreの適切な管理。
これらの対策を組み合わせれば、大幅な改善が期待できます。

しかし、本質的な問題は残ります。
ユーザーが自分でこうした対策を講じなければならない状況。
それ自体が、改善されるべきなのです。

AIツールの開発者には、透明性と説明責任が求められます。
何にリソースが使われているのか。

それをユーザーが把握できるようにすべきです。
そして、明らかな無駄は、デフォルトで排除されているべきでしょう。

今回紹介した対策は、現時点での最善策です。
しかし、それはあくまで一時的な回避策に過ぎません。

根本的な解決は、ツールそのものの改善によってもたらされるべきです。
それまでの間、ここで紹介した方法を活用してください。
トークン制限との戦いを、少しでも楽にできるはずです。

タイトルとURLをコピーしました