5 points par GN⁺ 2023-10-25 | 1 commentaires | Partager sur WhatsApp
  • Les embeddings transforment des contenus comme du texte, des images ou du code en tableaux de nombres à virgule flottante de longueur fixe, ce qui permet de retrouver des éléments sémantiquement proches via un calcul de distance
  • Dans l’espace vectoriel produit par un même modèle, il n’est pas nécessaire de connaître la signification de chaque nombre pour comparer des documents liés, des images similaires ou des fragments de code avec la similarité cosinus
  • Dans un cas où 472 billets TIL ont été stockés sous forme de vecteurs de 1 536 dimensions avec OpenAI text-embedding-ada-002, une requête de recherche d’articles liés prenait environ 400 ms, et le coût d’embedding total de 402 500 tokens était d’environ 0,04 $
  • Même avec seulement des modèles locaux et de petits outils combinés, il est possible d’implémenter la recherche dans des README, la recherche de code, la recherche d’images, le clustering et le RAG, avec comme exemples LLM, llm-sentence-transformers, Symbex, CLIP et E5-large-v2
  • La recherche sémantique fondée sur les embeddings ne dépend pas d’une correspondance exacte des mots, ce qui en fait un moyen clé, notamment dans le RAG pour les questions-réponses sur des documents internes, d’insérer dans le prompt du LLM des extraits pertinents

Concepts de base des embeddings

  • Un embedding est une manière de convertir un fragment de contenu en tableau de nombres à virgule flottante
    • Quelle que soit la longueur du contenu, la longueur du tableau reste toujours identique
    • La longueur du tableau est déterminée par le modèle d’embedding utilisé, par exemple 300, 1 000 ou 1 536 nombres
  • Ce tableau peut être vu comme des coordonnées dans un espace multidimensionnel
    • La position dans cet espace représente le sens du contenu tel qu’interprété par le modèle d’embedding
    • Des caractéristiques du contenu comme la couleur, la forme ou des concepts peuvent s’y refléter
  • Même sans comprendre complètement la signification de chaque nombre, on peut exploiter les relations de position pour des tâches utiles, comme retrouver des éléments proches

Recommander des contenus liés : le cas du blog TIL

  • Sur un site TIL comptant 472 articles, le modèle OpenAI text-embedding-ada-002 a été utilisé pour calculer un vecteur d’embedding de 1 536 dimensions pour chaque billet
    • Les vecteurs ont été stockés dans la base de données SQLite du site
    • Les articles liés ont été trouvés en calculant la similarité cosinus entre le vecteur de l’article cible et tous les autres, puis en renvoyant les 10 plus proches
  • Pour l’article d’exemple « Geospatial SQL queries in SQLite using TG, sqlite-tg and datasette-sqlite-tg », les premiers résultats liés portaient sur SQLite, SpatiaLite, GDAL et les requêtes SQL spatiales
    • La similarité avec lui-même était de 1.0
    • sqlite_geopoly.md avait 0.8817322855676049
    • spatialite_viewing-geopackage-data-with-spatialite-and-datasette.md avait 0.8813094978399854
  • La requête de calcul des articles liés prenait environ 400 ms, donc les 10 meilleures similarités ont été pré-calculées pour tous les articles puis enregistrées dans une table similarities
  • Le coût de l’API d’embedding d’OpenAI pour le site TIL était d’environ 0,04 $, sur la base d’environ 402 500 tokens au tarif de 0.0001 $ / 1 000 tokens
  • Les modèles propriétaires demandent une vigilance opérationnelle
    • OpenAI a déjà arrêté certains anciens modèles d’embedding
    • Si beaucoup d’embeddings ont été stockés avec un ancien modèle, il peut être nécessaire de les recalculer avec un modèle encore pris en charge pour embedder de nouveaux contenus
    • OpenAI a promis de prendre en charge le coût du ré-embedding avec les nouveaux modèles, mais le risque de dépendance à un modèle propriétaire demeure
  • Les modèles sous licence ouverte peuvent être exécutés sur son propre matériel, ce qui évite le risque de disparition du modèle

