<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>トークン on Claude Code 始めました</title><link>https://kitepon-rgb.github.io/WebAICoding/tags/%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3/</link><description>Recent content in トークン on Claude Code 始めました</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Thu, 16 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://kitepon-rgb.github.io/WebAICoding/tags/%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3/index.xml" rel="self" type="application/rss+xml"/><item><title>コンテキストの87%が使い捨てだったので自分で対策した話</title><link>https://kitepon-rgb.github.io/WebAICoding/post/throughline-context-diet/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/throughline-context-diet/</guid><description>&lt;p&gt;MAXプランの週間クォータが3日で溶けた。&lt;/p&gt;
&lt;p&gt;×20のクォータがあるはずなのに、水曜には残量が怪しくなってる。それ自体は「まあそんなもんか」で済ませてたんだけど、ふと気になった。コンテキストウィンドウの中身って、実際どうなってるんだろう。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/ai-secretary-token-diet/"&gt;前の記事&lt;/a&gt;ではAI秘書のトークン節約について書いた。CLAUDE.mdを削ったり、MCPツール定義を削ったり。でも今回はAI秘書じゃなくて、Claude Code自体の話。道具のほうが大食いだったとは。&lt;/p&gt;
&lt;h2 id="きっかけ"&gt;きっかけ&lt;/h2&gt;
&lt;p&gt;4月14日、スペイン語圏のあるツイートが目に留まった。&lt;/p&gt;
&lt;p&gt;「Claude Codeのトークン浪費の大半はユーザー側に原因がある」&lt;/p&gt;
&lt;p&gt;言いたいことはわかる。CLAUDE.mdが肥大化してるとか、プロンプトが冗長だとか。でも「大半がユーザー側」って、ちゃんと測って言ってるのか？&lt;/p&gt;
&lt;p&gt;じゃあ俺が測ってやる、と思った。&lt;/p&gt;
&lt;h2 id="実測してみた"&gt;実測してみた&lt;/h2&gt;
&lt;p&gt;Claude Codeの内部transcript（セッションを記録してるJSONL）を解析した。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1ターンあたり188,000トークン。うち164,000トークン（87%）が会話履歴。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CLAUDE.mdは12,700トークン。MCPツール定義は3,900トークン。合わせても全体の9%。これを半分にしても5%弱しか浮かない。&lt;/p&gt;
&lt;p&gt;本丸は会話履歴の肥大化だった。CLAUDE.mdを必死に削ってた自分がちょっと恥ずかしい。&lt;/p&gt;
&lt;h2 id="犯人はツールio"&gt;犯人はツールI/O&lt;/h2&gt;
&lt;p&gt;じゃあ履歴の中身は何か。&lt;/p&gt;
&lt;p&gt;開いて驚いた。&lt;strong&gt;履歴の約80%がツールの入出力だった。&lt;/strong&gt; ファイルの読み取り結果、Bashコマンドの出力、grepの結果。AIがその場で使って、判断して、次に進んだ時点で役目を終えてるデータ。&lt;/p&gt;
&lt;p&gt;なのに、それがコンテキストウィンドウにずっと居座って、毎ターントークンを食い続けている。&lt;/p&gt;
&lt;p&gt;50ターンのセッションだと、最初のほうにgrepした結果がまだコンテキストにいる。もう二度と見ることはないのに。&lt;/p&gt;
&lt;h2 id="compactの矛盾"&gt;/compactの矛盾&lt;/h2&gt;
&lt;p&gt;「/compactすればいいじゃん」って思うかもしれない。自分もそう思ってた。&lt;/p&gt;
&lt;p&gt;でも/compactの仕組み、&lt;strong&gt;AIに全履歴を読ませて要約させる&lt;/strong&gt;んだよね。&lt;/p&gt;
&lt;p&gt;トークンを節約するために、トークンを大量に消費する。しかも要約の過程でニュアンスが消える。「あの時なぜこの設計にしたか」みたいな文脈が、丸められて消えることがある。&lt;/p&gt;
&lt;p&gt;要約後にまた作業を続ければ、また肥大化して、またcompactして&amp;hellip;の繰り返し。根本解決じゃない。&lt;/p&gt;
&lt;h2 id="時間じゃなく種類で分ける"&gt;時間じゃなく、種類で分ける&lt;/h2&gt;
&lt;p&gt;ここで発想を変えた。&lt;/p&gt;
&lt;p&gt;MemGPTやLangChainのSummaryBufferMemoryは、&lt;strong&gt;古いものから要約する&lt;/strong&gt;。時間ベースの圧縮。でも問題は「古さ」じゃない。&lt;/p&gt;
&lt;p&gt;10ターン前の「この設計にした理由」は今でも価値がある。さっきのgrepの結果は、1ターン前でも用済み。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;時間じゃなく、種類で分ければいい。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会話本文（人間が書いたこと、AIが答えたこと）→ 残す&lt;/li&gt;
&lt;li&gt;ツール入出力（ファイル内容、コマンド結果）→ 退避する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この発想で作ったのが&lt;a href="https://github.com/kitepon-rgb/Throughline"&gt;Throughline&lt;/a&gt;だ。&lt;/p&gt;
&lt;h2 id="3層モデル"&gt;3層モデル&lt;/h2&gt;
&lt;p&gt;Throughlineは会話を3つのレイヤーに分解してSQLiteに保存する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L1（Skeleton）&lt;/strong&gt; — 古いターンの一行要約。軽量モデルが生成する。1ターン約10トークン。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L2（Body）&lt;/strong&gt; — 直近20ターンの会話本文。ユーザーの発言とAIの応答がそのまま残る。圧縮なし、ロスレス。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L3（Detail）&lt;/strong&gt; — ツール入出力、システムメッセージ。SQLiteに退避してコンテキストには一切残さない。必要になったらAIが自分でSQLiteから引っ張ってくる。&lt;/p&gt;
&lt;p&gt;/clearを打っても大丈夫。SQLiteは消えないから、次のセッション開始時にトランザクション一発で前セッションの記憶を引き継ぐ。PIDを追いかけたり、時間窓で判定する必要はない。決定的に動く。&lt;/p&gt;
&lt;p&gt;数字で言うとこう。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Throughlineなし（50ターン、/clearなし）：
 コンテキスト ≈ 125,000トークン（80%が用済みのツールI/O）

