Rendre l' IA accessible à tous

Mois : février 2024

Techniques d’ exploitation des modèles de langage

Un des points faibles des modèles actuellement disponibles sur le marché est qu’ ils ont été entraînés sur un ensemble de données publiquement accessibles qui ne va pas nécessairement suffire pour répondre à certains besoins spécifiques.

Prenons l’ exemple d’une entreprise qui possède un volume important de données propriétaires, qui utilise un vocabulaire hautement spécialisé ou encore qui utilise des formats de données spécifiques. Ces connaissances ne seront a priori pas intégrées dans un modèle généraliste car les données ne sont pas accessibles publiquement. Comment y remédier ? C’est ce que je voudrais exposer aujourd’ hui.

Il existe plusieurs techniques pour « enrichir » les connaissances du modèle. On trouve, par ordre de complexité croissante :

  • le prompt engineering;
  • la génération augmentée de récupération (RAG en Anglais);
  • l’ affinage du modèle (complet ou optimisé).

Ces techniques se retrouvent au milieu de la figure ci-dessous, entre les deux extrêmes du simple dialogue et de l’ entraînement complet :

Figure 1 : Techniques d’ exploitation des modèles de langage

C’est un sujet intéressant à couvrir maintenant car il complète bien mon précédent article sur les modèles locaux. En effet, certaines techniques comme l’ affinage s’ adressent principalement aux modèles open-source dont les paramètres sont librement disponibles.

Passons maintenant les différentes techniques en revue.

1. Le Prompt Engineering

Le Prompt engineering est un sujet que j’ai déjà traité dans un précédent article accessible ici.

Il comprend deux techniques élémentaires sous-jacentes : la première consiste à fournir suffisamment d’ informations contextuelles dans l’invite. Le modèle combinera alors l’ ensemble des informations en sa possession (ceux de l’ entraînement et ceux fournis dans l’invite) pour répondre à la question posée.

La seconde technique revient à inciter le modèle à suivre un raisonnement logique structuré. Les modèles de langage ayant été entraînés pour se conformer aux instructions de l’utilisateur, il est possible de leur demander de suivre un raisonnement pas à pas ou de fournir une série d’ exemples résolus pour mettre le modèle sur la bonne voie. Sans être une panacée, ces techniques ont déjà démontré leur efficacité.

Figure 2 : Le principe du Prompt Engineering

Une méthode amusante consiste à promettre une récompense financière au modèle s’ il répond correctement. Ajoutez simplement « Si tu réponds correctement, je te donnerai dix euros » à la fin de l’invite. Croyez-le ou non, cela semble fonctionner !

Le prompt engineering peut fournir une précision suffisante dans un certain nombre d’ applications. Son principal avantage est sa simplicité de mise en oeuvre, qui ne demande pas non plus de ressources de calcul supplémentaires.

Mais cette technique se heurte à la taille limitée des fenêtres de contexte des modèles de langage. Elle ne pourra donc pas s’appliquer lorque le volume d’ informations à transmettre est trop grand ou trop complexe à décrire dans le prompt. On risque alors de voir le modèle inventer les informations manquantes pour aboutir à des réponses incorrectes voire insensées (hallucinations).

2. La Génération Augmentée de Récupération (RAG)

L’ idée vous aura peut-être effleuré l’ esprit en lisant le point précédent : pourquoi ne pas combiner la technique du prompt engineering avec un engin de recherche indexant les données complémentaires ? On obtiendrait alors une invite « enrichie » par les éléments supplémentaires les plus significatifs, de manière automatisée et transparente pour l’utilisateur…

C’est ce que promet la Génération Augmentée de Récupération (Retrieval Augmented Generation ou RAG en Anglais). Voici la manière dont cette technique fonctionne :

  • Les informations supplémentaires sont découpées en blocs et chacun de ces blocs est indexé en fonction de son contenu. Ces index sont en général des vecteurs dont la position dans l’ espace dépend du contenu du bloc (indexation sémantique). Vous trouverez ici une introduction sur ce sujet;
  • L’ ensemble des index est placé dans une base de données vectorielle qui contient également la référence des blocs de texte indexés;
  • Lorsqu’ un utilisateur pose une question, le texte de la question est lui aussi indexé selon le même algorithme. Une recherche dans la base de données vectorielle permettra d’ identifier les blocs sémantiquement proches de l’ invite sur base de la proximité entre les vecteurs;
  • Ces blocs d’ informations sémantiquement proches sont concaténés à l’ invite d’origine en tant que contexte additionnel;
  • L’ invite enrichie du contexte additionnel est envoyée au modèle de langage pour réponse.