Comprendre l’espace vectoriel avec Word2Vec

  • Efficient Estimation of Word Representations in Vector Space de Google Research est l’article Word2Vec publié le 16 janvier 2013
  • Word2Vec est un des premiers modèles d’embedding qui transforme un mot en tableau de 300 nombres
  • turbomaze.github.io/word2vecjson est une démo qui permet d’explorer 10 000 mots et leur tableau de 300 nombres
    • Parmi les mots proches de « france », on trouve french, belgium, paris, germany, italy, spain
  • Les opérations vectorielles révèlent aussi des relations
    • Si on ajoute « paris » au vecteur « germany » puis qu’on retire « france », le vecteur résultant est le plus proche de « berlin »
    • Cela montre que le modèle a capturé des relations de nationalité et de géographie dans l’espace vectoriel
  • Word2Vec a été entraîné sur 1,6 milliard de mots, et les modèles d’embedding actuels sont entraînés sur des jeux de données bien plus vastes, capables de capturer des relations plus riches

Calculer des embeddings avec les outils LLM

  • LLM est un outil en ligne de commande et une bibliothèque Python pour manipuler de grands modèles de langage
    • Il peut être installé avec pip install llm ou brew install llm
    • Par défaut, il peut être utilisé avec l’API OpenAI
  • En installant des plugins, il est possible d’ajouter de nouveaux modèles de langage ou modèles d’embedding
  • Le plugin llm-sentence-transformers encapsule la bibliothèque SentenceTransformers
    • Il permet de télécharger le modèle all-MiniLM-L6-v2 depuis Hugging Face et de l’utiliser en local
    • La commande llm embed renvoie un tableau JSON de nombres pour une phrase
  • Un embedding seul, sous forme de tableau de nombres, a peu d’intérêt ; il devient utile une fois stocké puis comparé
  • llm embed-multi permet d’embedder plusieurs contenus à la fois et de les stocker dans une table SQLite appelée collection
    • La commande d’exemple cherche tous les fichiers README.md sous le répertoire personnel et les enregistre dans la collection readmes
    • L’option --store enregistre aussi le texte source dans la table SQLite
    • Au total, 16 796 fichiers README.md ont été enregistrés, ce qui a pris environ 30 minutes sur un ordinateur local

Recherche sémantique et « vibes-based search »

  • La commande llm similar cherche dans une collection d’embeddings stockée les éléments similaires à une phrase d’entrée
  • Si l’on interroge la collection readmes avec la phrase sqlite backup tools, les premiers résultats incluent les README de projets liés aux sauvegardes SQLite, comme sqlite-diffable, sqlite-dump, sqlite-generate, sqlite-history et sqlite-utils
  • Rien ne garantit que le mot « backups » apparaisse directement dans les documents trouvés
    • Un contenu peut ressortir comme résultat s’il est sémantiquement similaire à la requête
  • Cette méthode relève de la recherche sémantique, que l’auteur appelle ici vibes-based search
  • Comme une correspondance textuelle exacte ne permet pas toujours de trouver ce que cherche l’utilisateur, cette approche est utile pour différents moteurs de recherche de contenu

Embeddings de code : Symbex et Datasette

  • Symbex est un outil d’exploration des symboles dans un codebase Python
    • Il a été créé pour retrouver rapidement des fonctions et classes Python à transmettre à un LLM
    • Il a ensuite permis de calculer les embeddings de toutes les fonctions d’un codebase pour construire un moteur de recherche de code
  • Symbex peut produire les symboles trouvés en JSON ou CSV, formats qui peuvent servir d’entrée à llm embed-multi
  • L’exemple d’embedding de toutes les fonctions et méthodes de classe du projet Datasette utilise le modèle gte-tiny
    • gte-tiny est un fichier de 60 MB
    • symbex '*' '*:*' --nl produit les fonctions et méthodes de classe du répertoire courant au format JSON délimité par des retours à la ligne
    • llm embed-multi ... --format nl peut consommer directement cette sortie pour produire les embeddings
  • On peut ensuite utiliser Datasette et le plugin datasette-llm-embed pour exécuter une recherche sémantique de code en SQL
  • SQLite sert de point d’intégration pour assembler plusieurs outils
    • Extraire les fonctions du code
    • Les faire passer dans le modèle d’embedding
    • Écrire les résultats dans SQLite
    • Rechercher avec SQL

