Construisez des pipelines de données robustes, scalables et prêts pour la production. Devenez un ingénieur data capable de concevoir, déployer et industrialiser des architectures modernes cloud & Big Data.
La gestion de l'historique des messages est un élément central dans le développement d'agents conversationnels avec LangChain. Une bonne structuration de l'historique permet d'offrir des réponses plus pertinentes, contextuelles et cohérentes, tout en optimisant l'utilisation des ressources. Dans cet article, nous décortiquons les principales fonctionnalités offertes par LangChain pour manipuler les messages et conserver un historique efficace.
Pourquoi gérer l'historique des messages ?
Un agent conversationnel s'appuie sur le contexte pour générer ses réponses. Ce contexte est généralement formé par l'historique des interactions entre l'utilisateur et le système. Sans mémoire ou gestion d'historique, chaque requête serait traitée comme une nouvelle conversation, rendant l'agent incapable de maintenir un fil logique.
LangChain fournit des outils puissants pour stocker, mettre à jour et manipuler cet historique, sous forme de "messages" standardisés.
Les types de messages dans LangChain
LangChain propose plusieurs types de messages pour structurer les échanges :
HumanMessage : représente les messages envoyés par l'utilisateur.
AIMessage : représente les réponses générées par le modèle.
SystemMessage : permet d'ajouter des instructions initiales au modèle.
FunctionMessage et ToolMessage : utiles pour l'interaction avec des fonctions ou outils externes.
Tous ces messages héritent de la classe BaseMessage, permettant une manipulation uniforme.
Création d'un historique
L'historique est typiquement une liste de messages. LangChain propose des classes comme ChatMessageHistory ou ConversationBufferMemory pour centraliser cette gestion.
Exemple de base :
python
Gestion de l'historique
En plus du stockage et de la conservation de l'historique, LangChain fournit des outils pour manipuler efficacement les listes de messages.
filter_messages
Cette fonction permet de filtrer les messages selon leur type, leur nom ou leur identifiant. C'est utile pour cibler uniquement certaines parties de l'historique, par exemple pour ne conserver que les messages utilisateurs :
python
trim_messages
La fonction trim_messages est utile pour tronquer un historique afin de respecter une limite de longueur (en tokens ou en nombre de messages). Cela est essentiel lorsqu'on souhaite éviter des dépassements de contexte avec un LLM.
Elle utilise un modèle LLM pour calculer le nombre de tokens consommés par chaque message et élimine progressivement les plus anciens (par défaut) jusqu'à ce que la limite soit respectée. Cette méthode garantit que le contexte fourni reste pertinent tout en tenant compte des contraintes du modèle. Il existe aussi de nombreux autres paramètres pour réduire votre historique de message :
python
Utilisation des mémoires
LangChain propose plusieurs types de mémoires pour conserver l'historique des messages dans un agent.
Voici un exemple complet illustrant l'utilisation d'une mémoire de type ConversationBufferMemory dans une chaîne LangChain :
python
Ce script montre comment une mémoire permet au modèle de se souvenir de la conversation précédente et de répondre de manière contextuelle.
LangChain propose plusieurs types de mémoires pour conserver l'historique des messages dans un agent. Chaque mémoire a ses spécificités et avantages selon le scénario visé.
ConversationBufferMemory
C'est la mémoire la plus simple : elle stocke tous les messages dans l'ordre.
python
ConversationBufferWindowMemory
Cette mémoire limite l'historique aux k derniers messages.
python
ConversationSummaryMemory
Résume l'historique pour n'en conserver que les points essentiels.
python
ConversationKGMemory
Construit un graphe de connaissances à partir de l'historique.
python
Intégration dans un agent LangChain
L'historique est généralement passé au moment de la création d'une chaîne ou d'un agent via le paramètre memory :
python
Bonnes pratiques pour la gestion de l'historique
Choisir le bon type de mémoire en fonction du cas d'usage : contextes longs, interactions simples, synthèse...
Nettoyer ou tronquer régulièrement l'historique pour éviter des coûts de traitement trop élevés.
Ajouter des SystemMessage pour guider le comportement du modèle en début d'interaction.
Exploiter les types avancés comme FunctionMessage pour intégrer des appels d'API.
Conclusion
LangChain offre une grande flexibilité pour la gestion des historiques conversationnels. En choisissant la bonne mémoire et en structurant judicieusement vos messages, vous pouvez créer des agents plus intelligents, plus cohérents et adaptés à vos besoins. N'hésitez pas à expérimenter les différents types de mémoire pour trouver la stratégie qui convient le mieux à votre application.
Vous hésitez encore ou avez besoin d'un accompagnement spécifique, notre équipe est à votre écoute
Partager avec
💙 Merci d'avoir parcouru l'article jusqu'à la fin !
Romain DE LA SOUCHÈRE - Lead Developer, Expert Cloud et DevOps
Ingénieur de formation avec plus de 11 ans d'expérience dans le développement back-end et le data engineering. Expert dans l’industrialisation des projets data dans le cloud.