GPT, le Game changer

Doc d’Azur2

Géraldine Geoffroy1

2023-06-11

Ce billet exploratoire est le fruit d’un ensemble d’éléments et d’évènements qui ont fait converger mon intérêt sur les récents développements autour de l’IA et de GPT : l’accroissement très notable de la remontée d’articles sur le sujet au cours ma veille technique, la préparation d’une intervention dans un colloque dédié à ChatGPT à la faculté de Médecine d’Université Côte d’Azur (voir la présentation), des questionnements personnels sur l’inéluctable l’intégration à terme d’assistants IA dans nos outils métiers etc… A ce jour, s’il nous est déjà arrivé de ponctuellement mettre en oeuvre au SCD quelques briques de Machine Learning dans certains de nos pipelines de données, nous ne recourons pas (encore) de manière systématisé aux modèles de langages type GPT, et par ailleurs les formes que prendront ces intégrations sont tout sauf prévisibles… mais autant déjà comprendre de quoi il retourne, et être prêts !

A vrai dire “GPT” dans le titre est employé pour l’accroche mais le terme plus approprié serait LLMs, l’acronyme de Large Language Models, qui désigne la famille de ces nouveaux modèles de traitement du langage à base de réseaux de neurones artificiels dont fait partie GPT.

Le contexte

A l’origine du buzz médiatique qui a plongé GPT dans le débat public, mettant en lumière quasiment d’un jour à l’autre les étonnantes capacités de ces nouveaux modèles, la mise en ligne de l’agent conversationnel ChatGPT a eu, dans un même mouvement, la vertu de démocratiser l’accès utilisateur à cette nouvelle technologie, tout en générant un ensemble de malentendus et mauvaises compréhensions sur sa nature et ses potentalités.

GPT, qui signifie Generative Pre-trained Transformer (et en fait tout est dit dans ces trois mots), n’est ni une encyclopédie universelle, ni un assistant de recherche fiable tel quel ni un fact checker (par construction son application conversationnelle ChatGPT serait même plutôt l’inverse, un fact maker !). GPT est “juste” un modèle, un objet mathématique complexe déployé sur des serveurs de calcul à grande échelle qui en démultiplient la puissance. Il fait ainsi partie de la famille des LLMs qui s’appuient sur des réseaux de neurones artificiels à plusieurs milliards de paramètres et entraînés sur des corpus textuels gigantesques, dont le principal objet consiste à capter la sémantique dans le langage naturel et à générer de nouveaux contenus.

GPT n’est ni le premier ni le seul de ces LLMs. Pour qui s’intéresse au sujet (qui restait jusqu’à il y a quelques mois confiné dans la sphère des chercheurs et spécialistes du NLP), la famille des langages BERT de Google ou encore le modèle multilingue BLOOM créé par un consortium international de scientifiques étaient déjà accessibles en open source. Par ailleurs GPT n’est pas le seul modèle créé par OpenAI, plusieurs autres et parfois plus anciens modèles programmés pour des tâches spécifiques (Davinci pour le texte, Codex pour le code, DALL-E pour les images…) sont aussi disponibles même s’ils sont pour certains maintenant dépreciés. Enfin la communauté académique plutôt investie dans l’open source est également très active pour mettre à disposition de tous des grands modèles de langage qui pour certains d’entre eux (Alpaca, Vicuna, StartCoder,Open-Assistant…) commencent à sérieusement concurrencer les performances des modèles propriétaires d’OpenAI. Sans compter sur le recours à l’open sourcing comme outil de stratégie concurrentielle de différentiation à l’image du modèle LLaMA développé et ouvert par Meta…

