컨텍스트 압축
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_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(overlap=1)을 요약 B로 압축 |
호출 6 이후 에이전트는 다음을 확인합니다: [Summary B, event 6 overlap events, event 7+]
참고
- 압축 실패는 치명적이지 않습니다. 실행기는 경고를 기록하고 계속 진행합니다.
- 압축은 호출 스트림이 완료된 후에 실행되며, 실행 중에는 실행되지 않습니다.
- 내구성을 위해 압축 이벤트가 세션 서비스에 저장됩니다.
- 요약에는 빠르고 비용이 저렴한 모델을 사용하세요(예:
gemini-3.5-flash-lite)