Embeddings de texte et d’image dans le même espace avec CLIP

  • CLIP est un modèle publié par OpenAI en janvier 2021, capable d’embedder à la fois du texte et des images
  • L’idée clé est que texte et image sont placés dans le même espace vectoriel
    • La position de l’embedding de la chaîne « dog » est proche de celle d’une photo de chien dans le même espace
    • On peut ainsi retrouver des images liées à partir de texte, ou du texte lié à partir d’images
  • La démo CLIP exécutée dans le navigateur a été construite sous forme de notebook Observable et exécute le modèle CLIP dans le navigateur
    • La page charge 158 MB de ressources
    • Le modèle texte CLIP pèse 64.6 MB et le modèle image 87.6 MB
  • Un exemple calcule des scores de similarité entre une photo de plage et différents textes
    • beach: 26.946%
    • city: 19.839%
    • sunshine: 24.146%
    • california beach: 27.427%
  • Plus que de demander la similarité entre une photo quelconque et un seul mot, l’enjeu est de construire au-dessus une interface de recherche

Faucet Finder : recherche d’images fondée sur CLIP

  • Faucet Finder est un outil de recherche sur mesure pour retrouver des photos de robinets de salle de bain
  • Drew Breunig a collecté 20 000 images de robinets auprès de fournisseurs et a calculé leurs embeddings CLIP
    • L’implémentation utilise LLM et le plugin llm-clip
    • Le tout est déployé avec Datasette
  • L’outil permet de trouver d’autres robinets visuellement similaires à un modèle donné
    • Si un robinet cher plaît, on peut trouver des alternatives moins coûteuses mais visuellement proches
  • La démo de Drew affiche des résultats similaires à partir d’embeddings pré-calculés, sans exécuter le modèle CLIP côté serveur
  • Par la suite, un modèle CLIP côté serveur a été déployé sur Fly.io, et une démo sous forme de notebook Observable a été créée en combinant une API d’embedding de chaînes de texte et une API de table d’embeddings de robinets
    • Il devient alors possible de rechercher sémantiquement des images de robinets avec une requête comme « gold purple »

Clustering et visualisation en 2D

  • Les embeddings ne servent pas seulement à recommander des contenus liés ou à faire de la recherche sémantique, ils peuvent aussi servir au clustering
  • llm-cluster est un plugin qui implémente le clustering avec sklearn.cluster de scikit-learn
  • À partir de l’API GitHub issues et de paginate-json, on peut créer une collection llm-issues à partir des titres des issues du dépôt simonw/llm, puis générer 10 clusters
  • L’option llm cluster llm-issues 10 --summary transmet le texte des clusters à un LLM pour générer des noms descriptifs
    • Parmi les noms d’exemple figurent « Log Management and Interactive Prompt Tracking » et « Continuing Conversation Mechanism and Management »
  • Les espaces de grande dimension sont difficiles à visualiser, et l’on peut réduire la dimension avec une analyse en composantes principales (PCA)
    • Matt Webb a créé des embeddings OpenAI des descriptions d’épisodes du podcast BBC In Our Time, puis généré une visualisation 2D avec la PCA
    • Même réduits de 1 536 dimensions à 2 dimensions, les épisodes sur les guerres historiques ou les découvertes scientifiques modernes apparaissent encore proches les uns des autres