Figure 3 : Le principe de la Récupération Augmentée de Génération (RAG)

Cette technique présente un certain nombre d’ avantages. Imaginez un ensemble typique d’ informations propriétaires générées par une entreprise : bases de données, documents pdf, fichiers excel, flux d’ actualités, minutes de réunion….. L’ ensemble de ces données pourra être découpé, indexé sémantiquement et introduit dans la base de données vectorielle. Et il est assez aisé de continuer à enrichir régulièrement la base de données vectorielles pour s’ assurer que les informations restent à jour.

Le second grand avantage est qu’ il n’ est pas nécessaire de modifier le modèle de langage en tant que tel. Tout dépend bien sûr de l’ efficacité du mécanisme d’ indexation sémantique, mais après 25 ans d’existence d’ engins de recherche sur Internet, ces techniques sont matures.

Qui plus est, une librairie de programmation comme Langchain contient l’ ensemble des fonctionnalités nécessaires pour orchestrer l’ interaction avec la base de données vectorielle et le modèle de langage. Cette librairie supporte notamment une centaine de formats de fichier pour nourrir la base de connaissances.

Le prix à payer est une plus grande complexité de l’ architecture informatique. Il faut intégrer et combiner plusieurs éléments d’ infrastructure. Et si une base de données vectorielle dans le cloud comme Pinecone est utilisée, il faut aussi prendre en compte les risques de confidentialité qui vont avec.

Enfin, l’ enrichichissement du contexte se faisant de manière ponctuelle et ciblée, cette technique n’est pas appropriée si vous visez à spécialiser un modèle de langage dans un domaine complexe comme la médecine ou la finance.

Dans ce cas, il vaut mieux affiner le modèle. C’est ce que nous allons voir maintenant.

3. L’ affinage des modèles

L’ affinage d’un modèle est un processus au cours duquel un modèle déjà préentraîné subit un entraînement supplémentaire sur un ensemble de données spécifique. Il permet de capitaliser sur la connaissance déjà intégrée lors de l’ entraînement initial, en renforçant la compétence du modèle dans un domaine spécifique en contrepartie d’ un investissement raisonnable en ressources informatiques.

Cette technique est importante car l’ entraînement initial d’un modèle requiert des ressources énormes, ce qui le rend hors de portée de la pluart des organisations.

Il est possible de réduire encore plus le besoin en puissance en recourant à des techniques avancées d’ affinage comme LoRA (Low-Rank Adaptation). Cette méthode introduite début 2023 réduit considérablement le nombre de paramètres à entraîner au prix d’une faible dégradation en qualité.

Figure 4 : Le principe de l’ affinage complet et optimisé

Vous devrez disposer d’un jeu de données suffisant pour l’ entraînement complémentaire. Si vous cherchez à approfondir l’ expertise du modèle dans un domaine spécifique vous pouvez commencer par utiliser tous les documents de référence sur le sujet dont vous disposez.

De plus, vous pouvez améliorer le type de réponse du modèle en ajoutant au données d’ entraînement un ensemble d’ invites (prompts) et de leurs réponses. Ce jeu de données peut avoir été généré manuellement ou via un modèle de langage « haut de gamme » comme GPT4.

Quoi qu’ il en soit, l’ affinage reste une technique plus complexe, qui requiert une expertise suffisante en IA pour constituer le jeu de données, mettre en place l’ algorithme d’ entraînement du modèle et ensuite évaluer les performances du modèle modifié. Cette approche nécessite aussi l’ accès à une puissance de calcul significative.

Un point faible de cette approche par rapport à la Génération Augmentée de Récupération est qu’ il est nettement plus difficile d’ introduire de nouvelles informations dans le modèle : il faut repasser par une phase d’ entraînement avec tous les efforts qu’ elle implique.

Une autre contrainte de cette approche est que pour pouvoir modifier un modèle, il faut disposer de ses paramètres. Et donc en pratique, seuls les modèles open-source comme Llama2 ou Mistral se prêtent à ce genre d’ exercice.

Enfin, il faut noter que des versions déjà affinées de modèles de langage open-source comme Llama sont disponibles sur Internet, pour certains domaines particuliers comme la programmation. Utiliser un tel modèle peut aussi être une solution…

4. Réflexions

