Guide du praticien LLM : Llama-2 multilingue
In July 2023, Meta released Llama-2, a set of open-access large language models that quickly became a favorite for those concerned about data security and interested in building their own custom models. Unlike relying on generic third-party models, Llama-2 allows for tailored design and has been a leading choice for enhancements and specialized uses, often exceeding standard benchmarks.
Available through Huggingface, Llama-2 offers three sizes: 7B, 13B, and 70B parameters. You can use it as a foundational model or as a chat model for dialogue and answering questions. Meta also introduced CodeLlama, a variant of Llama-2, specifically trained to help with coding tasks.
Si vous êtes impliqué dans l’IA et avez besoin d’un modèle de langage étendu (LLM) personnalisé, Llama-2 est probablement sur votre radar comme point de départ potentiel. Nous avons été profondément impliqués dans la personnalisation, la mise au point et le déploiement de Llama-2. À travers cette série d’articles, nous souhaitons partager nos idées sur ce que Llama-2 peut et ne peut pas faire, ainsi que des instructions détaillées et les meilleures pratiques pour un réglage précis.
Guide du praticien LLM :
- À quoi ressemble réellement Llama-2 multilingue ?
- Structure d'invite Llama-2 (à venir)
Dans l’article d’aujourd’hui, nous explorerons la limitation la plus importante de Llama-2 : sa prise en charge linguistique restreinte. Malgré ses capacités, étendre Llama-2 à des langues autres que quelques-unes des langues européennes les plus parlées est une tâche difficile. Voyons pourquoi.
Les chemins qu’il ne suivra pas : comprendre les limitations linguistiques de Llama-2

