- WordLlama, LLM'lerin token gömmelerini yeniden kullanarak bulanık tekrar temizleme, benzerlik hesaplama, sıralama, kümeleme ve anlamsal metin bölme yapan hızlı ve hafif bir NLP araç takımıdır
- Çıkarım, ağırlıklı olarak token arama ve ortalama havuzlama ile çalışır; yalnızca NumPy ile çalışabilen hafif bir pipeline ve CPU optimizasyonu sunar
- Varsayılan model 256 boyutlu 16MB'dır; Matryoshka temsiliyle boyut azaltılabilir ve ikili gömmeler, Hamming benzerliğiyle daha hızlı hesaplamayı destekler
- MTEB tablosunda WL64~WL1024, birçok metrikte GloVe 300d ve Komninos'tan daha yüksek puan alırken
all-MiniLM-L6-v2'den genel olarak daha düşük puan alır
pip install wordllama sonrasında WordLlama.load() ile kullanılabilir; .key(query), sorted, min, max gibi standart kütüphane fonksiyonlarına verilebilecek callable bir fonksiyon döndürür
WordLlama ne yapar?
- WordLlama, bulanık tekrar temizleme, benzerlik hesaplama, sıralama, kümeleme ve anlamsal metin bölme gibi NLP yardımcı işleri için hafif bir araç takımıdır
- LLaMA 2, LLaMA 3 70B gibi modern LLM'lerden token gömme codebook'larını çıkararak GloVe·Word2Vec·FastText'e benzer, kompakt kelime temsilleri oluşturur
- Çıkarım sırasında az bağımlılığa ihtiyaç duyar ve CPU donanımı için optimize edilmiştir; bu nedenle kaynak kısıtlı ortamlarda dağıtım için uygundur
- Hızlı ve küçük yapısı sayesinde keşif amaçlı analiz, LLM çıktı değerlendiricileri ve multi-hop ya da agentic workflow'ların hazırlık işleri gibi yardımcı kullanım senaryolarına uygundur
Kurulum ve temel kullanım
pip install wordllama
- Varsayılan 256 boyutlu model,
WordLlama.load() ile yüklenir
from wordllama import WordLlama
wl = WordLlama.load()
.key(query), Callable[[str], float] döndürür; böylece aday dizgileri sorguyla benzerliklerine göre sıralayabilir veya en yüksek olanı seçebilirsiniz
query = "Machine learning methods"
candidates = [
"Foundations of neural science",
"Introduction to neural networks",
"Cooking delicious pasta at home",
"Introduction to philosophy: logic",
]
sim_key = wl.key(query)
sorted_candidates = sorted(candidates, key=sim_key, reverse=True)
best_candidate = max(candidates, key=sim_key)
- Örnek sonuçta
"Introduction to neural networks", 0.3414 puanla en yüksek skoru alan aday olur
Başlıca özellikler
- Gömme üretimi: Basit token arama ve ortalama havuzlama ile metin gömmelerini hızlıca üretir
- Benzerlik hesaplama: İki metin arasındaki cosine similarity'yi hesaplar
- Belge sıralama: Sorgu ile aday belgeler arasındaki benzerliğe göre sıralama yapar
- Bulanık tekrar temizleme: Benzerlik eşiğine göre yinelenen metinleri kaldırır
- Kümeleme: Belgeleri KMeans ile gruplar
- Filtreleme: Yalnızca sorguyla benzerliği belirli bir eşik üstünde olan belgeleri bırakır
- Top-K arama: Sorguya en benzer K belgeyi döndürür
- Anlamsal metin bölme: Metni anlamsal olarak tutarlı parçalara ayırır
- İkili gömmeler: Hamming benzerliğiyle daha hızlı hesaplamayı destekler
- Matryoshka temsili: Gerektiğinde gömme boyutunu keserek model boyutu ve performansı ayarlar
Model yapısı ve performans
- WordLlama, genel amaçlı bir gömme çerçevesi içinde context-less küçük modeller eğitir
- Varsayılan model 256 boyutlu 16MB boyutundadır
- README'deki MTEB tablosu, WL64, WL128, WL256, WL512, WL1024 modellerini GloVe 300d, Komninos ve
all-MiniLM-L6-v2 ile karşılaştırır
- WL256; Clustering
33.25, Reranking 52.03, Classification 58.21, Pair Classification 78.22, STS 67.91, CQA DupStack 24.12, SummEval 30.99 değerlerini elde eder
- GloVe 300d aynı başlıklarda sırasıyla
27.73, 43.29, 57.29, 70.92, 61.85, 15.47, 28.87 değerlerini alır
all-MiniLM-L6-v2; Clustering 42.35, Reranking 58.04, Classification 63.05, Pair Classification 82.37, STS 78.90, CQA DupStack 41.32, SummEval 30.81 değerlerini alır
- l2_supercat, LLaMA 2 vocabulary modelidir
- LLaMA 2 70B ve phi 3 medium gibi çeşitli modellerin codebook'larından ek special token'ları kaldırdıktan sonra birleştirerek eğitilmiştir
- LLaMA 2 tokenizer kullanan çeşitli modellerin codebook'ları birlikte birleştirilerek eğitilebilir
- LLaMA 3 70B codebook eğitimiyle benzer performans gösterirken vocabulary boyutu
128k yerine 32k olduğu için 4 kat daha küçüktür
- LLaMA 3 tabanlı model olarak l3_supercat sunulmaktadır
- Ek sonuçlar Results sayfasında yer alır
Anlamsal metin bölme
.split(), uzun bir metni anlamsal parçalara böler
long_text = "Your very long text goes here... " * 100
chunks = wl.split(long_text, target_size=1536)
print(list(map(len, chunks)))
# Output: [1055, 1055, 1187]
target_size, hem hedef boyut hem de azami boyuttur
- Bölme süreci, metin sırasını, cümle yapısını ve mümkün olduğunda paragraf yapısını korumaya çalışır
- Daha doğal bölme indeksleri bulmak için WordLlama gömmeleri kullanılır
- Çıktı parçalarının boyutu
target_size altındaki aralıkta değişebilir
- Önerilen target size 512~2048 karakter aralığındadır ve varsayılan değer
1536'dır
- Daha büyük parçalar gerekiyorsa, bölme sonrasında birden fazla semantic chunk'ı batch halinde birleştirme yaklaşımı önerilir
- Ayrıntılar technical overview içinde bulunabilir
Model2Vec ve doğrudan çıkarım
- 2025-01-04 güncellemesiyle Model2Vec static embeddings desteği eklendi
WordLlama.load_m2v() ile Model2Vec modeli yüklenebilir
wl = WordLlama.list_configs()
wl = WordLlama.load_m2v("potion_base_8m") # 256-dim model
wl = WordLlama.load_m2v("m2v_multilingual") # multilingual model
- Model2Vec, PCA kullanarak static embedding üretmenin farklı bir yoludur
- Model2Vec tarafında multilingual model ve glove tabanlı modeller üretildiği, ayrıca word similarity görevlerinde iyi puanlar aldığı belirtiliyor
- Hugging Face üzerindeki minishlab sayfasından incelenebilir
WordLlamaInference, loader yerine (n_vocab, dim) biçimindeki static embedding dizisini ve tokenizer'ı doğrudan vererek kullanılabilir
from wordllama import WordLlamaInference
from tokenizers import Tokenizer
tokenizer = Tokenizer.from_pretrained(...)
wl = WordLlamaInference(np_embeddings_ar, tokenizer)
Eğitim ve gömme çıkarma
- İkili gömme modeli, yüksek boyutlarda daha belirgin iyileşme gösterdi; ikili gömmeler için 512 veya 1024 boyut önerilir
- L2 Supercat modeli, tek bir A100 GPU üzerinde batch size
512 ile 12 saat eğitildi
- LLaMA modellerinden token gömmeleri çıkarmak için kullanıcı sözleşmesini kabul etmeniz ve Hugging Face CLI ile giriş yapmanız gerekir
from wordllama.extract.extract_safetensors import extract_safetensors
extract_safetensors("llama3_70B", "path/to/saved/model-0001-of-00XX.safetensors")
- Gömmeler genellikle ilk
safetensors dosyasında bulunur, ancak her zaman böyle olmayabilir
- Bir manifest olabilir
- Dosyaları kendiniz inceleyip bulmanız gerekebilir
- Eğitim için depodaki script'ler kullanılır; mevcut bir ayarı kopyalayarak veya değiştirerek yeni bir configuration file eklemeniz gerekir
pip install wordllama[train]
python train.py train --config your_new_config
python train.py save --config your_new_config --checkpoint ... --outdir /path/to/weights/
- Kaydetme adımı, her Matryoshka boyutu için modeli ayrı ayrı kaydeder
Güncellemeler, yol haritası, lisans
- 2025-02-01 güncellemesiyle
sorted, min, max gibi standart kütüphane fonksiyonlarında kullanılabilecek callable desteği eklendi
- 2024-10-04 güncellemesiyle semantic splitting inference algorithm eklendi
- Yol haritasında DSPy evaluator ve Retrieval-Augmented Generation, yani RAG pipeline örnek notebook'larının eklenmesi yer alıyor
- Topluluk projeleri arasında Gradio Demo HF Space ve CPU-ish RAG bulunuyor
- Projenin lisansı MIT License'dır
1 yorum
Hacker News yorumları
Küçük boyutu gerçekten hoşuma gitti. Şimdiden SBERT’in en küçük modeline göre bile avantajları var.
Ancak teknik olarak oldukça eski bir yaklaşım gibi görünüyor ve bunun performansla bir ödünleşim olduğunu anlıyorum. Yine de anlamsal benzerlik, doğal dil çıkarımı (NLI), isim soyutlama gibi benzerlik türleri arasında geçiş sunup sunamayacağını merak ediyorum.
Örneğin gazete haberlerini “aşırı çevresel olay” gibi kategoriler altında gruplarken “Freezing” ile “Burning”in birbirine çok benzer çıkmasını isterim. Bu, MTEB/Sentence-Similarity ya da klasik Word2Vec/GloVe gibi çalıştığı durum. Ama bir kimya yazısı söz konusuysa bu ikisi neredeyse zıt çıkmalı; doğal dil çıkarımı gömmeleriyle iki nesne arasındaki nedensel ilişkiyi görmek istediğim durumlar da oluyor.
Son iki gömme türü 2019 sonrası görece yeni yöntemler olduğu için teknik fırsatın daha büyük olduğunu düşünüyorum. Eski MTEB/anlamsal benzerlik hattı 2014’ten beri pek çok kullanım için yeterliydi ve 2019’da mini-lm-v2 gibi modellerle ciddi biçimde iyileşti.
Yukarıdaki üç gömme türü SBERT ile de mümkün, ama boyutları ve modelleri büyük; tür başına birden fazla model yükleyince kaynak yükü artıyor. Üretken gömme modelleri ya da E5, doğal dil çıkarımı modelleri büyük olduğundan çoğu zaman yaklaşık 6 GB gerekiyor.
Tek bir benzerlik türüyle eğitildiğinde performansın nasıl olduğunu görmek isterim. Bağlam hesabı olmadan bunu ele almanın başka bir yolu olup olmadığından emin değilim. Model değiştirmek gerekebilir, ama bu başlı başına büyük bir sorun değil.
Küçümsemek istemiyorum; böyle işleri bağlamı içinde anlamak önemli. Buradaki bağlam şu: LLM’leri derinlemesine anlamaya başlayınca LLM’lerde de gömmeler olduğunu keşfediyorsunuz; o bakış açısından, tüm gömme alanının mevcut durumunu yeniden taramak yerine o gömmelerle oynayıp bir adım ilerlemek daha doğal geliyor.
Zıt anlamlı kelimelerin zıt gömmelere sahip olduğunu düşünmek yaygın bir yanılgı. Gerçekte zıt anlamlı kelimelerin de pek çok ortak noktası var. “burning” ve “freezing” ikisi de sıcaklık ve fizik ile ilgili; İngilizce kelimeler; fiil, isim ve sıfat olarak kullanılabiliyorlar; yazımları da doğru. Tüm bu özellikler gömmelere giriyor.
Gömmeler, eğitim verisine ve amaç fonksiyonuna bağlı olarak çok fazla anlamsal bilgi içerir ve birçok yararlı görevde bağımsız olarak kullanılabilir.
Daha önce CLIP modelinin metin kodlayıcı gömmelerini kullanarak, prompt’ların karşılık gelen görüntülerle daha iyi eşleşmesini sağlamıştım. Örneğin prompt’ta “building” varsa, gömme matrisinde “concrete”, “underground” gibi en yakın komşuları bulup ilgili kelimenin arkasına değiştirerek ya da ekleyerek koyuyordum. Sınırlı deneylerde, sorguların çoğunda geri çağırma arttı.
https://www.marqo.ai/blog/generalized-contrastive-learning-f...
wordllama’da token gömmelerinin boyutuna bakınca, zenginleştirilecek önemli token’ları belirlemeye de yardımcı olabileceğini düşünüyorum. Ancak bu işe uygun olarak seçilmiş verilerle eğitilirse çok daha iyi çalışabilir.
İngilizce dışındaki diller için de plan olup olmadığını merak ediyorum. Fransızca için mükemmel bir araç olur gibi.
Mistral ailesi modellerle biraz eğitim denemiştim, bu yüzden Fransızca derlemde önce o tarafı denemem muhtemel.
Bir issue açarsanız zaman bulduğumda üzerinde çalışırım.
Büyük bir derlemde, örneğin 10.000’den fazla cümlede her cümleyi bir belge olarak görmek gibi bir kullanımda, TF-IDF seyrek matris vektörlerini k-means ile kümeleyerek de benzer sonuçlar elde edebilirsiniz.
Yine de bu araçta ikilileştirme gibi yöntemlerle k-means kısmını hızlandıran epey yardımcı işlev var gibi. Önümüzdeki birkaç hafta içinde benchmark yapmayı düşünüyorum.
Birkaç yıl önce benzer fonksiyonları kullanan bir dil oyunları koleksiyonu yapmıştım: https://github.com/Hellisotherpeople/Language-games
https://github.com/plasticityai/magnitude
Gömmelerle Little Alchemy çözmeyi düşünen oldu mu merak ediyorum. #sample-use
Güzel görünüyor. mini-lm modeline göre avantajı olup olmadığını merak ediyorum. Çoğu MTEB görevinde mini-lm daha iyi görünüyor; çıkarım hızı gibi konularda daha iyi olduğu yönler var mı merak ediyorum.
Hedefi de en güncel, en yüksek performanslı model olmak değil. Bağımlılıkları, boyutu ve donanım gereksinimlerini azaltıp hızı artırmak için oldukça sınırlı koşullar koyulmuş bir model.
Kelime gömme modeli olarak bakıldığında da oldukça hafif sayılır. Genelde bu tür modeller çok daha büyük sözlükler kullanır ve birkaç GB boyutunda olur.
Oyun geliştirme için çok yararlı görünüyor.
Token’ların kendi içinde ne kadar çok anlamsal içerik taşıdığını iyi gösteriyor.
PostgreSQL eklentisi olarak yapılabilir mi?