Compactage du contexte
Lorsquâun agent ADK sâexĂ©cute, il accumule du contexte â messages utilisateur, rĂ©ponses des outils, contenu gĂ©nĂ©rĂ©. Ă mesure que ce contexte augmente, les temps de traitement de LLM augmentent, car davantage de donnĂ©es sont envoyĂ©es avec chaque requĂȘte. Le compactage du contexte remĂ©die Ă ce problĂšme en rĂ©sumant les Ă©vĂ©nements plus anciens selon une approche Ă fenĂȘtre glissante.
Fonctionnement
Le compactage du contexte utilise une fenĂȘtre glissante pour rĂ©sumer pĂ©riodiquement les anciens Ă©vĂ©nements de conversation au sein dâune session. Lorsque le nombre dâinvocations terminĂ©es atteint lâintervalle configurĂ©, le rĂ©sumeur compresse les anciens Ă©vĂ©nements en un seul Ă©vĂ©nement de rĂ©sumĂ©.
Invocations 1-3: [event1, event2, event3] â Summarized into "Summary A"
Invocations 4-6: [Summary A, event3, event4, event5, event6] â Summarized into "Summary B"
Le paramĂštre overlap_size contrĂŽle le nombre dâĂ©vĂ©nements de la fenĂȘtre prĂ©cĂ©dente reportĂ©s dans le rĂ©sumĂ© suivant, afin de prĂ©server la continuitĂ©.
Configuration
Ajoutez le compactage à la configuration de votre exécuteur :
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,
}),
})?;
ParamĂštres de configuration
| ParamĂštre | Type | Description |
|---|---|---|
compaction_interval | u32 | Nombre dâinvocations terminĂ©es qui dĂ©clenche la compaction |
overlap_size | u32 | ĂvĂ©nements de la fenĂȘtre prĂ©cĂ©dente inclus dans le rĂ©sumĂ© suivant |
summarizer | Arc<dyn BaseEventsSummarizer> | La stratégie de synthÚse |
Résumeur personnalisé
Vous pouvez personnaliser lâinvite de rĂ©sumĂ© :
let summarizer = LlmEventSummarizer::new(llm)
.with_prompt_template(
"Summarize this conversation focusing on action items \
and decisions:\n\n{conversation_history}"
);
Ou implémenter BaseEventsSummarizer pour un contrÎle 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!()
}
}
Impact de la compaction sur lâhistorique
Lorsque conversation_history() est appelé sur une session comportant des événements de compaction :
- LâĂ©vĂ©nement de compaction le plus rĂ©cent est identifiĂ©
- Son rĂ©sumĂ© remplace tous les Ă©vĂ©nements jusquâĂ la limite de compaction
- Seuls les événements postérieurs à la limite sont inclus individuellement
Cette opération est transparente pour les agents : ils reçoivent un historique de conversation cohérent qui comprend le résumé, suivi des événements récents.
Chronologie dâexemple
Avec compaction_interval: 3 et overlap_size: 1 :
| Invocation | ĂvĂ©nements | Action |
|---|---|---|
| 1 | utilisateurâagent | â |
| 2 | utilisateurâagent | â |
| 3 | utilisateurâagent | Regrouper les Ă©vĂ©nements 1 Ă 3 dans le rĂ©sumĂ© A |
| 4 | utilisateurâagent | â |
| 5 | utilisateurâagent | â |
| 6 | utilisateurâagent | Regrouper les Ă©vĂ©nements 3 Ă 6 (chevauchement=1) dans le rĂ©sumĂ© B |
AprĂšs lâinvocation 6, lâagent voit : [Summary B, event 6 overlap events, event 7+]
Notes
- LâĂ©chec de la compaction nâest pas fatal â le runner consigne un avertissement et continue
- La compaction sâexĂ©cute aprĂšs la fin du flux dâinvocations, et non pendant celui-ci
- LâĂ©vĂ©nement de compaction est conservĂ© dans le service de session pour assurer sa durabilitĂ©
- Utilisez un modÚle rapide et peu coûteux pour le résumé (par exemple,
gemini-3.5-flash-lite)