컨텍스트 압축

ADK 에이전트가 실행되면 사용자 메시지, 도구 응답, 생성된 콘텐츠 등 컨텍스트가 누적됩니다. 이 컨텍스트가 증가할수록 각 요청과 함께 더 많은 데이터가 전송되므로 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 매개변수는 이전 윈도우에서 다음 요약으로 이어지는 이벤트 수를 제어하여 연속성을 유지합니다.

구성

러너 구성에 압축을 추가합니다.

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. 경계 이후의 이벤트만 개별적으로 포함됩니다

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

예시 타임라인

compaction_interval: 3overlap_size: 1 사용:

호출이벤트작업
1사용자→에이전트
2사용자→에이전트
3사용자→에이전트이벤트 1~3을 요약 A로 압축
4사용자→에이전트
5사용자→에이전트
6사용자→에이전트이벤트 3~6(overlap=1)을 요약 B로 압축

호출 6 이후 에이전트는 다음을 확인합니다: [Summary B, event 6 overlap events, event 7+]

참고

  • 압축 실패는 치명적이지 않습니다. 실행기는 경고를 기록하고 계속 진행합니다.
  • 압축은 호출 스트림이 완료된 후에 실행되며, 실행 중에는 실행되지 않습니다.
  • 내구성을 위해 압축 이벤트가 세션 서비스에 저장됩니다.
  • 요약에는 빠르고 비용이 저렴한 모델을 사용하세요(예: gemini-3.5-flash-lite)