Tu codes avec l’IA ?
Outils, agents et nouveautés dev IA décryptés, chaque soir en 5 min. Gratuit.
Inclus dès l'inscription : notre sélection des meilleurs guides & comparatifs IA.
Choisis ton rythme
Gratuit · Pas de spam · Désabonnement en 1 clic
Les fenêtres de contexte : une mémoire trompeuse pour les agents IA
Les fenêtres de contexte dans les modèles d'intelligence artificielle, notamment ceux qui reposent sur des agents et des modèles de langage, sont souvent mal comprises. Elles sont comparables à un carnet de notes sans état, où chaque interaction commence à partir de zéro. Contrairement à une mémoire persistante, ces fenêtres ne conservent aucune information entre les appels API. Ainsi, même avec un historique de conversation dépassant les 200 000 tokens, l'agent ne se souvient pas des interactions précédentes. Chaque nouvelle requête nécessite une relecture complète de l'historique, ce qui peut entraîner des complications.
Les modèles d'IA, face à de longs prompts, se comportent souvent comme un étudiant qui ne prête attention qu'au début et à la fin d'un texte, négligeant les informations intermédiaires. Cela peut créer un effet boule de neige, où l'agent doit constamment relire l'ensemble de l'historique, incluant des détails souvent obsolètes. En termes de performance, cela peut provoquer un ralentissement, un effet de "gel cérébral", où le modèle met du temps à générer une réponse face à un texte volumineux.
Pour illustrer ce processus, considérons un appel API typique. Le modèle, ne conservant aucune mémoire entre les appels, doit recevoir l'intégralité des interactions précédentes pour répondre à une nouvelle question :
model.generate(
messages=[
{"role": "user", "content": "Étape 1 : Appelons cette variable `session_id`."},
{"role": "assistant", "content": "Compris, j'utiliserai `session_id` à partir de maintenant."},
# ... chaque intervention intermédiaire doit être renvoyée, à chaque fois ...
{"role": "user", "content": "Étape 47 : Quel nom de variable avons-nous convenu à l'étape 1 ?"}
]
)
La récupération : un outil pour une mémoire contextuelle
Les systèmes de génération augmentée par récupération (RAG) agissent comme une étagère bien organisée, permettant de récupérer des données pertinentes au moment opportun, de manière "Just-In-Time". Ces systèmes identifient les documents les plus pertinents pour une question donnée et les intègrent dans la fenêtre de contexte. Toutefois, la similarité vectorielle, utilisée pour déterminer la pertinence, ne garantit pas toujours la vérité sémantique.
Par exemple, si un utilisateur demande à déplacer une réunion à vendredi, puis mentionne qu'Alice est malade jeudi, un moteur de recherche vectoriel pourrait récupérer les deux informations, même si elles se contredisent. Un agent efficace doit être capable de discerner quelle information est la plus actuelle et pertinente. Un pipeline RAG naïf concatène simplement les informations récupérées, laissant le modèle deviner quelle instruction est valide. Un modèle plus sophistiqué résout ces contradictions avant la génération de la réponse, en privilégiant les informations les plus récentes :
retrieved_chunks = [
{"text": "Déplacer la réunion à vendredi", "timestamp": "2025-01-10T09:00:00"},
{"text": "Annuler jeudi, Alice est malade", "timestamp": "2025-01-12T14:30:00"}
]
# Réconcilier les morceaux contradictoires avant qu'ils n'atteignent le prompt
latest_relevant = max(retrieved_chunks, key=lambda chunk: chunk["timestamp"])
Cette approche permet à l'agent de fournir des réponses précises et à jour.
Compression : optimiser l'espace dans les fenêtres de contexte
La compression dans le contexte des agents IA est similaire à la compression de fichiers ZIP. Elle consiste à réduire la taille des données tout en préservant les informations essentielles. Cela permet de libérer de l'espace dans la fenêtre de contexte pour d'autres tâches. Des techniques comme la suppression des mots vides ou l'utilisation de modèles de compression spécifiques, tels que LLMLingua, sont employées pour cette optimisation.
Par exemple, une réponse API volumineuse de 15 000 tokens peut être compressée à 5 000 tokens, laissant ainsi plus de place pour le traitement des données principales :
raw_payload = json.dumps(large_api_response) # environ 15 000 tokens
compressed_payload = compress_with_llmlingua(
raw_payload,
target_token_count=5000
)
prompt = f"Données : {compressed_payload}\n\nRépondez à la question de l'utilisateur."
Cette méthode assure que les informations essentielles sont conservées, tout en réduisant leur empreinte dans la fenêtre de contexte.
Synthèse : une abstraction des données
La synthèse diffère de la compression en ce qu'elle remplace les données originales par une abstraction, un processus irréversible, un voyage à sens unique. Elle nécessite un stockage bifurqué, où les transcriptions brutes sont sauvegardées dans un stockage économique, comme des buckets S3, tandis que le résumé synthétisé est utilisé dans le prompt actif.
Ce modèle de stockage bifurqué se traduit par une double écriture : une pour le stockage froid et une pour le prompt actif :
def summarize_turn(raw_transcript, session_id, turn_id):
# 1. Persister la transcription brute, non abrégée, dans le stockage froid
s3_client.put_object(
Bucket="agent-transcripts",
Key=f"{session_id}/turn_{turn_id}.json",
Body=raw_transcript
)
# 2. Générer un résumé compact pour le prompt actif
summary = summarizer_model.generate(raw_transcript)
# 3. Seul le résumé réintègre la fenêtre de contexte
return summary
Si le détail original est requis ultérieurement, il peut être récupéré depuis le stockage froid. La synthèse, contrairement à la compression, ne nécessite pas de reconstruction à partir du prompt actif.
Vers une véritable persistance de mémoire
La persistance de mémoire dans les agents IA est souvent mal interprétée. Pour qu'un agent possède une véritable mémoire, il doit agir comme un gestionnaire de base de données, plutôt que comme une base de données elle-même. Par exemple, si un utilisateur mentionne que son chien s'appelle Goofy, mais qu'il pourrait être appelé Pluto, l'agent doit être capable de mettre à jour cette information de manière structurée :
{
"tool": "update_entity_graph",
"params": {
"subject": "User_Dog",
"attribute": "Name",
"value": "Goofy",
"notes": "Considérant Pluto comme un nouveau nom potentiel"
}
}
En adoptant cette approche, les agents IA peuvent gérer efficacement les informations et offrir une expérience utilisateur plus cohérente et fiable.
