Vectra es una base de datos vectorial local para Node.js con características similares a Pinecone o Qdrant pero construida con archivos locales. Cada índice de Vectra es una carpeta en el disco. Hay un archivo index.json
en la carpeta que contiene todos los vectores para el índice junto con los metadatos indexados. Cuando crea un índice, puede especificar qué propiedades de metadatos indexar y solo esos campos se almacenarán en el archivo index.json
. Todos los demás metadatos de un elemento se almacenarán en el disco en un archivo separado codificado por un GUID.
Al consultar Vectra, podrá utilizar el mismo subconjunto de operadores de consulta Mongo DB que admite Pinecone y los resultados se devolverán ordenados por similitud. Cada elemento del índice se filtrará primero por metadatos y luego se clasificará por similitud. Aunque cada elemento se evalúa en la memoria, debería ser casi instantáneo. Probablemente 1 ms - 2 ms incluso para un índice bastante grande. Los índices más pequeños deben ser <1 ms.
Tenga en cuenta que todo su índice Vectra está cargado en la memoria, por lo que no es adecuado para escenarios como la memoria del chat bot a largo plazo. Utilice una base de datos vectorial real para eso. Vectra está diseñado para usarse en escenarios en los que tiene un pequeño corpus de datos en su mayoría estáticos que le gustaría incluir en su mensaje. Unos cuantos ejemplos infinitos de tomas serían un excelente caso de uso para Vectra o incluso un solo documento sobre el que desea hacer preguntas.
Los espacios de nombres de estilo Pinecone no son compatibles directamente, pero puedes imitarlos fácilmente creando un índice (y una carpeta) de Vectra independiente para cada espacio de nombres.
Este repositorio contiene el enlace TypeScript/JavaScript para Vectra, pero se están creando otros enlaces de lenguaje. Dado que Vectra se basa en archivos, se puede utilizar cualquier enlace de idioma para leer o escribir un índice de Vectra. Eso significa que puede crear un índice de Vectra usando JS y luego leerlo usando Python.
$ npm install vectra
Primero cree una instancia de LocalIndex
con la ruta a la carpeta donde desea almacenar sus elementos:
import { LocalIndex } from 'vectra' ;
const index = new LocalIndex ( path . join ( __dirname , '..' , 'index' ) ) ;
A continuación, desde dentro de una función asíncrona, crea tu índice:
if ( ! ( await index . isIndexCreated ( ) ) ) {
await index . createIndex ( ) ;
}
Agregue algunos elementos a su índice:
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' ) ;
Luego consulta por artículos:
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
*/