- Ternlight memungkinkan embedding teks dan pencarian kemiripan dilakukan di dalam browser tanpa panggilan server, sehingga pencarian semantik kecil di sisi klien bisa disusun dengan cepat
- Paket dasarnya berukuran 7MB termasuk engine dan bobot, sedangkan varian mini 5MB, dan berjalan di CPU tanpa GPU
- Setelah memasang
@ternlight/base, Anda bisa mengimpor embed dan similar untuk membuat alur pencarian berbasis semantik hanya dalam sekitar 3 baris
- Contoh pemanggilan mengurutkan 3 hasil teratas dari daftar resep, dengan penekanan pada waktu sekitar 5ms dan tanpa panggilan jaringan
- Demo pencarian dokumentasi React melakukan pencarian di browser saat pengguna memasukkan pertanyaan, dan dijalankan oleh tier @ternlight/mini berukuran 5MB
Embedding yang selesai sepenuhnya di dalam browser
- Ternlight menonjolkan dirinya sebagai “model embedding 7MB”, melakukan embedding teks dalam hitungan milidetik tanpa memanggil server
-
Karakteristik eksekusi
- Tanpa panggilan API
- Engine + bobot: 7MB
- Varian mini: 5MB
- Embedding cepat: sekitar 5ms
- Khusus CPU, tanpa GPU
Contoh instalasi dan penggunaan
- Tersedia sebagai satu paket npm, dan dapat digunakan tanpa langkah unduh model terpisah maupun server
- Perintah instalasinya adalah sebagai berikut
npm install @ternlight/base
- Impor
embed dan similar dari @ternlight/base untuk menjalankan pencarian berbasis semantik
import { embed, similar } from '@ternlight/base';
similar('easy weeknight dinner ideas', recipes, { topK: 3 });
// → ranked matches · ~5 ms · zero network
- Demo pencarian dokumentasi React melakukan pencarian di browser saat pengguna memasukkan pertanyaan, dan dijalankan dengan tier 5MB @ternlight/mini
1 komentar
Komentar Hacker News
Karena ingin mencoba menjalankan model yang berguna di browser sebagai proyek hobi, saya mendistilasi encoder kalimat kecil dari MiniLM dan menerapkan pelatihan sadar kuantisasi ternary
Mesin inferensinya juga saya tulis sendiri dan didistribusikan dari Rust → WASM SIMD
Ini bukan LLM, melainkan model embedding: jika diberi teks, ia menghasilkan vektor 384 dimensi, lalu relevansi teks dinilai dengan kemiripan kosinus antara dua vektor. Misalnya, "reset my password" dan "I forgot my password" bisa menghasilkan nilai seperti 0,88
Bisa dipakai untuk pencarian berbasis makna, pencocokan FAQ/intensi, dan clustering; karena berjalan di perangkat, pencarian semantik dapat dilakukan cepat begitu input masuk tanpa bergantung pada API
Demonya mencari 2.000 dokumen React sepenuhnya di perangkat: https://ternlight-demo.vercel.app
Di npm ada dua tingkat: @ternlight/base (7MB, sekitar 5ms per embedding, embedding dengan performa lebih baik) dan @ternlight/mini (transfer 5MB, sekitar 2,5ms per embedding), dan keduanya dibundel untuk Node serta browser
Repositorinya mencakup detail teknis, lisensi MIT, dan pipeline pelatihan: https://github.com/soycaporal/ternlight
Saya penasaran apakah embedding di perangkat benar-benar berguna, dan use case apa saja yang ada
Saya penasaran apakah ini bisa membantu membuat pengguna menemukan crêpe saat mengetik "pancake", tanpa harus menulis entri kamus eksplisit "pancake = crêpe"
Kalau pemahaman saya benar, apakah strukturnya library mengunduh 5MB sekali di awal, lalu setelah itu dipakai seperti kami sekarang memakai Fuse.js?
Saya juga ingin tahu seberapa baik ia menangani bahasa selain Inggris, dan apakah bisa dilatih dengan wiki tag OpenStreetMap
Penasaran apakah ada perbandingan dengan model embedding superkecil lain. Sulit menilai apakah alasan memulai dari MiniLM-L6 adalah karena model itu sangat bagus di kelas yang sama, sementara metrik yang diberikan hanya "Retrieval (SciFact NDCG@10)"
Namun hasilnya cukup jauh dari performa yang diklaim: di Firefox pada i5-4570, saya hanya mendapat 35 embedding per detik, bukan 400 per detik. Saya menduga ada masalah sehingga jatuh ke jalur non-SIMD, dan berencana mencoba binary Rust native juga
Keren, tapi akan bagus kalau landing page punya tombol untuk memulai demo. Saya cukup kaget karena begitu membuka halaman web, terdengar kipas berputar seperti gila
Akan bagus kalau dibuat sebagai plugin Astro atau plugin meta-framework umum yang otomatis mem-parsing semua file HTML yang dihasilkan dan membuat database embedding kecil
Di frontend, ini bisa dimuat secara lazy, dan HNSW mungkin juga bisa disimpan per chunk sehingga hanya bagian yang diperlukan untuk query pencarian yang dimuat
Misalnya mirip https://pagefind.app/, tetapi menyediakan pencarian vektor yang sepenuhnya statis
Kalau setelah beberapa bulan atau tahun masih begitu, itu terasa cukup mengecewakan dan tampak seperti sinyal kurangnya kapasitas untuk benar-benar menyelesaikan proyek. Bahkan saya merekomendasikan proyek itu sebagai kandidat yang layak untuk hibah yang saya ajukan, dan mereka terpilih sementara saya tidak
Jika ada yang tahu solusi bagus di area ini, atau jika saya keliru soal SQLite-vec, saya ingin diberi tahu. Untuk SSG kami, kami kurang lebih sudah memutuskan untuk mengerjakan infrastruktur lain dulu selama beberapa bulan, lalu membuatnya sendiri jika saat itu masih belum selesai
Ini bisa menjadi tambahan yang cukup keren untuk proyek pencarian DuckDB HNSW yang pernah saya lihat di sini: https://github.com/jasonjmcghee/portable-hnsw
Sangat menarik bahwa pencarian dilakukan terhadap file Parquet yang di-host secara statis dengan memakai HTTP range requests
Saya melihat hal-hal seperti ini bisa tumbuh menjadi ekosistem pencarian yang relatif terbuka dan terdistribusi, tidak dikendalikan perusahaan besar
https://news.ycombinator.com/item?id=27016630
Ini benar-benar keren, dan mungkin merupakan bagian yang hilang dari sesuatu yang dulu ingin saya buat
Dengan https://github.com/npiesco/absurder-sql, seluruh korpus asli bisa disimpan persisten di dalam browser sebagai IndexedDB/SQLite
Lalu, seperti https://weaviate.io/blog/chunking-strategies-for-rag, alih-alih mengindeks semuanya terlebih dahulu, kita bisa memakai Ternlight untuk membuat dan meng-cache embedding saat dibutuhkan
Dengan begitu, Reciprocal Rank Fusion yang menggabungkan FTS5/BM25 native SQLite dan pencarian semantik Ternlight, alias pencarian hibrida, juga menjadi mungkin
Dibuat dengan baik
Dipromosikan sebagai 7MB, tetapi ada juga versi mini 5MB
Sepertinya mini secara internal memakai vektor 256 elemen, bukan 384, untuk mengurangi ruang, lalu pada akhirnya memproyeksikannya ke 384 demi kompatibilitas
Ukurannya berkurang sepertiga, tetapi kerugiannya tidak linear, jadi meski memakai jalur data yang lebih kecil, kehilangan informasinya tampak kurang dari sepertiga
Proyek yang keren
Saya dulu pernah mencoba sesuatu yang mirip: http://sol.quipu-strands.com/
Saya ingin memuat model embedding di browser dan mengurutkan teks secara semantik
Saya mengambil bobot ONNX (MPNet, MiniLM) dari HuggingFace, membuat embedding dengan Transformers.js, lalu menggunakan clustering dari scikit-learn yang dijalankan lewat pyodide di dalam halaman. Semuanya berjalan di sisi klien, dan saya terkejut karena ini bekerja dengan sempurna
Demonya berperilaku cukup aneh. Misalnya, jika mencari "how to use typescript with createContext", hasil teratas hanya entri typescript, jadi pencarian kemiripan tampak gagal
Terima kasih. Model lokal suatu hari akan membawa privasi, dan saya sudah tahu use case yang sangat cocok untuk model embedding kecil seperti ini: pencarian murah dan cepat di database produk
Dalam kasus saya, ketergantungannya pada CPU juga merupakan kelebihan
Bisakah pembuatan embedding yang memakan 30 detik dilakukan sebelumnya lalu dikirim ke browser?
Setelah itu inferensinya cepat dan bagus