---
title: "Context の圧縮とコンパクション"
description: "Ankole が長い会話をモデルのコンテキスト内に保つ仕組み — AIGateway による自動履歴コンパクションと、逐語的なユーザー原文の保持。"
url: "https://ankole.agentbull.com/ja-JP/docs/context-compression-and-caching/"
lang: "ja-JP"
---

> AI Agent 向けドキュメント索引: https://ankole.agentbull.com/ja-JP/llms.txt

# Context の圧縮とコンパクション

長く続く会話は、やがてモデルのコンテキストウィンドウを超えます。AIGateway は turn が見る会話履歴をコンパクト化し、会話がそのコンテキスト上限を超えても続けられるようにします。このページは、`ai_gateway/compaction*.ex` の実際のコードに照らして、この仕組みを文書化します。

最初に決定的な性質を述べます。コンパクションは*設計上 lossy ですが、沈黙はしません*。コンパクションは古い turn を要約に置き換え、最近の turn を逐語的に保持し、それ自体を会話が指す永続的なアーティファクトとして記録します。元の turn はモデルのコンテキストから消え、要約が新しい参照状態になります。コンパクションは、元に戻せるキャッシュではありません。

## AIGateway の履歴コンパクション

AIGateway は、ステートフルな Responses 会話の自動履歴コンパクションを所有します。トリガー、要約、そして何が残るかはすべて `Ankole.AIGateway.Compaction` にあります。

### トリガー

コンパクションは、会話の token 使用量がしきい値を越えたときに発火します。この決定は、可視の履歴に保存された**最新の provider が返した使用量**を使います。各使用量の値は累積スナップショットであり、加算する量ではありません。AIGateway はコンテンツから token 数を推定しません。provider の使用量の数値を信頼します。

しきい値は `ai_gateway.compaction` AppConfigure キーで設定します。

| 設定 | デフォルト | 意味 |
|---|---|---|
| `threshold` | 0.50 | コンパクションをトリガーするモデルの入力コンテキストの比率 |
| `max_threshold_tokens` | 120,000 | 計算されたトリガーの絶対上限。非常に大きなコンテキストが長く待ちすぎないようにする |
| `tail_rows` | 2 | 要約と一緒に逐語的に残る最近の turn の数 |
| `user_message_budget_tokens` | 20,000 | 逐語的なユーザー原文を再再生するための token 予算 |

デフォルトは 256k のコンテキスト長を仮定しています。`max_threshold_tokens` の上限があるのは、非常に大きなコンテキストを持つモデルが、コンパクション自体が高くつくほど長い履歴を蓄積しないようにするためです。小さなコンテキストのモデルは、`small_context_trigger_ratio`（0.85）によってより早くトリガーします。

### 要約器が行うこと

しきい値を越えると、AIGateway は要約器モデルを呼び出し、古い turn の構造化された要約を作成します。コンパクションのプロンプトは、要約を**指示ではなく参照状態**として位置づけます。「会話を続けないでください。質問に答えないでください。構造化された要約だけを出力してください」。要約は意図、決定、エラーと修正を捉え、ファイルパス、関数名、エラーメッセージ、コマンドライン、ID を逐語的に保持します。言い換えられたパスやエラーは壊れた参照になるからです。

要約は会話の中で新しい最古の項目になります。モデルはそれを、続けるべき turn ではなく状態として見ます。

### 何が逐語的に残るか

要約と一緒に 2 つのものが残ります。

- **最近の turn**（`tail_rows`、デフォルト 2）— 最後の数 turn は完全なまま残り、モデルが必要とする直近のコンテキストを提供します。
- **逐語的なユーザー原文** — `CompactionRetention` は、コンパクト化された区間からユーザーメッセージを選択し、`user_message_budget_tokens` の範囲内で逐語的に再再生します。これが、assistant の turn が要約された後でもモデルが「ユーザーは X を求めた」を見られる理由です。

この組み合わせ — 古い assistant の作業の要約、逐語的な最近の turn、逐語的なユーザー原文 — が、会話がドリフトせずに続くことを可能にします。

### コンパクションアーティファクト

各コンパクションは、AIGateway が保存する永続的な `CompactionArtifact` を生成します。会話の履歴は最新のコンパクションをアンカーとして指し、後続の turn はそこから続きます。

## チューニング

- **`threshold` を上げる** — agent が短い会話で作業し、コンパクションが早すぎる頻度で発火する場合。デフォルト（0.50）は保守的です。
- **`tail_rows` を上げる** — コンパクション後にモデルが直近のコンテキストを失う場合。逐語的な最近の turn が増えますが、要約のためのスペースが減ります。
- **`user_message_budget_tokens` を上げる** — コンパクト化された区間からユーザーメッセージが落とされ、モデルが何を求められたかを追えなくなる場合。

3 つすべてが AppConfigure キーで、Console を通じて変更され、現在の turn ではなく次のコンパクションで有効になります。

## このガイドがそうでないもの

プロンプトキャッシングのガイドではありません。AIGateway はここで provider 側のプロンプトキャッシングを実装しません。それは provider の関心事であり、サポートする provider の `promptCacheKey` 設定がレバーです。ロスレスの履歴でもありません。コンパクションは設計上 lossy であり、元の turn はモデルのコンテキストから消えます。そして、より短い会話の代替でもありません。コンパクションは会話がコンテキストの限界を越えて続くことを可能にしますが、数 turn ごとにコンパクト化される会話は、session に分割するか background job に委任する方が良いものです。

## 次のステップ

- AIGateway のコンセプトページについては、[AIGateway](https://ankole.agentbull.com/ja-JP/docs/ai-gateway/index.md)を参照してください。