Throughlineあり（50ターン → /clear → 復帰）：
 コンテキスト ≈ 13,000トークン
 （直近20ターンのL2 + 古い30ターンのL1要約）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;約90%の削減。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="失敗した設計の話もしておく"&gt;失敗した設計の話もしておく&lt;/h2&gt;
&lt;p&gt;最初からこの形だったわけじゃない。&lt;/p&gt;
&lt;p&gt;初期の設計では、L2を「重要な判断の構造化抽出」にしようとした。&lt;code&gt;[DECISION] WebSocketを採用&lt;/code&gt;、&lt;code&gt;[CONSTRAINT] ポート8080は使えない&lt;/code&gt; みたいなタグ付きで、会話から重要な情報だけ引き抜くイメージ。&lt;/p&gt;</description></item><item><title>AI秘書のトークン節約を必死に調べた記録</title><link>https://kitepon-rgb.github.io/WebAICoding/post/ai-secretary-token-diet/</link><pubDate>Sun, 12 Apr 2026 12:00:00 +0900</pubDate><guid>https://kitepon-rgb.github.io/WebAICoding/post/ai-secretary-token-diet/</guid><description>&lt;h2 id="やらかした"&gt;やらかした&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://kitepon-rgb.github.io/WebAICoding/post/ai-assistant-personality/"&gt;前回の記事&lt;/a&gt;で、AIアシスタントに記憶と人格を持たせて秘書にした話を書いた。俺専属のAI秘書ができて、よし本格運用だ、と意気込んだ。&lt;/p&gt;
&lt;p&gt;3日で週次リミットに到達した。&lt;/p&gt;
&lt;p&gt;ClaudeのMAXプラン、x20の上限。普段ガッツリ開発してても週末まで余裕で持つ枠。それを3日で溶かした。自分でもびっくりした。画面に「今週はもう使えません」って出たとき、「え、もう?」って声が出た。&lt;/p&gt;
&lt;p&gt;犯人は明らかだった。秘書は起動しっぱなしで、メールもカレンダーもDiscordも、全部Claudeに読ませて判断させてた。そりゃ減る。人間一人分の事務仕事を24時間AIに回してるんだから、減らないわけがない。&lt;/p&gt;
&lt;p&gt;でも困る。困るので必死に調べた。この記事はその記録。&lt;/p&gt;
&lt;h2 id="トークン節約の世界に迷い込む"&gt;トークン節約の世界に迷い込む&lt;/h2&gt;
&lt;p&gt;「Claude Code トークン 節約」とかで検索して、辿り着いたのが3つ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ECC&lt;/strong&gt; (Everything Claude Code)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTK&lt;/strong&gt; (Rust Token Killer)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caveman&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最初は名前だけ見てもさっぱりわからなかった。でも触って調べてるうちに、ある一つの共通原則に気づいた。&lt;/p&gt;
&lt;h2 id="腑に落ちた共通原則"&gt;腑に落ちた共通原則&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;人間向けのフォーマットは、AIにとって無駄が多い。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;考えてみれば当たり前だった。コマンドの出力も、ファイルの中身も、エラーメッセージも、全部「人間が読みやすい」ように作られてる。空白、罫線、色、親切な説明、ヘッダー。AIにとってはそのほとんどがノイズで、トークンを食うだけの飾りだ。&lt;/p&gt;
&lt;p&gt;トークン節約の本質は、&lt;strong&gt;人間向けのフォーマットをAI向けに削ってから渡す&lt;/strong&gt;こと。そして&lt;strong&gt;AI向けに吐かせた出力をさらに圧縮する&lt;/strong&gt;こと。3つのツールは、それぞれこの前提を別の角度から解決してた。&lt;/p&gt;
&lt;h3 id="ecc--凄い人がうまいことやってくれるやつ"&gt;ECC — 凄い人がうまいことやってくれるやつ&lt;/h3&gt;
&lt;p&gt;正直まだ全貌はつかめてない。でも入れて動かすと、Claudeの振る舞いが明らかに整理される。スキルやフック、エージェントの定義が大量に入ってて、Claudeが「こういうときはこう動け」というレールに乗って動くようになる。&lt;/p&gt;
&lt;p&gt;俺の理解だと、ECCは「凄い人たちが知見を詰め込んだ設定集」に近い。自分で考えなくても、ベストプラクティスに沿って動いてくれる。トークン節約の観点だと、無駄な探索や脱線が減る分、結果的に消費が落ちる。直接削ってるというより、&lt;strong&gt;余計なことをしなくなる&lt;/strong&gt;タイプの節約だ。&lt;/p&gt;
&lt;h3 id="rtk--コマンドの返答を簡略化してaiに渡す"&gt;RTK — コマンドの返答を簡略化してAIに渡す&lt;/h3&gt;
&lt;p&gt;こっちはわかりやすい。Claudeがコマンドを実行したとき、その出力を横取りしてAI向けに削ってくれる。&lt;/p&gt;
&lt;p&gt;たとえば &lt;code&gt;git status&lt;/code&gt; や &lt;code&gt;ls&lt;/code&gt; の出力、普通に流すと人間向けの装飾がそのまま渡るけど、RTK通すと余計な情報を落とした状態でClaudeに渡る。&lt;code&gt;rtk&lt;/code&gt; をコマンドの頭につけるだけでいい。フィルタがない対象はそのまま素通しするから壊れないのも良い。&lt;/p&gt;
&lt;p&gt;グローバルのCLAUDE.mdに「全コマンドに &lt;code&gt;rtk&lt;/code&gt; プレフィックスを付ける」と書いておけば、Claudeが勝手にそうしてくれる。設置コスト低いわりに効きが体感できる。&lt;/p&gt;
&lt;h3 id="caveman--aiの出力を要約する今回は見送り"&gt;Caveman — AIの出力を要約する(今回は見送り)&lt;/h3&gt;
&lt;p&gt;これはまだ入れてない。RTKが「入力」側を削るのに対して、Cavemanは「出力」側を削る、という理解。Claude自身の応答を短く圧縮する方向性らしい。&lt;/p&gt;
&lt;p&gt;入れなかった理由は単純で、&lt;strong&gt;秘書がカタコトになったら嫌だから&lt;/strong&gt;。せっかく人格と言葉遣いを作り込んだ秘書が、急にぶっきらぼうに返してきたら萎える。限定的に、たとえば開発用のセッションだけ有効にする、みたいな使い方はできたんだろうけど、そこまで調べる前に「今回はいいや」と見送った。&lt;/p&gt;
&lt;p&gt;このへんは俺の用途の都合で、純粋に開発だけで使ってる人には普通に強力だと思う。&lt;/p&gt;
&lt;h2 id="自分の開発スタイルでここから追加でやれそうなこと"&gt;自分の開発スタイルで、ここから追加でやれそうなこと&lt;/h2&gt;
&lt;p&gt;3つのツールで「土台」の節約はできた。ここから先は、自分の癖に合わせた追加の削り方を考えてる。まだ試してない、これからやる話。&lt;/p&gt;
&lt;h3 id="変数名や関数名で報告されても俺にはわからん"&gt;変数名や関数名で報告されても、俺にはわからん&lt;/h3&gt;
&lt;p&gt;俺の開発スタイルはコードをほぼ書かない。命名は全部Claudeがやってる。だからClaudeから「&lt;code&gt;handleUserSubmit&lt;/code&gt; を修正しました」と言われても、正直ピンとこない。&lt;/p&gt;
&lt;p&gt;これって裏を返すと、&lt;strong&gt;Claudeが報告のために変数名や関数名を引用するのは俺にとって情報量ゼロ&lt;/strong&gt;ということ。人間向けには親切な情報でも、俺という読者にとってはノイズに近い。&lt;/p&gt;
&lt;p&gt;だったら「送信ボタンを押したときの処理を直した」と意味のわかる言葉で説明してもらえばいい。名前の引用を減らせば、そのぶん報告は短くなるし、俺の理解も早い。一石二鳥。&lt;/p&gt;
&lt;h3 id="判断を求められてる部分は手厚く前段の説明は薄く"&gt;判断を求められてる部分は手厚く、前段の説明は薄く&lt;/h3&gt;
&lt;p&gt;あと気づいたのが、Claudeの報告って「やったこと」の説明がけっこう長い。でも俺が一番読みたいのは最後の「で、どうする?」の部分。&lt;/p&gt;
&lt;p&gt;判断を求められてる箇所、つまり俺が返事しないと進まない部分は手厚く書いてほしい。でもその前段——どのファイルを読んで、何を確認して、どういう経緯で、みたいな情報——は正直、結論出す上ではそんなに要らない。必要になったら聞くから、デフォルトは薄くていい。&lt;/p&gt;
&lt;p&gt;この2つはルールファイルに書いて渡せば効くはずで、次はそこを詰めていく予定。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;トークン節約って、要するに &lt;strong&gt;AIに人間向けフォーマットを読ませない&lt;/strong&gt; ことなんだな、というのが今回の一番の気づき。&lt;/p&gt;
&lt;p&gt;ECCは「余計なことをしない」方向で、RTKは「入力を削る」方向で、Cavemanは「出力を削る」方向で、それぞれ別の角度から同じ原則を解こうとしてる。全部入れれば最強、というより、用途に合うものを選ぶのがよさそう。俺の場合は秘書の言葉遣いを守りたいからCavemanは見送った。&lt;/p&gt;
&lt;p&gt;そしてここから先は、自分の読み方の癖に合わせてさらに削っていく番だ。名前じゃなくて意味で説明してもらう、前段は薄く、判断は手厚く。この辺を詰めたらまた書こうと思う。&lt;/p&gt;
&lt;p&gt;リミット食らったのは痛かったけど、おかげで「AIに渡す情報の設計」というテーマに向き合うきっかけになった。結果オーライ、かもしれない。&lt;/p&gt;</description></item></channel></rss>