Extraction pratique des requêtes pour les LLM plus petits

Maud Nalpas
Maud Nalpas

L'efficacité d'un grand modèle de langage repose fortement sur les instructions que nous lui donnons. L'ingénierie des requêtes est le processus qui consiste à formuler des questions de manière à obtenir les meilleurs résultats d'un LLM. Il s'agit d'une étape cruciale pour implémenter une fonctionnalité basée sur l'apprentissage automatique local.

L'ingénierie des requêtes est un processus itératif. Si vous avez expérimenté différents LLM, vous avez probablement remarqué que vous deviez ajuster votre requête pour obtenir de meilleurs résultats.

Cela est également vrai pour les modèles de différentes tailles.

Les interfaces Chat optimisées par de grands LLM, tels que Gemini ou ChatGPT, peuvent souvent produire de bons résultats avec un minimum d'efforts de requête. Toutefois, lorsque vous utilisez un LLM plus petit par défaut qui n'est pas affiné, vous devez adapter votre approche.

Les LLM plus petits sont moins puissants et disposent d'un plus petit ensemble d'informations à exploiter.

Qu'entendons-nous par "LLM plus petits" ?

La définition des tailles de LLM est complexe, et elles ne sont pas toujours divulguées par les fabricants.

Dans ce document, les "LLM plus petits" désignent tout modèle comportant moins de 30 milliards de paramètres. À l'heure actuelle, les modèles comportant 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ù les grands modèles de langage (LLM) sont-ils utilisés ?

  • IA générative sur l'appareil/dans le navigateur, par exemple si vous utilisez Gemma 2B avec l'API d'inférence LLM de MediaPipe (adaptée même aux appareils CPU uniquement) ou DistilBert dans le navigateur avec Transformers.js. Il n'est possible de télécharger un modèle et d'exécuter une inférence sur l'appareil d'un utilisateur qu'avec ces LLM plus petits, afin de maintenir les téléchargements Web raisonnables et de répondre aux contraintes de mémoire et de GPU/processeur d'un appareil.
  • IA générative côté serveur personnalisée : Vous pouvez exécuter de petits modèles à pondération ouverte tels que Gemma 2B, Gemma 7B ou Gemma 27B sur votre propre serveur (et les affiner si vous le souhaitez).

Commencer

Les interfaces Chat optimisées par de grands LLM, comme Gemini ou ChatGPT, peuvent souvent produire des résultats satisfaisants avec un minimum d'efforts de requête. Toutefois, lorsque vous travaillez avec des LLM plus petits, vous devez adapter votre approche. Les LLM plus petits sont moins puissants et disposent d'un volume d'informations plus restreint.

Fournir un contexte et des instructions de format précises

Pour obtenir des résultats optimaux avec de petits LLM, élaborez des requêtes plus détaillées 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 (examen) Sortie (évaluation)
  LLM plus grande (Gemini 1.5) LLM plus petit (Gemma 2B)
J'adore la coupe ! Il répartit bien le poids et est étonnamment confortable, même lors de randonnées de plusieurs jours. Je recommande. 5 4 étoiles sur 5**
Les sangles sont fragiles et ont commencé à s'enfoncer dans mes épaules sous de lourdes charges. 1 2/5

Bien que Gemini 1.5 fournisse la sortie souhaitée avec cette invite simple, la sortie de Gemma n'est pas satisfaisante :

  • Le format est incorrect. Nous avons demandé un entier pour la note.
  • L'évaluation ne semble pas tout à fait exacte. Le premier avis est suffisamment enthousiaste pour mériter cinq étoiles.

Pour résoudre ce problème, nous devons utiliser des techniques d'ingénierie des requêtes, des requêtes one-shot, few-shot et multi-shot et des requêtes de chaîne de pensée. Nous devons également fournir des instructions de format claires et insister pour que le modèle utilise toute la gamme 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 ! Il répartit bien le poids et est étonnamment confortable, même lors de randonnées de plusieurs jours. Je recommande.

Analyse: cet avis est très positif et met l'accent sur l'adéquation et le confort du produit, indiquant une grande satisfaction à l'égard du produit. Cela justifie une note élevée.

Note (entier): 5

Les bretelles sont fragiles et ont commencé à s'enfoncer dans mes épaules sous de lourdes charges.

**Analyse :** L'avis met en évidence un problème de confort important avec les bretelles. Il suggère également que le produit n'est peut-être pas adapté aux charges lourdes ou aux sorties prolongées.

**Note : 1 (pire)

Notre requête plus élaborée, combinée à des techniques de requêtes few-shot et en chaîne de pensée, permet d'obtenir des évaluations plus précises.

Analyse manuelle des résultats attendue

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 des invites de chaîne de pensée.

Dans le premier exemple, nous avons utilisé des invites de chaîne de pensée. La sortie incluait donc à la fois une analyse et une note, et nous devons analyser manuellement la note. Notez également que la mise en forme de la sortie est incohérente dans la section précédente: le modèle génère parfois un élément Markdown, mais pas à chaque fois.

// 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);
}

Différences entre les API Mind

Les API cloud LLM, comme l'API Gemini ou OpenAI, qui sont généralement le point d'entrée vers des LLM plus importants, offrent des fonctionnalités d'invite pratiques. Par exemple, Gemini 1.5 Pro propose des instructions système et le 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 auxquels on accède à l'aide d'API d'IA dans le navigateur, telles que l'API d'inférence LLM MediaPipe ou Transformers.js. Bien qu'il ne s'agisse pas nécessairement d'une limite technique, les API d'IA intégrées aux navigateurs ont tendance à être plus simples.

Limites des jetons Mind

Étant donné que votre requête pour les LLM plus petits doit inclure des exemples ou des instructions plus détaillées, elle sera probablement plus longue et occupera une plus grande partie de la 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 inférieure. Par exemple, Gemini 1.5 Pro est limité à un million de jetons d'entrée, tandis que les modèles Gemma disposent d'une fenêtre de contexte de 8 k.

Utilisez des fonctions de comptabilisation des jetons pour éviter d'atteindre la limite.

Adapter vos estimations de temps

Tenez compte de la conception et des tests des requêtes dans vos estimations de temps d'ingénierie.

En raison des différences d'API et des limites de jetons, vous aurez probablement besoin de plus de temps et d'efforts pour créer votre invite pour un LLM plus petit que pour un LLM plus grand. Le test et la validation des résultats du LLM peuvent également nécessiter un effort plus important.

Ingénieur des requêtes ou affinage ?

Pour les développeurs Web, l'ingénierie des requêtes est notre méthode préférée pour exploiter l'IA générative par rapport à l'entraînement personnalisé et à l'ajustement. Cependant, même une ingénierie avancée des requêtes peut ne pas suffire dans certains cas d'utilisation, en particulier si vous employez un LLM de plus petite taille.

Utilisez l'ajustement fin dans les cas suivants :

  • Pour accomplir une tâche spécifique, vous avez besoin d'une précision et de performances exceptionnelles. L'ajustement 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 résultats souhaités. Ces données sont nécessaires pour effectuer des réglages efficaces.
  • Vous utilisez le modèle à plusieurs reprises pour le même objectif. L'affinage peut être effectué une fois et réutilisé pour une tâche spécifique.