Vectra — это локальная векторная база данных для Node.js с функциями, аналогичными Pinecone или Qdrant, но построенная с использованием локальных файлов. Каждый индекс Vectra представляет собой папку на диске. В папке находится файл index.json
, содержащий все векторы для индекса, а также все проиндексированные метаданные. При создании индекса вы можете указать, какие свойства метаданных индексировать, и только эти поля будут храниться в файле index.json
. Все остальные метаданные элемента будут храниться на диске в отдельном файле с ключом GUID.
При запросе Vectra вы сможете использовать то же подмножество операторов запроса Mongo DB, которое поддерживает Pinecone, и результаты будут возвращены, отсортированные по сходству. Каждый элемент индекса сначала будет отфильтрован по метаданным, а затем ранжирован на предмет сходства. Несмотря на то, что каждый элемент оценивается полностью в памяти, он должен выполняться почти мгновенно. Вероятно, 1–2 мс даже для довольно большого индекса. Меньшие индексы должны быть <1 мс.
Имейте в виду, что весь ваш индекс Vectra загружается в память, поэтому он не очень подходит для таких сценариев, как долговременная память чат-бота. Используйте для этого настоящую векторную БД. Vectra предназначена для использования в сценариях, где у вас есть небольшой массив в основном статических данных, которые вы хотели бы включить в свое приглашение. Бесконечное количество примеров снимков было бы отличным вариантом использования Vectra или даже одним документом, к которому вы хотите задать вопросы.
Пространства имен в стиле сосновой шишки напрямую не поддерживаются, но вы можете легко имитировать их, создав отдельный индекс (и папку) Vectra для каждого пространства имен.
Этот репозиторий содержит привязку TypeScript/JavaScript для Vectra, но создаются привязки для других языков. Поскольку Vectra основана на файлах, для чтения или записи индекса Vectra можно использовать любую языковую привязку. Это означает, что вы можете создать индекс Vectra с помощью JS, а затем прочитать его с помощью Python.
$ npm install vectra
Сначала создайте экземпляр LocalIndex
с путем к папке, в которой вы хотите хранить элементы:
import { LocalIndex } from 'vectra' ;
const index = new LocalIndex ( path . join ( __dirname , '..' , 'index' ) ) ;
Затем изнутри асинхронной функции создайте свой индекс:
if ( ! ( await index . isIndexCreated ( ) ) ) {
await index . createIndex ( ) ;
}
Добавьте несколько элементов в свой индекс:
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' ) ;
Затем запросите элементы:
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
*/