Vectra هي قاعدة بيانات متجهة محلية لـ Node.js مع ميزات مشابهة لـ Pinecone أو Qdrant ولكن تم إنشاؤها باستخدام الملفات المحلية. كل فهرس Vectra عبارة عن مجلد على القرص. يوجد ملف index.json
في المجلد الذي يحتوي على جميع متجهات الفهرس بالإضافة إلى أي بيانات تعريف مفهرسة. عندما تقوم بإنشاء فهرس، يمكنك تحديد خصائص البيانات التعريفية المراد فهرستها وسيتم تخزين تلك الحقول فقط في ملف index.json
. سيتم تخزين كافة البيانات التعريفية الأخرى لأحد العناصر على القرص في ملف منفصل مرتبط بمعرف GUID.
عند الاستعلام عن Vectra، ستتمكن من استخدام نفس المجموعة الفرعية من عوامل استعلام Mongo DB التي يدعمها Pinecone وسيتم إرجاع النتائج مرتبة حسب التشابه. ستتم تصفية كل عنصر في الفهرس أولاً حسب البيانات الوصفية، ثم يتم تصنيفه من حيث التشابه. على الرغم من أن كل عنصر يتم تقييمه بالكامل في الذاكرة، فيجب أن يتم ذلك بشكل فوري تقريبًا. من المحتمل 1 مللي ثانية - 2 مللي ثانية حتى بالنسبة لمؤشر كبير إلى حد ما. يجب أن تكون الفهارس الأصغر <1 مللي ثانية.
ضع في اعتبارك أنه يتم تحميل فهرس Vectra بالكامل في الذاكرة، لذا فهو غير مناسب تمامًا لسيناريوهات مثل ذاكرة روبوت الدردشة طويلة المدى. استخدم قاعدة بيانات متجهة حقيقية لذلك. تم تصميم Vectra ليتم استخدامه في السيناريوهات التي يكون لديك فيها مجموعة صغيرة من البيانات الثابتة في الغالب والتي ترغب في تضمينها في الموجه الخاص بك. قد تكون الأمثلة القليلة غير المحدودة حالة استخدام رائعة لـ Vectra أو حتى مجرد مستند واحد تريد طرح الأسئلة عليه.
مساحات الأسماء ذات النمط Pinecone غير مدعومة بشكل مباشر ولكن يمكنك تقليدها بسهولة عن طريق إنشاء فهرس 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 : `` ,
} ) ;
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
*/