# Ingénierie de prompt

L'ingénierie de prompt (de l'anglais prompt engineering), ou rédactique, est le processus de conception et de structuration d'un prompt, de sorte qu'il soit efficacement interprété et compris par un modèle d'intelligence artificielle générative. Un prompt (aussi appelé requête, ou invite de commande) est une description textuelle de la tâche qu’une IA doit effectuer.
Un prompt, pour un modèle de langage produisant du texte, peut être une requête telle que « qu'est-ce que le petit théorème de Fermat ? ». Ou bien une commande comme « écrire un poème sur la chute des feuilles », ou une déclaration plus longue incluant du contexte, des instructions, et l'historique des conversations. L'ingénierie de prompt peut impliquer de formuler une requête, de spécifier un style, de fournir un contexte pertinent, ou d'attribuer un rôle à l'IA. Un prompt peut inclure quelques exemples à partir desquels un modèle doit apprendre, comme demander au modèle de compléter « maison → house, chat → cat, chien → » (la réponse attendue étant dog), une approche appelée apprentissage en quelques coups (few-shot learning).
Lors de la communication avec un modèle générant des images ou du son, un prompt typique est une description d'un résultat souhaité, tel que « une photo de haute qualité d'un astronaute montant un cheval » ou « une musique de fond pour piano dans le style de Gershwin ». Le prompt est écrit (ou dicté) dans une « fenêtre de contexte », qui autorise un texte plus ou moins long selon le LLM et sa version.

## Apprentissage en contexte