Au cœur des limites de Llama-2 se trouve son tokenizer, un élément crucial dans la façon dont il traite le langage.
Les grands modèles linguistiques (LLM) comme Llama-2 fonctionnent en utilisant des nombres. Pour comprendre le texte, ces modèles le convertissent d’abord dans un format numérique. Le défi majeur du traitement du langage naturel consiste à trouver le moyen le plus efficace de représenter numériquement les langues.
Une méthode de base consiste à attribuer à chaque lettre ou symbole un numéro unique, par exemple, « a » devient 1, « b » devient 2, et ainsi de suite. Ensuite, le modèle prédit le numéro suivant dans une séquence. Cependant, cette méthode transforme même une phrase courte en une longue séquence de 61 nombres. Toute erreur dans la prédiction d’une lettre a un impact sur toutes les lettres suivantes, rendant cette approche complexe et sujette aux erreurs.
Une autre méthode consiste à représenter chaque mot par un nombre. Dans ce système, la phrase devient une série de 11 chiffres, nettement plus courte que la séquence lettre par lettre. C'est plus facile pour le modèle mais cela pose quand même un problème. Compte tenu du grand nombre de mots (plus de 200 000 rien qu’en anglais), cela signifie que pour plusieurs langues, le modèle devra peut-être choisir parmi des millions de nombres, ce qui augmentera le risque d’erreurs.
To tackle these issues, researchers developed a compromise called tokenization. Tokenization splits words into smaller parts, called tokens, which are common across various words. For instance, \u201Cpredicting\u201D might be split into \u201Cpred,\u201D \u201Cict,\u201D and \u201Cing.\u201D This means instead of guessing each letter or entire word, the model predicts smaller, more manageable sequences. These tokens dramatically reduce the number of options the model has to consider\u2014from the entire dictionary to around 2,000 tokens for the English language, making the process more efficient and accurate.
Examinons le tokenizer Llama-2.
Tout d’abord, nous l’importons depuis la bibliothèque Huggingface Transformers :
> from transformers import AutoTokenizer
> tokenizer = AutoTokenizer.from_pretrained('meta-llama/Llama-2-7b-hf', use_fast=True)Le tokenizer Llama-2 prend en charge une gamme impressionnante de 32 000 tokens :
> print(tokenizer.vocab_size)
32000Now, let’s observe it in action. Consider this sentence:
> print(tokenizer.tokenize('Call me Ishmael. Some years ago...'))
['▁Call', '▁me', '▁I', 'sh', 'ma', 'el', '.', '▁Some', '▁years', '▁ago', ...]Le résultat montre une tokenisation efficace : les mots courants sont représentés par un seul token, tandis que les mots plus complexes sont découpés en segments encore compréhensibles. Par exemple, « aqueux » est correctement segmenté, tandis que « Ismaël » est représenté par syllabes, signe d’une tokenisation relativement fine.
Maintenant, testons-le avec une phrase allemande. Même si vous ne parlez pas allemand ou toute autre langue mentionnée, sachez qu'une tokenisation efficace divise le texte en un plus petit nombre de tokens plus longs, tandis qu'une tokenisation plus faible entraîne un plus grand nombre de tokens plus courts.
> print(tokenizer.tokenize('Da steh ich nun, ich armer Tor! Und bin so klug als wie zuvor.'))
['▁Da', '▁ste', 'h', '▁ich', '▁nun', ',', '▁ich', '▁ar', 'mer', '▁Tor', '!', ...]Le tokenizer fonctionne admirablement, reflétant les subtilités de la langue, d’autant plus que l’allemand est plus complexe informatiquement que l’anglais.
Voyons comment Llama-2 traite le français.
> print(tokenizer.tokenize("On ne voit bien qu'avec le cœur..."))
['▁On', '▁ne', '▁voit', '▁bien', '▁qu', "'", 'ave', 'c', '▁le', '▁c', 'œur', ...]Encore une fois, nous constatons une très bonne représentation linguistique.
Si nous continuons avec les langues romanes et germaniques, nous verrons que Llama-2 s'en sort plutôt bien. Alors, sans plus tarder, passons aux slaves et commençons par le polonais.
> print(tokenizer.tokenize('Litwo, ojczyzno moja! Ty jesteś jak zdrowie...'))
['▁Lit', 'wo', ',', '▁o', 'j', 'czy', 'z', 'no', '▁mo', 'ja', '!', ...]Le polonais est une langue notoirement complexe sur le plan informatique, et la dégradation de la tokenisation se voit immédiatement : les tokens deviennent beaucoup plus petits et leur nombre explose.
Maintenant, regardons l'ukrainien.
> print(tokenizer.tokenize('Як умру, то поховайте мене на могилі...'))
['▁Я', 'к', '▁у', 'м', 'ру', ',', '▁то', '▁по', 'х', 'ова', 'й', 'те', ...]On observe ici un cas similaire : même sans lire l’ukrainien, on voit tout de suite apparaître une multitude de tokens très courts. Ce n’est pas bon signe.
Et pourtant, c'est quand même quelque chose. Voyons maintenant le grec.
> print(tokenizer.tokenize('ἄνδρα μοι ἔννεπε, Μοῦσα, πολύτροπον...'))
['▁', 'ἄ', 'ν', 'δ', 'ρ', 'α', '▁', 'μ', 'ο', 'ι', '▁', 'ἔ', 'ν', 'ν', 'ε', 'π', 'ε', ...]Ici, nous voyons le pire des cas : le tokenizer se retire dans le premier cas naïf représentant le langage par caractères.
Maintenant, comment lit-on l’hébreu ?
> print(tokenizer.tokenize('בְּרֵאשִׁית בָּרָא אֱלֹהִים...'))
['▁', 'ב', 'ְ', 'ּ', 'ר', 'ֵ', 'א', 'ש', 'ִ', 'ׁ', 'י', 'ת', ...]Encore une fois, c'est une question de caractère.
Et le chinois ?
> print(tokenizer.tokenize("道可道,非常道。名可名,非常名。"))
['▁', '道', '可', '道', ',', '非', '常', '道', '。', '名', '可', '名', ',', '非', '常', '名', '。']Même représentation par personnage ici.
Si nous continuons à faire cela avec d'autres langues, nous verrons le même schéma : le tokenizer Llama-2 fonctionne bien avec les langues romanes et germaniques tout en se dégradant rapidement en représentation par caractères pour le reste.
Certes, Meta a indiqué que Llama-2 avait été principalement formé sur un corpus de texte composé à 90 % d'anglais, ce qui suggère que le modèle pourrait ne pas être aussi efficace avec d'autres langues. Cet avertissement est crucial mais peut être trompeur. Il n’a pas seulement été formé, il a été conçu principalement en pensant à l’anglais.
En lisant la description du modèle, certains pourraient penser que former Llama-2 avec des données non anglaises pourrait améliorer considérablement ses performances avec d’autres langues. Cependant, même si un réglage fin peut aider dans une certaine mesure, il ne résout pas les limites inhérentes à la conception du tokenizer. Par conséquent, Llama-2 fonctionne naturellement mieux avec certaines langues, comme l'anglais, l'allemand, l'espagnol ou le français, qu'avec d'autres, comme le polonais ou l'ukrainien. Tenter d’étendre ses capacités au grec, à l’hébreu, au chinois et à de nombreuses autres langues est une tâche encore plus difficile. Et comme le tokenizer est étroitement couplé au modèle et ne peut pas être remplacé, il n’y a aucun moyen de contourner ce problème.
Dans nos projets, nous avons essayé d’adapter Llama-2 à des tâches multilingues avec un vaste jeu de données supervisées soigneusement préparé, représentant plus d’un milliard de tokens, avant d’être contraints de basculer vers un autre modèle en cours de route.
Pour ceux qui ont besoin d'affiner un modèle de langage dans l'un de ces langages plus difficiles, Llama-2 n'est peut-être pas le choix optimal. Au lieu de cela, la sélection d’un modèle plus petit avec un tokenizer plus approprié pourrait conduire à de meilleurs résultats. Notre expérience dans le développement de modèles multilingues suggère qu'opter pour des modèles plus petits et plus anciens avec de meilleurs tokenizers et les personnaliser pour des tâches et des langues spécifiques pourrait être bien plus efficace que d'utiliser Llama-2.
Building your custom LLM could enhance data security and compliance and enable an AI competitive advantage for your product. You can check our other posts to get an extensive explanation of what the network effect is and how AI enables it, how to build an AI competitive advantage for your company, what culture helps you build the right AI products, what to avoid in your AI strategy and execution, and more.
Besoin d’un modèle linguistique véritablement multilingue ?
Le bon choix de modèle dépend de vos langues cibles et de votre cas d’utilisation. Trouvons l'approche optimale pour votre produit d'IA multilingue.