41 points par xguru 2023-10-30 | 5 commentaires | Partager sur WhatsApp

Qu'est-ce qu'un embedding ?

  • Un « embedding » consiste à convertir un contenu en « tableau de nombres à virgule flottante »
  • Le point clé de ce tableau est que, quelle que soit la « longueur du contenu », la « taille du tableau » reste toujours la même
  • La taille du tableau est déterminée par le modèle d'embedding utilisé : 300, 1000, 1536, etc.
  • La meilleure façon de se représenter ce tableau de nombres est de l'imaginer comme des « coordonnées dans un espace multidimensionnel très étrange »
  • Pourquoi placer un contenu dans un espace multidimensionnel ? Parce qu'on peut en apprendre des informations intéressantes à partir de sa position, et en particulier des autres contenus situés à proximité
  • Sa position dans cet espace représente le « sens sémantique (Semantic Meaning) » du contenu, selon la « compréhension étrange et en grande partie incompréhensible du monde » qu'a le modèle d'embedding
  • Le contenu embarqué peut capturer la couleur, la forme, les concepts ou toutes sortes d'autres caractéristiques
  • Personne ne comprend complètement ce que signifient individuellement ces nombres, mais on sait que leur position peut être utilisée pour trouver des informations utiles sur le contenu

Trouver du contenu lié à l'aide des embeddings

  • Le premier problème que j'ai résolu avec des embeddings a été la création de la fonctionnalité « Related Content » de mon blog TIL
  • J'ai utilisé le modèle text-embedding-ada-002 d'OpenAI. Il est accessible via API
  • Mon site contient actuellement 472 articles, et pour chacun j'ai calculé un vecteur d'embedding de dimension 1536 (un tableau de nombres à virgule flottante), puis stocké ce vecteur dans la base SQLite de mon site
  • Ensuite, pour trouver les articles liés à un article donné, il suffit de calculer la similarité cosinus (Cosine Similarity) entre son vecteur d'embedding et les autres articles de la base, puis de renvoyer les 10 correspondances les plus proches par distance
  • Le code Python utilisé pour la similarité cosinus est le suivant
def cosine_similarity(a, b):  
    dot_product = sum(x * y for x, y in zip(a, b))  
    magnitude_a = sum(x * x for x in a) ** 0.5  
    magnitude_b = sum(x * x for x in b) ** 0.5  
    return dot_product / (magnitude_a * magnitude_b)  
  • L'API d'embedding d'OpenAI est très bon marché et facile à utiliser
    • J'ai embarqué environ 400 000 tokens pour mon site TIL, et à $0.0001 pour 1 000 tokens, cela n'a coûté que $0.04 au total
    • Il suffit d'envoyer le texte en POST avec une clé API, et cela renvoie un tableau JSON de nombres à virgule flottante
  • Mais c'est un modèle propriétaire, et il y a quelques mois OpenAI a également arrêté certains de ses modèles d'embedding
  • Autrement dit, si vous avez stocké un grand nombre d'embeddings provenant de ce modèle, il faut les recalculer pour un nouveau modèle
  • OpenAI a indiqué qu'ils compenseraient le coût du ré-embedding avec le nouveau modèle, mais il faut faire attention avec les modèles propriétaires
  • On peut éviter cela avec des modèles puissants sous licence ouverte

Comprendre comment cela fonctionne avec les modèles Word2Vec

  • Il y a 10 ans, Google Research a publié un article influent décrivant un premier modèle d'embedding appelé Word2Vec
    • L'article de 2013, « Efficient Estimation of Word Representations in Vector Space », a suscité l'intérêt pour les embeddings
  • Word2Vec est un modèle qui prend un mot unique et le transforme en une liste de 300 nombres. Cette liste capture des informations sur le sens de mots apparentés
  • En recherchant un mot, on peut trouver des mots similaires à partir de la distance cosinus par rapport à sa représentation Word2Vec
  • Si l'on recherche « france », on peut obtenir des valeurs comme « french : 0.70007~ », « belgium: 0.69331~ », « paris: 0.63349~ », « germany: 0.62707~ »
  • C'est un mélange de ce qui est français et de géographie européenne
  • Ce qu'on peut faire de vraiment intéressant ici, c'est effectuer des opérations arithmétiques sur ces vecteurs
  • Si l'on ajoute « paris » au vecteur de « germany » puis qu'on soustrait « france », le vecteur résultant est le plus proche de « berlin »
  • Ce modèle a capturé des idées de nationalité et de géographie, au point que l'arithmétique permet d'explorer d'autres faits sur le monde
  • Word2Vec a été entraîné sur 1,6 milliard de mots, et les modèles d'embedding que nous utilisons aujourd'hui sont entraînés sur des jeux de données bien plus vastes, capturant une compréhension beaucoup plus riche des relations sous-jacentes