Classer des phrases par position moyenne

  • Les embeddings peuvent aussi être utilisés pour la classification
    • On calcule d’abord la position moyenne de groupes d’embeddings classés selon un certain critère
    • On compare ensuite l’embedding d’un nouveau contenu à ces positions pour lui attribuer une catégorie selon celle dont il est le plus proche
  • Getting creative with embeddings d’Amelia Wattenberger présente un cas où l’on attribue un score à une phrase selon qu’elle est concrète ou abstraite
  • On crée des exemples de phrases concrètes et abstraites, puis on calcule la position moyenne de chaque groupe
  • Une nouvelle phrase reçoit un score selon sa proximité avec l’une ou l’autre position moyenne
  • Ce score peut aussi être transformé en couleur pour représenter de manière souple à quel point la phrase est abstraite ou concrète

RAG : questions-réponses sur documents personnels et documents internes

  • Les personnes qui ont utilisé ChatGPT se demandent souvent comment obtenir des réponses fondées sur leurs notes personnelles ou sur des documents internes à l’entreprise
  • La réponse n’est peut-être pas un entraînement coûteux d’un modèle sur mesure, mais une combinaison de LLM standard et de RAG (génération augmentée par la recherche)
  • La procédure de base du RAG est simple
    • L’utilisateur pose une question
    • On recherche dans les documents personnels les contenus qui semblent liés à la question
    • En respectant la limite de taille du LLM, on insère dans le prompt les extraits pertinents avec la question d’origine
    • Le LLM répond à partir du contenu additionnel fourni
  • La limite de taille courante est généralement de l’ordre de 3 000 à 6 000 mots
  • La partie difficile du RAG consiste à trouver les meilleurs extraits à inclure dans le prompt
    • La recherche sémantique fondée sur les embeddings est bien adaptée pour rassembler les contenus les plus susceptibles d’être pertinents

Implémenter un Q&R hors ligne fondé sur un blog avec E5-large-v2

  • Un exemple de RAG fondé sur le contenu d’un blog utilise E5-large-v2
  • Les phrases de question et de réponse ont une grammaire différente, donc une question n’est pas toujours sémantiquement proche d’un document qui contient la réponse
  • E5-large-v2 prend en charge deux types de contenu
    • Une factual sentence est embedded comme phrase
    • Une question est embedded comme query
    • Cela ressemble à la manière dont CLIP place images et texte dans le même espace
  • Les 19 000 paragraphes du blog sont embeddés en tant que phrase, et la question est embeddée en tant que query pour trouver les paragraphes les plus proches de la réponse
  • L’exemple implémente un RAG avec une simple ligne de commande Bash
    • llm similar sert à trouver les paragraphes pertinents
    • jq extrait le contenu
    • La question et les paragraphes sont ensuite transmis à un modèle Llama 2 Chat 7B exécuté sur un ordinateur portable local
  • À la question What is shot-scraper?, la réponse générée explique que shot-scraper est un utilitaire Python qui encapsule Playwright et automatise les captures d’écran de pages web ainsi que le scraping fondé sur JavaScript via une interface en ligne de commande et un flux de configuration basé sur YAML
  • La réponse générée ne correspondait pas à une phrase exactement présente dans le contenu du blog

Choix ajustables en pratique

  • LangChain est un framework pour implémenter des fonctionnalités au-dessus des LLM, et le RAG en est l’une des fonctions centrales
    • On peut construire les mêmes fonctionnalités avec LangChain, mais sa compréhension demande un investissement important
    • Ici, la préférence va à une boîte à outils de petits composants combinables plutôt qu’à un framework unique censé tout résoudre
  • La fonction de distance utilisée par défaut est la similarité cosinus
    • D’autres fonctions de distance n’ont pas encore été testées
    • Le RAG comporte de nombreux paramètres ajustables : fonction de distance, modèle d’embedding, stratégie de prompt, LLM, etc.
  • Les exemples portaient sur un volume maximal d’environ 20 000 embeddings, taille à laquelle un calcul brute force de similarité cosinus sur l’ensemble reste raisonnablement rapide
  • Pour des volumes bien plus grands, comme 1 milliard d’objets, on peut envisager une base de données vectorielle ou une extension de base de données existante
    • SQLite dispose de sqlite-vss
    • PostgreSQL dispose de pgvector
    • FAISS de Facebook a aussi été utilisé dans des expérimentations, ainsi que le plugin Datasette datasette-faiss qui s’appuie dessus
  • Parmi les évolutions attendues figurent les modèles multimodaux et des modèles plus petits
    • ImageBind de Facebook apprend un embedding commun pour six modalités de données : image, texte, audio, profondeur, thermique et IMU
    • Des modèles plus compacts comme gte-tiny, qui ne pèse que 60 MB, augmentent les possibilités d’exécution sur des appareils contraints ou directement dans le navigateur

