Show HN: Wordllama – Was sich mit Token-Embeddings aus LLMs machen lässt
(github.com/dleemiller)WordLlama
WordLlama ist ein schnelles und leichtgewichtiges NLP-Tool, das Aufgaben wie unscharfe Deduplizierung, Ähnlichkeit und Ranking mit minimalen Inferenz-Abhängigkeiten verarbeitet und für CPU-Hardware optimiert ist.
Inhaltsverzeichnis
- Schnellstart
- Was ist das?
- MTEB-Ergebnisse
- Text-Embeddings
- Trainingsnotizen
- Roadmap
- Token-Embeddings extrahieren
- Zitierung
- Lizenz
Schnellstart
-
Installation:
pip install wordllama -
256-dimensionale Modelle laden:
from wordllama import WordLlama wl = WordLlama.load() -
Ähnlichkeit zwischen zwei Sätzen berechnen:
similarity_score = wl.similarity("i went to the car", "i went to the pawn shop") print(similarity_score) # Output: 0.06641249096796882 -
Dokumente für eine Abfrage ranken:
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) # Output: # [ # ('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) # ] -
Weitere Inferenzmethoden:
wl.deduplicate(candidates, threshold=0.8) # unscharfe Deduplizierung wl.cluster(docs, k=5, max_iterations=100, tolerance=1e-4) # Labeling mit kmeans/kmeans++-Initialisierung wl.filter(query, candidates, threshold=0.3) # Kandidaten anhand der Abfrage filtern wl.topk(query, candidates, k=3) # die Top-k-Strings für die Abfrage zurückgeben
Was ist das?
WordLlama ist ein NLP- und Wort-Embedding-Modell, das Komponenten großer Sprachmodelle (LLMs) wiederverwendet, um effiziente und kompakte Wortrepräsentationen zu erzeugen. Es ist Modellen wie GloVe, Word2Vec und FastText ähnlich.
- Matryoshka Representations: Embedding-Dimensionen können bei Bedarf reduziert werden
- Geringe Ressourcenanforderungen: Einfache Token-Lookups mit Average Pooling ermöglichen schnelle Ausführung auf CPUs
- Binarisierung: Mit Straight-Through Estimator trainierte Modelle können in kleine Integer-Arrays gepackt werden (demnächst verfügbar)
- Nur Numpy-Inferenz: leichtgewichtig und einfach
WordLlama eignet sich für eine Vielzahl von NLP-Aufgaben und ist durch seine Geschwindigkeit und portable Größe nützlich für explorative Analysen und Utility-Anwendungen.
MTEB-Ergebnisse
| 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 |
Text-Embeddings
So lädt man vortrainierte Embeddings und bettet Text ein:
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)
Beispiel für die Verwendung eines binären Embedding-Modells:
wl = WordLlama.load(trunc_dim=64, binary=True)
wl.embed("I went to the car") # Output: 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) # Output: 0.57421875
ranked_docs = wl.rank("i went to the car", ["van", "truck"])
wl.binary = False # Kosinus-Ähnlichkeit statt Hamming-Ähnlichkeit verwenden
wl = WordLlama.load(config="l3_supercat", dim=1024)
Trainingsnotizen
Das binäre Embedding-Modell zeigte in höheren Dimensionen deutlichere Verbesserungen; empfohlen werden 512 oder 1024 Dimensionen. L2 Supercat wurde auf einer einzelnen A100 mit Batch-Größe 512 zwölf Stunden lang trainiert.
Roadmap
- Es wird weiter an Inferenzfunktionen gearbeitet:
- semantisches Text-Chunking
- zusätzliche Beispiel-Notebooks
- DSPy-Evaluator
- RAG-Pipelines
Token-Embeddings extrahieren
Um Token-Embeddings aus dem Modell zu extrahieren, muss man der Nutzervereinbarung zustimmen und sich mit der Hugging Face CLI anmelden. Danach kann folgendes Snippet verwendet werden:
from wordllama.extract import extract_safetensors
extract_safetensors("llama3_70B", "path/to/saved/model-0001-of-00XX.safetensors")
Zitierung
Wenn du WordLlama in Forschung oder Projekten verwendest, zitiere es bitte wie folgt:
@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}
}
Lizenz
Dieses Projekt steht unter der MIT-Lizenz.
Zusammenfassung von GN⁺
- WordLlama ist ein NLP-Tool, das Komponenten großer Sprachmodelle wiederverwendet, um effiziente und kompakte Wortrepräsentationen zu erzeugen.
- Es läuft schnell auf CPUs und kann als vielseitiges „Schweizer Taschenmesser“-Utility für verschiedene NLP-Aufgaben eingesetzt werden.
- Das binäre Embedding-Modell zeigt in höheren Dimensionen deutlichere Verbesserungen; empfohlen werden 512 oder 1024 Dimensionen.
- Durch seine Geschwindigkeit und portable Größe ist es nützlich für explorative Analysen und Utility-Anwendungen.
1 Kommentare
Hacker-News-Kommentar
Mir gefällt die geringe Größe, sie ist vorteilhafter als das kleinste Modell von SBERT
Embeddings erfassen viele semantische Informationen und können eigenständig für nützliche Aufgaben verwendet werden
Frage, ob Pläne für andere Sprachen außer Englisch bestehen
Zeigt, dass bereits die Tokens selbst viel semantischen Gehalt enthalten
Gedanken dazu, Little Alchemy mithilfe von Embeddings zu lösen
Sehr nützlich für die Spieleentwicklung, danke
Sieht großartig aus, Frage nach den Vorteilen des mini-lm-Modells
Vor ein paar Jahren ein "Sprachspiel" mit ähnlicher Funktionalität geschrieben