December 11, 2023

Comment doter un LLM de mémoire ?

Maria Ibanez
Ingénieure IA, Universidad Politécnica de Madrid
11
December
2023

La mémoire est une caractéristique indispensable à n’importe quel chatbot ou agent conversationnel. Sans mémoire, il est impossible :

  • d’assurer la continuité d’une conversation : on ne peut pas envisager une discussion durant laquelle chaque nouvelle question nécessiterait de repréciser le contexte.
  • de corriger, d’affiner les résultats de la discussion : les utilisateurs réguliers de ChatGPT savent qu’on travaille souvent avec les agents conversationnels de manière incrémentale et progressive.

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.

Mémoire “court terme” vs mémoire “long terme”

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.

Différentes manières de traiter la mémoire

Mémoire brute

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.

Exemple de prompt avec mémoire simple

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.

Exemple de prompt avec mémoire glissante

Mémoire synthèse

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.

exemple de prompt avec mémoire synthèse

Deux difficultés se posent cependant :

  • Un calcul de la conversation qui a eu lieu jusque là doit être réalisé à chaque nouvelle étape, consommant temps et tokens.
  • L’estimation des éléments “importants” de la conversation n’est pas toujours aisée.

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.

exemple de prompt avec mémoire hybride

Formes de mémoire avancées

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 :

  • RAG on memory : pour les très longues mémoires, ou lorsqu’on traite des documents, on peut envisager de découper et vectoriser les éléments passés de la conversation. Ces éléments pourront ainsi être retrouvés rapidement, grâce à un processus de recherche vectorielle classique.
  • Compression syntaxique : on peut ne conserver que les éléments essentiels de chaque phrase, en les réduisant à des schémas Name + Verbe + Complément, pour réduire la taille de la mémoire.
  • Knowledge graph : on peut enfin stocker les relations entre les différents éléments ou entités, à l’aide d’une structure de graphe sémantique.

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.

Besoin d'accompagnement sur un projet en IA Générative

Covilla promise

Get unparalleled peace of mind from start to finish of your trip