Vectra는 Pinecone 또는 Qdrant와 유사하지만 로컬 파일을 사용하여 구축된 기능을 갖춘 Node.js용 로컬 벡터 데이터베이스입니다. 각 Vectra 인덱스는 디스크의 폴더입니다. 폴더에는 색인화된 메타데이터와 함께 색인에 대한 모든 벡터가 포함된 index.json
파일이 있습니다. 인덱스를 생성할 때 인덱스할 메타데이터 속성을 지정할 수 있으며 해당 필드만 index.json
파일에 저장됩니다. 항목에 대한 다른 모든 메타데이터는 GUID로 입력되는 별도의 파일로 디스크에 저장됩니다.
Vectra를 쿼리할 때 Pinecone이 지원하는 동일한 Mongo DB 쿼리 연산자 하위 집합을 사용할 수 있으며 결과는 유사성에 따라 정렬되어 반환됩니다. 인덱스의 모든 항목은 먼저 메타데이터로 필터링된 다음 유사성을 기준으로 순위가 매겨집니다. 모든 항목이 모두 메모리에 평가되더라도 거의 즉각적으로 평가되어야 합니다. 다소 큰 인덱스의 경우에도 1ms - 2ms일 수 있습니다. 더 작은 인덱스는 1ms 미만이어야 합니다.
전체 Vectra 인덱스는 메모리에 로드되므로 장기 채팅 봇 메모리와 같은 시나리오에는 적합하지 않습니다. 이를 위해 실제 벡터 DB를 사용하십시오. 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
*/