컨텍스트 압축

ADK agent가 실행됨에 따라 사용자 메시지, Tool 응답, 생성된 콘텐츠 등 컨텍스트가 축적됩니다. 이 컨텍스트가 증가함에 따라 각 요청과 함께 더 많은 데이터가 전송되므로 LLM 처리 시간이 늘어납니다. 컨텍스트 압축은 슬라이딩 윈도우 접근 방식을 사용하여 오래된 이벤트를 요약함으로써 이 문제를 해결합니다.

작동 방식

컨텍스트 압축은 슬라이딩 윈도우를 사용하여 세션 내의 오래된 대화 이벤트를 주기적으로 요약합니다. 완료된 호출 수가 구성된 간격에 도달하면 요약기는 오래된 이벤트를 단일 요약 이벤트로 압축합니다.

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 매개변수는 이전 윈도우의 이벤트 중 다음 요약으로 얼마나 많은 이벤트가 전달되어 연속성을 유지하는지 제어합니다.

구성

Runner 구성에 압축을 추가하세요:

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_intervalu32압축을 트리거하는 완료된 호출 수
overlap_sizeu32다음 요약에 포함되는 이전 창의 이벤트
summarizerArc<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()가 호출되면:

  1. 가장 최근의 압축 이벤트를 찾습니다.
  2. 해당 요약이 압축 경계까지의 모든 이벤트를 대체합니다.
  3. 경계 이후의 이벤트만 개별적으로 포함됩니다.

이는 Agent에게 투명하게 처리됩니다. Agent는 요약과 최근 이벤트가 포함된 일관된 대화 기록을 받습니다.

예시 타임라인

compaction_interval: 3overlap_size: 1와 함께:

호출이벤트액션
1user→agent
2user→agent
3user→agent이벤트 1-3을 요약 A로 압축
4user→agent
5user→agent
6user→agent이벤트 3-6을 (겹침=1) 요약 B로 압축

invocation 6 이후, agent는 다음을 봅니다: [Summary B, event 6 overlap events, event 7+]

참고

  • Compaction 실패는 치명적이지 않습니다 — runner는 경고를 기록하고 계속 진행합니다.
  • Compaction은 invocation 스트림이 완료된 후에 실행되며, 도중에 실행되지 않습니다.
  • compaction 이벤트는 내구성을 위해 session service에 유지됩니다.
  • 요약을 위해 빠르고 저렴한 model을 사용하세요 (예: gemini-2.5-flash)