Aller au contenu principal
Intermédiaire12 min

Module 6 — Observation masking et KV-cache


Objectif

À la fin de ce module, tu sauras masquer les outputs verbeux et structurer tes prompts pour maximiser le cache.


Observation masking

Principe

Remplacer les outputs d’outils verbeux par des références compactes une fois leur contenu traité. L’original reste récupérable si besoin.

Règles de masking

Situation Action
Output critique pour la tâche en cours Ne PAS masquer
Output des 3 derniers tours Ne PAS masquer
Output déjà résumé dans la conversation Masquer après 3+ tours
Output répété/dupliqué Masquer IMMÉDIATEMENT
Headers et footers boilerplate Masquer IMMÉDIATEMENT
Error output en cours de debug Ne PAS masquer

Format de référence masquée

[Obs:{ref_id} masqué. Clé: {summary}. Complet récupérable.]

Exemple :

[Obs:grep-001 masqué. Clé: 12 fichiers trouvés, 3 pertinents 
(auth.ts, middleware.ts, config.ts). Complet récupérable.]

Gains typiques

  • 60-80% de réduction sur les outputs masqués
  • <2% d’impact qualité
  • Latence quasi nulle

KV-cache optimization

Principe

Le KV-cache stocke les tenseurs Key/Value calculés pendant l’inférence. Quand des requêtes consécutives partagent un préfixe identique, les tenseurs sont réutilisés.

Gain : 50%+ de réduction de coût, 40%+ de réduction de latence sur les tokens cachés.

Ordonnancement optimal

# 1. System prompt (le plus stable — ne change jamais)
# 2. Tool definitions (stables entre requêtes)
# 3. Templates et few-shot réutilisés
# 4. Historique de conversation (partage le préfixe)
# 5. Requête actuelle et contenu dynamique (toujours à la fin)

Ce qui casse le cache

Changement Impact
Espace ou newline dans le system prompt Cache invalidé en aval
Timestamp dans le system prompt Cache miss à chaque jour
Compteur de session dans le prompt Cache miss à chaque requête
Réordonnancement des outils Cache invalidé

Règles pour un cache stable

  1. Épingler le system prompt comme string immuable
  2. Ne pas interpoler de timestamps, versions, ou IDs de session
  3. Déplacer les métadonnées dynamiques dans un message user séparé
  4. Diff byte-for-byte les templates de prompt entre déploiements

Budget et triggers

Allocation type

budgets:
  tool_outputs: 35%        # Souvent le plus gros poste
  message_history: 30%
  retrieved_documents: 20%
  reserved_buffer: 15%     # Marge pour nouveaux outputs

triggers:
  tool_outputs_over_budget: masquer les observations résolues
  total_context_over_70%: compacter l'historique
  retrievals_irrelevantes: resserrer le scope de recherche

Ordre d’optimisation

  1. KV-cache d’abord (pas de perte qualité, gain immédiat)
  2. Masking ensuite (largest capacity gain)
  3. Compaction ensuite (lossy, mais contrôlé)
  4. Partitioning en dernier recours (overhead de coordination)

Checklist de validation

  • Je masque les outputs verbeux après traitement
  • Je ne masque jamais les errors en cours de debug
  • Mon system prompt est immuable (pas de timestamps)
  • Les métadonnées dynamiques sont dans un message user séparé
  • J’ai un budget alloué par catégorie
  • Je connais l’ordre d’optimisation (cache → masking → compaction → partition)

Piège courant

Un espace dans le system prompt invalide tout le cache. → Même un seul whitespace ou newline de différence dans le préfixe invalide le KV-cache en aval. Diff tes templates byte-for-byte entre déploiements. Un changement de version dans le prompt = pic de coût 2-5x jusqu’à ce que le nouveau cache se réchauffe.


Prochaine étape

→ Module 7 (Subagents et partitionnement) pour splitter quand un seul contexte ne suffit plus