Google l’a explicitement annoncé l’année dernière : son moteur de recherche sera désormais enrichi d’IA Générative. Microsoft Bing, quant à eux ne le cachent pas non plus : Copilot améliore déjà toutes vos recherches. De son côté, OpenAI n’est pas en reste : l’association a récemment décidé de publier son nouveau prototype SearchGPT. Les résultats y sont clairs, directs, et l’utilisateur peut interagir avec cette technologie comme lors d’une discussion avec ChatGPT.
Comment imaginer que ce nouveau moteur puisse rivaliser avec les deux géants déjà largement établis ? Si OpenAI semble confiant, c’est en partie grâce à son utilisation plus élaborée de la technologie sous-jacente : la recherche sémantique.
Au cœur de l’IA Générative, cette innovation prend progressivement sa place dans toutes les technologies associées au langage naturel.
Comment fonctionne-t-elle et comment peut-on l’utiliser ?
Il s'agit des concepts, plus ou moins abstraits, sous-jacents à une phrase ou à un mot. La sémantique permet ainsi de répondre à tout un ensemble de questions sur les mots ; construction, associations, significations… En somme, la sémantique représente toute l’information pouvant transiter à travers un mot ou un ensemble de mots. C’est la compréhension et traduction informatique de ce concept qui a rendu possible la technologie associée aux Grands Modèles de Langage (LLMs).
Une machine (et par extension une intelligence artificielle) n’est pas un humain ; elle ne comprend que les nombres. Il faut donc en premier lieu convertir le mot en un nombre, qu’elle sera ensuite capable d’interpréter. Cette étape se nomme “tokenization”. Grâce à un gigantesque dictionnaire de conversion, nous associons un “numéro” à chaque ensemble de caractères, appelé alors “token” (en français, “jeton”). Il n’y a pas que les mots qui sont concernés : les dates, caractères spéciaux, nombres, émoticônes, tout a besoin d’être “tokenisé” !
Par exemple, le mot “acheté” dans ce grand dictionnaire de conversion aura la valeur “42368” et l'émoticône “😅” aura la valeur “784235”. L’objectif est de faire correspondre un “identifiant” à chaque groupe de caractères, pour faciliter l’entraînement de l’intelligence artificielle (réseau de neurones). Concrètement, cette phase sert à découper notre texte en petites entités sémantiques.
Une fois notre texte converti en tokens, nous utilisons un algorithme (un réseau de neurones nommé “Embedder”) pour les transformer en vecteurs de nombres. L’Embedding (ou en français, "vectorisation sémantique"), permet donc de créer la représentation vectorielle d’un mot. Plus précisément, il s’agit de projeter le mot dans un espace latent. Pas de crainte, nous allons expliciter la notion derrière ce concept. Prenons par exemple la phrase “Vive la GenAI !” :
À la fin de la transformation, nous obtenons pour chaque token notre vecteur sémantique. Ce vecteur, suite de nombres, représente en réalité une position dans un espace à grandes dimensions.
Un espace latent est un concept souvent utilisé en intelligence artificielle et en mathématiques. Il faut l’imaginer comme un espace où il est possible de positionner des points. Sa caractéristique est qu’il est construit grâce à une représentation simplifiée d’un autre espace, beaucoup plus complexe.
Pour donner une analogie, cet espace est comme une carte géographique. Une carte géographique est une représentation en deux dimensions d’un monde en trois dimensions : la représentation est simplifiée mais suffisamment riche pour nous permettre de l’utiliser de manière pertinente (et donc de naviguer).
Chaque dimension (c'est-à-dire, chaque nombre de ce vecteur) représente un concept. Ces concepts sont ceux que l’algorithme aura pu lui-même construire au cours de son entraînement, grâce à une compréhension progressive des textes et relations entre les mots. Pour illustrer cela, prenons un espace relativement simple à deux dimensions. De manière arbitraire, appelons la première “âge” et la seconde “taille”. Générons les embeddings des mots “chat”, “chaton”, “lion”, “lionceau” avec ces deux dimensions, et positionnons-les sur un graphe.
On y remarque la relation “sémantique” qu’ils vont avoir les uns avec les autres :
Dimension “âge” : Chaton est à Chat ce que Lionceau est à Lion
Dimension “taille” : Chat est à Lion ce que Chaton est à Lionceau
Autrement dit, chaque dimension de notre vecteur va représenter un concept qui permet d’établir des relations entre vecteurs, et donc entre textes. De cette manière en découle une seconde notion capitale : la proximité entre vecteurs se traduit par une proximité sémantique entre textes. Si dans l’espace précédent nous avions ajouté “Lionne”, son embedding aurait été très proche de celui du Lion.
En effet, dans l’espace sémantique, deux embeddings proches sont deux embeddings dont les dimensions partagent des valeurs très similaires (logiquement). C’est précisément dans ce cas que nous allons nous servir des outils mathématiques associés aux vecteurs. Comment savoir que “lion” est proche de “lionne” ? Simplement en calculant la distance qui sépare les deux vecteurs. Plusieurs méthodes existent (distance euclidienne, similarité de cosinus, de Manhattan, …), et toutes permettent d’arriver à une même forme de résultat : un nombre qui permet de savoir à quel point les deux vecteurs sont proches (par exemple 0.001, les vecteurs sont proches, 0.895, les vecteurs sont éloignés). Si nous avions ajouté la dimension du sexe, celle-ci aurait été un nouveau facteur différenciant, affectant à son tour la fonction de distance.
C’est ce fonctionnement que nous retrouvons dans les Embedders, et leur capacité à faire transiter un ensemble de caractères dans un espace multidimensionnel, appelé “espace latent”. Ces espaces n’ont pas seulement deux ou trois dimensions, mais plusieurs milliers ! Un des plus couramment utilisés aujourd’hui, text-embedding-large-3 d’OpenAI, dispose par exemple de 3072 dimensions. Ce sont autant de dimensions nécessaires pour représenter toute la complexité sémantique du langage naturel. Les Embedders sont ainsi capables de créer l’embedding d’un texte, quelle que soit sa longueur tant qu’elle rentre dans sa capacité maximale : syllabes, mots, phrases, paragraphes, etc.
text-embedding-large-3, en l'occurrence, peut prendre jusqu’à 8191 tokens en entrée (taille définie pour un ensemble de raisons techniques), de quoi abstraire beaucoup d’informations ! Naturellement, plus la quantité de tokens à faire passer dans l’espace latent augmente, plus le vecteur qui en résulte représente une information plus diffuse. Il faut donc bien jauger la taille des textes à embedder suivant la problématique…
Embedder du texte n’est pas une problématique récente. Un des algorithmes les plus connus, Word2Vec, a vu le jour en 2013 à travers les travaux des équipes de Google. Il a évolué au cours du temps, mais n’est aujourd’hui que très peu utilisé. Il fonctionnait à l’origine sans réseaux de neurones, et s’est vu être vite distancé par de nouvelles structures (BERT, ELMo) issus d’une évolution de 2017 à nouveau portée par Google : les Transformers.
“Attention is all you need” est le nom d’un papier de recherche publié en 2017 par Google, qui présente l’architecture Transformers démontrant alors une nouvelle manière d’envisager l’embedding. Il y est proposé de ne plus prendre chaque mot de manière indépendante, mais en le considérant comme faisant partie d’un tout, ce tout étant par exemple une phrase. Le constat est simple : le contexte est un élément primordial pour comprendre le sens d’une phrase. Il faut donc relier chaque mot (token) à tous les autres mots (tokens) de la phrase pour être capable d’en comprendre véritablement le sens.
Le principe est le suivant :
Le texte est découpé en tokens
Les tokens sont transformés en vecteurs sémantiques (embeddings)
Les tokens sont alors enrichis avec le contexte des tokens alentour (couche d’attention)
Le fonctionnement est le même que pour les réseaux de neurones : on construit l’abstraction grâce à une superposition de couches. Chaque couche d’attention provoque des modifications dans les vecteurs sémantiques. L’objectif est de faire se déplacer chaque embedding dans l’espace latent afin de s’assurer qu’il transporte l’information de son token couplée à celle de son contexte.
Comme dans l’exemple ci-dessus, si l’on cherche à positionner le mot “lit” dans l’espace latent, celui-ci va progressivement prendre du sens en fonction des autres mots présents dans la phrase. Ce "déplacement" des embeddings à chaque couche se fait en calculant des pondérations (ou "poids") basées sur les relations entre les tokens, qui permettent au modèle de mettre en avant ou d'atténuer l'influence des autres tokens dans la phrase.
Les couches vont ainsi être chaînées (et en grandes quantités) jusqu’à obtenir une couche d’attention finale. De cette dernière, il en est déduit le vecteur sémantique qui va représenter l’ensemble des tokens. Une première manière assez classique et historique de le construire consiste simplement à réaliser une “moyenne” de ces vecteurs grâce à un algorithme nommé "Bag Of Words".
Cette méthode reste cependant relativement “brute”, là où l’ensemble de l’approche Transformers tente d’exploiter la puissance des réseaux de neurones pour construire la connaissance. Une autre méthode a progressivement été mise au point, et est celle principalement utilisée aujourd’hui : le Token CLS.
“CLS” se traduit par “classification”, car ce token aide le modèle à classifier le sens du texte. L’idée se base justement sur le fonctionnement même de l’entraînement d’un réseau de neurones. Il faut percevoir ce Token CLS comme un mot totalement neutre (dont l’embedding est un vecteur vide ou aléatoire) que l’on ajoute à la fin de notre texte. Faisant partie de l’ensemble, il va s’interconnecter avec tous les autres embeddings, et va profiter à chaque couche d’attention de l’information véhiculée. L’objectif est de lui permettre de s’enrichir progressivement de sens au cours des couches, jusqu’à arriver à la dernière couche. Il y aura accumulé toute l’information qui transite dans le texte. Sa valeur représente l’embedding final qui sera le résultat en sortie de notre embedder.
Un LLM est un très grand réseau de neurones. Tout comme pour tous les autres réseaux de neurones, il dispose d’une suite de couches en entrée qui ont pour vocation à convertir et enrichir l’information, puis de couches décisionnelles capables d’interpréter, et enfin d’une couche en sortie rendant la décision du réseau. L’embedder et la sémantique dont nous venons de parler correspondent à cette suite de couches en entrée qui permet au LLM de transformer l’information en un langage qu’il comprend, pour ensuite prendre une décision sur le texte à générer en réponse à l’entrée.
L’embedding ne se limite aujourd’hui plus au simple texte. La méthode d’entraînement de ces modèles a évolué pour dorénavant inclure les images, vidéos et audio. Nous devenons maintenant capables de faire coexister au sein d'un même espace sémantique des données dont le type initial est très hétérogène ! Cela veut dire que nous pouvons retrouver simplement des images, des vidéos, grâce aux concepts qu’elles abordent. Cela veut aussi dire que les LLMs, devenus donc multimodaux, sont capables de comprendre une grande diversité de contenus. Cette évolution élargit d’autant plus les capacités de la technologie initiale, que l’on peut désormais appliquer à des domaines toujours plus variés et hétéroclites.
Dans notre prochain article, en lien avec celui-ci, nous aurons l’occasion d'aborder plus précisément comment l’IA Générative et les embeddings peuvent être utilisés dans des applications concrètes (et même déjà implémentées pour certaines d'entre elles !).
Merci d’avoir pris le temps de lire.