L’ exploitation avancée de modèles de langage décrite ci-dessus est en progression rapide. Tant les techniques d’affinage « optimisées » que les algorithmes de recherche sémantiques et les bases de données vectorielles de la RAG font des progrès constants.

Des techniques comme le RAG ou l’ affinage sont trop lourdes pour une utilisation privée, mais constituent une solution intéressante pour des entreprises. La disponibilité de modèles open-source combinée à ces techniques offre une grande souplesse de déploiement aux organisations désireuses d’ exploiter les modèles de langage au mieux de leurs capacités.

Et la possibilité de faire fonctionner l’ ensemble « en interne » offre une réponse élégante aux soucis de confidentialité qui freinent de nombreuses organisations.

5. Notes et références

Les modèles génératifs locaux

Introduction

Si 2023 a été dominée par les modèles mis à disposition dans le cloud comme chatGPT ou Claude, cette approche pourrait fort bien évoluer cette année. Ceci est dû aux progrès rapides des modèles open-source, qui réduisent progressivement l’ écart avec les modèles propriétaires. Ces modèles open-source rendent possible l’ exécution locale de modèles, ce qui offre de nouvelles perspectives que je vais exposer dans cet article.

J’ ai déjà publié une analyse générale des avantages et inconvénients des modèles open-source ici, ainsi qu’une présentation de la start-up française Mistral (ici). Cet article présente les choses d’ un point de vue plus pratique : quels sont les élements à prendre en compte lors du choix et de l’ installation d’ un modèle local, et comment l’ exploiter ensuite.

1. Identifier et choisir un modèle local

La première question est de déterminer les cas d’ utilisation de modèles génératifs qui sont pertinents pour vous. Vous pourrez alors vous orienter vers un modèle répondant à vos besoins. Pour cela, vous pourrez vous baser sur différents indicateurs de performance qui sont publiés régulièrement pour tous les modèles disponibles.

Vous trouverez ici un tableau de bord reprenant une série représentative d’indicateurs de performance. Ce tableau de bord est remis à jour très régulièrement. Etudions-le un peu plus en détail.

Figure 1 : Le LMSYS Chatbot Arena sur Huggingface

Voyons tout d’ abord comment interpréter les différents indicateurs de performance mentionnés:

  • Arena Elo : Il s’ agit d’ un système de classement comparable aux points Elo utilisé par les joueurs d’ échecs. Un être humain pose une question et la réponse de deux modèles choisis au hasard lui est présentée en retour. L’ humain choisit la meilleure réponse (le gagnant), et les points Elo des deux modèles sont mis à jour en conséquence. Le système compte à ce jour plus de 200.000 affrontements entre modèles…
  • MT-bench : Ce test est basé sur une série de 80 dialogues standardisés couvrant huit domaines (10 questions par domaine) : rédaction, incarnation de rôle, extraction d’ information, raisonnement, mathématiques, programmation, sciences naturelles et sciences humaines. Chaque dialogue consiste en plusieurs questions successives sur le même sujet. Une fois le dialogue terminé, GPT4 évalue la qualité de la réponse et lui attribue un score.
  • MMLU : Cet indicateur utilise un grand nombre de questions à choix multiples choisies parmi 57 catégories couvrant l’ essentiel du savoir humain. L’ avantage d’ un QCM est que l’ évaluation de la réponse est immédiate et sans ambiguité.

Et si la programmation est votre cas d’ utilisation principal, il existe un indicateur spécialisé HumanEval qui évalue l’ aptitude à la programmation à travers 164 tests. Vous pouvez accéder à un tableau de bord pour HumanEval ici :

Figure 2 : Un tableau de bord HumanEval (credit : KLU.ai)

En règle générale, au plus le modèle compte de paramètres, au plus les réponses du modèle seront riches et précises, mais au plus de ressources son exploitation nécessitera. Beaucoup de modèles étant disponibles en plusieurs tailles, c’est un paramètre sur lequel vous pouvez jouer dans une seconde étape si vous vous rendez compte que le modèle est trop imprécis ou trop gourmand en ressources. Il faudra tenir compte de certaines contraintes: la mémoire de votre machine limitera la taille des modèles qui pourront fonctionner dessus, alors que la performance dépendra surtout du ou des processeurs disponibles (CPU ou GPU).

