- WordLlama adalah toolkit NLP yang cepat dan ringan yang memanfaatkan ulang embedding token dari LLM untuk melakukan deduplikasi fuzzy, perhitungan kemiripan, ranking, clustering, dan pemisahan teks berbasis makna
- Inferensinya berpusat pada lookup token dan average pooling, serta mengedepankan pipeline ringan yang dapat berjalan hanya dengan NumPy dan optimisasi CPU
- Model dasar berdimensi 256 dengan ukuran 16MB, dimensinya dapat dikurangi dengan representasi Matryoshka, dan embedding biner mendukung komputasi yang lebih cepat lewat kemiripan Hamming
- Pada tabel MTEB, WL64~WL1024 menunjukkan skor lebih tinggi daripada GloVe 300d dan Komninos di berbagai metrik, sementara skornya secara umum lebih rendah daripada
all-MiniLM-L6-v2
- Setelah
pip install wordllama, dapat digunakan dengan WordLlama.load(), dan .key(query) mengembalikan fungsi callable yang bisa dimasukkan ke fungsi pustaka standar seperti sorted, min, dan max
Apa yang dilakukan WordLlama
- WordLlama adalah toolkit ringan untuk pekerjaan utilitas NLP seperti deduplikasi fuzzy, perhitungan kemiripan, ranking, clustering, dan pemisahan teks berbasis makna
- Mengekstrak codebook embedding token dari LLM modern seperti LLaMA 2 dan LLaMA 3 70B, lalu membuat compact word representation yang mirip dengan GloVe, Word2Vec, dan FastText
- Karena memiliki sedikit dependensi saat inferensi dan dioptimalkan untuk hardware CPU, WordLlama cocok untuk deployment di lingkungan dengan sumber daya terbatas
- Berkat kecepatan dan ukurannya yang kecil, WordLlama dapat digunakan untuk keperluan utilitas seperti analisis eksploratif, evaluator output LLM, serta pekerjaan persiapan untuk workflow multi-hop atau agentic
Instalasi dan penggunaan dasar
- Instalasi dilakukan dengan pip
pip install wordllama
- Model 256 dimensi bawaan dimuat dengan
WordLlama.load()
from wordllama import WordLlama
wl = WordLlama.load()
.key(query) mengembalikan Callable[[str], float], sehingga kandidat string dapat diurutkan berdasarkan kemiripan dengan query atau dipilih nilai maksimumnya
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)
- Pada hasil contoh,
"Introduction to neural networks" menjadi kandidat tertinggi dengan skor 0.3414
Fitur utama
- Pembuatan embedding: membuat embedding teks dengan cepat melalui lookup token sederhana dan average pooling
- Perhitungan kemiripan: menghitung cosine similarity antara dua teks
- Ranking dokumen: memberi peringkat berdasarkan kemiripan antara query dan dokumen kandidat
- Deduplikasi fuzzy: menghapus teks duplikat berdasarkan ambang kemiripan
- Clustering: mengelompokkan dokumen dengan KMeans
- Filtering: hanya menyisakan dokumen yang kemiripannya dengan query berada di atas kriteria
- Pencarian Top-K: mengembalikan K dokumen yang paling mirip dengan query
- Pemisahan teks berbasis makna: membagi teks menjadi chunk yang kohesif secara semantik
- Embedding biner: mendukung komputasi yang lebih cepat dengan kemiripan Hamming
- Representasi Matryoshka: menyesuaikan ukuran dan performa model dengan memotong dimensi embedding sesuai kebutuhan
Struktur dan performa model
- WordLlama melatih model kecil context-less di dalam framework embedding serbaguna
- Model dasar berukuran 256 dimensi 16MB
- Tabel MTEB di README membandingkan WL64, WL128, WL256, WL512, dan WL1024 dengan GloVe 300d, Komninos, dan
all-MiniLM-L6-v2
- WL256 mencatat Clustering
33.25, Reranking 52.03, Classification 58.21, Pair Classification 78.22, STS 67.91, CQA DupStack 24.12, dan SummEval 30.99
- GloVe 300d mencatat masing-masing
27.73, 43.29, 57.29, 70.92, 61.85, 15.47, dan 28.87 pada item yang sama
all-MiniLM-L6-v2 mencatat Clustering 42.35, Reranking 58.04, Classification 63.05, Pair Classification 82.37, STS 78.90, CQA DupStack 41.32, dan SummEval 30.81
- l2_supercat adalah model vocabulary LLaMA 2
- Dilatih dengan menghubungkan codebook dari berbagai model seperti LLaMA 2 70B dan phi 3 medium setelah menghapus special token tambahan
- Codebook dari berbagai model yang menggunakan tokenizer LLaMA 2 dapat dihubungkan bersama untuk pelatihan
- Menunjukkan performa yang mirip dengan pelatihan codebook LLaMA 3 70B, tetapi vocabulary-nya 4 kali lebih kecil, yaitu
32k dibanding 128k
- Model berbasis LLaMA 3 tersedia sebagai l3_supercat
- Hasil tambahan tersedia di Results
Pemisahan teks berbasis makna
.split() membagi teks panjang menjadi chunk semantik
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 adalah ukuran target sekaligus ukuran maksimum
- Proses pemisahan berusaha mempertahankan urutan teks, struktur kalimat, dan jika memungkinkan struktur paragraf
- WordLlama menggunakan embedding untuk menemukan indeks pemisahan yang lebih natural
- Ukuran chunk output dapat bervariasi selama berada di bawah
target_size
- Target size yang direkomendasikan adalah 512~2048 karakter, dengan nilai bawaan
1536
- Jika membutuhkan chunk yang lebih besar, disarankan untuk mengelompokkan beberapa semantic chunk sebagai batch setelah pemisahan
- Detail lebih lanjut tersedia di technical overview
Model2Vec dan inferensi langsung
- Pembaruan 2025-01-04 menambahkan dukungan untuk Model2Vec static embeddings
- Model Model2Vec dapat dimuat dengan
WordLlama.load_m2v()
wl = WordLlama.list_configs()
wl = WordLlama.load_m2v("potion_base_8m") # 256-dim model
wl = WordLlama.load_m2v("m2v_multilingual") # multilingual model
- Model2Vec adalah pendekatan lain yang menggunakan PCA untuk membuat static embedding
- Pihak Model2Vec disebut telah membuat multilingual model dan model berbasis glove, serta mendapatkan skor bagus pada word similarity task
- Dapat dilihat di minishlab di Hugging Face
WordLlamaInference dapat digunakan dengan memasukkan langsung array static embedding berbentuk (n_vocab, dim) dan tokenizer, alih-alih menggunakan loader
from wordllama import WordLlamaInference
from tokenizers import Tokenizer
tokenizer = Tokenizer.from_pretrained(...)
wl = WordLlamaInference(np_embeddings_ar, tokenizer)
Pelatihan dan ekstraksi embedding
- Model embedding biner menunjukkan peningkatan yang lebih jelas pada dimensi tinggi, dan 512 atau 1024 dimensi direkomendasikan untuk embedding biner
- Model L2 Supercat dilatih selama 12 jam dengan batch size
512 pada satu GPU A100
- Untuk mengekstrak embedding token dari model LLaMA, pengguna harus menyetujui perjanjian pengguna dan login ke Hugging Face CLI
from wordllama.extract.extract_safetensors import extract_safetensors
extract_safetensors("llama3_70B", "path/to/saved/model-0001-of-00XX.safetensors")
- Embedding biasanya berada di file
safetensors pertama, tetapi tidak selalu demikian
- Bisa saja ada manifest
- Mungkin perlu memeriksa dan mencarinya sendiri
- Pelatihan menggunakan skrip dari repositori, dan harus menyalin atau memodifikasi konfigurasi yang ada untuk menambahkan configuration file
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/
- Tahap penyimpanan menyimpan model satu per satu untuk setiap dimensi Matryoshka
Pembaruan, roadmap, dan lisensi
- Pembaruan 2025-02-01 menambahkan dukungan callable yang dapat digunakan pada fungsi pustaka standar seperti
sorted, min, dan max
- Pembaruan 2024-10-04 menambahkan semantic splitting inference algorithm
- Roadmap mencakup penambahan notebook contoh untuk DSPy evaluator dan Retrieval-Augmented Generation, yaitu pipeline RAG
- Proyek komunitas mencakup Gradio Demo HF Space dan CPU-ish RAG
- Lisensi proyek adalah MIT License
1 komentar
Komentar Hacker News
Saya sangat suka ukurannya yang kecil. Sudah punya keunggulan dibanding model SBERT terkecil
Meski begitu, secara teknis ini terlihat seperti pendekatan yang sudah cukup lama, dan saya paham ini adalah kompromi terhadap performa. Namun saya penasaran apakah ini bisa menyediakan peralihan jenis kemiripan seperti kemiripan semantik, natural language inference (NLI), dan abstraksi nomina
Misalnya, saat mengelompokkan artikel koran ke kategori seperti “peristiwa lingkungan ekstrem”, saya ingin “Freezing” dan “Burning” muncul sangat mirip. Ini adalah kasus seperti MTEB/Sentence-Similarity atau Word2Vec/GloVe klasik. Tetapi jika artikelnya tentang kimia, keduanya seharusnya muncul hampir berlawanan, dan kadang saya juga ingin melihat hubungan kausal antara dua hal lewat embedding natural language inference
Dua jenis embedding terakhir itu adalah pendekatan yang relatif baru sejak 2019, jadi menurut saya peluang teknisnya lebih besar. Sementara keluarga MTEB/kemiripan semantik yang lebih lama sudah cukup untuk berbagai penggunaan sejak 2014, dan mengalami peningkatan besar pada 2019 dengan mini-lm-v2 dan sejenisnya
Tiga jenis embedding di atas juga bisa dilakukan dengan SBERT, tetapi dimensinya besar dan modelnya juga besar, jadi jika memuat beberapa model per jenis, beban sumber dayanya tinggi. Model embedding generatif atau E5, serta model natural language inference, ukurannya besar dan sering membutuhkan sekitar 6GB
Saya ingin tahu seperti apa performanya jika dilatih pada satu jenis kemiripan saja. Saya belum yakin apakah ada cara lain untuk menangani ini tanpa perhitungan konteks. Mungkin perlu mengganti model, tetapi itu sendiri bukan masalah besar
Bukan bermaksud meremehkan, tetapi penting memahami pekerjaan seperti ini dalam konteksnya. Di sini konteksnya adalah ketika seseorang mendalami LLM lalu menyadari bahwa LLM juga punya embedding, dan dari sudut pandang itu lebih wajar untuk melangkah maju dengan mengutak-atik embedding tersebut daripada meninjau ulang seluruh keadaan bidang embedding
Mengira kata yang bermakna berlawanan akan punya embedding yang berlawanan adalah kesalahpahaman yang umum. Pada kenyataannya, kata-kata dengan makna berlawanan juga punya banyak kesamaan. “burning” dan “freezing” sama-sama terkait suhu dan fisika, sama-sama kata bahasa Inggris, sama-sama bisa dipakai sebagai verba, nomina, dan adjektiva, dan ejaannya juga benar. Semua karakteristik itu masuk ke dalam embedding
Embedding menyimpan banyak informasi makna tergantung data pelatihan dan fungsi objektifnya, dan bisa dimanfaatkan secara mandiri untuk banyak tugas yang berguna
Dulu saya pernah memakai embedding text encoder dari model CLIP untuk memperkaya prompt agar lebih cocok dengan gambar yang bersesuaian. Misalnya jika prompt berisi “building”, saya mencari tetangga terdekat seperti “concrete” dan “underground” di matriks embedding, lalu mengganti atau menambahkan kata-kata itu setelah kata terkait. Dalam eksperimen terbatas, recall meningkat pada sebagian besar kueri
https://www.marqo.ai/blog/generalized-contrastive-learning-f...
Dengan melihat besarnya embedding token di wordllama, ini juga tampaknya bisa membantu mengidentifikasi token penting untuk diperkuat. Meski begitu, kalau dilatih dengan data yang dipilih khusus untuk tugas ini, hasilnya bisa jauh lebih baik
Saya penasaran apakah ada rencana untuk bahasa selain Inggris. Untuk bahasa Prancis, ini sepertinya akan menjadi alat yang sempurna
Saya pernah sedikit bereksperimen melatih model keluarga Mistral, jadi untuk korpus bahasa Prancis saya mungkin akan mencoba yang itu lebih dulu
Kalau Anda membuka issue, saya akan coba kerjakan saat ada waktu
Untuk korpus besar, misalnya lebih dari 10.000 kalimat dengan setiap kalimat diperlakukan sebagai dokumen, hasil yang mirip juga bisa didapat dengan mengelompokkan vektor matriks sparse TF-IDF memakai k-means
Namun tampaknya alat ini punya cukup banyak utilitas untuk mempercepat bagian k-means, misalnya lewat binerisasi. Saya berencana melakukan benchmark dalam beberapa minggu ke depan
Beberapa tahun lalu saya pernah membuat kumpulan permainan bahasa yang memakai fungsi-fungsi serupa: https://github.com/Hellisotherpeople/Language-games
https://github.com/plasticityai/magnitude
Saya penasaran apakah ada yang pernah berpikir untuk menyelesaikan Little Alchemy dengan embedding. #sample-use
Terlihat keren. Saya penasaran apakah ada keunggulan dibanding model mini-lm. Di sebagian besar tugas MTEB, mini-lm tampaknya lebih baik, jadi saya ingin tahu apakah ada sisi yang lebih unggul seperti kecepatan inferensi
Ini juga memang tidak ditujukan untuk mengejar performa terbaik mutakhir. Model ini dibuat dengan batasan yang cukup ketat demi menurunkan dependensi, ukuran, dan kebutuhan hardware, sekaligus meningkatkan kecepatan
Bahkan sebagai model word embedding pun ini cukup ringan. Biasanya model seperti itu punya kosakata jauh lebih besar dan ukurannya bisa mencapai beberapa GB
Sepertinya sangat berguna untuk pembuatan game
Ini menunjukkan dengan baik seberapa banyak muatan makna yang ada di dalam token itu sendiri
Apakah ini bisa dijadikan ekstensi PostgreSQL?