0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code の自動圧縮は何トークンで起きたか — 実測3回と、それに備えてやっていること

0
Last updated at Posted at 2026-10-08

この記事は Zenn と note にも同じ内容を載せています。Zenn: https://zenn.dev/suisei498/articles/8b9b9edde7768b / note: https://note.com/suisei498/n/ne840430df72c

Claude Code で、同じ会話を何日も続けて作業しています。自宅のPCで動かしている自動売買や、動画の自動投稿の保守です。

長く続けると、ある時点で会話が自動で圧縮(それまでのやり取りが要約に置き換わる)されます。これが何トークンで起きるのかを、会話の記録ファイルから実測しました。3回分の記録と、それに備えて何をしているかを書きます。

※数字は私の環境での観測値です。モデルや設定で変わりうるので、目安として読んでください。

測り方:会話の記録ファイルの usage を足す

Claude Code は会話ごとに、記録を JSON Lines 形式で残しています。

~/.claude/projects/<プロジェクト>/<セッションID>.jsonl

アシスタントの各応答には usage があり、そのとき読み込んだトークン数が入っています。キャッシュから読んだ分も含めて3つを足すと、その時点で会話がどれだけ積み上がっているかになります。

import json

def ctx_series(path):
    rows = []
    for line in open(path, encoding="utf-8"):
        try:
            d = json.loads(line)
        except ValueError:
            continue
        if d.get("type") != "assistant":
            continue
        u = (d.get("message") or {}).get("usage")
        if not u:
            continue
        n = (u.get("input_tokens", 0)
             + u.get("cache_creation_input_tokens", 0)
             + u.get("cache_read_input_tokens", 0))
        rows.append((d.get("timestamp", ""), n))
    return rows

rows = ctx_series(r"C:\Users\<ユーザー>\.claude\projects\<プロジェクト>\<セッションID>.jsonl")
prev = None
for ts, n in rows:
    # 直前の半分以下に落ちたら、そこで圧縮が起きたとみなす
    if prev and n < prev[1] * 0.5:
        print("圧縮", prev[0], prev[1], "->", ts, n)
    prev = (ts, n)

実測:3回とも 93万〜98万トークンで起きた

日時(UTC) 圧縮の直前 圧縮の直後
2026-09-14 23:32 976,071 98,581
2026-09-24 08:03 937,609 81,560
2026-09-26 17:58 965,169 89,911
  • 3回とも、93万〜98万トークンのあたりで起きていました
  • 圧縮の後は 8万〜10万トークンから再開しています。要約と、毎回読み込まれる設定(CLAUDE.md など)の分です

画面の「%」と合わなかった

一方で、65万トークンの時点で、画面に「97%」と出たことがありました。実測の圧縮点(93万〜98万)から逆算すると、計算が合いません。

どちらが正しいのか、まだ説明できていません。なので、% では判断せず、トークンの生の数で判断することにしました。

圧縮で何が困るのか:要約は記録ではない

圧縮の後も会話は続けられます。要約には「何をしていたか」はかなり残ります。

困るのは、要約から落ちやすいものです。

  • 測った値(何件だったか、何秒だったか)
  • ファイルの版を示す識別子(どの版を配ったか)
  • 自分が間違えた記録(何を誤り、どう直したか)

どれも、後で「あのとき確かに測った」と言うための根拠です。要約に「確認済み」とだけ残ると、何をもって確認したのかが分からなくなります。

備え:引き継ぎ書と、2つの合図

1. 90万トークンで「引き継ぎ書を書け」と出す

上の測り方で、今の会話の大きさを測る小さなスクリプトを置いています。90万トークンを超えたら「引き継ぎ書を書く」合図を出します。圧縮点の実測(93万〜)より少し手前です。

引き継ぎ書には、要約から落ちる3つ(測った値・識別子・誤りの記録)を書きます。圧縮の前に書いておけば、圧縮の後で読める。これが唯一の、消えない記録です。

2. 圧縮が起きたら「引き継ぎ書を読め」と出す

同じスクリプトが、**前回測ったときより半分以下に落ちていたら「圧縮が起きた」**と判定し、その高さを台帳に残します。上の表の1行目と2行目は、この台帳から取りました。

3. CLAUDE.md に「圧縮の後はまず引き継ぎ書を読む」と書く

CLAUDE.md は会話の最初に毎回読み込まれるので、圧縮されても残ります。ここに「圧縮されたら、要約だけで続けずに、引き継ぎ書の最新の節から読む」と書いておきます。

CLAUDE.md 自体は短く保ちます。圧縮で落ちたら困ることだけを書き、細かいことは引き継ぎ書に置きます。

踏んだ穴:測る会話を取り違えていた

このスクリプトで、2回つまずきました。

1回目:最初の版は「直近30分に書き込まれた会話ファイル」だけを測る作りでした。席を外していると何も測れず、「測れません」と出て、合図が自動で出ない状態になっていました。直近30分に無ければ、全体で一番新しいものに落とすよう直しました。

2回目:その「一番新しい会話ファイル」は、同じPCで別の会話が動いていると、そちらを選びます。ある日「62万トークン、まだ余裕」と報告した数字が、実は別の会話のものでした。測り直すと、作業中の会話は44万トークンでした(このときは、どちらでも余裕がある範囲だったので実害はありませんでした)。

数字を出すときは、どの会話の数字かも一緒に出す。当たり前ですが、自分で作った見張りで、それを外していました。

まとめ

  • 自動圧縮は、私の環境では 93万〜98万トークンで3回起きた。圧縮後は 8万〜10万から再開
  • 画面の % とは合わないので、生のトークン数で見る
  • 要約から落ちる「測った値・識別子・誤りの記録」は、圧縮の前に引き継ぎ書へ
  • 合図は 90万で「書け」、半分以下に落ちたら「読め」。CLAUDE.md に「圧縮後はまず読む」
  • 測るときは、どの会話を測ったかを必ず添える
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?