PiにおけるCompaction(会話履歴圧縮)
Piは earendil-works が開発しているAIエージェントツールキットで、統一LLM API・agent loop・TUI・コーディングエージェントCLIから構成される。Claude CodeやCodexと似た立ち位置のコーディングエージェントで、npmパッケージ@earendil-works/pi-coding-agentとして配布されている。
以下はCompaction in Piという記事の内容整理。
課題: コンテキストウィンドウの上限
LLMには一度に処理できる入力トークン数の上限(コンテキストウィンドウ)がある。コーディングエージェントとの対話ではシステムプロンプト・ツール定義・会話履歴が毎ターン蓄積していき、いずれこの上限に達する。
上限に達したときの選択肢は基本的に2つ。
- 新しい空の会話を開始する(それまでの文脈を失う)
- 会話内容を圧縮した表現に置き換える(Compaction)
Piの圧縮方式
- 古い会話履歴に達すると自動的にトリガーされるほか、
/compactコマンドで手動でも実行できる。デフォルトのトークン予算(2万トークン程度)は、会話のおよそ5〜20ターン分に相当する。 - 圧縮対象となる古いターンをまとめて抽出・直列化し、要約する。直近の数ターンは圧縮せずそのまま残す。
- 圧縮は通常の会話ターンとは別の、専用のリクエストとして実行される。
- システムプロンプトも通常時の「コーディングアシスタント」用ではなく、「コンテキスト要約アシスタント」用の別のものを使う。
- 出力は「目標」「進捗」「重要な決定」といったセクション構成を持つ要約として指定される。
- 既存の会話履歴をそのまま引き継がないスタンドアロンなリクエストのため、要約自体を通常の対話と異なるLLMモデルで処理することもできる。
- 圧縮結果はプレーンテキストとしてセッションに追加保存される。プレーンテキストであることで、人間が読めることと、異なるモデル間での可搬性が保たれる。
プロンプトキャッシングとの相互作用
LLMプロバイダのプロンプトキャッシングは、繰り返しリクエストされる入力のプレフィックスをキャッシュしてコストを下げる機能。Compactionを実行すると会話履歴のプレフィックスが変わるため、それまで蓄積していたキャッシュは無効化される。圧縮後の新しいプレフィックスは、以降のターンで改めてキャッシュの恩恵を受ける形になる。
考えたこと
Claude Codeでも長時間セッションで自動的に文脈が要約される仕組みがあり(このセッション自体もその挙動に依存している)、Piの実装はその一般的なパターンを外部から観測・言語化したものと言える。圧縮を「通常会話とは別のスタンドアロンリクエスト」として切り出す設計は、要約専用に安いモデルを割り当てたり、圧縮プロンプトだけを独立にチューニングできる点で理にかなっている。
#llm #ai-agent #context-window