Show HN : Wordllama – Ce qu’on peut faire avec les embeddings de tokens d’un LLM
(github.com/dleemiller)WordLlama
WordLlama est un outil de NLP rapide et léger, capable de gérer des tâches comme la déduplication floue, la similarité et le classement avec un minimum de dépendances à l’inférence, et optimisé pour le matériel CPU.
Table des matières
- Démarrage rapide
- Qu’est-ce que c’est ?
- Résultats MTEB
- Embeddings de texte
- Notes d’entraînement
- Feuille de route
- Extraction des embeddings de tokens
- Citation
- Licence
Démarrage rapide
-
Installation :
pip install wordllama -
Charger le modèle 256 dimensions :
from wordllama import WordLlama wl = WordLlama.load() -
Calculer la similarité entre deux phrases :
similarity_score = wl.similarity("i went to the car", "i went to the pawn shop") print(similarity_score) # sortie : 0.06641249096796882 -
Classer des documents pour une requête :
query = "i went to the car" candidates = ["i went to the park", "i went to the shop", "i went to the truck", "i went to the vehicle"] ranked_docs = wl.rank(query, candidates) print(ranked_docs) # sortie : # [ # ('i went to the vehicle', 0.7441646856486314), # ('i went to the truck', 0.2832691551894259), # ('i went to the shop', 0.19732814982305436), # ('i went to the park', 0.15101404519322253) # ] -
Méthodes d’inférence supplémentaires :
wl.deduplicate(candidates, threshold=0.8) # déduplication floue wl.cluster(docs, k=5, max_iterations=100, tolerance=1e-4) # labellisation avec initialisation kmeans/kmeans++ wl.filter(query, candidates, threshold=0.3) # filtrer les candidats selon la requête wl.topk(query, candidates, k=3) # renvoyer les k meilleures chaînes selon la requête
Qu’est-ce que c’est ?
WordLlama est un modèle de NLP et d’embeddings de mots qui réutilise des composants de grands modèles de langage (LLM) pour produire des représentations de mots efficaces et compactes. Il est similaire à des modèles comme GloVe, Word2Vec et FastText.
- Matryoshka Representations : réduction possible de la dimension des embeddings selon les besoins
- Faibles besoins en ressources : fonctionnement rapide sur CPU via une simple recherche de tokens avec average pooling
- Binarisation : les modèles entraînés avec un straight-through estimator peuvent être empaquetés en petits tableaux d’entiers (bientôt disponible)
- Inférence uniquement en Numpy : léger et simple
WordLlama convient à diverses tâches de NLP et s’avère utile pour l’analyse exploratoire et les applications utilitaires grâce à sa rapidité et à sa taille portable.
Résultats MTEB
| Metric | WL64 | WL128 | WL256 (X) | WL512 | WL1024 | GloVe 300d | Komninos | all-MiniLM-L6-v2 |
|---|---|---|---|---|---|---|---|---|
| Clustering | 30.27 | 32.20 | 33.25 | 33.40 | 33.62 | 27.73 | 26.57 | 42.35 |
| Reranking | 50.38 | 51.52 | 52.03 | 52.32 | 52.39 | 43.29 | 44.75 | 58.04 |
| Classification | 53.14 | 56.25 | 58.21 | 59.13 | 59.50 | 57.29 | 57.65 | 63.05 |
| Pair Classification | 75.80 | 77.59 | 78.22 | 78.50 | 78.60 | 70.92 | 72.94 | 82.37 |
| STS | 66.24 | 67.53 | 67.91 | 68.22 | 68.27 | 61.85 | 62.46 | 78.90 |
| CQA DupStack | 18.76 | 22.54 | 24.12 | 24.59 | 24.83 | 15.47 | 16.79 | 41.32 |
| SummEval | 30.79 | 29.99 | 30.99 | 29.56 | 29.39 | 28.87 | 30.49 | 30.81 |
Embeddings de texte
Comment charger des embeddings préentraînés et encoder du texte :
from wordllama import WordLlama
wl = WordLlama.load(trunc_dim=64)
embeddings = wl.embed(["the quick brown fox jumps over the lazy dog", "and all that jazz"])
print(embeddings.shape) # (2, 64)
Exemple d’utilisation d’un modèle d’embeddings binaires :
wl = WordLlama.load(trunc_dim=64, binary=True)
wl.embed("I went to the car") # sortie : array([[3029168427562626]], dtype=uint64)
wl = WordLlama.load(dim=1024, binary=True)
similarity_score = wl.similarity("i went to the car", "i went to the pawn shop")
print(similarity_score) # sortie : 0.57421875
ranked_docs = wl.rank("i went to the car", ["van", "truck"])
wl.binary = False # utiliser la similarité cosinus au lieu de la similarité de Hamming
wl = WordLlama.load(config="l3_supercat", dim=1024)
Notes d’entraînement
Les modèles d’embeddings binaires ont montré des améliorations plus nettes en haute dimension, et 512 ou 1024 dimensions sont recommandées. L2 Supercat a été entraîné pendant 12 heures sur un seul A100 avec une taille de batch de 512.
Feuille de route
- Ajouts de fonctionnalités d’inférence en cours :
- segmentation sémantique de texte
- ajout de notebooks d’exemple
- évaluateur DSPy
- pipelines RAG
Extraction des embeddings de tokens
Pour extraire les embeddings de tokens depuis le modèle, il faut accepter l’accord utilisateur et se connecter avec la CLI Hugging Face. Ensuite, on peut utiliser l’extrait suivant :
from wordllama.extract import extract_safetensors
extract_safetensors("llama3_70B", "path/to/saved/model-0001-of-00XX.safetensors")
Citation
Si vous utilisez WordLlama dans une recherche ou un projet, merci de le citer comme suit :
@software{miller2024wordllama,
author = {Miller, D. Lee},
title = {WordLlama: Recycled Token Embeddings from Large Language Models},
year = {2024},
url = {https://github.com/dleemiller/wordllama},
version = {0.2.6}
}
Licence
Ce projet est sous licence MIT.
Résumé de GN⁺
- WordLlama est un outil de NLP qui réutilise des composants de grands modèles de langage pour produire des représentations de mots efficaces et compactes.
- Il fonctionne rapidement sur CPU et peut servir d’utilitaire « couteau suisse » adapté à diverses tâches de NLP.
- Les modèles d’embeddings binaires montrent des améliorations plus nettes en haute dimension, et 512 ou 1024 dimensions sont recommandées.
- Sa rapidité et sa taille portable le rendent utile pour l’analyse exploratoire et les applications utilitaires.
1 commentaires
Commentaires Hacker News
J’aime bien la petite taille, c’est un avantage par rapport au plus petit modèle de SBERT
Les embeddings capturent beaucoup d’informations sémantiques et peuvent être utilisés indépendamment pour des tâches utiles
Question sur l’existence de plans pour d’autres langues que l’anglais
Cela montre que les tokens eux-mêmes contiennent déjà beaucoup de contenu sémantique
Réflexion sur l’utilisation des embeddings pour résoudre Little Alchemy
Très utile pour le développement de jeux, merci
Ça a l’air sympa, question sur les avantages du modèle mini-lm
A écrit il y a quelques années un « jeu de langage » utilisant une fonctionnalité similaire