# Que sont les plongements, et comment permettent-ils la recherche par le sens?

Date: 2022-02-05 · Author: Robert Scales · https://guidetoartificialintelligence.com/fr/apprendre/plongements-recherche-par-le-sens/

**Answer:** Un plongement est une longue liste de nombres qui représente le sens d’un texte, de sorte que des textes de sens semblable reçoivent des nombres semblables. La recherche par le sens transforme la question et chaque document en plongements, puis renvoie les documents dont les nombres sont les plus proches, même s’ils n’ont aucun mot en commun avec la question.

Le 25 janvier, OpenAI a ajouté à son API un point de terminaison pour les plongements (*embeddings*). Envoyez-lui un texte, ou du code, et il renvoie un vecteur : une liste de nombres, 2 048 dans le cas du modèle de similarité de taille babbage. Pris isolément, ces nombres ne veulent rien dire pour une personne. Leur valeur tient à la comparaison. Deux textes sur la même idée reviennent avec des vecteurs qui pointent presque dans la même direction, et deux textes sans rapport, non.

Cette propriété toute simple alimente toute une famille de tâches qu’OpenAI énumère pour le nouveau point de terminaison : la recherche sémantique (la recherche par le sens), le regroupement d’éléments semblables, la modélisation de sujets et la classification. L’idée n’est pas nouvelle; word2vec a montré en 2013 que des mots isolés pouvaient être placés dans un tel espace. Ce qui est nouveau, c’est d’obtenir des vecteurs de grande qualité pour des phrases et des documents entiers en un seul appel à l’API.

## Une carte du sens

Imaginez une carte où chaque phrase est un point. Les phrases sur les animaux de compagnie se regroupent dans un quartier, celles sur les déclarations de revenus dans un autre, celles sur le football dans un troisième. La distance sur la carte représente la différence de sens. L’illustration d’OpenAI elle-même : le vecteur de « canine companions say » (les compagnons canins disent) se retrouve plus près de « woof » (ouaf) que de « meow » (miaou).

Un véritable espace de plongements ne compte pas deux dimensions, mais des milliers. Chaque dimension saisit un aspect du texte, mais habituellement pas un aspect qu’une personne pourrait nommer. Pour comparer deux vecteurs, on calcule leur similarité cosinus, un score de -1 à 1 qui mesure à quel point ils pointent dans la même direction. Plus il est élevé, plus les textes se ressemblent. Les exemples d’OpenAI la calculent avec un seul produit scalaire, une ligne de code.

Les modèles d’OpenAI sont des descendants de GPT-3. Selon l’article qui les accompagne, ils ont été entraînés par préentraînement contrastif : le modèle voit des paires de textes qui vont ensemble et apprend à les placer près l’un de l’autre, tout en éloignant les textes qui ne vont pas ensemble. L’article rapporte de grands gains par rapport aux méthodes non supervisées antérieures sur des bancs d’essai de recherche comme MSMARCO, Natural Questions et TriviaQA.

## Pourquoi cela bat la recherche par mots-clés

La recherche classique par mots-clés fait correspondre des mots. Si un client tape « je n’arrive pas à accéder à mon compte » et que votre page d’aide dit « réinitialisez votre mot de passe », un moteur par mots-clés risque de ne rien trouver, parce qu’aucun mot important n’est partagé. La recherche par plongements fait correspondre le sens, si bien que la page sur le mot de passe se classe quand même en bonne position. OpenAI affirme que la recherche fondée sur les plongements généralise mieux que les méthodes qui comptent les mots en commun, précisément pour cette raison. Un client, Fabius, dit trouver environ deux fois plus de transcriptions d’appels pertinentes qu’avec une recherche approximative par mots-clés.

Pour la recherche, OpenAI offre des modèles jumelés : une version « query » (requête) pour la courte question et une version « doc » (document) pour les passages plus longs dans lesquels on cherche. Les vecteurs des documents peuvent être calculés une seule fois et conservés; chaque nouvelle recherche n’a donc besoin que d’un appel pour la question, suivi d’un calcul arithmétique rapide.

