文脈とメモリ
コンテキストウィンドウは、今回モデルが読める有限の token 空間です。ユーザーメッセージ、モデル応答、ツール結果などが共有します。長いセッションでは harness が古い内容を要約に置き換え、セッションを越えて必要な事実は別のメモリへ保存し、規則に従って読み込みます。
窓を机、メモリを書類棚と考えてください。圧縮は机の古い資料を要約へ替え、要点を残して原文の一部を失います。棚へは明示的に保存します。本例の次セッションが復元するのはメモリだけですが、実製品は会話や要約も保存でき、この境界は普遍的ではありません。
文脈圧縮の仕組み
本例で大きいのはツール出力です。read("src/parser.ts") が 19,000 token、テストログが 22,100 token を返します。ブロック高は token 数に比例し(小さいメッセージは最小の高さに切り上げ)、メーターに値を示します。ユーザー文やモデル出力でも埋まりますが、この例はツールが大半を占めます。
各モデル呼び出し前に tokens(ctx) > 0.92 × LIMIT を検査し、超えれば先に圧縮します。固定ヘッダーと最近 2 メッセージの間を要約器へ渡し、目標、決定、残作業を残します。再構成は [system prompt, memory file, summary, recent tail]。末尾は原文、古い部分は要約だけです。
92% は余裕を残す設定です。上限で拒否された要求を、対象モデル自身が後から整理することはできません。実装では出力予算も確保し、大きなツール結果や保持する末尾が上限を超えた場合は切り詰めや分割も必要です。
メモリは別機構です。Always pnpm, never npm を保存しても、現在のメモリブロックは開始時のスナップショットなので更新しません。新行は次セッションの再読み込みで入ります。本例は終了時に要約を捨て、ファイルだけを次へ渡します。
初期設定は両方を使います。No compaction は同じ会話を上限まで増やし、No memory は圧縮してもセッション間の事実を保存しません。
文脈とメモリのステップ
教材の窓は 50,000 token、92% のしきい値は 46,000。値は固定トレースの集計で、ライブの token 測定ではありません。
- セッション 1 開始。 system 3.0k、MEMORY.md の注入コピー 1.0k で、最初から 4.0k 使用します。
- タスク。 「失敗するパーサーテストを直す。常に pnpm、npm は使わない」が 0.5k。記録してパーサーを読むという応答が 0.8k。
- メモリへ保存。
MEMORY.md += "Always pnpm, never npm"を別ストアへ書き、メーターは変わりません。注入コピーを更新しないためです。実際の書き込み要求や結果は token を使い得るので、保存が無料という意味ではありません。 - 窓が埋まる。 読み取り要求 0.3k、ファイル 19.0k。内容は 247 行のループ境界誤りと、
MAX_DEPTH再帰ガード、Unicode サロゲートペアの TODO です。診断と修正説明 0.9k、bash("apply patch && pnpm test")0.3k、テストログ 22.1k が加わり、47.9k/50k。 - しきい値超過。 47.9k > 46k。次のモデル呼び出し前に圧縮します。
- 範囲を選択。 ヘッダーと最近の末尾の間の 5 メッセージを囲みます。system、メモリ、最後の 2 件は含みません。
- 要約。 実モデル claude-opus-5-5 の録画結果が、
src/parser.ts247 行、i <= nをi < nにする修正、pnpm の指示、パッチ後に pnpm でテストする次の手順を残し、表示予算は 0.8k です。MAX_DEPTHと Unicode TODO はこの要約に入りません。 - 置換。 5 ブロックを要約 1 個へまとめ、末尾を保ち、47.9k → 27.2k。内容は
[system, memory, summary, test command, test log]です。 - 損失を調べる。 ユーザーが Unicode TODO を尋ねても要約に見つからず、再読み取りが必要という回答を示します。先ほど見えていた詳細が活動文脈から消えています。設計どおりの圧縮でも、抽出しなかった内容は失われ得ます。
- セッション境界。 要約を含む列が消え、別のメモリだけが残ります。
- セッション 2 開始。 system と再読した MEMORY.md。pnpm 行込みのメモリは 1.1k、全体は 4.1k で、前の会話履歴はありません。
- 保持を検査。 新しいリポジトリで date-fns の導入を求めると、メモリの規則を見つけ、
pnpm add date-fnsを表示します。
No compaction は 47.9k、48.5k、49.0k と増え、読み取り要求と 4.2k changelog が加わって 53.5k。次の API は context_length_exceeded で拒否されます。この例は品質が徐々に下がるのではなく、生成へ到達しません。
No memory でも要約は pnpm を残し、同じセッションの導入確認は成功します。しかし次は system だけで始まり、固定回答が npm install lodash を使います。訂正を次へ渡さない場合の例で、実モデルが必ずこうするという予測ではありません。
情報の寿命
本例の原メッセージは圧縮対象になるまで、要約はセッション終了まで(後の圧縮で再要約されなければ)、メモリ行は変更・削除まで残ります。長い寿命へ明示的に移さなければ、既定の境界で失われます。
行番号や数値が必ず最初に消えるわけではありません。要約カードごとに 5 回録画し、診断を含む要約はすべて parser.ts 247 行、i < n の修正、pnpm 規則を残しました。解決中の問題の結論だからです。同じファイルの、尋ねられていない別の根拠は違います。92% の単発要約は Unicode TODO を 5 回中 4 回落とし、50% の要約の要約は 5 回中 2 回だけ落としました。同じモデル、同じメッセージでも結果が変わります。結論以外に何が残るかは、どちらの方向にも当てにできません。
圧縮後に原文で必要な情報は、読み直せる出所か適切な記録を保ちます。「一度見た」ことを「要約が保持する」と混同しないでください。
92% は本課で 1 回の圧縮ですが、直前には数千 token の余裕しかありません。50% は MEMORY.md を読み込むと 2 回圧縮し、2 回目は最初の要約も対象にします。再要約は必ず悪化するわけではなくても、再び省略・歪曲する機会になります。早い圧縮は要約呼び出しを増やして原文を早く失い、遅い圧縮は大出力で上限を越える危険を残します。無効化すると本例は 50k でエラーです。
大きな窓でも資料管理は必要です。保持量は空間を使い、処理費用や遅延を増やし得ますが、前置部キャッシュや料金体系で関係は変わります。作業中の資料と長期保存する事実を分けます。
境界条件
- 検査はモデル呼び出し前。 本例の圧縮モードは上限内に収まります。実装は圧縮後も再検査し、出力余地を残します。大きな末尾が残れば失敗し得ます。
- 末尾が重い。 22.1k のログを原文で残すため、4k ではなく 27.2k までしか下がりません。さらに必要ならツール結果の保持方針を変えます。
- 要約もモデルの誤りを受け継ぐ。 決定を誤記すれば後続要求もその誤りを受けます。存在は検証済みの証拠ではありません。
- メモリは古くなる。 チームが道具を変えても pnpm 規則が残り得るため、更新と削除が必要です。
- 2 回目が最初の要約を含む。 50%(MEMORY.md あり)では診断後とログ後に発火し、後者の範囲に前の要約が入ります。ここで示す録画では、この要約が Unicode TODO を残したため、50% の検査では見つかり、92% では見つかりません。
よくある間違い
- モデルが別セッションを自力で覚えると思う。 本例は各呼び出しの明示入力を使い、次はファイルだけを復元します。他の製品が履歴を復元しても、システムが入力する必要があります。
- 原証拠が全部残ると思う。 修正の結論は残ります。無関係な TODO が残るかは実行次第で、録画した 5 回の要約のうち 4 回は落としました。必要なら出所を記録するか読み直します。
- メモリを全量ログにする。 次回注入も窓を使うので、すべて書くと別の層で同じ混雑を作ります。選別が必要です。
- ファイルと注入コピーを混同する。
remember()はファイルを変え、現在のコピーは変えません。新行は次回の注入で入ります。 - 現在の要約だけで将来の好みを保つ。 No memory では規則を持つ要約も終了時に消えます。
- 上限だけ増やす。 容量は情報の寿命を選んでくれず、大きな読み取りは引き続き空間を使います。
モデルの簡略化
50k は教材の選択で、実モデルの仕様ではありません。メモリファイルは別のメモリ状態で模擬し、利用者の MEMORY.md へ書きません。token サイズは固定値です。実 harness は tokenizer と提供者の制限を使います。
要約は claude-opus-5-5 がこのメッセージ群を圧縮した出力の逐語記録です。手書きでも再生時のライブ生成でもありません。録画では、バグの位置は毎回残り、Unicode TODO は残る場合と残らない場合がありました。他の表示と数値は教材用で、モデル性能の基準ではありません。
実システムは古いツール結果の切り詰め、固定前置部のキャッシュ、Claude Code の /compact のような手動操作、製品別しきい値も使います。会話や要約を永続化する場合もあります。本例は有損な作業文脈、しきい値での要約、次セッションへのメモリ再注入を示します。
続けて学ぶ
同じ手法につながるレッスンや、次の概念への入口です。
鍵マークのあるレッスンの操作には有料アクセスが必要です。解説はすべて無料で読めます。
誤りや気になる点を見つけましたか? フィードバックを送る。