Autre point : certains modèles ont été affinés pour exceller dans un domaine particulier (la création artistique, la programmation, le domaine médical…). Si vous pouvez mettre la main sur un modèle affiné dans le domaine qui vous intéresse, utilisez-le en priorité car il a toutes les changes de présenter une meilleure efficacité relative qu’ un modèle généraliste de même taille. Par exemple, si c’ est la programmation qui vous intéresse, orientez-vers WizardCoder, Magicoder ou CodeLlama

Vous pouvez aussi affiner vous-même un modèle open-source généraliste pour le faire approcher au plus près de votre cas d’ utilisation. C’est une approche plus complexe, dont je parlerai dans un article futur.

Enfin, pensez toujours à vérifier les conditions de licence pour voir si cette dernière est compatible avec l’ utilisation que vous envisagez. Les modèles de langage sont souvent publiés sous des licences open-source modifiées contenant certaines restrictions d’ utilisation…

2. Installer un programme d’ exploitation et télécharger le modèle

L’ heure est maintenant venue d’ installer un moteur d’ exploitation sur votre ordinateur. En voici trois, tous gratuits :

Vous trouverez quelques bonnes vidéos explicatives des mécanismes d’ installation et d’ utilisation de ces programmes dans la partie « Références » ci-dessous. Ces programmes contiennent une fonctionnalité intégrée de recherche et d’ installation des modèles. Le téléchargement manuel du modèle depuis un site comme HuggingFace n’ est donc en général pas nécessaire.

Prenons l’ exemple de Ollama qui est extrêmement facile à utiliser. Une fois l’ application installée sur votre machine, vous pouvez aller voir la liste des modèles disponibles ici :

Figure 3 : Liste des modèles Ollama disponibles)

Il suffit ensuite de demander le lancement d’ un modèle via la commande ollama run *model*. Ollama téléchargera d’ abord le modèle si ce dernier n’ est pas déjà présent localement, puis ouvrira une session de dialogue interactif. Tapez /bye pour arrêter la session interactive.

Quelques autres commandes :

  • Ollama list : fournit la liste des modèles disponibles localement.
  • Ollama pull *model* : installe un modèle sans lancer l’ exécution.
  • Ollama rm *model* : supprime le modèle local.

Difficile de faire plus simple…

3. Exploiter un modèle local

Premier cas d’ utilisation, le plus évident : la conversation avec le modèle. Les applications décrites au point précédent offrent cette fonctionnalité sans besoin d’ installations supplémentaires.

Le second cas d’ utilisation que je voudrais présenter est l’ assistant de programmation intégré dans un environnement de développement (IDE). Je vais prendre comme example un des environnements les plus répandus: Microsoft VSCode.

Il existe des extensions pour VSCode comme Continue et Cody qui fournissent une fonction d’ assistance en interagissant avec un modèle de langage. Pour interagir avec un modèle cloud, il faudra configurer le modèle désiré et la clé d’accès. Pour un modèle local, il suffit de spécifier l’ application (Ollama ou autre) et le modèle à utiliser. C’est tout.

Par exemple, voici Continue utilisant le modèle Mistral7B via Ollama sur mon iMac :

Figure 4 : Intégration de VSCode et Mistral7B via l’ extension Continue

Enfin, troisième cas d’utilisation, l’ accès direct aux modèles locaux via un programme informatique. Ici aussi, c’ est facile : la présence d’ interfaces de programmation sur les applications les rend facilement intégrables dans des processus informatisés internes. Par exemple, Ollama offre un point d’entrée REST accessible sur le port 11434 dont la documentation est accessible ici. Et depuis peu, une librairie ollama-python est disponible ce qui simplifie encore plus les choses.

4. Réflexions

Avec les applications actuelles, l’ utilisation de modèles locaux est devenue très aisée. Les progrès rapides des modèles open-source en font une option très intéressante qui résout un certain nombre de désavantages des modèles propriétaires dans le cloud. Ces modèles n’ atteignent pas encore les performances des meilleurs modèles propriétaires comme GPT-4, mais la disponibilité prochaine de Llama 3 et les progrès rapides de Mistral permettent d’ être optimistes.

Si les modèles locaux sont opérationnels dès aujourd’hui, 2024 devrait voir l’ émergence de modèles fonctionnant sur smartphone. Internet bruisse de rumeurs selon lesquelles Apple se préparerait à lancer une nouvelle version de Siri basée sur un modèle génératif pouvant piloter certaines applications du téléphone. Samsung, de son côté a développé un modèle de langage appelé Gauss destiné à être intégré sur ses téléphones dans un avenir proche…

5. Notes et références