Vectra ist eine lokale Vektordatenbank für Node.js mit ähnlichen Funktionen wie Pinecone oder Qdrant, die jedoch mit lokalen Dateien erstellt wurde. Jeder Vectra-Index ist ein Ordner auf der Festplatte. Im Ordner befindet sich eine index.json
-Datei, die alle Vektoren für den Index sowie alle indizierten Metadaten enthält. Wenn Sie einen Index erstellen, können Sie angeben, welche Metadateneigenschaften indiziert werden sollen. Nur diese Felder werden in der Datei index.json
gespeichert. Alle anderen Metadaten für ein Element werden auf der Festplatte in einer separaten Datei gespeichert, die durch eine GUID verschlüsselt ist.
Wenn Sie Vectra abfragen, können Sie dieselbe Teilmenge der Mongo DB-Abfrageoperatoren verwenden, die Pinecone unterstützt, und die Ergebnisse werden nach Ähnlichkeit sortiert zurückgegeben. Jedes Element im Index wird zunächst nach Metadaten gefiltert und dann nach Ähnlichkeit eingestuft. Auch wenn jedes Element ausgewertet wird, ist alles im Speicher, so dass es nahezu augenblicklich erfolgen sollte. Wahrscheinlich 1 ms – 2 ms selbst für einen ziemlich großen Index. Kleinere Indizes sollten <1 ms sein.
Bedenken Sie, dass Ihr gesamter Vectra-Index in den Speicher geladen wird und daher nicht für Szenarien wie den Langzeitspeicher eines Chat-Bots geeignet ist. Verwenden Sie dazu eine echte Vektor-DB. Vectra soll in Szenarien verwendet werden, in denen Sie über einen kleinen Korpus überwiegend statischer Daten verfügen, die Sie in Ihre Eingabeaufforderung einbeziehen möchten. Unendlich wenige Aufnahmebeispiele wären ein großartiger Anwendungsfall für Vectra oder auch nur ein einzelnes Dokument, zu dem Sie Fragen stellen möchten.
Namespaces im Pinecone-Stil werden nicht direkt unterstützt, aber Sie können sie leicht nachahmen, indem Sie für jeden Namespace einen separaten Vectra-Index (und Ordner) erstellen.
Dieses Repo enthält die TypeScript/JavaScript-Bindung für Vectra, es werden jedoch auch andere Sprachbindungen erstellt. Da Vectra dateibasiert ist, kann jede Sprachbindung zum Lesen oder Schreiben eines Vectra-Index verwendet werden. Das bedeutet, dass Sie mit JS einen Vectra-Index erstellen und ihn dann mit Python lesen können.
$ npm install vectra
Erstellen Sie zunächst eine Instanz von LocalIndex
mit dem Pfad zu dem Ordner, in dem Ihre Elemente gespeichert werden sollen:
import { LocalIndex } from 'vectra' ;
const index = new LocalIndex ( path . join ( __dirname , '..' , 'index' ) ) ;
Erstellen Sie als Nächstes innerhalb einer asynchronen Funktion Ihren Index:
if ( ! ( await index . isIndexCreated ( ) ) ) {
await index . createIndex ( ) ;
}
Fügen Sie Ihrem Index einige Elemente hinzu:
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' ) ;
Fragen Sie dann nach Artikeln ab:
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
*/