Aller au contenu
Craft Solution Tech

Context Engineering : comment optimiser ce qu'on envoie à un LLM

La fenêtre de contexte ne peut pas tout contenir. Priorité par message, budget tokens, compression extractive et nettoyage : le pipeline qui choisit quoi garder.

8 min de lecture

Affiche : un ingénieur portant prompt, mémoire et outils marche vers un sablier nommé « fenêtre de contexte », tandis que des documents tombent dans le vide sous le mot « sélection stratégique ».
Tout ne rentre pas dans la fenêtre. Le context engineering, c'est décider de ce qui tombe.

Tu as un agent IA qui marche. Il a sa mémoire, ses outils, son prompt bien rédigé.

Mais à chaque appel, tu envoies tout. L'historique complet. Les consignes. Les résultats d'outils. Et ta facture explose.

Le context engineering, c'est l'art de choisir quoi envoyer au LLM et quoi sacrifier, quand la fenêtre de contexte ne peut pas tout contenir.

C'est le sujet dont tout le monde parle en 2025, et c'est probablement le skill le plus sous-estimé quand on build des agents IA.


Le principe : tout ne rentre pas

Un LLM a une fenêtre de contexte limitée. C'est le nombre maximum de tokens qu'il peut traiter en un seul appel.

Même avec 128 000 tokens (GPT-4o), ton prompt se remplit vite :

┌─────────────────────────────────────────┐
│        Fenêtre de contexte (100%)       │
│                                         │
│  ┌───────────────────────────────┐      │
│  │ System prompt + consignes     │ 15%  │
│  ├───────────────────────────────┤      │
│  │ Description des outils        │ 10%  │
│  ├───────────────────────────────┤      │
│  │ Historique des messages        │ 50%  │  ← le gros morceau
│  ├───────────────────────────────┤      │
│  │ Résultats d'outils (RAG, web) │ 15%  │
│  ├───────────────────────────────┤      │
│  │ Question + place réponse      │ 10%  │
│  └───────────────────────────────┘      │
└─────────────────────────────────────────┘

Quand ça déborde, tu as deux options :

  1. Ne rien faire : l'API tronque ou plante
  2. Choisir consciemment ce qui reste et ce qui part

Le context engineering, c'est l'option 2.


Étape 1 : Tout a une priorité

Tous les messages ne se valent pas. En context engineering, on assigne un poids à chaque type de message :

system      (poids 10)  →  "Qui tu es, tes règles"
developer   (poids 8)   →  "Comment répondre"
user        (poids 6)   →  "Ce que l'utilisateur demande"
assistant   (poids 4)   →  "Ce que tu as déjà répondu"

Le system prompt ne doit jamais être sacrifié. C'est lui qui définit le comportement de l'agent. Si tu le perds, le LLM oublie ses consignes, un bug classique en prod que presque tout le monde rencontre sur les conversations longues.

À l'inverse, les anciennes réponses de l'assistant sont les premières à sauter. Elles sont utiles pour le contexte, mais sacrifiables.


Étape 2 : Le budget tokens

Avant d'envoyer quoi que ce soit au LLM, tu comptes.

L'heuristique de base pour estimer les tokens :

1 token ≈ 4 caractères

"Bonjour, comment ça va ?" 
= 25 caractères 
≈ 7 tokens

C'est une approximation, mais elle suffit pour du budget management. En prod, tu utiliserais un tokenizer exact (comme tiktoken pour OpenAI), mais le principe reste le même.

Le workflow :

1. Compter les tokens de chaque message
2. Comparer au budget disponible
3. Si ça dépasse → sélectionner par priorité
4. Vérifier que ça rentre
5. Envoyer

L'algorithme de sélection est glouton (greedy) : tu tries les messages par score décroissant, tu les ajoutes un par un tant que le budget le permet, puis tu remets tout en ordre chronologique.


Étape 3 : Compresser sans LLM

C'est la partie la plus intéressante. Quand un bloc de texte est trop long, un résultat de recherche, un vieux résumé, un document, tu peux le compresser sans appeler de LLM.

Comment ? Avec de la compression extractive : tu scores chaque ligne du texte et tu gardes les meilleures.

Le scoring

Chaque ligne reçoit un score basé sur des signaux simples :