Calculer et rechercher des embeddings avec mes outils

  • Je développe un CLI et une bibliothèque Python appelés LLM
  • Ils peuvent être utilisés comme CLI pour interagir avec des LLM, et prennent aussi en charge l'intégration OpenAPI
  • Il y a quelques mois, j'ai aussi ajouté à cet outil via des plugins la possibilité d'exécuter des modèles d'embedding (avec la bibliothèque SentenceTransformers)
  • Il permet de choisir une collection d'embeddings et d'effectuer une recherche sémantique « vibes-based » pour trouver des éléments similaires
  • Je développe aussi un outil nommé Symbex pour trouver des symboles dans une base de code Python. Cela permet de calculer des embeddings des fonctions du code afin de construire un moteur de recherche dans le code
  • (Les détails d'implémentation sont omis)

Utiliser CLIP pour embarquer ensemble texte et images

  • Mon modèle d'embedding préféré actuellement est CLIP
  • Lancé par OpenAI en janvier 2021, il peut embarquer à la fois du « texte et des images » dans le même espace vectoriel
  • Si l'on insère « dog », on obtient une position dans un espace à 512 dimensions (selon la configuration CLIP)
  • Si l'on embarque une photo de chien, on obtient aussi une position dans ce même espace, proche de celle de la chaîne « dog »
  • Cela permet donc de rechercher des images pertinentes avec du texte, ou du texte pertinent à partir d'une image
  • Si l'on fournit une photo de plage, on peut obtenir des scores de similarité comme « beach: 26.946% », « city: 19.839% », « sunshine: 24.146% »

Trouver des robinets avec CLIP

  • Drew Breunig a construit un moteur de recherche de robinets avec le plugin llm-clip
  • Il a récupéré 20 000 photos de robinets puis exécuté CLIP dessus
  • Il a ensuite pu trouver des robinets similaires à d'autres robinets, puis parmi eux des options à la fois similaires et moins chères

Répondre à des questions avec le RAG

  • La question finale de tous ceux qui ont essayé ChatGPT est toujours la même
    « Comment faire pour qu'il réponde à propos de mes notes ou de la documentation de mon entreprise ? »
  • Les gens supposent qu'il faut entraîner à grands frais un modèle personnalisé sur ce contenu
  • Mais en réalité, ce n'est pas nécessaire. C'est possible avec les LLM et le RAG (Retrieval Augmented Generation)
  • L'idée de base est la suivante : « l'utilisateur pose une question »
    • On cherche ensuite dans ses documents personnels ce qui est pertinent pour cette question
    • On injecte ensuite un extrait de ce contenu dans le LLM avec la question d'origine
    • Le LLM peut alors répondre à la question à partir du contenu supplémentaire fourni
  • Cette astuce peu coûteuse est étonnamment efficace
    • Mais il n'est pas si simple de faire fonctionner correctement la version de base qui rend cela possible
    • Il faut que cela marche aussi bien que possible face à l'ensemble infini des questions que les utilisateurs peuvent poser
  • Le principal problème du RAG consiste à déterminer les meilleurs extraits de contenu à inclure dans le prompt envoyé au LLM
  • La recherche sémantique « vibes-based » alimentée par des embeddings est la capacité nécessaire pour rassembler les contenus les plus pertinents susceptibles d'aider à répondre à la question de l'utilisateur
  • J'ai créé et publié une version portant sur « le contenu de mon blog »
    • Au final, cela rend le RAG possible avec une simple commande Bash sur une ligne

5 commentaires

 
edunga1 2023-11-06

J’ai vu cet article et j’ai essayé ce week-end. J’ai tenté un modèle en coréen, mais comme la configuration de l’environnement n’était pas simple, j’ai utilisé ada v2, et au total cela m’a coûté 0,03 dollar. Si on est un nouvel utilisateur qui n’a jamais utilisé ChatGPT, les 5 dollars de crédit gratuit devraient largement suffire pour essayer, haha.

J’ai même calculé et comparé la similarité cosinus, et les résultats m’ont paru convaincants. Merci pour le partage de l’article.

 
laeyoung 2023-11-01

Je vais essayer ça ce week-end.

 
donghemul11 2023-10-31

Merci~

 
seatbelts 2023-10-30

Je crois que je commence à comprendre, au moins un peu.
Merci.

 
charo 2023-10-30

J’ai appris beaucoup de choses sur des points qui m’intriguaient depuis longtemps sans que je les comprenne vraiment bien. Merci comme toujours pour cet excellent contenu.