Vectra adalah database vektor lokal untuk Node.js dengan fitur yang mirip dengan Pinecone atau Qdrant tetapi dibuat menggunakan file lokal. Setiap indeks Vectra adalah sebuah folder pada disk. Ada file index.json
di folder yang berisi semua vektor untuk indeks beserta metadata yang diindeks. Saat Anda membuat indeks, Anda dapat menentukan properti metadata mana yang akan diindeks dan hanya bidang tersebut yang akan disimpan dalam file index.json
. Semua metadata lain untuk suatu item akan disimpan pada disk dalam file terpisah yang dikunci oleh GUID.
Saat menanyakan Vectra, Anda akan dapat menggunakan subset yang sama dari operator kueri Mongo DB yang didukung Pinecone dan hasilnya akan dikembalikan berdasarkan kemiripan. Setiap item dalam indeks pertama-tama akan difilter berdasarkan metadata dan kemudian diberi peringkat untuk kesamaan. Meskipun setiap item dievaluasi semuanya dalam memori sehingga harus dilakukan hampir seketika. Kemungkinan 1ms - 2ms bahkan untuk indeks yang agak besar. Indeks yang lebih kecil harus <1ms.
Ingatlah bahwa seluruh indeks Vectra Anda dimuat ke dalam memori sehingga tidak cocok untuk skenario seperti memori bot obrolan jangka panjang. Gunakan DB vektor nyata untuk itu. Vectra dimaksudkan untuk digunakan dalam skenario di mana Anda memiliki kumpulan kecil yang sebagian besar berisi data statis yang ingin Anda sertakan dalam prompt Anda. Beberapa contoh pengambilan gambar yang tak terbatas akan menjadi kasus penggunaan yang bagus untuk Vectra atau bahkan hanya satu dokumen yang ingin Anda ajukan pertanyaan.
Namespace gaya biji pinus tidak didukung secara langsung tetapi Anda dapat dengan mudah menirunya dengan membuat indeks (dan folder) Vectra terpisah untuk setiap namespace.
Repo ini berisi pengikatan TypeScript/JavaScript untuk Vectra tetapi pengikatan bahasa lain sedang dibuat. Karena Vectra berbasis file, pengikatan bahasa apa pun dapat digunakan untuk membaca atau menulis indeks Vectra. Artinya Anda dapat membuat indeks Vectra menggunakan JS dan kemudian membacanya menggunakan Python.
$ npm install vectra
Pertama buat instance LocalIndex
dengan jalur ke folder tempat Anda ingin menyimpan item:
import { LocalIndex } from 'vectra' ;
const index = new LocalIndex ( path . join ( __dirname , '..' , 'index' ) ) ;
Selanjutnya, dari dalam fungsi async, buat indeks Anda:
if ( ! ( await index . isIndexCreated ( ) ) ) {
await index . createIndex ( ) ;
}
Tambahkan beberapa item ke indeks Anda:
import { OpenAI } from 'openai' ;
const openai = new OpenAI ( {
apiKey : `` ,
} ) ;
async function getVector ( text : string ) {
const response = await openai . embeddings . create ( {
'model' : 'text-embedding-ada-002' ,
'input' : text ,
} ) ;
return response . data [ 0 ] . embedding ;
}
async function addItem ( text : string ) {
await index . insertItem ( {
vector : await getVector ( text ) ,
metadata : { text } ,
} ) ;
}
// Add items
await addItem ( 'apple' ) ;
await addItem ( 'oranges' ) ;
await addItem ( 'red' ) ;
await addItem ( 'blue' ) ;
Kemudian kueri item:
async function query ( text : string ) {
const vector = await getVector ( text ) ;
const results = await index . queryItems ( vector , 3 ) ;
if ( results . length > 0 ) {
for ( const result of results ) {
console . log ( `[ ${ result . score } ] ${ result . item . metadata . text } ` ) ;
}
} else {
console . log ( `No results found.` ) ;
}
}
await query ( 'green' ) ;
/*
[0.9036569942401076] blue
[0.8758153664568566] red
[0.8323828606103998] apple
*/
await query ( 'banana' ) ;
/*
[0.9033128691220631] apple
[0.8493374123092652] oranges
[0.8415324469533297] blue
*/