コンテキストの圧縮
ADK エージェントの実行中、ユーザーメッセージ、ツールの応答、生成されたコンテンツなどのコンテキストが蓄積されます。このコンテキストが増えると、各リクエストで送信されるデータ量が増えるため、LLM の処理時間が長くなります。コンテキストの圧縮では、スライディングウィンドウ方式を使用して古いイベントを要約することで、この問題に対処します。
仕組み
コンテキストの圧縮では、スライディングウィンドウを使用して、セッション内の古い会話イベントを定期的に要約します。完了した呼び出しの数が設定された間隔に達すると、要約処理によって古いイベントが1つの要約イベントに圧縮されます。
Invocations 1-3: [event1, event2, event3] → Summarized into "Summary A"
Invocations 4-6: [Summary A, event3, event4, event5, event6] → Summarized into "Summary B"
overlap_size パラメータは、前のウィンドウから次の要約に引き継ぐイベント数を制御し、継続性を維持します。
設定
ランナーの設定に圧縮を追加します。
use adk_agent::LlmEventSummarizer;
use adk_runner::{Runner, RunnerConfig, EventsCompactionConfig};
use std::sync::Arc;
// Use any LLM for summarization (a fast, cheap model works well)
let summarizer_llm = Arc::new(my_model);
let summarizer = Arc::new(LlmEventSummarizer::new(summarizer_llm));
let runner = Runner::new(RunnerConfig {
app_name: "my_app".to_string(),
agent: root_agent,
session_service: sessions,
artifact_service: None,
memory_service: None,
plugin_manager: None,
run_config: None,
compaction_config: Some(EventsCompactionConfig {
compaction_interval: 3, // Compact every 3 invocations
overlap_size: 1, // Keep 1 prior invocation for context
summarizer,
}),
})?;
設定パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
compaction_interval | u32 | コンパクションをトリガーする完了済み呼び出しの数 |
overlap_size | u32 | 次の要約に含まれる前のウィンドウのイベント |
summarizer | Arc<dyn BaseEventsSummarizer> | 要約戦略 |
カスタム要約
要約プロンプトをカスタマイズできます:
let summarizer = LlmEventSummarizer::new(llm)
.with_prompt_template(
"Summarize this conversation focusing on action items \
and decisions:\n\n{conversation_history}"
);
または、完全な制御を行うために BaseEventsSummarizer を実装します:
use adk_core::{BaseEventsSummarizer, Event, Result};
use async_trait::async_trait;
struct MySummarizer;
#[async_trait]
impl BaseEventsSummarizer for MySummarizer {
async fn summarize_events(&self, events: &[Event]) -> Result<Option<Event>> {
// Custom summarization logic
// Return None to skip compaction for this window
todo!()
}
}
圧縮が履歴に与える影響
conversation_history() が圧縮イベントを含むセッションで呼び出されると:
- 最新の圧縮イベントが検索されます
- その要約が、圧縮境界までのすべてのイベントを置き換えます
- 境界の後のイベントのみが個別に含まれます
これはエージェントに対して透過的です。エージェントは、要約に続いて最近のイベントが含まれる、一貫性のある会話履歴を受け取ります。
タイムラインの例
compaction_interval: 3 と overlap_size: 1 の場合:
| 呼び出し | イベント | アクション |
|---|---|---|
| 1 | ユーザー→エージェント | — |
| 2 | ユーザー→エージェント | — |
| 3 | ユーザー→エージェント | イベント 1~3 を要約 A に圧縮 |
| 4 | ユーザー→エージェント | — |
| 5 | ユーザー→エージェント | — |
| 6 | ユーザー→エージェント | イベント 3~6(重複=1)を要約 B に圧縮 |
呼び出し 6 の後、エージェントには次の内容が表示されます:[Summary B, event 6 overlap events, event 7+]
注記
- 圧縮の失敗は致命的ではありません — ランナーは警告をログに記録して処理を続行します
- 圧縮は呼び出しストリームの完了後に実行され、実行中には行われません
- 圧縮イベントは耐久性を確保するためにセッションサービスに永続化されます
- 要約には高速で低コストなモデルを使用してください(例:
gemini-3.5-flash-lite)