L'ingénierie de prompt est associée à la notion d'apprentissage en contexte (de l'anglais in-context learning), ce qui signifie la capacité d'un modèle à apprendre temporairement des informations à partir du prompt, c'est-à-dire du contexte. L'apprentissage en contexte a l'avantage de fournir des informations spécifiques au modèle sans nécessiter de l'entraîner, ce qui serait plus long et coûteux. Le modèle n'est en effet pas modifié, le prompt faisant simplement partie des « données d'entrée ».

## Histoire

En 2021, les chercheurs ont affiné un modèle pré-entraîné génératif (T0) sur l'exécution de 12 tâches de traitement automatique des langues (en utilisant 62 ensembles de données, car chaque tâche peut avoir plusieurs ensembles de données). Le modèle a montré de bonnes performances sur de nouvelles tâches, surpassant les modèles entraînés directement sur l'exécution d'une seule tâche (sans pré-entraînement). Pour résoudre une tâche, T0 reçoit la tâche dans un prompt structuré, par exemple If {{premise}} is true, is it also true that {{hypothesis}}? ||| {{entailed}}. est le prompt utilisé pour que T0 résolve l'implication.
En 2022, une technique chain-of-thought (« chaîne de pensée ») a été proposée par des chercheurs de Google$^,$.
En 2023, plusieurs « bases de données de prompts » pour la génération de texte ou d'images étaient publiquement accessibles$^,$.

## Génération de texte
### Chaîne de pensée

C'est l'une des techniques les plus connues, qui consiste à inciter les grands modèles de langage à aborder un problème « pas à pas », avant de fournir la réponse finale. La chaîne de pensée améliore les capacités de raisonnement d'un modèle, en le poussant à résoudre un problème de façon plus progressive. Il permet aux grands modèles de langage de surmonter les difficultés liées à certaines tâches de raisonnement qui nécessitent une réflexion logique et plusieurs étapes à résoudre, comme les problèmes arithmétiques$^,$$^,$.
Par exemple, étant donné la question « Q : Les cuisiniers de la cafétéria avaient 23 pommes. S'ils en utilisaient 20 pour préparer le déjeuner et en achetaient 6 de plus, combien de pommes ont-ils ? », un prompt pourrait inciter le grand modèle de langage à répondre « A : La cafétéria avaient 23 pommes à l'origine. Ils en utilisaient 20 pour préparer le déjeuner. Ils en avaient donc 23 - 20 = 3. Ils ont acheté 6 pommes de plus, donc ils ont 3 + 6 = 9. La réponse est 9."
La méthode initialement proposée consistait à inclure dans le prompt quelques exemples de questions et de réponses, où les réponses contenaient des détails de raisonnement pour inciter le modèle à faire de même. Cependant, le simple fait d'ajouter les mots Let's think step-by-step (« Réfléchissons étape par étape ») s'est également révélé efficace. Cela rend la méthode plus facile à appliquer, puisqu'il n'y a plus besoin de fournir des exemples spécifiques de questions et de réponses.

### Réduire ou divulguer l’incertitude

Par défaut, un modèle de langage ne produit par d'indice de fiabilité lié à sa réponse à un prompt.
Le modèle peut produire un texte qui inspire confiance, bien que les prédictions sous-jacentes de mots (ou plus exactement de tokens) aient des scores de probabilité faibles. Les grands modèles de langage comme GPT-4 peuvent avoir des scores de vraisemblance calibrés avec précision dans leurs prédictions de mots suivants.
Mais si on ne peut pas accéder à ces scores (comme lorsqu’on accède au modèle via une API restrictive), l’incertitude peut toujours être estimée et incorporée dans la sortie du modèle. Une méthode simple consiste à inciter le modèle à utiliser des mots pour estimer l’incertitude. Une autre consiste à inciter le modèle à refuser de répondre de manière standardisée si l’entrée ne satisfait pas certaines conditions.

## Génération d'images

* En haut: pas de prompt négatif
* Au centre: "arbres verts"
* En bas: "pierres rondes, rochers ronds"
En 2022, des modèles des modèles de génération d'images comme DALL-E 2, Stable Diffusion et Midjourney ont été rendus public. Ces modèles prennent en entrée des prompts, et les utilisent pour générer des images artistiques IA. Ces modèles n'ont pas forcément la même compréhension de la grammaire et de la structure des phrases que les grands modèles de langage.
Une prompt de génération d'images contient généralement une description du sujet souhaité (par exemple, des coquelicots orange vif ), du type de « support » souhaité (comme une une gravure, une peinture ou une photographie numérique ), du style (hyperréalisme, cartoon, pop-art...), l'éclairage (éclairage incident, rayons crépusculaires, ambiance nocturne... ), la couleur et la texture, etc..
La documentation de Midjourney encourage les requêtes courtes et descriptives : au lieu de « Montre-moi une photo de nombreux coquelicots de Californie en fleurs, rend-les orange vif et vibrants, et dessinez-les dans un style illustré avec des crayons de couleur », un prompt efficace pourrait être « Coquelicots orange vif de Californie dessinés aux crayons de couleur ».

## Génération augmentée par récupération (mode RAG)

Traditionnellement, les modèles de langage à grande échelle (LLM) génèrent du contenu en ne s’appuyant que sur les informations apprises durant leur phase d’entraînement. Dans le domaine de l’IA générative, le mode RAG (Retrieval-Augmented Generation) peut éviter cela.
Le mode RAG passe par deux étapes :
* étape de récupération : quand le modèle reçoit une requête, il fait une rapide recherche dans un ensemble prédéfini de documents ou de données pour trouver et incorporer les informations les plus pertinentes par rapport à la requête. Cette phase initiale, aussi dite d'incorporations denses, nécessite que le modèle ait accès à une source qui peut être (selon les cas) une base de données vectorielle, un index de résumés, un index d’arbres, ou un index de table de mots-clés, etc.). Un récupérateur de documents sélectionne les documents les plus pertinents au vu du prompt. Techniquement, cette pertinence est généralement déterminée en encodant sous forme de vecteur la requête ainsi que les documents, puis en identifiant les documents dont les vecteurs sont les plus proches en distance euclidienne du vecteur de requête ;
* étape de génération : le LLM génère alors une sortie qui incorpore à la fois des informations provenant de la requête, des documents pertinents ainsi récupérés, et de ses connaissances internes.
Cette méthode est particulièrement bénéfique pour gérer des informations propriétaires ou dynamiques qui n’étaient pas incluses dans les phases initiales de formation ou de réglage fin du modèle.
RAG est également notable pour son utilisation de l'apprentissage few-shot, où le modèle utilise un petit nombre d’exemples, souvent récupérés automatiquement à partir d’une base de données, pour informer ses sorties. Le modèle peut alors utiliser les informations pertinentes ainsi récupérées, en plus de ses connaissance interne, pour générer une réponse ou un contenu (image, code..) conforme à la requête initiale, mais créé de manière plus informée et précise.
Le RAG invite le modèle d'IA à « consulter » — en temps réel — une base de données ou un corpus de documents externes. Si les données y sont bien indexées, ou si l'IA dispose d'outils perfectionnés de récupération d’informations, ces dernières seront susceptibles d'enrichir la génération de texte ou d'image par l'IA. Ceci améliore significativement la précision, la pertinence et la richesse du contenu généré.
Le mode RAG s'avère par exemple utile pour générer des FAQ dynamiques, permettre à un chatbot d'administration ou d'entreprise de mieux répondre, respectivement, aux requêtes des citoyens et des clients (réponses plus personnalisées et précises). Il peut « créer des articles, des billets de blog, des descriptions de produits personnalisés pour le public cible ».

### Génération de réponse augmentée par récupération de graphes

Une variante, dite de génération augmentée par récupération de graphes (GraphRAG ; solution inventé par Microsoft Research), étend le RAG de telle manière qu’au lieu de se fier uniquement à la similarité vectorielle (comme dans la plupart des approches RAG), GraphRAG utilise un graphe de connaissances généré par le LLM. Ce graphe permet au modèle de connecter des morceaux d’information disparates, de synthétiser des idées, et de « comprendre » de manière holistique des concepts sémantiques résumés à partir de grandes collections de données.
Des chercheurs ont montré l’efficacité de GraphRAG en utilisant des corpus de données comme le « Violent Incident Information from News Articles » (VIINA) qui est une base de données créée par le politologue Yuri Zhukov dans le cadre de l’invasion de l'Ukraine par l'armée russe en 2022. C'est un système de collecte, classement et géocodage par une IA d’événements multi-sourcés, réalisé en temps quasi-réel à partir des rapports d'informations des médias ukrainiens et russes, fonctionnant grâce à l’apprentissage automatique.VIINA est librement disponible pour les étudiants, les journalistes, les décideurs politiques et les chercheurs. Il se met à jour toutes les six heures et conserve certaines métadonnées de chaque source (date, heure, URL web). Dans VIINA, en combinant des graphes de connaissances générés par le LLM avec l’apprentissage automatique de graphes, GraphRAG a amélioré la complétude et la diversité des réponses générées par l'IA.

### Semi-automatisation du prompting

Il consiste, dans un système qui utilise deux LLM (disons A et B), à demander au LLM A (« LLM de requêtes » ou « expert en prompt », entraîné avec des paires d’entrées-sorties) de générer des prompts qui, s'ils étaient fournis au LLM B, produiraient les réponses attendues.
Le LLM B reçoit le prompt initial, et les instructions générées par le LLM A. Il génère des réponses à partir de ces requêtes. Les log-probabilités (probabilités logarithmiques) des réponses sont calculées et ajoutées pour obtenir le score de l’instruction. Ce processus peut être répété, avec le LLM A qui génère alors de nouvelles variations d’instructions, basées sur les instructions les mieux notées, jusqu’à ce qu’un « critère d’arrêt » soit atteint. Les instructions les mieux notées sont alors sélectionnées et utilisées.
Une option dite auto-CoT est de former « le LLM A » à générer ses propres exemples de Chain of Thought (« chaîne de pensée »). Pour ce faire, une bibliothèque de questions est utilisée, où chaque question est convertie en vecteurs à l'aide d'un modèle comme BERT. Les vecteurs de questions sont ensuite regroupés, et les questions les plus proches des centroïdes de chaque groupe sont sélectionnées. Le LLM A procède alors à un CoT sur chaque question, et les exemples de CoT résultants sont ajoutés à l’ensemble de données. Ainsi, lorsqu’une nouvelle requête est faite au LLM B, des exemples de CoT correspondant aux questions les plus similaires peuvent être récupérés et ajoutés à la requête.
L’algorithme d'ingénierie de prompt du LLM A peut effectuer une recherche en faisceau (beam search) pour optimiser les requêtes. La recherche en faisceau est une technique d'exploration sélective déjà utilisée en traduction automatique, en reconnaissance vocale, et en génération de texte. Elle complexifie l'algorithme, mais limite le périmètre d’exploration à un nombre restreint de « meilleures options » à chaque étape, ce qui permet de trouver plus rapidement les séquences de mots ou d’actions les plus probables, en explorant un espace de possibilités de manière structurée. La recherche en faisceau « consiste, à chaque instant t, à conserver N hypothèses candidates, en choisissant les N chemins les plus probables. La probabilité d'un chemin est donnée comme la probabilité jointe de toute la séquence, depuis la racine (...). Il s’agit donc d’un parcours en largeur de l’arbre de recherche. » Elle est plus efficace que l’exploration exhaustive, car réduisant considérablement le nombre de chemins à considérer. En raison de sa nature fondamentalement heuristique, elle peut parfois ignorer des solutions optimales ; elle est donc utilisée quand le compromis entre efficacité de calcul et niveau de qualité des solutions générées est jugé acceptable.

## Injection de prompt

L'injection de prompt consiste à manipuler le prompt pour qu'il pousse le modèle à créer un contenu qu'il est censé ne pas produire.
Il y a plusieurs types d'injection de prompt, notamment :
* Le jailbreaking (« débridage »), qui désinhibe le modèle. Par exemple avec un prompt qui demande au modèle de jouer le rôle d'un caractère fictif.
* Le prompt leaking (« fuite de prompt »), dans lequel un utilisateur persuade le modèle de divulguer son pre-prompt, qui est un texte en général caché des utilisateurs, et automatiquement ajouté au début du prompt pour indiquer au modèle comment se comporter.