Vectra 是 Node.js 的本地向量資料庫,其功能類似於 Pinecone 或 Qdrant,但使用本地檔案建構。每個 Vectra 索引都是磁碟上的一個資料夾。該資料夾中有一個index.json
文件,其中包含索引的所有向量以及任何索引元資料。建立索引時,您可以指定要索引的元資料屬性,並且只有這些欄位才會儲存在index.json
檔案中。專案的所有其他元資料都將儲存在磁碟上由 GUID 鍵入的單獨檔案中。
當 queryng Vectra 時,您將能夠使用 Pinecone 支援的 Mongo DB 查詢運算子的相同子集,並且傳回的結果將按相似性排序。索引中的每個項目將首先透過元資料進行過濾,然後根據相似性進行排名。儘管每個項目都被評估,但它都在記憶體中,所以它應該幾乎是瞬時的。即使是相當大的索引,也可能需要 1 毫秒 - 2 毫秒。較小的索引應<1ms。
請記住,您的整個 Vectra 索引都會載入到記憶體中,因此它不太適合長期聊天機器人記憶體等場景。為此使用真實的向量資料庫。 Vectra 旨在用於以下場景:您有一個主要包含靜態資料的小型語料庫,您希望將其包含在提示中。無限的幾個鏡頭範例將是 Vectra 的一個很好的用例,甚至只是您想要提出問題的單一文件。
不直接支援 Pinecone 樣式名稱空間,但您可以透過為每個名稱空間建立單獨的 Vectra 索引(和資料夾)來輕鬆模仿它們。
此儲存庫包含 Vectra 的 TypeScript/JavaScript 綁定,但正在建立其他語言綁定。由於 Vectra 是基於檔案的,因此任何語言綁定都可用於讀取或寫入 Vectra 索引。這意味著您可以使用 JS 建立 Vectra 索引,然後使用 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 : `` ,
} ) ;
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
*/