Show HN: Wordllama – O que dá para fazer com embeddings de tokens de LLM
(github.com/dleemiller)WordLlama
WordLlama é uma ferramenta de NLP rápida e leve, que lida com tarefas como deduplicação difusa, similaridade e ranqueamento com dependências mínimas de tempo de inferência, otimizada para hardware CPU.
Índice
- Início rápido
- O que é?
- Resultados no MTEB
- Embeddings de texto
- Notas de treinamento
- Roadmap
- Extração de embeddings de tokens
- Citação
- Licença
Início rápido
-
Instalação:
pip install wordllama -
Carregar o modelo de 256 dimensões:
from wordllama import WordLlama wl = WordLlama.load() -
Calcular a similaridade entre duas frases:
similarity_score = wl.similarity("i went to the car", "i went to the pawn shop") print(similarity_score) # saída: 0.06641249096796882 -
Ranquear documentos para uma 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) # saída: # [ # ('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 adicionais de inferência:
wl.deduplicate(candidates, threshold=0.8) # deduplicação difusa wl.cluster(docs, k=5, max_iterations=100, tolerance=1e-4) # rotulagem usando inicialização kmeans/kmeans++ wl.filter(query, candidates, threshold=0.3) # filtrar candidatos com base na consulta wl.topk(query, candidates, k=3) # retornar as k principais strings com base na consulta
O que é?
WordLlama é um modelo de NLP e embeddings de palavras que reutiliza componentes de grandes modelos de linguagem (LLM) para gerar representações de palavras eficientes e compactas. É semelhante a modelos como GloVe, Word2Vec e FastText.
- Matryoshka Representations: é possível reduzir a dimensão dos embeddings conforme a necessidade
- Baixa exigência de recursos: pode rodar rapidamente em CPU com uma simples busca de tokens usando average pooling
- Binarização: modelos treinados com straight-through estimator podem ser empacotados em pequenos arrays de inteiros (em breve)
- Inferência apenas com Numpy: leve e simples
WordLlama é adequado para várias tarefas de NLP e útil em análises exploratórias e aplicações utilitárias por ser rápido e portátil.
Resultados no 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
Como carregar embeddings pré-treinados e gerar 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)
Exemplo de uso de um modelo de embeddings binários:
wl = WordLlama.load(trunc_dim=64, binary=True)
wl.embed("I went to the car") # saída: 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) # saída: 0.57421875
ranked_docs = wl.rank("i went to the car", ["van", "truck"])
wl.binary = False # usar similaridade cosseno em vez de similaridade de Hamming
wl = WordLlama.load(config="l3_supercat", dim=1024)
Notas de treinamento
O modelo de embeddings binários mostrou melhorias mais nítidas em dimensões altas, e 512 ou 1024 dimensões são recomendadas. O L2 Supercat foi treinado por 12 horas em uma única A100 com batch size 512.
Roadmap
- Trabalhando na adição de recursos de inferência:
- segmentação semântica de texto
- adição de notebooks de exemplo
- avaliador DSPy
- pipelines de RAG
Extração de embeddings de tokens
Para extrair embeddings de tokens do modelo, é preciso concordar com o termo de consentimento do usuário e fazer login usando a Hugging Face CLI. Em seguida, é possível usar o snippet abaixo:
from wordllama.extract import extract_safetensors
extract_safetensors("llama3_70B", "path/to/saved/model-0001-of-00XX.safetensors")
Citação
Se você usar o WordLlama em pesquisa ou projetos, cite da seguinte forma:
@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}
}
Licença
Este projeto está sob a licença MIT.
Resumo do GN⁺
- WordLlama é uma ferramenta de NLP que reutiliza componentes de grandes modelos de linguagem para gerar representações de palavras eficientes e compactas.
- Roda rapidamente em CPU e pode ser usada como um utilitário “canivete suíço” adequado para várias tarefas de NLP.
- O modelo de embeddings binários mostra melhorias mais claras em dimensões altas, e 512 ou 1024 dimensões são recomendadas.
- É útil para análises exploratórias e aplicações utilitárias por ser rápido e ter tamanho portátil.
1 comentários
Comentários no Hacker News
Gosto do tamanho pequeno; é vantajoso em relação ao menor modelo do SBERT
Embeddings capturam muita informação semântica e podem ser usados de forma independente em tarefas úteis
Pergunta se há planos para idiomas além do inglês
Isso mostra que os próprios tokens contêm muito conteúdo semântico
Reflexão sobre usar embeddings para resolver Little Alchemy
Muito útil para desenvolvimento de jogos, obrigado
Parece muito legal; pergunta sobre as vantagens do modelo mini-lm
Escrevi um "jogo de linguagem" usando um recurso parecido há alguns anos