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 : `<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
*/