Vectra é um banco de dados vetorial local para Node.js com recursos semelhantes ao Pinecone ou Qdrant, mas construído usando arquivos locais. Cada índice do Vectra é uma pasta no disco. Há um arquivo index.json
na pasta que contém todos os vetores do índice junto com quaisquer metadados indexados. Ao criar um índice, você pode especificar quais propriedades de metadados indexar e apenas esses campos serão armazenados no arquivo index.json
. Todos os outros metadados de um item serão armazenados no disco em um arquivo separado codificado por um GUID.
Ao consultar o Vectra, você poderá usar o mesmo subconjunto de operadores de consulta Mongo DB que o Pinecone suporta e os resultados serão retornados classificados por similaridade. Cada item no índice será primeiro filtrado por metadados e depois classificado por similaridade. Mesmo que cada item seja avaliado, está tudo na memória, então deve ser quase instantâneo. Provavelmente 1ms - 2ms, mesmo para um índice bastante grande. Índices menores devem ser <1ms.
Tenha em mente que todo o seu índice Vectra é carregado na memória, portanto não é adequado para cenários como memória de bot de bate-papo de longo prazo. Use um banco de dados vetorial real para isso. O Vectra deve ser usado em cenários onde você tem um pequeno corpus de dados principalmente estáticos que gostaria de incluir em seu prompt. Infinitos exemplos de fotos seriam um ótimo caso de uso para o Vectra ou mesmo apenas um único documento sobre o qual você deseja fazer perguntas.
Namespaces estilo Pinecone não são suportados diretamente, mas você pode imitá-los facilmente criando um índice (e pasta) Vectra separado para cada namespace.
Este repositório contém a ligação TypeScript/JavaScript para Vectra, mas outras ligações de linguagem estão sendo criadas. Como o Vectra é baseado em arquivo, qualquer ligação de linguagem pode ser usada para ler ou escrever um índice do Vectra. Isso significa que você pode construir um índice Vectra usando JS e depois lê-lo usando Python.
$ npm install vectra
Primeiro crie uma instância de LocalIndex
com o caminho para a pasta onde você deseja armazenar os itens:
import { LocalIndex } from 'vectra' ;
const index = new LocalIndex ( path . join ( __dirname , '..' , 'index' ) ) ;
A seguir, dentro de uma função assíncrona, crie seu índice:
if ( ! ( await index . isIndexCreated ( ) ) ) {
await index . createIndex ( ) ;
}
Adicione alguns itens ao seu índice:
import { OpenAI } from 'openai' ;
const openai = new OpenAI ( {
apiKey : `<YOUR_KEY>` ,
} ) ;
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' ) ;
Em seguida, consulte os itens:
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
*/