Ini adalah versi WebAssembly (WASM) dari perpustakaan indeks HNSWLIB yang ditulis dalam C ++. Port Wasm ini dibuat oleh @shravansunder menggunakan kompiler EMCC Wasm, lihat repositori di sini.
Terinspirasi oleh Perpustakaan Hnswlib-Node. @yoshoku telah memberikan beberapa dokumentasi yang luar biasa untuk HNSWLIB-Node. Terima kasih, @yoshoku!
Catatan: Perpustakaan ini masih di masa -masa awalnya! Ini sedang dibangun untuk kasus penggunaan yang mengharuskan menjalankan hnswlib di browser.
hnswlib-wasm menyediakan binding WASM untuk HNSWLIB yang mengimplementasikan perkiraan pencarian tetangga terdekat berdasarkan grafik dunia kecil yang dapat dilayari secara hierarkis. Ini bekerja di browser dan dikompilasi dengan Emscripten.
$ yarn add hnswlib-wasmLihat paket NPM di sini.
indexedDB (di browser) dan menggunakan FS dari Emscripten untuk menyimpan dan memuat indeks melalui sistem file virtual dan IDBFS.hnswlib-node untuk detail lebih lanjut oleh @yoshoku Changelog.Pertama, buat instance runtime dari perpustakaan:
import { loadHnswlib } from 'hnswlib-wasm' ;
const lib = await loadHnswlib ( ) ;Berikut adalah contoh lengkap dari memuat indeks jika ada atau membuat indeks baru jika tidak ada:
const filename = 'ghost.dat' ;
const { loadHnswlib } = await import ( 'hnswlib-wasm' ) ;
this . hnswlib = await loadHnswlib ( ) ;
this . hnswlib . EmscriptenFileSystemManager . setDebugLogs ( true ) ;
this . vectorHnswIndex = new this . hnswlib . HierarchicalNSW ( 'cosine' , 1536 ) ;
await syncFileSystem ( 'read' ) ;
const exists = this . hnswlib . EmscriptenFileSystemManager . checkFileExists ( filename ) ;
if ( ! exists ) {
this . vectorHnswIndex . initIndex ( 100000 , 48 , 128 , 100 ) ;
this . vectorHnswIndex . setEfSearch ( 32 ) ;
this . vectorHnswIndex . writeIndex ( 'ghost.dat' ) ;
} else {
this . vectorHnswIndex . readIndex ( filename , 100000 , true ) ;
this . vectorHnswIndex . setEfSearch ( 32 ) ;
}Anda dapat membuat indeks dan menggunakannya seperti itu.
// Here you're creating a new index with the L2 distance metric and 1000 as the max number of elements
const hnswIndex = lib . HierarchicalNSW ( 'l2' , 100 ) ;
// Initialize the index with the dimensions (1536), m, efConstruction. See the section below on parameters for more details. These cannot be changed after the index is created.
index . initIndex ( 1536 , 36 , 16 , 200 ) ;
// Set efSearch parameters. This can be changed after the index is created.
index . setEfSearch ( efSearch ) ;
// Now you can add items to the index, labels are returned as an array for the vectors. It will reuse deleted labels if possible based on the second parameter.
const labels = index . addItems ( vectors , true ) ;
// Now you can search the index
const result1 = index . searchKnn ( vectors [ 10 ] , 10 , undefined ) ;
// You can also search the index with a label filter
const labelFilter = ( label : number ) => {
return label >= 10 && label < 20 ;
}
const result2 = index . searchKnn ( testVectorData . vectors [ 10 ] , 10 , labelFilter ) ;Lebih banyak contoh penggunaan yang akan ditambahkan.
Untuk saat ini, lihat file
HierarchicalNSW.test.tsdi folder Tes dan lihat dokumentasi API HNSWLIB-Node.
Perpustakaan hnswlib-wasm menyediakan dukungan yang diperluas untuk IndexedDB (IDBFS) untuk menyimpan dan mengelola indeks pencarian di browser. Ini memungkinkan Anda untuk menyimpan dan memuat indeks pencarian dengan mudah di lingkungan web dan Anda tidak perlu memindahkan data dari sistem file EMCC ke memori JavaScript. Ini menggunakan FS dari Emscripten untuk menyimpan dan memuat indeks melalui sistem file virtual. Sistem file virtual disinkronkan dengan IDBFS.
Untuk menyimpan indeks pencarian, gunakan metode writeIndex :
await index . writeIndex ( 'savedIndex' ) ; Untuk memuat indeks pencarian yang disimpan sebelumnya, gunakan metode readIndex :
await index . readIndex ( 'savedIndex' , false ) ; Metode syncFs digunakan untuk menyinkronkan sistem file Emscripten dengan IDBF penyimpanan persisten. Anda dapat menggunakan metode ini untuk menyimpan atau membaca data dari sumber persisten sistem file.
await lib . EmscriptenFileSystemManager . syncFS ( true , emscripten :: val :: undefined ( ) ) ; // Read data from the persistent source
await lib . EmscriptenFileSystemManager . syncFS ( false , emscripten :: val :: undefined ( ) ) ; // Save data to the persistent source Bagian ini akan memberikan gambaran umum parameter algoritma HNSW dan dampaknya pada kinerja saat menggunakan perpustakaan HNSWLIB-WASM. HNSW (Dunia Kecil yang Dapat Dilakukan Hierarkis) adalah struktur indeks berbasis grafik untuk pencarian kesamaan yang efisien di ruang dimensi tinggi.
Gambar dari Pinecone.io
Ini memiliki beberapa parameter yang dapat disetel untuk mengontrol trade-off antara kualitas pencarian dan ukuran indeks atau waktu konstruksi. Berikut adalah beberapa parameter utama.
Efsearch adalah ukuran daftar dinamis untuk tetangga terdekat yang digunakan selama pencarian. Nilai EFSearch yang lebih tinggi menyebabkan pencarian yang lebih akurat tetapi lebih lambat. Efsearch tidak dapat diatur lebih rendah dari jumlah tetangga terdekat yang ditanya dan dapat berupa nilai antara K dan ukuran dataset.
M adalah jumlah tautan dua arah yang dibuat untuk setiap elemen baru selama konstruksi indeks. Kisaran yang masuk akal untuk M adalah 2-100. Nilai M yang lebih tinggi bekerja lebih baik pada dataset dengan dimensi intrinsik tinggi dan/atau penarikan tinggi, sementara nilai M yang lebih rendah bekerja lebih baik untuk set data dengan dimensi intrinsik rendah dan/atau penarikan rendah. Parameter juga menentukan konsumsi memori algoritma, yang kira-kira m * 8-10 byte per elemen yang disimpan.
EFCONSTRUKSI Mengontrol waktu konstruksi indeks dan akurasi. Nilai konstruksi yang lebih besar menyebabkan waktu konstruksi yang lebih lama tetapi kualitas indeks yang lebih baik. Pada titik tertentu, peningkatan konstruksi tidak meningkatkan kualitas indeks. Untuk memeriksa apakah nilai konstruksi yang dipilih sesuai, ukur penarikan untuk pencarian tetangga terdekat ketika EFSEARCH = EFConstruksi. Jika penarikan lebih rendah dari 0,9, ada ruang untuk perbaikan.
Saat menggunakan HNSWLIB-WASM, penting untuk memilih nilai yang sesuai untuk M, EFSearch, dan EFConstruksi berdasarkan ukuran dan dimensi dataset Anda. Karena HNSWLIB-WASM berjalan di browser, Anda harus mempertimbangkan memori yang tersedia dan keterbatasan kinerja. Berikut beberapa rekomendasi:
Pilih nilai dalam kisaran 12-48, karena berfungsi dengan baik untuk sebagian besar kasus penggunaan. Anda mungkin perlu bereksperimen untuk menemukan nilai optimal untuk dataset spesifik Anda.
Mulailah dengan nilai yang dekat dengan M dan sesuaikan berdasarkan trade-off yang Anda inginkan antara kecepatan pencarian dan akurasi. Nilai yang lebih rendah akan lebih cepat tetapi kurang akurat, sementara nilai yang lebih tinggi akan lebih akurat tetapi lebih lambat.
Tetapkan nilai ini dengan mempertimbangkan volume kueri yang diharapkan. Jika Anda mengantisipasi volume kueri rendah, Anda dapat menetapkan nilai yang lebih tinggi untuk konstruksi untuk meningkatkan penarikan dengan dampak minimal pada waktu pencarian, terutama saat menggunakan nilai M yang lebih rendah.
Ingatlah bahwa nilai M yang lebih tinggi akan meningkatkan penggunaan memori indeks, jadi Anda harus menyeimbangkan kendala kinerja dan memori saat memilih parameter Anda untuk HNSWLIB-WASM.
Pelajari HNSW dengan Pinecone
Indeks vektor dengan pinus
Gambar dari Pinecone.io
HNSWLIB-WASM tersedia sebagai open source di bawah ketentuan lisensi apache-2.0.
Untuk membangun
yarn install
make rebuild
yarn build
Untuk menguji
yarn test
Hubungi @shravansunder dulu!