Pour aller plus loin

1 commentaires

 
GN⁺ 2023-10-25
Avis sur Hacker News
  • Après avoir publié cet article, j’ai trouvé quelques ressources supplémentaires utiles pour comprendre les embeddings à un niveau plus bas
    Mon article était volontairement très général, avec un accent surtout mis sur les applications
    Text Embeddings Visually Explained de Cohere : https://txt.cohere.com/text-embeddings/
    L’outil Tensorflow Embedding Projector : https://projector.tensorflow.org/
    What are embeddings? de Vicki Boykis vaut aussi le détour : https://vickiboykis.com/what_are_embeddings/
    Je vais les ajouter à la section « further reading » en bas de page

    • J’avais essayé une idée presque identique il y a quelque temps : https://blog.scottlogic.com/2022/02/23/word-embedding-recomm...
      J’ai utilisé des embeddings pour augmenter l’engagement sur les articles liés et, personnellement, je pense que les embeddings sont un outil puissant et sous-estimé
      On peut s’en servir pour naviguer par similarité entre des documents ou des extraits, ou au contraire pour trouver du contenu atypique, et c’est plutôt « sûr » puisqu’on n’a pas à se soucier des hallucinations
    • J’aime la façon dont c’est écrit pour rester accessible aux personnes ayant peu d’expérience en IA, machine learning ou LLM
      La manière dont les embeddings sont créés peut aussi être intéressante. Par exemple, il y a des approches consistant à retirer la couche de classification après l’entraînement, ou des méthodes comme EfficientNet
    • Je me demande s’il existe des ressources sur l’histoire des embeddings et leur usage en informatique et dans les LLM
      Ils sont en train de devenir un socle central du machine learning
  • En vision par ordinateur et dans les algorithmes de SLAM visuel, les embeddings sont devenus la méthode de fait pour la reconnaissance de lieux, et c’est très proche de ce que décrit l’article
    On appelle cela la « bag-of-word place recognition », et c’est utilisé aujourd’hui dans presque toutes les bibliothèques open source
    L’idée centrale est de faire passer chaque image dans un pipeline d’extraction de caractéristiques et de descripteurs pour l’« embedder » sous forme de vecteur contenant les N meilleures caractéristiques
    Pendant que la caméra se déplace, on construit une base de données d’images appelées keyframes, et les images sont stockées sous forme de vecteurs de dimension bien plus faible
    Ensuite, on interroge la base avec chaque image et l’on cherche la meilleure correspondance dans la base vectorielle avec une méthode comme la similarité cosinus
    S’il y a une correspondance, on peut calculer les contraintes stéréo entre l’image requête et l’image correspondante afin de mettre à jour la carte
    L’article original est [1] et l’implémentation la plus connue est https://github.com/dorian3d/DBoW2
    [1] : https://www.google.com/search?client=firefox-b-d&q=Bags+of+B...

  • Excellente ressource d’introduction
    J’avais autrefois créé ma propre application de notes iOS, et ajouter des embeddings à la recherche plein texte existante s’est révélé 1) étonnamment facile et 2) bien plus puissant que ce que j’imaginais au départ
    Je savais qu’une recherche sur « dog » ferait aussi remonter des notes contenant « canine », mais ce n’est qu’en essayant que j’ai compris qu’une recherche comme « un animal de compagnie que je pourrais aimer » retrouvait plusieurs notes sur des animaux avec une tonalité positive
    C’était mon premier grand moment de révélation
    À l’époque, la PR DocsGPT de Supabase m’avait été utile comme exemple de code : https://github.com/supabase/supabase/pull/12056

    • L’expression « ajouter à la recherche plein texte existante » est discrètement importante. Les embeddings fournissent une recherche sémantique qui complète les algorithmes de recherche traditionnels
      Beaucoup d’applications dépendent fortement des noms et des noms propres, avec souvent peu de contexte
      Si vous désignez votre chien uniquement par son nom, sans description, certains modèles d’embedding risquent de ne pas le retrouver
      Les noms propres de personnes, de lieux ou de rues peuvent être très importants pour ancrer une recherche personnalisée ou propre à un domaine, mais les modèles de langage généralistes ne les connaissent pas
      Je me demande s’il existe des méthodes concrètes pour traiter ce problème
    • Je travaille sur quelque chose de similaire pour les notes Logseq
      La grande question pour l’instant est de savoir quelle quantité de texte mettre dans un seul embedding
      Faut-il le faire phrase par phrase, ou plutôt regrouper en un seul embedding tout le bloc de phrases appartenant à une page dans l’application de notes ?
    • Je me demande si l’API utilisée pour générer les embeddings est externe à l’appareil, et si la recherche se fait sur l’appareil
  • L’exemple emblématique des embeddings de mots est le fameux King - Man + Woman = Queen
    Cela fonctionne bien dans l’espace vectoriel, mais une fois projeté en 2D, ce n’est pas très parlant visuellement
    D’après mon expérience, c’était pareil avec PCA, MDS et t-SNE : https://bhugueney.gitlab.io/test-notebooks-org-publish/jupyt...
    C’est un notebook JupyterLite qui effectue des embeddings de mots dans le navigateur, et il vaut mieux éviter de le lancer sur smartphone
    Je me demande si quelqu’un connaît une bonne façon de visualiser joliment cet exemple classique d’embedding de mots

    • Si j’ai bien compris, on peut le visualiser dans un espace 2D en plaçant “king” à l’origine, avec l’axe X défini par “king”-“man” et l’axe Y par “king”-“woman”
      Si l’on veut vraiment de l’orthogonalité, on peut utiliser Gram-Schmidt
      En 3D, on peut ajouter un axe Z défini par “king”-“queen”, et la version orthogonalisée est plus proche de la notion de distance vue par le modèle
      En 2D, on ne peut pas montrer à quel point “king”-“man”+“woman” s’écarte de “queen”, mais on peut obtenir exactement les distances restantes
      En 3D, on devrait pouvoir donner la distance exacte
      “queen” est généralement choisi parce que c’est le mot dont l’embedding est le plus proche de X="king"-"man"+"woman"
      On peut aussi afficher quelques-uns des mots suivants les plus proches sur le graphique 2D, et ajouter pour chaque mot sa distance orthogonale au plan 2D
      Ainsi, “queen” devrait être le mot pour lequel la somme de la distance au carré depuis X et de la distance orthogonale au carré depuis le plan est la plus petite, ce qui permet de le vérifier plus ou moins à l’œil nu
    • Tu pourrais essayer UMAP
    • En cherchant une blague de mathématicien sur la visualisation des hautes dimensions, j’ai demandé à ChatGPT, qui a inventé une blague à la Richard Feynman introuvable sur Google
      C’était du genre : « On ne peut pas visualiser la 4D… en tout cas moi je ne peux pas. Je n’ai que trois branes », avec un jeu de mots entre branes et brains
      Plus tard, ChatGPT a reconnu l’avoir inventée et s’est excusé
      Il a ensuite sorti des citations de John von Neumann, H. G. Wells et Ian Stewart, puis a fini par répondre quelque chose comme : « Pour visualiser la 4D, visualisez la 3D, puis dites ‘n+1’ », ce qui ressemblait le plus à la blague dont je me souvenais, mais en moins drôle
      Alors je lui ai demandé de fabriquer des citations hallucinées dans le style de Deepak Chopra sur la visualisation d’espaces de grande dimension, et il m’a déversé des fausses citations plausibles mêlant des expressions comme septillion-dimensional embeddings, Hilbert space, Poincaré conjecture, Heisenberg uncertainty principle et Shannon entropy
  • Une erreur courante en trigonométrie pratique consiste à faire des calculs de racine carrée inutiles
    Dans le code d’exemple, magnitude_a = sum(x * x for x in a) * 0.5 et magnitude_b = sum(x * x for x in b) * 0.5 n’ont pas besoin de *0.5
    Si l’on veut comparer des cosinus, on peut comparer les valeurs au carré, ce qui évite un calcul de racine coûteux
    De même, en cryptographie sur courbes elliptiques, on repousse autant que possible les opérations coûteuses comme le calcul d’inverses, ou bien, lorsqu’il s’agit seulement de comparer deux points, on évite parfois même de calculer la valeur canonique

    • Ce code est écrit pour être facile à comprendre
      Sinon, il aurait été remplacé par du code SIMD bas niveau
  • dot_product = sum(x * y for x, y in zip(a, b)) — je me demande pourquoi faire comme ça au lieu d’utiliser des opérations numpy vectorisées
    J’ai compris en voyant le passage disant qu’il avait demandé à ChatGPT d’écrire plusieurs versions du code de similarité cosinus

    • Il y a deux raisons
      Premièrement, quand j’explique à des gens, je trouve que la syntaxe numpy gêne plutôt qu’elle n’aide
      Deuxièmement, numpy n’est pas la dépendance la plus légère
      Je l’utilise quand j’ai besoin de performance, mais je ne veux pas en faire mon choix par défaut
  • Si vous voulez voir des posts Show HN, des startups ProductHunt, des entreprises YC ou des dépôts Github liés aux embeddings LLM, vous pouvez les trouver rapidement dans le MVP de moteur de recherche basé sur les embeddings LLM que je viens de lancer
    https://payperrun.com/%3E/search?displayParams={%22q%22:%22L...

    • Pas mal
      Je m’attendais à ce que les résultats soient immédiatement mis à jour en appuyant sur les différents boutons de filtre, et je ne pensais pas qu’il faudrait relancer la recherche
      Je comprends pourquoi vous l’avez fait ainsi
    • Mon post Show HN est ici : https://news.ycombinator.com/item?id=38011802
  • C’est ce que j’ai lu de plus intéressant sur l’“IA” ces derniers mois
    Chaque fois que je voyais un modèle d’embedding dans une liste, je me demandais ce que c’était, et je me demandais aussi pourquoi tout le monde parlait de bases de données vectorielles
    Je vois tout de suite comment l’appliquer à un side project que je mène depuis longtemps
    Si tous les documents disposent d’un embedding, il pourrait devenir réaliste de produire des regroupements utiles de données utilisateur

  • Je me demande si quelqu’un a déjà utilisé les embeddings en pratique pour autre chose que les plus proches voisins approximatifs et le clustering
    Les possibilités qui me viennent à l’esprit sont la projection, l’indexation et le tri selon des axes arbitraires. Par exemple des axes comme « chaud-froid », « bonheur-tristesse », « SF-réalisme », « littérarité-commercialité »
    Il doit aussi exister des façons d’entraîner directement des embeddings, au-delà de faire de la classification façon SVM dans l’espace des embeddings, du raisonnement façon word2vec comme woman-man+king=queen, ou de récupérer une couche d’un LLM
    Je sais que l’apprentissage contrastif est utilisé, mais d’autres approches semblent aussi mériter d’être explorées, comme entraîner des embeddings avec un réseau de fonctions, générer des équations fonctionnelles et calculer une perte d’erreur quadratique moyenne
    Je suis surpris de voir à quel point tout semble centré sur la recherche sémantique, et il doit sûrement y avoir d’autres applications intéressantes

    • Je suis un peu perplexe, parce que tous les exemples cités me semblent être des tâches assez courantes
      Le premier et le troisième sont en fait la même chose
      En vision par ordinateur, on peut vouloir modifier sémantiquement une image, par exemple ajouter des lunettes sur une photo, et les tâches qu’on voit dans les publicités Google en sont des exemples
      Ce genre d’opération se fait dans l’espace latent
      C’est particulièrement clair avec les flots normalisants, puisqu’ils transforment l’espace en gaussienne
      Les modèles de diffusion font quelque chose de similaire par approximation, mais ils ne sont pas inversibles, même si l’on peut revenir en arrière
      On projette l’image, la phrase ou les données que l’on veut manipuler, on les modifie dans l’espace gaussien, puis on les ramène dans l’espace cible
      Cela dit, il se peut aussi qu’on se mélange les pinceaux parce que le mot embedding est un terme surchargé qui veut dire trop de choses
      Peut-être que vous pensez seulement au premier bloc qui transforme des tokens entiers discrets en nombres à virgule flottante continus
      Mais cet embedding-là est lui aussi appris, donc même s’il finit par ressembler à une table de correspondance, cela reste un processus de réseau neuronal
      On utilise aussi des SVM dans cet espace
      Je le vois comme proche de l’espace latent, mais un peu plus abstrait
      Au minimum, un embedding devrait être injectif. Mathématiquement, c’est le cas, mais…
    • La classification façon SVM dans l’espace des embeddings est une technique tout à fait fondamentale dans le traitement automatique du langage naturel et le machine learning industriels
      Entraîner directement des embeddings, c’est littéralement Word2Vec, le modèle d’embeddings d’origine
    • J’ai aussi déjà créé un espace d’embeddings word2vec à partir de résumés PubMed
      J’y ai trouvé beaucoup de variantes et d’abréviations de noms chimiques et biochimiques, avec ou sans trait d’union, ou avec des espaces
      On aurait probablement pu en faire un dictionnaire de termes techniques
      Je ne sais pas jusqu’où on aurait pu aller pour les définitions, mais même si les vecteurs seuls ont leurs limites, c’est un point de départ
      Il est très probable que d’autres aient construit des dictionnaires de cette manière
    • Les embeddings multilingues, qui consistent à créer un espace d’embeddings pour chacune de deux langues puis à aligner les espaces avec un dictionnaire d’amorçage, ont des applications réelles ou potentielles dans la recherche multilingue et la traduction automatique
    • On peut aussi les utiliser pour la déduplication de données
  • J’ai manipulé des embeddings et construit quelques cas d’usage en production ; c’est un excellent outil qui rend possibles beaucoup d’applications très intéressantes
    Mais quand on en crée pour un domaine précis, on se heurte aux limites des modèles d’embeddings prêts à l’emploi
    Les modèles prêts à l’emploi ont beaucoup de dimensions, mais certaines de ces dimensions peuvent être importantes pour la classification, la similarité de contenu ou le clustering dans mon application, tandis que d’autres ne le sont pas
    Autrement dit, deux vecteurs peuvent sembler proches parce qu’ils sont proches sur des dimensions qui ne m’intéressent pas
    J’espère voir apparaître de meilleurs outils et davantage de littérature pour le fine-tuning des modèles d’embeddings

    • Fine-tuner tout le modèle de langage pour résoudre ce problème, c’est utiliser un marteau-pilon pour enfoncer un clou
      Ce type d’outil existe depuis longtemps : par exemple, il suffit d’étiqueter un peu de données, puis d’entraîner un SVM de classification sur l’espace des embeddings
    • sentence-transformers dispose d’outils assez bien conçus pour ce genre de choses