L'efficacité d'un grand modèle de langage dépend fortement des instructions que nous lui fournissons. Le prompt engineering consiste à formuler des questions de manière à obtenir les meilleurs résultats d'un LLM. Il s'agit d'une étape essentielle de l'implémentation d'une fonctionnalité basée sur un LLM.
Le prompt engineering est un processus itératif. Si vous avez testé différents LLM, vous avez probablement remarqué que vous deviez ajuster votre prompt pour obtenir un meilleur résultat.
Cela vaut également pour les modèles de différentes tailles.
Les interfaces de chat optimisées par de grands LLM, tels que Gemini ou ChatGPT, peuvent souvent produire des résultats satisfaisants avec un effort de prompting minimal. Toutefois, lorsque vous utilisez un LLM par défaut plus petit qui n'est pas affiné, vous devez adapter votre approche.
Les LLM plus petits sont moins puissants et disposent d'un pool d'informations plus restreint.
Que signifie "LLM plus petits" ?
Définir la taille des LLM est compliqué, et les fabricants ne la divulguent pas toujours.
Dans ce document, "LLM plus petits" désigne tout modèle comportant moins de 30 milliards de paramètres. À ce jour, les modèles comportant de quelques millions à quelques milliards de paramètres peuvent être exécutés de manière réaliste dans le navigateur, sur des appareils grand public.
Où sont utilisés les LLM plus petits ?
- IA générative sur l'appareil/dans le navigateur, par exemple si vous utilisez Gemma 2B avec l'API LLM Inference de MediaPipe (même adaptée aux appareils équipés uniquement d'un processeur) ou DistilBert dans le navigateur avec Transformers.js. Le téléchargement d'un modèle et l'exécution de l'inférence sur l'appareil d'un utilisateur ne sont possibles qu'avec ces LLM plus petits, afin de limiter les téléchargements Web et de s'adapter aux contraintes de mémoire et de GPU/processeur d'un appareil.
- IA générative personnalisée côté serveur. Des modèles à pondération ouverte de petite taille, tels que Gemma 2B, Gemma 7B ou Gemma 27B, sont disponibles pour que vous puissiez les exécuter sur votre propre serveur (et éventuellement les affiner).
Premiers pas
Les interfaces de chat optimisées par de grands LLM, tels que Gemini ou ChatGPT, peuvent souvent produire des résultats satisfaisants avec un effort de prompting minimal. Toutefois, lorsque vous utilisez des LLM plus petits, vous devez adapter votre approche. Les LLM plus petits sont moins puissants et disposent d'un pool d'informations plus restreint.
Fournir un contexte et des instructions de format précises
Pour obtenir des résultats optimaux avec des LLM de petite taille, créez des prompts plus détaillés et spécifiques.
Exemple :
Based on a user review, provide a product rating as an integer between 1 and 5. \n
Only output the integer.
Review: "${review}"
Rating:
| Entrée (avis) | Sortie (note) | |
|---|---|---|
| LLM plus grand (Gemini 1.5) | LLM plus petit (Gemma 2B) | |
| J'adore la coupe ! Le poids est bien réparti et le sac est étonnamment confortable, même pour des randonnées d'une journée. Je le recommande. | 5 | 4 étoiles sur 5** |
| Les bretelles sont fragiles et ont commencé à me rentrer dans les épaules lorsque j'ai porté des charges lourdes. | 1 | 2/5 |
Alors que Gemini 1.5 fournit le résultat souhaité avec ce prompt simple, la sortie de Gemma n'est pas satisfaisante :
- Le format est incorrect. Nous avons demandé un entier pour la note.
- La note ne semble pas tout à fait exacte. Le premier avis est suffisamment enthousiaste pour indiquer une note de 5 étoiles.
Pour résoudre ce problème, nous devons utiliser des techniques de prompt engineering, des prompts à un, quelques et plusieurs exemples et des prompts de raisonnement en chaîne. Nous devons également fournir des instructions de format claires et insister sur le fait que le modèle doit utiliser toute la plage de notes.
Exemple :
`Analyze a product review, and then based on your analysis give me the
corresponding rating (integer). The rating should be an integer between 1 and
5. 1 is the worst rating, and 5 is the best rating. A strongly dissatisfied
review that only mentions issues should have a rating of 1 (worst). A strongly
satisfied review that only mentions positives and upsides should have a rating
of 5 (best). Be opinionated. Use the full range of possible ratings (1 to
5). \n\n
\n\n
Here are some examples of reviews and their corresponding analyses and
ratings:
\n\n
Review: 'Stylish and functional. Not sure how it'll handle rugged outdoor
use, but it's perfect for urban exploring.'
Analysis: The reviewer appreciates the product's style and basic
functionality. They express some uncertainty about its ruggedness but
overall find it suitable for their intended use, resulting in a positive,
but not top-tier rating.
Rating (integer): 4
\n\n
Review: 'It's a solid backpack at a decent price. Does the job, but nothing
particularly amazing about it.'
Analysis: This reflects an average opinion. The backpack is functional and
fulfills its essential purpose. However, the reviewer finds it unremarkable
and lacking any standout features deserving of higher praise.
Rating (integer): 3
\n\n
Review: 'The waist belt broke on my first trip! Customer service was unresponsive too. Would not recommend.'
Analysis: A serious product defect and poor customer service experience naturally warrants the lowest possible rating. The reviewer is extremely unsatisfied with both the product and the company.
Rating (integer): 1
\n\n
Review: 'Love how many pockets and compartments it has. Keeps everything organized on long trips. Durable too!'
Analysis: The enthusiastic review highlights specific features the user loves (organization and durability), indicating great satisfaction with the product. This justifies the highest rating.
Rating (integer): 5
\n\n
Review: 'The straps are a bit flimsy, and they started digging into my shoulders under heavy loads.'
Analysis: While not a totally negative review, a significant comfort issue leads the reviewer to rate the product poorly. The straps are a key component of a backpack, and their failure to perform well under load is a major flaw.
Rating (integer): 1
\n\n
Now, here is the review you need to assess:
\n
Review: "${review}" \n`;
| Entrée (avis) | Sortie avec un LLM plus petit (Gemma 2B) |
|---|---|
J'adore la coupe ! Le poids est bien réparti et le sac est étonnamment confortable, même pour des randonnées d'une journée. Je le recommande. |
Analyse : cet avis est très positif et met l'accent sur la coupe et le confort du produit, ce qui indique une grande satisfaction. Cela justifie une note élevée. Note (entier) : 5 |
Les bretelles sont fragiles et ont commencé à me rentrer dans les épaules lorsque j'ai porté des charges lourdes. |
**Analyse** : l'avis met en évidence un problème de confort important avec les bretelles. Il suggère également que le produit peut ne pas convenir aux charges lourdes ni aux sorties prolongées. **Note** : 1 (pire) |
Notre prompt plus élaboré, combiné à des techniques de prompting à quelques exemples et de raisonnement en chaîne, donne des notes plus précises.
S'attendre à une analyse manuelle de la sortie
Bien que vous deviez toujours nettoyer et interpréter manuellement la sortie d'un LLM, cela est particulièrement vrai pour les LLM plus petits, qui peuvent produire des résultats moins soignés et nécessiter un prompting de raisonnement en chaîne.
Dans le premier exemple, nous avons utilisé un prompting de raisonnement en chaîne. La sortie comprenait donc à la fois une analyse et une note, et nous devons analyser manuellement la note. Notez également l'incohérence de la mise en forme dans la sortie de la section précédente : le modèle génère parfois du code Markdown, mais pas toujours.
// Use try/catch to catch (parsing) errors
try {
// Parse the output for a rating
const int = /[1-5]/;
const ratingAsString = llmOutput.match(int)[0];
// Parse as int
const ratingAsInt = parseInt(ratingAsString);
// `checkRating` checks the rating is a number between 1 and 5, since the
// regEx may catch a number like "100"
const finalRating = checkRating(ratingAsInt);
} catch (e) {
console.error('Error', e);
}
Tenir compte des différences entre les API
Les API cloud LLM telles que l'API Gemini ou OpenAI, qui sont généralement le point d'entrée des LLM plus grands, offrent des fonctionnalités de prompt pratiques. Par exemple, Gemini 1.5 Pro propose des instructions système et un mode JSON.
Pour le moment, ces fonctionnalités ne sont pas toujours disponibles pour l'utilisation de modèles personnalisés ni pour les LLM plus petits accessibles à l'aide d'API d'IA dans le navigateur, telles que l' API LLM Inference de MediaPipe ou Transformers.js. Bien qu'il ne s'agisse pas nécessairement d'une limitation technique, les API d'IA dans le navigateur ont tendance à être plus légères.
Tenir compte des limites de jetons
Étant donné que votre prompt pour les LLM plus petits doit inclure des exemples ou des instructions plus détaillées, il sera probablement plus long et occupera une plus grande partie de votre limite de jetons d'entrée, le cas échéant.
De plus, les modèles plus petits ont tendance à avoir une limite de jetons d'entrée plus faible. Par exemple, Gemini 1.5 Pro a une limite de jetons d'entrée d'un million tandis que les modèles Gemma ont une fenêtre de contexte de 8 000 jetons.
Utilisez des fonctions de comptage de jetons pour éviter d'atteindre la limite.
Adapter vos estimations de temps
Tenez compte de la conception et des tests des prompts dans vos estimations de temps d'ingénierie.
En raison des différences entre les API et des limites de jetons, vous aurez probablement besoin de plus de temps et d'efforts pour créer votre prompt pour un LLM plus petit que pour un LLM plus grand. Les tests et la validation de la sortie du LLM peuvent également nécessiter plus d'efforts.
Prompt engineering ou réglage fin ?
Pour les développeurs Web, le prompt engineering est notre moyen privilégié d'exploiter l'IA générative plutôt que l'entraînement personnalisé et le réglage fin. Toutefois, même le prompt engineering avancé peut ne pas suffire dans certains cas d'utilisation, en particulier si vous utilisez un LLM plus petit.
Utilisez le réglage fin lorsque :
- Vous avez besoin d'une précision et de performances optimales pour une tâche spécifique. Le réglage fin ajuste directement les paramètres internes du modèle pour obtenir des résultats optimaux.
- Vous disposez de données bien organisées, pertinentes pour votre tâche, déjà étiquetées avec les sorties préférées. Vous avez besoin de ces données pour un réglage fin efficace.
- Vous utilisez le modèle à plusieurs reprises dans le même but. Le réglage fin peut être effectué une seule fois et réutilisé pour une tâche spécifique.