Perpustakaan pencarian vektor sisi klien yang dapat menanamkan, mencari, dan menangani. Bekerja di sisi browser dan server.
Ini mengungguli Openai's Embedding-DADA-002 dan jauh lebih cepat daripada Pinecone dan Vectorbs lainnya.
Saya pendiri SearchBase.app dan kami membutuhkan ini untuk produk dan pelanggan kami. Kami akan menggunakan perpustakaan ini dalam produksi. Anda bisa yakin itu akan dipertahankan dan ditingkatkan.
Banyak perbaikan akan datang!
Tujuan kami adalah membangun pencarian vektor yang sangat sederhana dan cepat yang bekerja dengan beberapa ratus hingga ribuan vektor. ~ Vektor 1K per pengguna mencakup 99% dari kasus penggunaan.
Awalnya kami akan menjaga hal -hal yang super sederhana dan sub 100ms
npm i client-vector-searchPerpustakaan ini menyediakan solusi plug-and-play untuk pencarian embedding dan vektor. Ini dirancang agar mudah digunakan, efisien, dan serbaguna. Inilah panduan mulai cepat:
import { getEmbedding , EmbeddingIndex } from 'client-vector-search' ;
// getEmbedding is an async function, so you need to use 'await' or '.then()' to get the result
const embedding = await getEmbedding ( "Apple" ) ; // Returns embedding as number[]
// Each object should have an 'embedding' property of type number[]
const initialObjects = [
{ id : 1 , name : "Apple" , embedding : embedding } ,
{ id : 2 , name : "Banana" , embedding : await getEmbedding ( "Banana" ) } ,
{ id : 3 , name : "Cheddar" , embedding : await getEmbedding ( "Cheddar" ) } ,
{ id : 4 , name : "Space" , embedding : await getEmbedding ( "Space" ) } ,
{ id : 5 , name : "database" , embedding : await getEmbedding ( "database" ) } ,
] ;
const index = new EmbeddingIndex ( initialObjects ) ; // Creates an index
// The query should be an embedding of type number[]
const queryEmbedding = await getEmbedding ( 'Fruit' ) ; // Query embedding
const results = await index . search ( queryEmbedding , { topK : 5 } ) ; // Returns top similar objects
// specify the storage type
await index . saveIndex ( 'indexedDB' ) ;
const results = await index . search ( [ 1 , 2 , 3 ] , {
topK : 5 ,
useStorage : 'indexedDB' ,
// storageOptions: { // use only if you overrode the defaults
// indexedDBName: 'clientVectorDB',
// indexedDBObjectStoreName: 'ClientEmbeddingStore',
// },
} ) ;
console . log ( results ) ;
await index . deleteIndexedDB ( ) ; // if you overrode default, specify db name Untuk menggunakannya di dalam proyek NextJS, Anda harus memperbarui file next.config.js untuk memasukkan yang berikut:
module . exports = {
// Override the default webpack configuration
webpack : ( config ) => {
// See https://webpack.js.org/configuration/resolve/#resolvealias
config . resolve . alias = {
... config . resolve . alias ,
sharp$ : false ,
"onnxruntime-node$" : false ,
} ;
return config ;
} ,
} ; Anda dapat menginisialisasi model sebelum menggunakannya untuk menghasilkan embeddings. Ini akan memastikan bahwa model dimuat sebelum Anda menggunakannya dan memberikan UX yang lebih baik.
import { initializeModel } from "client-vector-search"
. . .
useEffect ( ( ) => {
try {
initializeModel ( ) ;
} catch ( e ) {
console . log ( e ) ;
}
} , [ ] ) ; Panduan ini menyediakan langkah-langkah langkah demi langkah dari fitur utama perpustakaan. Ini mencakup segala sesuatu mulai dari menghasilkan embeddings untuk string hingga melakukan operasi pada indeks seperti menambahkan, memperbarui, dan menghapus objek. Ini juga termasuk instruksi tentang cara menyimpan indeks ke database dan melakukan operasi pencarian di dalamnya.
Sampai kami memiliki dokumentasi referensi, Anda dapat menemukan semua metode dan penggunaannya dalam panduan ini. Setiap langkah disertai dengan cuplikan kode untuk menggambarkan penggunaan metode yang dimaksud. Pastikan untuk mengikuti dan mencoba contoh -contoh di lingkungan Anda sendiri untuk mendapatkan pemahaman yang lebih baik tentang bagaimana semuanya bekerja.
Mari kita mulai!
Menghasilkan embeddings untuk string yang diberikan menggunakan metode getEmbedding .
const embedding = await getEmbedding ( "Apple" ) ; // Returns embedding as number[]Catatan :
getEmbeddingasinkron; Pastikan untuk menggunakanawait.
Hitung kesamaan kosinus antara dua embeddings.
const similarity = cosineSimilarity ( embedding1 , embedding2 , 6 ) ;Catatan : Kedua embedding harus memiliki panjang yang sama.
Buat indeks dengan array awal objek. Setiap objek harus memiliki properti 'penyematan'.
const initialObjects = [ ... ] ;
const index = new EmbeddingIndex ( initialObjects ) ;Tambahkan objek ke indeks.
const objectToAdd = { id : 6 , name : 'Cat' , embedding : await getEmbedding ( 'Cat' ) } ;
index . add ( objectToAdd ) ;Perbarui objek yang ada di indeks.
const vectorToUpdate = { id : 6 , name : 'Dog' , embedding : await getEmbedding ( 'Dog' ) } ;
index . update ( { id : 6 } , vectorToUpdate ) ;Hapus objek dari indeks.
index . remove ( { id : 6 } ) ;Ambil objek dari indeks.
const vector = index . get ( { id : 1 } ) ;Cari indeks dengan embedding kueri.
const queryEmbedding = await getEmbedding ( 'Fruit' ) ;
const results = await index . search ( queryEmbedding , { topK : 5 } ) ;Cetak seluruh indeks ke konsol.
index . printIndex ( ) ;Simpan indeks ke database IndexedDB persisten. Catatan
await index . saveIndex ( "indexedDB" , { DBName : "clientVectorDB" , objectStoreName : "ClientEmbeddingStore" } )Lakukan operasi pencarian di indexeddb.
const results = await index . search ( queryEmbedding , {
topK : 5 ,
useStorage : "indexedDB" ,
storageOptions : { // only if you want to override the default options, defaults are below
indexedDBName : 'clientVectorDB' ,
indexedDBObjectStoreName : 'ClientEmbeddingStore'
}
} ) ;
-- -
### Delete Database
To delete an entire database .
`` ` ts
await IndexedDbManager . deleteIndexedDB ( "clientVectorDB" ) ;Untuk menghapus toko objek dari database.
await IndexedDbManager . deleteIndexedDBObjectStore ( "clientVectorDB" , "ClientEmbeddingStore" ) ;Untuk mengambil semua objek dari toko objek tertentu.
const allObjects = await IndexedDbManager . getAllObjectsFromIndexedDB ( "clientVectorDB" , "ClientEmbeddingStore" ) ;