Bref, si pour l’instant le modèle “star” GPT reste relativement fermé en mode boite noire, le consensus existe dans la communauté des chercheurs sur la nécessaire transparence et ouverture des modèles d’IA (https://www.nature.com/articles/d41586-023-01295-4), pour des raisons autant éthiques et déontologiques que liées aux vertus de l’open source pour la diffusion des connaissances. D’autant que l’infrastructure adéquate pour l’ouverture, la documentation, la reproductibilité, bref la FAIRisation de ces modèles et de leurs données d’entraînement, existe déjà via la plateforme de dépôt et de diffusion Hugging Face. Cet entrepôt de modèles, de datasets et de code, qui se positionne comme le Github de l’IA, facilite également la réutilisation des modèles qui y sont archivés par un système d’API d’inférence qui permet d’utiliser un modèle à distance (en mode remote) et de l’appliquer sur ses propres données par une simple requête GET.

La théorie

Au coeur de ces modèles NLP de nouvelle génération, on trouve les concepts de Transformers, d’embeddings et d’attention, développés par des chercheurs de Google et de l’Université de Toronto qui ont communiqué sur leurs travaux dans l’article fondateur de 2017.

Un transformer est un type d’architecture de réseau de neurones qui dépasse les limites des précédents réseaux neuronaux appliqués au Natural Language Processing (NLP), à savoir en gros la séquentialité et la non-parallélisation, en s’appuyant sur le mécanisme dit de l’attention . Par attention, on entend la prise en compte par le modèle non pas des seuls mots adjacents pour un mot donné mais de l’ensemble du contexte (de la séquence de mots) en encodant la position de chacun d’entre eux. Entraîné sur de grandes quantités d’exemples de phrases, ce dispositif permet au réseau de neurone d’élaborer une représentation interne des données qui capte les relations et interdépendances entre chaque occurrence de chaque mot, ce qui se traduit par la capacité à apprendre statistiquement les associations entre mots et séquences de mots (parmi ces types d’association se trouvent donc la grammaire, la sémantique etc…). Pour être employés concrètement dans un traitement statistique qui par définition ne travaille que des nombres réels, les modèles basés sur les transformers sont fournis sous forme d’embeddings, c’est-à dire de représentations numériques vectorielles de leur ensemble d’apprentissage qui, projetées géométriquement, forment un espace multi-dimensionel de très grande dimension. Ainsi les distances euclidiennes et les directions entre vecteurs permettent de calculer les similarités et dissimilarités entre chaque portion de texte elle-même représentée par son propre jeu de coordonnées “sémantiques”.

Expected vector space embeddings of three analogical sentence pairs from a hypothetical LLM that captures sentence analogies accurately.

Source : Wijesiriwardene, Thilini & Wickramarachchi, Ruwan & Gajera, Bimal & Gowaikar, Shreeyash & Gupta, Chandan & Chadha, Aman & Reganti, Aishwarya & Sheth, Amit & Das, Amitava. (2023). ANALOGICAL -A New Benchmark for Analogy of Long Text for Large Language Models.

Chaque input en langage naturel passé en entrée d’un LLM est donc à son tour encodé numériquement en fonction du modèle choisi puis projeté dans l’espace vectoriel, afin que l’output soit généré par calcul de proximité avec les vecteurs voisins. La “taille” de ce voisinage porte le nom de fenêtre de contexte et détermine la précision de la réponse du modèle (ce paramètre est appelé “temperature” dans les API qui permettent de travailler par inférence avec ces modèles : réglé à O, il conditionne une réponse purement déterministe, et au contraire paramétré à 1 autorise de l’aléa, de la “créativité” dans la réponse). En résumé, l’innovation des LLMs en regard des anciens algorithmes de NLP tient dans l’extension des performances d’encodage de l’information (exit les logiques type “bags of words” par exemple) couplées en sortie à de nouvelles capacités de décodage permettant des processus génératifs. Pour être complet dans ce rapide donc très grossier panorama des LLMs et de GPT en particulier, il faut enfin différencier le modèle liguistique GPT du modèle conversationnel ChatGPT : le deuxième est un dérivé du premier, régulé et affiné par des phases intermédiaires de Reinforcement Learning by Human Feedbackqui consistent à perfectionner le modèle grâce à des exemples d’inputs-outputs labelisés manuellement afin de compenser un comportement natif parfois erratique.

Sous le capot de GPT donc, point d’intelligence au sens d’expression d’une volonté, d’émotions, d’esprit critique, d’expérience sensible ou de compréhension cognitive de la signification des mots qu’il encode et décode, mais un algorithme statistique génératif capable de calculer à la suite de chaque chaîne de texte le mot le plus probable en fonction de ce qu’il a appris. La position dans l’espace de la fenêtre de contexte dépendant fortement de l’input (le texte en entrée, la question posée), l’output (la réponse) qui va en découler est donc facile à mettre en défaut dans l’interface publique ChatGPT d’OpenAI : ChatGPT bien sûr fournit des informations fiables (fiabilisées d’après son corpus d’entraînement) , mais par construction créé aussi des “hallucinations” puisque la génération purement statistique de texte qui fait sens grammaticalement ne peut être gage ni de vérité ni de référence au “réel”.

Mais là n’est sans doute pas le point central, certes ChatGPT peut halluciner et générer du malentendu quand on l’utilise pour autre chose que ce pour quoi il est programmé, mais GPT et les LLMs en général ont surtout entrouvert la porte sur la possibilité de nouveaux process et de nouveaux outils dont on peine aujourd’hui à mesurer la profondeur de l’impact dans nos processus métiers ou tout simplement notre vie courante.

La pratique

Le modèle GPT est livré avec tout en ensemble d’API plutôt richement documentée doublé d’un bac à sable qui permettent, moyennement l’obtention d’une clé d’API et d’un coût calculé sur l’usage des API, d’interagir très simplement avec le modèle avec quelques lignes de codes, et donc d’envisager des cas d’usage personnalisés s’appuyant sur toutes les fonctionnalités de traitement du langage naturel permises par GPT : résumés de textes, génération de textes, chatbot portant sur un contexte précis, traduction multilingues, moteur de recherche sémantique, génération et documentation de code, reconnaissance d’entités nommées….

En d’autres termes, l’environnement de développement existe pour “s’extraire” de ChatGPT et adapter GPT pour ses propres besoins, ses propres contenus, ses propres données, et ce dans des applications web, des extensions de navigateurs, des logiciels, des bookmarklets …Le Game changer se situe sans doute à ce niveau-là, à savoir la possibilité de réutilisation du modèle pré-entrainé en l’appliquant à son propre contexte . D’ailleurs l’écosystème des frameworks, outils et applications en ligne basés sur GPT connait une expansion exponentielle, presque chaque jour voit apparaitre une nouvelle application en ligne, une nouvelle extension de navigateur, voire un nouveau langage développant une couche d’abstraction supplémentaire autour du modèle qui en repoussent les limites des usages possibles.

Néanmoins dans cette effervescence, et pour qui veut lui aussi se lancer dans le développement avec GPT, un standard d’outils semble émerger, basé d’une part sur le framework open source LangChain qui met à disposition (en Javascript en et en Python) des composants LLM prêts à l’emploi, et d’autre part sur le framework python Streamlit pour l’interfaçage rapide dans des applications web simples.

A noter le niveau d’abstraction suplémentaire induit par le développement d’applications basés sur les LLMs car il ne s’agit plus de coder la fonction qui va réaliser une opération mais d’utiliser le code du composant par lequel on va indiquer en langage naturel au modèle quelle opération réaliser. D’une certaine manière, la technicité se déporte de la production du code nécessaire à la réalisation de l’opération vers le choix du bon modèle de langage et du composant adéquat, ainsi que de la qualité du prompt (de l’invite) qui demande au LLM de réaliser cette opération.

Les exemples qui suivent illustrent quelques une des pistes d’exploitation de GPT qui mettent en oeuvre des niveaux d’abstraction de plus en plus élevés, jusqu’à aller aux tout récents systèmes auto-génératifs et itératifs de “nouvelle génération” qui permettent (en théorie) de confier l’intégralité de la réalisation d’un projet à un LLM.

Les trois premiers exemples sont replicables dans une application développée pour l’occasion et disponible sur le Cloud Streamlit à cette adresse : https://gegedenice-streamlitcloud-gpt-experimentations-about-y7jwfv.streamlit.app/

Créer un Chatbot personnalisé

En réalité, pour développer un chatbot centré sur une base de connaissance spécifique en utilisant des composants LangChain, il suffit seulement de quelques lignes de codes pour, dans l’ordre :

L’ensemble de ces opérations forme une chaîne, facilement intégrable dans une application Streamlit avec seulement quelques lignes de code ! Voici en output un exemple de “dialogue” avec le bot à propos de ce mode d’emploi en PDF préalablement uploadé dans l’application (il s’agit d’une documentation pour un outil d’interrogation de Scopus et SciVal produit par Elsevier)

Le même procédé est évidemment réplicable sur à peu près n’importe quelles données textuelles : une documentation interne type wiki, un ensemble de textes intégraux de publications, le contenu d’un site web…

Créer une interface pour le résumé multilingue de texte

Le deuxième exemple, qui s’appuie sur un autre type de chainage ayant pour but d’obtenir des résumés de textes en différentes langues, montre l’importance du prompt et des modèles de prompt dans la construction de l’invite de commande proposée au modèle. En gros le prompt sert à indiquer en langage naturel les consignes qui acompagnent la requête utilisateur afin de guider et “border” la réponse de l’IA pour un maximum de précision et de pertinence.

Dans le cas qui nous occupe, voici un exemple de prompt qui intègre des variables liées à la langue et au nombre de mots attendus en retour

template = """
    Write a summary og the following text:
    {text}
    Your abstract must not exceed {max_words} words and must be written in {language}
    """

Et en résultat quand je demande un résumé en 128 mots et en anglais du premier paragraphe de ce trop long billet

Il y a quelques mois, réaliser une telle interface aurait nécessité le recours en back office à de multiples techniques NLP de nettoyage de données (suppression des mots vides et des caractères spéciaux, tokenisation, lemmatisation…), d’extraction d’information selon une méthode classique (TextRank) ou basée sur un réseau de neurones (Seq2Seq), d’évaluation de la stratégie choisie etc… Bref tout un arsenal bien compliqué alors qu’avec un LLM et les wrappers Langchain, le développement se résume à créer les embeddings d’un texte, choisir la classe à appliquer et paramétrer le prompt indiquant clairement au modèle quoi faire, avec juste quelques lignes de code.

Faire de l’exploration de données structurées en langage naturel

Avec les mêmes logiques appliquées à des données structurées, en utilisant la classe d’agent Langchain appropriée ainsi qu’un prompt précis, on peut de même interroger et explorer des données en langage naturel. Voici le prompt

prompt = (
"""
You are a assistant agent for data analysis.

Answer the best you can to the query below,
and if you don't know just reply that you don't know.

If your response is a text, use the st.success() function.
Example : st.success("your answer")

If the query requires to plot a chart, use the plotly.express library to draw the chart 
and reply with the st.plotly_chart() function.  
Example : st.plotly_chart(chart)

Below is the query. 
Query:  
"""
+ query
)

et le résultat de quelques questions sur un échantillon de nos données de publications avec APC

Au passage, on notera qu’il n’est même pas nécessaire d’expliciter les données en les documentant ou avec un schéma de données pour que le modèle les “comprennent” sur la base des libellés de colonnes !

Mais la force du truc…

… C’est la notion d’agent que nous venons d’évoquer et qui mérite quelques éclaircissements, puique grâce à elle on peut encore monter d’un cran dans la complexité des tâches à confier au modèle.

En effet, un niveau d’abstraction fondamental proposé par la librarie LangChain tient dans les concepts d’agents (agents) et d’outils (tools) ou ensemble d’outils (toolkits). Un agent s’appuie sur le moteur de raisonnement implicte au modèle pour décider de manière autonome quelle action réaliser à partir de l’input de l’utilisateur, et surtout la réalise concrètement, de surcroît en phasant successivement les tâches intermédiaires à accomplir. Il dispose pour cela de plusieurs tools et toolkits, qui sont par exemple des fonctions de récupération d’informations depuis Google (ou Bing, ou DuckDuckGo), de données de publications depuis Arxiv, de requêtage d’API, d’interaction avec le système de fichier local, d’exécution de code Python etc…

A noter en complément qu’en plus des tools proposés par LangChain pour permettre l’interaction du modèle avec le monde extérieur, il est bien évidemment possible de programmer son propre tool, pour par exemple (je dis ça je ne dis rien) “brancher” un LLM sur un SIGB…

Pour résumer, il s’agit de programmer le modèle pour qu’il raisonne et agisse de manière autonome afin d’atteindre un objectif “à long terme” en réfléchissant aux sous-tâches, en planifiant les mesures à prendre, et en exécutant à l’aide d’outils externes les tâches successives qu’il aura identifiées. Ce type de développements s’appuient principalement à la fois sur LangChain et sur le framework ReAct (Reasoning + Acting).

Certains agents sont déjà pré-construits et prêts à l’emploi, tels qu’un agent capable de manipuler des dataframes pandas (comme dans l’exemple précédent), d’interagir avec PowerBI, des bases de données SQL, ou encore des endpoints d’API, mais en plus des agents pré-définis, chacun peut créer son propre agent “from scratch” en choisissant parmi les tools disponibles ceux dont on estime avoir besoin et en les combinant avec un modèle de prompt explicite pour le modèle.

Par exemple je peux définir un agent qui moissonnera des publications de l’entrepôt Arxiv et fera une analyse sur les co-occurences de termes dans les titres comme ceci :

import pandas as pd
from langchain import OpenAI
from langchain.agents import load_tools, initialize_agent, AgentType, AgentExecutor
from langchain.agents import create_pandas_dataframe_agent

llm = OpenAI(temperature=0.0,openai_api_key=OPENAI_API_KEY)

tools = load_tools(
    ["arxiv", "python_repl"],
)

agent_chain = initialize_agent(
    tools,
    llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,`
    verbose=True,   
)

agent_chain.run(
    "Collect the the ten most recent papers about semantic web. Concat the ten titles into a single text. Then run the agent on this text to find the five most commonly used word co-occurrences (meaning bigrams) excluding common stopwords"
)

En exécutant ce code dans un notebook (la requête utilisateur est dans les 3 dernières lignes), en voici le résultat assez bluffant avec l’enchaînement des pensées-actions de l’agent qui s’affichent (en vert) au fur et à mesure de la réalisation de l’objectif par l’agent autonome, dont celles relatives à la détection des bi-grammes qui impliquent de faire l’import des libraries python nécessaires sur le PC.

Par extension de cette logique, la caractéristiques des agents dits autonomes consistent donc à pouvoir fonctionner de manière récursive, dans une boucle auto-générative de prompts où chaque input déclenche une action produisant un output qui devient lui-même l’input de l’action suivante, les types d’action à activer étant contextuellement choisie par l’agent dans la panoplie d’outils dont il dispose. Ces nouvelles générations d’IA sont ainsi prévues pour fonctionner sans intervention humaine, uniquement sur la base de mécanismes d’automatisation augmentés d’interactions directes avec le monde physique (votre PC, le web…).

Depuis l’ouverture de ChatGPT et la démocratisation de l’accès aux LLMs, ce sont ces types d’implémentations la plupart du temps open source qui repoussent encore le champ des possibles, avec des applications telles que AutoGPT ou BabyAGI, propulsées au rang de prémisces des AGI (Artificial General Intelligence, ou Intelligence Artificielle Forte). Ainsi, pour tester facilement un agent autonome sans rien installer ni développer, on peut utiliser l’application en ligne AgentGPT dans laquelle vous pouvez nommer votre agent, lui assigner un objectif, et le regarder faire (jusqu’à un certain point, là où s’arrête la gratuité de la plateforme). Néanmoins, l’enchaînement de pensées et d’actions élaborées par l’IA suite à cette demande

interpelle : voir la réponse de l’agent autonome dans ce fichier agentgpt_bosco

A ce stade soyons honnêtes, même si ces outils démontrent de fortes capacités à réaliser des tâches complexes (organiser un voyage, réservations comprises par exemple), ils portent en eux les points faibles des LLMs, à savoir la propension à halluciner et des facultés de raisonnement parfois limitées, tout ceci nécessitant toujours une modération humaine. Ce qui frappe par contre, ce sont la simplicité des développements nécessaires et suffisants pour mettre en oeuvre ce type d’agent autonome, un simple script Python exécutable dans un notebook faisant l’affaire.

Conclusion

Comme dit précédemment, les champs d’applications, y compris dans les métiers documentaires, sont tellement immenses que l’exercice de projection côté professionnel comme côté utilisateur est quasi impossible : remplacement partiel de nos services de questions-réponses en ligne par des bots, moteurs de recherche sémantique pour nos catalogues, assistant IA pour passer des instructions en langage naturel dans nos SIGB (“Crée des lignes de commande pour les 10 derniers ouvrages en informatique disponibles chez Eyrolles”) et/ou pour gérer les opérations de reporting et d’analyse de données, gestion de projets partiellement déléguée à des agents autonomes, montage de sites web en quelques minutes grâce aux générateurs de code… Tout en gardant à l’esprit les limites (actuelles) et les biais d’apprentissage des LLMs, les futurs assistants autonomes de recherche, de gestion de projets, de catalogage etc… qui ne manqueront pas d’arriver risque probablement de renouveler en profondeur nos pratiques, nous outils et nos compétences.