Compactación del contexto
A medida que un agente ADK se ejecuta, acumula contexto: mensajes del usuario, respuestas de herramientas y contenido generado. A medida que este contexto crece, los tiempos de procesamiento de LLM aumentan porque se envían más datos con cada solicitud. La compactación del contexto aborda este problema mediante el resumen de eventos antiguos usando un enfoque de ventana deslizante.
Cómo funciona
La compactación del contexto utiliza una ventana deslizante para resumir periódicamente eventos antiguos de la conversación dentro de una sesión. Cuando el número de invocaciones completadas alcanza el intervalo configurado, el resumidor comprime los eventos antiguos en un único evento de resumen.
Invocations 1-3: [event1, event2, event3] → Summarized into "Summary A"
Invocations 4-6: [Summary A, event3, event4, event5, event6] → Summarized into "Summary B"
El parámetro overlap_size controla cuántos eventos de la ventana anterior se transfieren al siguiente resumen, preservando la continuidad.
Configuración
Añade la compactación a la configuración de tu ejecutor:
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,
}),
})?;
Parámetros de configuración
| Parámetro | Tipo | Descripción |
|---|---|---|
compaction_interval | u32 | Número de invocaciones completadas que activa la compactación |
overlap_size | u32 | Eventos de la ventana anterior incluidos en el siguiente resumen |
summarizer | Arc<dyn BaseEventsSummarizer> | La estrategia de resumen |
Resumidor personalizado
Puedes personalizar el prompt de resumen:
let summarizer = LlmEventSummarizer::new(llm)
.with_prompt_template(
"Summarize this conversation focusing on action items \
and decisions:\n\n{conversation_history}"
);
O implementar BaseEventsSummarizer para obtener un control total:
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!()
}
}
Cómo afecta la compactación al historial
Cuando se llama a conversation_history() en una sesión con eventos de compactación:
- Se encuentra el evento de compactación más reciente
- Su resumen reemplaza todos los eventos hasta el límite de compactación
- Solo los eventos posteriores al límite se incluyen individualmente
Esto es transparente para los agentes: reciben un historial de conversación coherente que incluye el resumen seguido de los eventos recientes.
Línea de tiempo de ejemplo
Con compaction_interval: 3 y overlap_size: 1:
| Invocación | Eventos | Acción |
|---|---|---|
| 1 | usuario→agente | — |
| 2 | usuario→agente | — |
| 3 | usuario→agente | Compactar eventos 1-3 en el resumen A |
| 4 | usuario→agente | — |
| 5 | usuario→agente | — |
| 6 | usuario→agente | Compactar eventos 3-6 (superposición=1) en el resumen B |
Después de la invocación 6, el agente ve: [Summary B, event 6 overlap events, event 7+]
Notas
- El fallo de compactación no es fatal: el ejecutor registra una advertencia y continúa
- La compactación se ejecuta después de que se completa el flujo de invocaciones, no durante este
- El evento de compactación se conserva en el servicio de sesiones para garantizar su durabilidad
- Usa un modelo rápido y económico para la generación del resumen (p. ej.,
gemini-3.5-flash-lite)