La ligne est un titre (# ou ** ou -) ?     → +2 points
La ligne contient un chiffre ?              → +1 point
La ligne contient un nom propre ?           → +1 point

Exemple concret

Un rapport de réunion de 12 lignes qu'on doit compresser à 5 :

# Rapport de réunion                          → score 2 (titre)
Introduction générale sur le projet            → score 0
- Objectifs atteints à 85%                     → score 3 (titre + chiffre)
Discussions diverses sur l'équipe              → score 0
- Budget de 150 000 euros alloué               → score 3 (titre + chiffre)
Commentaires généraux                          → score 0
# Décisions importantes                        → score 2 (titre)
- Lancement prévu le 15 mars 2025              → score 3 (titre + chiffre)
Autres remarques sans importance               → score 0
Marie Dubois sera responsable technique        → score 1 (nom propre)
- Budget supplémentaire de 25 000 euros        → score 3 (titre + chiffre)
Conclusion générale du rapport                 → score 0

Résultat après compression (les 5 meilleurs scores, remis en ordre) :

- Objectifs atteints à 85%
- Budget de 150 000 euros alloué
# Décisions importantes
- Lancement prévu le 15 mars 2025
- Budget supplémentaire de 25 000 euros

Les lignes "blabla" (introduction, commentaires, conclusion) ont été éliminées. Les lignes avec des chiffres, des titres et des noms ont survécu.

Pourquoi ne pas demander au LLM de résumer ?

Compression extractiveRésumé par LLM
Coût0, c'est du codeUn appel API payant
VitesseInstantané1 à 3 secondes
DéterminismeMême entrée = même sortie, toujoursPeut varier à chaque appel
FiabilitéCopie les lignes telles quelles, impossible d'hallucinerPeut déformer un chiffre ou un nom

En prod, tu veux que la couche de compression soit gratuite, rapide, et prévisible. Le LLM intervient après, sur un contexte déjà nettoyé.


Étape 4 : Nettoyer avant d'envoyer

Deux opérations de nettoyage que les gens oublient souvent :

Déduplication

Dans une longue conversation, le même message peut apparaître plusieurs fois (retry, bug côté client, boucle d'agent). Chaque doublon gaspille des tokens pour rien.

La règle : on parcourt les messages de la fin vers le début, et on garde uniquement la première occurrence (= la plus récente). Les doublons anciens disparaissent.

Traçabilité des citations

Quand un message cite une source (un lien Wikipédia, un document interne), les messages suivants qui n'ont pas de source héritent de cette citation.

Message 3 : "Selon wikipedia.org, le PIB est de..."  → source: wikipedia
Message 4 : "Donc le PIB par habitant serait..."      → pas de source
            → hérite de la source du message 3

C'est critique en entreprise. Quand un manager demande "d'où vient ce chiffre ?", tu veux pouvoir remonter la chaîne. Le context engineering inclut la provenance des informations, pas seulement leur contenu.


Le pipeline complet

Les étapes forment une chaîne. Voici l'ordre dans lequel le contexte est préparé avant chaque appel au LLM :

                    Conversation brute
                          │
                          ▼
               ┌─────────────────────┐
           1.  │  Composer le prompt  │  System + Developer + User
               └──────────┬──────────┘
                          ▼
               ┌─────────────────────┐
           2.  │  Sélectionner la    │  Rolling (récent)
               │  mémoire            │  + Episodic (important)
               └──────────┬──────────┘
                          ▼
               ┌─────────────────────┐
           3.  │  Nettoyer           │  Déduplication
               │                     │  + Citations
               │                     │  + Compression extractive
               └──────────┬──────────┘
                          ▼
               ┌─────────────────────┐
           4.  │  Packer sous budget │  Scoring + sélection gloutonne
               │                     │  + remise en ordre chrono
               └──────────┬──────────┘
                          ▼
                   Envoi au LLM ✅

Chaque étape réduit la taille du contexte tout en préservant la qualité de l'information. Le LLM ne reçoit que le nécessaire — propre, priorisé, dans le budget.


Le takeaway

Tu vas forcément perdre de l'info. La fenêtre de contexte est limitée, c'est une contrainte physique.

La vraie question n'est pas "comment tout garder ?" mais "est-ce que tu choisis consciemment quoi garder, ou tu laisses le LLM tronquer au hasard ?"

Le context engineering, c'est choisir. Et c'est souvent plus impactant que le choix du modèle lui-même.

Sujets abordés

  • IA
  • LLM
  • context engineering
  • agents
  • TypeScript

Dites-nous ce que vous cherchez à construire.

Nous écrire sur WhatsApp
Retour au blog