AIエージェント活用実践編状態管理とメモリ設計

Context 圧縮の基本

無料公開レッスン / 読了目安 5


学習のねらい

LLM との会話が長くなると、入力するプロンプト全体の長さ(コンテキストウィンドウ)が限界に達し、古い情報から順に忘れられてしまうことがあります。また、コンテキストウィンドウが長くなると、API コストも増大します。 このレッスンでは、会話履歴を効率的に保ちながら、コンテキストウィンドウの制限やコストの問題を解決するための「コンテキスト圧縮」の基本的な考え方と実装パターンを学びます。

コンテキストウィンドウの課題

LLM は、プロンプトとして与えられたテキスト全体を一度に処理します。この処理できるテキストの最大長を コンテキストウィンドウ(Context Window) と呼びます。Anthropic の Claude 3 Sonnet の場合、最大200Kトークンという非常に長いコンテキストウィンドウを持っていますが、それでも無限ではありません。

コンテキストウィンドウが長くなると、以下のような課題が発生します。

  • トークン制限: 会話履歴が長くなると、コンテキストウィンドウの最大トークン数を超過し、古い情報が切り捨てられてしまいます。
  • コスト増: 入力トークン数が増えるほど、API 利用料金が高くなります。
  • 性能低下: 不必要な情報が多いと、LLM が重要な情報を見落としたり、パフォーマンスが低下したりする可能性があります。

これらの課題を解決するために、コンテキスト圧縮が重要になります。

コンテキスト圧縮の基本 — 要約によるアプローチ

最も一般的なコンテキスト圧縮の方法は、古い会話履歴を 要約(Summarization) することです。これにより、会話の重要な論点を保ちつつ、トークン数を大幅に削減できます。

1. 古いターンの要約 LLM コールで圧縮

会話履歴がある一定の長さに達したら、過去の会話の一部を LLM に要約させ、その要約文をコンテキストに含める方法です。

例えば、以下のような会話履歴があったとします。

ユーザー: こんにちは、製品Aについて質問があります。
AI: 製品Aですね。どのようなご質問でしょうか?
ユーザー: 機能Xについて知りたいです。
AI: 機能Xは、〇〇の用途で使えます。
... (さらに会話が続く)

会話が長くなってきたら、古い部分を要約します。

[要約] ユーザーは製品Aの機能Xについて質問し、AIが回答した。
ユーザー: (現在の質問)
AI: (現在の回答)

この要約文と、直近の会話履歴を組み合わせることで、過去の文脈を保ちつつコンテキストを短縮できます。

2. 重要情報の保持ルール

要約する際に、ただ短くするだけでなく、会話において特に重要な情報を失わないようにする工夫が必要です。

  • エンティティ抽出: 登場する固有名詞(製品名、人名、会社名など)を抽出して保持する。
  • 決定事項の抽出: 会話の中で決定されたことや、合意事項を抽出して保持する。
  • ユーザーの意図: ユーザーの最終的な目的や、繰り返し強調されている点を保持する。

これらの情報をプロンプトに明示的に含めることで、要約の精度を高め、LLMが重要な文脈を見失うのを防げます。

3. 圧縮タイミングの判断

コンテキスト圧縮を実行するタイミングも重要です。

  • トークン数ベース: 現在の会話履歴のトークン数が、あらかじめ設定した閾値(例: コンテキストウィンドウの70%)を超えたら圧縮を実行します。
  • ターン数ベース: 会話のターン数(やり取りの回数)が一定数(例: 5ターン)を超えたら圧縮を実行します。
  • 時間ベース: 一定時間(例: 10分)会話が続いたら圧縮を実行します。

これらの基準を組み合わせて、最適なタイミングで圧縮を行うように設計しましょう。例えば、直近の数ターンはそのまま残し、それより古い部分を要約するといったアプローチも有効です。

まとめ

コンテキスト圧縮は、LLMとの長期的な会話を効率的かつ低コストで維持するために不可欠な技術です。古い会話履歴を要約し、その際に重要な情報を失わないよう工夫し、適切なタイミングで圧縮を実行することで、コンテキストウィンドウの制限を乗り越えることができます。 次のレッスンでは、この圧縮された会話履歴をどのように保存し、再開するかを見ていきましょう。

参考リンク


Context 圧縮の基本 | AIエージェント活用実践編 第1章 - AI研修