Kontextkomprimierung

Während ein ADK-Agent ausgeführt wird, sammelt er Kontext an – Benutzernachrichten, Toolantworten und generierte Inhalte. Mit zunehmendem Kontext verlängern sich die LLM-Verarbeitungszeiten, da bei jeder Anfrage mehr Daten gesendet werden. Die Kontextkomprimierung begegnet diesem Problem, indem ältere Ereignisse mithilfe eines gleitenden Fensteransatzes zusammengefasst werden.

Funktionsweise

Die Kontextkomprimierung verwendet ein gleitendes Fenster, um ältere Konversationsereignisse innerhalb einer Sitzung regelmäßig zusammenzufassen. Wenn die Anzahl der abgeschlossenen Aufrufe das konfigurierte Intervall erreicht, komprimiert die Zusammenfassung ältere Ereignisse zu einem einzelnen Zusammenfassungsereignis.

Invocations 1-3: [event1, event2, event3] → Summarized into "Summary A"
Invocations 4-6: [Summary A, event3, event4, event5, event6] → Summarized into "Summary B"

Der Parameter overlap_size steuert, wie viele Ereignisse aus dem vorherigen Fenster in die nächste Zusammenfassung übernommen werden, um die Kontinuität zu wahren.

Konfiguration

Fügen Sie die Komprimierung Ihrer Runner-Konfiguration hinzu:

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,
    }),
})?;

Konfigurationsparameter

ParameterTypBeschreibung
compaction_intervalu32Anzahl abgeschlossener Aufrufe, die die Komprimierung auslöst
overlap_sizeu32Ereignisse aus dem vorherigen Fenster, die in die nächste Zusammenfassung aufgenommen werden
summarizerArc<dyn BaseEventsSummarizer>Die Zusammenfassungsstrategie

Benutzerdefinierte Zusammenfassung

Sie können den Prompt für die Zusammenfassung anpassen:

let summarizer = LlmEventSummarizer::new(llm)
    .with_prompt_template(
        "Summarize this conversation focusing on action items \
         and decisions:\n\n{conversation_history}"
    );

Oder BaseEventsSummarizer implementieren, um die vollständige Kontrolle zu erhalten:

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!()
    }
}

Wie sich die Verdichtung auf den Verlauf auswirkt

Wenn conversation_history() für eine Sitzung mit Verdichtungsereignissen aufgerufen wird:

  1. Das aktuellste Verdichtungsereignis wird gefunden
  2. Seine Zusammenfassung ersetzt alle Ereignisse bis zur Verdichtungsgrenze
  3. Nur Ereignisse nach der Grenze werden einzeln einbezogen

Dies ist für Agenten transparent – sie erhalten einen kohärenten Gesprächsverlauf, der die Zusammenfassung gefolgt von den aktuellen Ereignissen enthält.

Beispielzeitachse

Mit compaction_interval: 3 und overlap_size: 1:

AufrufEreignisseAktion
1Benutzer→Agent
2Benutzer→Agent
3Benutzer→AgentEreignisse 1–3 in Zusammenfassung A zusammenfassen
4Benutzer→Agent
5Benutzer→Agent
6Benutzer→AgentEreignisse 3–6 (Überlappung=1) in Zusammenfassung B zusammenfassen

Nach Aufruf 6 sieht der Agent: [Summary B, event 6 overlap events, event 7+]

Hinweise

  • Ein Fehlschlag der Komprimierung ist nicht kritisch – der Runner protokolliert eine Warnung und fährt fort
  • Die Komprimierung wird ausgeführt, nachdem der Aufruf-Stream abgeschlossen ist, nicht währenddessen
  • Das Komprimierungsereignis wird zur dauerhaften Speicherung im Sitzungsdienst persistiert
  • Verwende ein schnelles, kostengünstiges Modell für die Zusammenfassung (z. B. gemini-3.5-flash-lite)
Kontextkomprimierung - ADK-Rust Dokumentation | ADK-Rust