Vectra est une base de données vectorielles locale pour Node.js avec des fonctionnalités similaires à Pinecone ou Qdrant mais construite à l'aide de fichiers locaux. Chaque index Vectra est un dossier sur le disque. Il y a un fichier index.json
dans le dossier qui contient tous les vecteurs de l'index ainsi que toutes les métadonnées indexées. Lorsque vous créez un index, vous pouvez spécifier les propriétés de métadonnées à indexer et seuls ces champs seront stockés dans le fichier index.json
. Toutes les autres métadonnées d'un élément seront stockées sur le disque dans un fichier séparé saisi par un GUID.
Lorsque vous interrogez Vectra, vous pourrez utiliser le même sous-ensemble d'opérateurs de requête Mongo DB que Pinecone prend en charge et les résultats seront renvoyés triés par similitude. Chaque élément de l'index sera d'abord filtré par métadonnées, puis classé pour sa similarité. Même si chaque élément est évalué, il est entièrement en mémoire, il devrait donc être presque instantané. Probablement 1 ms à 2 ms, même pour un index assez grand. Les index plus petits doivent être <1 ms.
Gardez à l’esprit que l’intégralité de votre index Vectra est chargé en mémoire et n’est donc pas bien adapté aux scénarios tels que la mémoire à long terme du chatbot. Utilisez une vraie base de données vectorielle pour cela. Vectra est destiné à être utilisé dans des scénarios dans lesquels vous disposez d'un petit corpus de données principalement statiques que vous souhaitez inclure dans votre invite. Une infinité d'exemples de prises de vue constitueraient un excellent cas d'utilisation pour Vectra ou même un seul document sur lequel vous souhaitez poser des questions.
Les espaces de noms de style Pinecone ne sont pas directement pris en charge, mais vous pouvez facilement les imiter en créant un index (et un dossier) Vectra distinct pour chaque espace de noms.
Ce référentiel contient la liaison TypeScript/JavaScript pour Vectra mais d'autres liaisons de langage sont en cours de création. Étant donné que Vectra est basé sur des fichiers, n'importe quelle liaison de langage peut être utilisée pour lire ou écrire un index Vectra. Cela signifie que vous pouvez créer un index Vectra en utilisant JS, puis le lire en utilisant Python.
$ npm install vectra
Créez d’abord une instance de LocalIndex
avec le chemin d’accès au dossier dans lequel vous souhaitez stocker vos éléments :
import { LocalIndex } from 'vectra' ;
const index = new LocalIndex ( path . join ( __dirname , '..' , 'index' ) ) ;
Ensuite, depuis une fonction asynchrone, créez votre index :
if ( ! ( await index . isIndexCreated ( ) ) ) {
await index . createIndex ( ) ;
}
Ajoutez quelques éléments à votre index :
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' ) ;
Ensuite, recherchez les éléments :
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
*/