La mémoire est une caractéristique indispensable à n’importe quel chatbot ou agent conversationnel. Sans mémoire, il est impossible :
Attribut indispensable donc, mais non évident, puisqu’il n’y a pas de solution “native” dans les modèles actuels. Il existe en fait différents “mécanismes” de gestion de la mémoire, en fonction des situations. Comme souvent, il n’y a pas de solution parfaite, plutôt une gamme de solutions à adapter selon la situation.
Précisons d’abord ce qu’on entend par “mémoire”. Un modèle de langage a une mémoire “long-terme”, c’est-à-dire une connaissance des données sur lesquelles il a été pré-entrainé. En ce sens, il dispose d’une “mémoire profonde”. Les modèles GPT disposent par exemple de bonnes connaissances historiques. Ils savent bien ce qui s’est passé le 11 novembre 1918, ou ce que c’est qu’une intégrale. Cette mémoire est native au modèle et intangible. Elle ne peut pas être modifiée (facilement…). On peut aussi ajouter de la “mémoire profonde” à un modèle en le fine-tunant (sur-entrainant) sur des informations supplémentaires.
La mémoire dont nous traitons ici est donc une mémoire “court-terme” ou “mémoire-vive”, c’est-à-dire qu'elle dure le temps d’une conversation.Un LLM n’ayant pas de “mémoire court-terme” à proprement parler, il faut donc en créer un équivalent.
La manière la plus simple de doter un modèle de langage d’une mémoire consiste à lui rappeler à chaque nouvelle question toute la discussion qui a eu lieu jusqu’alors. En bref, à chaque fois qu’on lui pose une nouvelle question, on inclut dans la question les éléments passés. Comme dans le jeu où on doit donner tous les mots qui ont été prononcés auparavant, avant d’ajouter le sien.
Cette méthode est très simple à utiliser et à mettre en place. Il suffit pour cela de mémoriser toutes les interactions passées pour les réinjecter dans le prompt.
Elle présente toutefois l’inconvénient de voir la taille des requêtes augmenter linéairement en fonction de la conversation.
Lorsque la discussion s’allonge trop, on peut alors travailler avec une “Sliding window” de mémoire, c’est-à-dire une mémoire qui oublie les questions-réponses qui sont trop amont dans la conversation. En ne retenant par exemple que la question précédente.
Une méthode plus sophistiquée consiste à garder en mémoire un résumé de la conversation passée. Ainsi, on réduit la taille du prompt total, tout en conservant les éléments essentiels. Cette méthode est particulièrement intéressante lorsque la conversation s’allonge, ou lorsque les questions sont répétitives.
Deux difficultés se posent cependant :
Une mémoire qui hybride la synthèse et la sliding window est aujourd’hui dans de nombreuses situations, celle qui nous parait la plus pertinente. Elle garde ainsi une mémoire précise des dernières questions de la conversation, et plus lointaine des éléments antérieurs, sans les oublier tout à fait.
Des formes beaucoup plus avancées peuvent être envisagées. Elles sont rarement utilisées, car plus lourdes à déployer ou nécessitant d’autres techniques. Nous les mentionnons toutefois pour illustrer l’espace des possibles :
Certaines de ces options existent dans les bibliothèques de manipulation de LLM, telles que LangChain. Les meilleurs systèmes étant cependant ceux qui sont parametrés sur-mesure…
N’hésitez pas à nous contacter pour un éclairage, ou pour mettre en place des chatbots non amnésiques.