Show HN: Wordllama – Qué se puede hacer con los embeddings de tokens de un LLM
(github.com/dleemiller)WordLlama
WordLlama es una herramienta de NLP rápida y ligera que maneja tareas como deduplicación difusa, similitud y ranking con dependencias mínimas en tiempo de inferencia, y está optimizada para hardware CPU.
Índice
- Inicio rápido
- ¿Qué es?
- Resultados MTEB
- Embeddings de texto
- Notas de entrenamiento
- Hoja de ruta
- Extracción de embeddings de tokens
- Cita
- Licencia
Inicio rápido
-
Instalación:
pip install wordllama -
Cargar el modelo de 256 dimensiones:
from wordllama import WordLlama wl = WordLlama.load() -
Calcular la similitud entre dos oraciones:
similarity_score = wl.similarity("i went to the car", "i went to the pawn shop") print(similarity_score) # salida: 0.06641249096796882 -
Clasificar documentos para una consulta:
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) # salida: # [ # ('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étodos de inferencia adicionales:
wl.deduplicate(candidates, threshold=0.8) # deduplicación difusa wl.cluster(docs, k=5, max_iterations=100, tolerance=1e-4) # etiquetado usando inicialización kmeans/kmeans++ wl.filter(query, candidates, threshold=0.3) # filtrar candidatos según la consulta wl.topk(query, candidates, k=3) # devuelve las k cadenas principales según la consulta
¿Qué es?
WordLlama es un modelo de NLP y de embeddings de palabras que reutiliza componentes de modelos grandes de lenguaje (LLM) para generar representaciones de palabras eficientes y compactas. Es similar a modelos como GloVe, Word2Vec y FastText.
- Matryoshka Representations: permite reducir la dimensión de los embeddings según sea necesario
- Bajos requisitos de recursos: puede ejecutarse rápido en CPU con una simple búsqueda de tokens usando average pooling
- Binarización: los modelos entrenados con estimación directa pueden empaquetarse en arreglos de enteros pequeños (próximamente)
- Inferencia solo con Numpy: ligera y simple
WordLlama es adecuado para diversas tareas de NLP y resulta útil para análisis exploratorio y aplicaciones utilitarias gracias a su velocidad y tamaño portable.
Resultados 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 texto
Cómo cargar embeddings preentrenados y generar embeddings de texto:
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)
Ejemplo de uso del modelo de embeddings binarios:
wl = WordLlama.load(trunc_dim=64, binary=True)
wl.embed("I went to the car") # salida: 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) # salida: 0.57421875
ranked_docs = wl.rank("i went to the car", ["van", "truck"])
wl.binary = False # usar similitud coseno en lugar de similitud de Hamming
wl = WordLlama.load(config="l3_supercat", dim=1024)
Notas de entrenamiento
El modelo de embeddings binarios mostró mejoras más claras en dimensiones altas, y se recomiendan 512 o 1024 dimensiones. L2 Supercat fue entrenado durante 12 horas en una sola A100 con tamaño de lote 512.
Hoja de ruta
- Se está trabajando en agregar funciones de inferencia:
- segmentación semántica de texto
- agregar notebooks de ejemplo
- evaluador de DSPy
- pipelines de RAG
Extracción de embeddings de tokens
Para extraer embeddings de tokens del modelo, debes aceptar el acuerdo de usuario e iniciar sesión usando Hugging Face CLI. Luego puedes usar el siguiente fragmento:
from wordllama.extract import extract_safetensors
extract_safetensors("llama3_70B", "path/to/saved/model-0001-of-00XX.safetensors")
Cita
Si usas WordLlama en investigación o en un proyecto, por favor cítalo de la siguiente manera:
@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}
}
Licencia
Este proyecto está bajo la licencia MIT.
Resumen de GN⁺
- WordLlama es una herramienta de NLP que reutiliza componentes de modelos grandes de lenguaje para generar representaciones de palabras eficientes y compactas.
- Funciona rápido en CPU y puede usarse como una utilidad tipo "navaja suiza" adecuada para diversas tareas de NLP.
- El modelo de embeddings binarios muestra mejoras más claras en dimensiones altas, y se recomiendan 512 o 1024 dimensiones.
- Es útil para análisis exploratorio y aplicaciones utilitarias gracias a su rapidez y tamaño portable.
1 comentarios
Opiniones de Hacker News
Me gusta el tamaño pequeño; tiene ventaja frente al modelo más pequeño de SBERT
Los embeddings capturan mucha información semántica y pueden usarse de forma independiente para tareas útiles
Preguntan si hay planes para idiomas distintos del inglés
Muestra que los propios tokens contienen mucho contenido semántico
Comentario sobre usar embeddings para resolver Little Alchemy
Muy útil para hacer juegos; gracias
Se ve genial; preguntan por las ventajas del modelo mini-lm
Hace unos años alguien escribió un "juego de lenguaje" usando una función parecida