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 consiste à créer des questions de manière à obtenir le meilleur résultat possible 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 de chat basées sur de grands LLM, tels que Gemini ou ChatGPT, peuvent souvent produire des résultats satisfaisants avec un effort d'incitation minimal. 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.

Que signifie "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, "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ù les LLM plus petits 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. Le téléchargement d'un modèle et l'exécution d'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/CPU 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 de chat basées sur de grands LLM, comme Gemini ou ChatGPT, peuvent souvent produire des résultats satisfaisants avec un effort d'incitation minimal. 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 plus petit ensemble d'informations à exploiter.

Fournir un contexte et des instructions de format précises

Pour obtenir des résultats optimaux avec de petits LLM, créez 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 (avis) Sortie (classification)
  LLM plus grande (Gemini 1.5) LLM plus petite (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'ajustement 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é à 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 aux techniques d'incitation à quelques reprises et de chaîne de pensée, permet d'obtenir des évaluations plus précises.

Attendez-vous à 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 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 la mise en forme incohérente de la sortie de la section précédente: le modèle génère parfois du code 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 dans le navigateur ont tendance à être plus légères.

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 plus faible. 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 de la sortie du LLM peuvent également nécessiter plus d'efforts.

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. Toutefois, même une ingénierie des requêtes avancée peut ne pas être suffisante dans certains cas d'utilisation, en particulier si vous utilisez un LLM plus petit.

Utilisez l'ajustement fin dans les cas suivants:

  • Vous avez besoin d'une précision et de performances de premier ordre pour une tâche spécifique. 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. Vous avez besoin de ces données pour effectuer un ajustement efficace.
  • Vous utilisez le modèle à plusieurs reprises pour le même objectif. L'ajustement fin peut être effectué une seule fois et réutilisé pour une tâche spécifique.