컨텍스트 압축
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_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()가 호출되면:
- 가장 최근의 압축 이벤트를 찾습니다.
- 해당 요약이 압축 경계까지의 모든 이벤트를 대체합니다.
- 경계 이후의 이벤트만 개별적으로 포함됩니다.
이는 Agent에게 투명하게 처리됩니다. Agent는 요약과 최근 이벤트가 포함된 일관된 대화 기록을 받습니다.
예시 타임라인
compaction_interval: 3 및 overlap_size: 1와 함께:
| 호출 | 이벤트 | 액션 |
|---|---|---|
| 1 | user→agent | — |
| 2 | user→agent | — |
| 3 | user→agent | 이벤트 1-3을 요약 A로 압축 |
| 4 | user→agent | — |
| 5 | user→agent | — |
| 6 | user→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)