Introduction
L’introduction de ChatGPT par OpenAI en novembre 2022 a fait sensation. Ce chatbot basé sur de très larges modèles de langage a su attirer près de 100 millions d’utilisateurs en l’espace de 2 mois, notamment par sa capacité à générer du texte de manière cohérente et fluide.
Le phénomène de mode se prolonge avec l’arrivée en masse de diverses modèles de langage, tous basés sur cette même particularité à être “instruite”, qu’ils soient open-source, à usage commercial, académique ou encore payants. Malheureusement, la compétition pousse certains des auteurs à l’origine de ces modèles à garder les détails secrets de leur conception.
Néanmoins, le potentiel se ressent et les entreprises souhaitent tout de même capitaliser sur les usages possibles de ce type de modèle. Pour cela, il faut se demander:
- Quelle est la plus-value de ces modèles ?
- Quelles sont les bonnes pratiques d’usage ?
- Quels sont les risques et les limitations ?
Dans cet article, le Data Lab vous les décortique. 😉
I – Des modèles classiques vers des modèles instruits
Les modèles de langage sont des modèles de machine learning entraînés sur de grands volumes de texte à déterminer le prochain “token” (unité de texte ~= sous-mot) le plus probable à partir d’un texte en entrée.
Source: https://www.assemblyai.com/blog/emergent-abilities-of-large-language-models/
Ces derniers étaient bien trop généralistes pour être utiles sur une tâche spécifique. C’est pourquoi, un fine-tuning de ces modèles est appliqué, ce qui nécessite des données, des ressources et du temps supplémentaires. En 2020, OpenAI propose un usage plus flexible des modèles de langage avec l’introduction du modèle GPT-3 (Language Models are Few-shot Learners) en multipliant principalement le nombre de paramètres et données d’entraînement.
Leurs résultats ont montré des performances prometteuses dans diverses tâches par un usage direct du modèle (sans fine-tuning) via une description des attentes (=prompt) en entrée. On parle d’une procédure de prédiction en zero-shot, one-shot ou few-shot.
Source: https://arxiv.org/abs/2005.14165
Pouvoir réaliser des prédictions en zero-shot permet un gain de temps et une économie d’effort car aucun ré-apprentissage n’est requis. Afin de capitaliser sur ce type d’usage, Google propose en 2021 le modèle FLAN (Finetuned LAnguage Net), fine-tuné sur un jeu de données d’instruction dans le but:
- d’avoir un modèle capable de suivre des instructions et réaliser des tâches sur lesquels il n’a pas été entraîné,
- d’améliorer les prédictions en zero-shot,
- de cibler un plus large panel d’utilisateurs par un mode d’usage plus simple.
On parle alors d’instruction tuning. Ces chercheurs ont montré que la taille du modèle devient un facteur important dans les performances des prédictions en zero-shot.
Source: https://ai.googleblog.com/2021/10/introducing-flan-more-generalizable.html
Cependant, miser sur la quantité n’impose pas une garantie sur la qualité à exécuter la tâche décrite, à savoir fournir une réponse véridique, inoffensive ou encore utile. OpenAI diagnostique le problème comme étant une conséquence d’un désalignement entre l’objectif mathématique et l’objectif d’usage. De ce fait, ses chercheurs introduisent InstructGPT, basé sur GPT 3, en étendant le processus d’entraînement avec:
- Un fine-tuning supervisé sur la prédiction d’une réponse à partir d’une instruction depuis un dataset de prompt-réponse (instruction-tuning): le modèle se spécialise à suivre des instructions écrites. Parmi ces instructions: des tâches de synthèse, rédaction de code, classification, QA ou encore de traduction.
- Une équipe de labelleurs pour trier par ordre d’utilité des réponses fournies par le modèle à partir d’un même prompt. Cela permet d’entrainer un modèle de récompense capable de donner un indice sur l’utilité d’une réponse.
- Optimiser le modèle de langage à maximiser l’utilité donnée par le modèle de récompense sur un dataset de prompts (apprentissage par renforcement)
Source: https://openai.com/blog/chatgpt
Ce procédé est également à l’origine de GPT-3.5-turbo, le premier modèle derrière ChatGPT.
Un modèle de langage instruit a donc été entraîné à suivre des instructions (sans nécessairement suivre le processus d’apprentissage par renforcement). Une multitude de modèles de langage instruits ont été introduits tels que PaLM2, Alpaca, ou encore Dolly 2.0.
Le volume de données utilisé en entraînement et la variété de tâches rencontrées comme instructions lors de la phase de fine-tuning supervisé rendent ces modèles instruits multimodales. Les performances diffèrent selon le modèle et la tâche. Parmi les applications courantes:
- agent conversationnel / chatbot
- synthèse de texte
- génération de code
- extraction d’information
- question-answering
- classification
- rédaction de texte.
II – Comment utiliser un modèle instruit ?
Pour exploiter un modèle de langage instruit, deux éléments sont à prendre en considération à minima:
- la qualité du prompt,
- le paramètre de la température.
Prompt engineering
La qualité de la réponse dépend fortement de la clarté et de l’exhaustivité exprimés par le prompt. Prenons un exemple en analyse des sentiments par aspect.
Prompt :
Réponse:
Dans cet exemple, le modèle renvoie le sentiment dans un format verbeux et peu exploitable (bien que correct) si on voulait effectuer des statistiques sur un jeu de verbatims rapidement.
Modifions le prompt pour obtenir une réponse plus exploitable, c’est-à-dire:
- avoir les aspects et sentiments de manière isolée
- avoir un résultat dans un format JSON
- cadrer les labels à utiliser
Prompt:
Réponse:
Dans ce format, les aspects et sentiments pourront être repris et lus par un script (Python par exemple), bouclant sur un ensemble de commentaires à analyser.
Prompt injection – Se préparer aux attaques
Le prompt engineering renvoie donc à un certain degré de liberté dans la rédaction des attentes pour le développeur/analyste mais également pour les reviewers à l’origine de la source à analyser. Un modèle peut être soumis à des attaques venant perturber les réponses. Par exemple, si le commentaire était:
La réponse obtenue ci-dessous défie clairement les instructions et attentes de départ.
On parle de hi-jacking ou de jailbreak pour désigner une attaque incitant le modèle à désobéir aux instructions initiales.
Nous pouvons délimiter le commentaire de l’utilisateur pour ajouter une couche de sécurité et donner un exemple en JSON pour mieux cadrer le format de sortie.
Prompt:
Réponse:
Wrap up
De manière plus générale, il peut être judicieux d’intégrer:
- le rôle (dans quel contexte s’inscrit la tâche ?) – optionnel
- la tâche (que doit faire le modèle ?)
- une référence / une cible (les informations isolées à exploiter pour réaliser la tâche)
- les conditions et le format d’output (à quoi doit ressembler la réponse ?)
Voici un deuxième exemple où on demande au modèle de fournir une description publicitaire à partir des caractéristiques d’un produit.
Prompt:
Réponse:
À partir de là, pour automatiser la génération, la formulation du prompt est une question de template.
Les hyperparamètres
La température est un hyperparamètre central qui reflète “un caractère d’originalité” en sortie du modèle. Pour être plus exact, rappelons qu’un modèle de langage prédit le prochain token le plus probable ; la température donne un indice sur la probabilité de diverger du prochain token le plus probable, comme un indice d’aléa.
La température impacte les modèles de différentes manières et n’est pas nécessairement normalisée.
Un exemple ci-dessous en reprenant le prompt sur la génération de description publicitaire avec des températures différentes.
(via l’API d’OpenAI)
Température=0
Température=1
Température=1.5
Une température à 0 produit une rédaction plus “conservative”. Avec une température plus élevée, les réponses se diversifient mais les erreurs peuvent être plus fréquentes. Attention aux hallucinations (informations inventées par le modèle) que l’on peut voir ici avec une température de 1.5: “the breathable synthetic outsole”, les données du prompt ne mentionnent pas de semelle respirante. Une limitation qui nous indique à rester vigilant dans l’usage de ce type de modèle.
D’autres hyperparamètres peuvent être prise en compte (se référer à la documentation des modèles afin d’étudier leurs recommandations d’usage) :
- Top-P: Pour impacter le choix des tokens ; pour une valeur de 0.2, le token est choisi parmi les 20% les plus probables. Peut être utilisé en complément ou de manière alternative à la température.
- Top-K: Pour impacter le choix des tokens ; pour une valeur de 5, le token est choisi parmi les 5 tokens les plus probables. Peut être utilisé en complément ou de manière alternative à la température.
- Token limit: Nombre de token maximal en sortie
III – Choisir un modèle
Il existe une panoplie de modèles instruits. Pour s’y repérer, un tableau récapitulatif des principaux modèles incluant des caractéristiques à prendre en compte.
Conclusion et limitations
Les modèles de langage instruits ont donc été fine-tunés pour mieux répondre aux instructions posées. Cela permet d’en faire un usage en zero-shot ou few-shot. Un prompt peut être optimisé pour mieux répondre aux attentes (ajout d’un contexte, informations de base, format de sortie…). De plus, des paramètres comme la température peuvent venir influencer la “variété” de la réponse.
Néanmoins, ces modèles ne sont pas sans risques. Une attaque par injection de prompt peut venir compromettre la réponse. Ils peuvent également être sujet à des soucis de sécurité dans les réponses fournies. Certains services monitorent les requêtes/appels API passés. Il faut donc rester prudent sur les données qui y transitent, notamment par souci de confidentialité. Par ailleurs, les connaissances des modèles sont restreintes car leurs bases d’entraînement sont limitées dans le temps et le risque d’hallucination est également à prendre en compte.
Toutefois, il peut être judicieux de capitaliser sur leurs compétences (extraire de l’information, résumer ou enrichir du texte…) en cadrant les instructions du prompt pour éviter les dérives.
Références
- https://www.assemblyai.com/blog/emergent-abilities-of-large-language-models/
- https://arxiv.org/abs/2005.14165
- https://openai.com/blog/chatgpt
- https://ai.googleblog.com/2021/10/introducing-flan-more-generalizable.html
- https://arxiv.org/abs/2303.08774
- https://arxiv.org/abs/2304.01373
- https://www.databricks.com/blog/2023/04/12/dolly-first-open-commercially-viable-instruction-tuned-llm
- https://stability.ai/blog/stability-ai-launches-the-first-of-its-stablelm-suite-of-language-models
- https://www.mosaicml.com/blog/mpt-7b
- https://www.graphcore.ai/posts/flan-t5-sweet-results-with-the-smaller-more-efficient-llm
- https://huggingface.co/bigscience/bloomz
- https://www.anthropic.com/index/introducing-claude
- https://github.com/salesforce/CodeGen
- https://huggingface.co/blog/starcoder