## Un exemple concret : classer cinq réponses de FAQ

Pour voir la mécanique, réduisons la carte à deux dimensions inventées : à quel point un texte porte sur la **facturation**, et à quel point il porte sur l’**accès au compte**. Ces coordonnées jouets sont inventées à des fins pédagogiques; un vrai modèle renvoie des milliers de nombres par texte.

Question : « Je n’arrive pas à accéder à mon compte » → (0,2; 0,9)

| Réponse de la FAQ | Vecteur jouet | Similarité cosinus |
|---|---|---|
| A. Cliquez sur « Mot de passe oublié » sur la page de connexion pour en choisir un nouveau. | (0,1; 0,9) | 0,99 |
| C. Après cinq tentatives ratées, la connexion est bloquée pendant 15 minutes. | (0,4; 0,8) | 0,97 |
| E. Vous pouvez changer votre adresse courriel dans Paramètres. | (0,6; 0,6) | 0,84 |
| B. Pour mettre à jour la carte que nous débitons, ouvrez la page Facturation. | (0,9; 0,2) | 0,42 |
| D. Les remboursements sont possibles dans les 30 jours suivant l’achat. | (0,95; 0,1) | 0,32 |

Les deux réponses liées à l’accès montent en tête, même si aucune ne contient les mots « accéder » ou « compte ». Les réponses sur la facturation descendent. Un vrai système fait la même chose avec des vecteurs beaucoup plus riches, et c’est pourquoi il peut distinguer des nuances de sens qu’un jouet à deux axes ne pourrait jamais saisir.

> **À essayer :** écrivez une question et cinq réponses possibles tirées de votre propre travail. Avant de lancer le moindre logiciel, classez les réponses selon la façon dont chacune vous semble convenir. Si vous avez accès à l’API, calculez les plongements de toutes, puis les similarités, et comparez l’ordre de la machine avec le vôtre.

## Comment chercher par le sens dans vos propres documents?

La recette compte cinq étapes. D’abord, découpez vos documents en passages assez courts pour porter sur un seul sujet, comme un paragraphe ou une section d’article d’aide. Ensuite, envoyez chaque passage à un modèle de recherche « doc » et enregistrez le vecteur à côté du texte; un tableur, un fichier ou une table de base de données ordinaire suffit pour quelques milliers de passages. Troisièmement, quand quelqu’un pose une question, calculez son plongement avec le modèle « query » correspondant. Quatrièmement, calculez la similarité cosinus entre la question et chaque passage conservé. Enfin, affichez les quelques meilleurs résultats.

Les exemples d’OpenAI utilisent quelques lignes de Python et la bibliothèque NumPy pour les calculs. Pour une petite collection, comparer la question à chaque passage à chaque recherche est assez rapide. Les collections plus grandes exigent une indexation plus astucieuse, mais le principe reste le même.

Vous pouvez aller un peu plus loin et confier les meilleurs passages à GPT-3 avec la question, pour qu’il rédige une réponse fondée sur votre propre matériel. Le point de terminaison Answers qu’offre déjà OpenAI fonctionne ainsi : il cherche dans les documents que vous fournissez et ajoute le contexte pertinent au prompt avant de générer une complétion. Les plongements vous permettent de construire cette chaîne vous-même, en contrôlant les passages que voit le modèle. Quoi que vous construisiez, montrez aux utilisateurs les passages sources, pour qu’ils puissent vérifier la réponse dans le texte d’origine.

## Sources

- Introducing Text and Code Embeddings in the OpenAI API: https://web.archive.org/web/20220201184422/https://openai.com/blog/introducing-text-and-code-embeddings/
- Text and Code Embeddings by Contrastive Pre-Training: https://arxiv.org/abs/2201.10005v1
- GPT-3 Powers the Next Generation of Apps: https://web.archive.org/web/20210927153619/https://openai.com/blog/gpt-3-apps/
