هذا هو إصدار Webassembly (WASM) من مكتبة فهرس HNSWLIB المكتوبة في C ++. تم إنشاء منفذ WASM هذا بواسطة shravansunder باستخدام برنامج التحويل البرمجي EMCC WASM ، انظر المستودع هنا.
مستوحاة من مكتبة HNSWLIB-DOODE. قدمت Yoshoku بعض الوثائق الرائعة لعقدة HNSWLIB. شكرا ، Yoshoku!
ملاحظة: لا تزال هذه المكتبة في أيامها الأولى! يتم بناؤه لحالة الاستخدام التي تتطلب تشغيل HNSWLIB في المتصفح.
يوفر hnswlib-wasm روابط WASM لـ HNSWLIB التي تنفذ بحثًا تقريبيًا أقرب جورب على أساس الرسوم البيانية العالمية الصغيرة الصالحة للملاحة. إنه يعمل في المتصفحات ويتم تجميعه باستخدام emscripten.
$ yarn add hnswlib-wasmانظر حزمة NPM هنا.
indexedDB (في المتصفح) ويستخدم FS من emscripten لحفظ وتحميل الفهرس عبر نظام الملفات الظاهرية و IDBFs.hnswlib-node لمزيد من التفاصيل بواسطة yoshoku changelog.أولاً ، قم بإنشاء مثيل وقت تشغيل للمكتبة:
import { loadHnswlib } from 'hnswlib-wasm' ;
const lib = await loadHnswlib ( ) ;فيما يلي مثال كامل على تحميل فهرس إذا كان موجودًا أو إنشاء فهرس جديد إذا لم يكن موجودًا:
const filename = 'ghost.dat' ;
const { loadHnswlib } = await import ( 'hnswlib-wasm' ) ;
this . hnswlib = await loadHnswlib ( ) ;
this . hnswlib . EmscriptenFileSystemManager . setDebugLogs ( true ) ;
this . vectorHnswIndex = new this . hnswlib . HierarchicalNSW ( 'cosine' , 1536 ) ;
await syncFileSystem ( 'read' ) ;
const exists = this . hnswlib . EmscriptenFileSystemManager . checkFileExists ( filename ) ;
if ( ! exists ) {
this . vectorHnswIndex . initIndex ( 100000 , 48 , 128 , 100 ) ;
this . vectorHnswIndex . setEfSearch ( 32 ) ;
this . vectorHnswIndex . writeIndex ( 'ghost.dat' ) ;
} else {
this . vectorHnswIndex . readIndex ( filename , 100000 , true ) ;
this . vectorHnswIndex . setEfSearch ( 32 ) ;
}يمكنك إنشاء الفهرس واستخدامه مثل ذلك.
// Here you're creating a new index with the L2 distance metric and 1000 as the max number of elements
const hnswIndex = lib . HierarchicalNSW ( 'l2' , 100 ) ;
// Initialize the index with the dimensions (1536), m, efConstruction. See the section below on parameters for more details. These cannot be changed after the index is created.
index . initIndex ( 1536 , 36 , 16 , 200 ) ;
// Set efSearch parameters. This can be changed after the index is created.
index . setEfSearch ( efSearch ) ;
// Now you can add items to the index, labels are returned as an array for the vectors. It will reuse deleted labels if possible based on the second parameter.
const labels = index . addItems ( vectors , true ) ;
// Now you can search the index
const result1 = index . searchKnn ( vectors [ 10 ] , 10 , undefined ) ;
// You can also search the index with a label filter
const labelFilter = ( label : number ) => {
return label >= 10 && label < 20 ;
}
const result2 = index . searchKnn ( testVectorData . vectors [ 10 ] , 10 , labelFilter ) ;المزيد من أمثلة الاستخدام المراد إضافتها.
في الوقت الحالي ، راجع ملف
HierarchicalNSW.test.tsفي مجلد الاختبارات ويرجع إلى وثائق واجهة برمجة تطبيقات HNSWLIB-Node.
توفر مكتبة hnswlib-wasm دعمًا موسعًا لـ INSEDDB (IDBFS) لتخزين وإدارة فهرس البحث في المتصفح. يتيح لك ذلك حفظ وتحميل فهرس البحث بسهولة في بيئة ويب ولا يتعين عليك نقل البيانات من نظام ملفات EMCC إلى ذاكرة JavaScript. يستخدم FS من emscripten لحفظ وتحميل الفهرس عبر نظام الملفات الافتراضية. يتم مزامنة نظام الملفات الظاهرية مع IDBFs.
لحفظ فهرس البحث ، استخدم طريقة writeIndex :
await index . writeIndex ( 'savedIndex' ) ; لتحميل فهرس البحث المحفوظ مسبقًا ، استخدم طريقة readIndex :
await index . readIndex ( 'savedIndex' , false ) ; يتم استخدام طريقة syncFs لمزامنة نظام الملفات emscripten مع التخزين المستمر IDBFs. يمكنك استخدام هذه الطريقة لحفظ أو قراءة البيانات من المصدر المستمر لنظام الملفات.
await lib . EmscriptenFileSystemManager . syncFS ( true , emscripten :: val :: undefined ( ) ) ; // Read data from the persistent source
await lib . EmscriptenFileSystemManager . syncFS ( false , emscripten :: val :: undefined ( ) ) ; // Save data to the persistent source سيقدم هذا القسم نظرة عامة على معلمات خوارزمية HNSW وتأثيرها على الأداء عند استخدام مكتبة HNSWLIB-WASM. HNSW (عالم صغير قابل للملاحة الهرمي) هو بنية فهرس قائم على الرسم البياني للبحث الفعال في التشابه في المساحات عالية الأبعاد.
صورة من pinecone.io
يحتوي على العديد من المعلمات التي يمكن ضبطها للتحكم في المفاضلة بين جودة البحث وحجم الفهرس أو وقت البناء. فيما يلي بعض المعلمات الرئيسية.
EFSearch هو حجم القائمة الديناميكية لأقرب الجيران المستخدمة أثناء البحث. تؤدي قيم EFSearch الأعلى إلى عمليات تفتيش أكثر دقة ولكن أبطأ. لا يمكن تعيين EFSearch أقل من عدد أقرب الجيران التي تم الاستعلام عنها K ويمكن أن تكون أي قيمة بين K وحجم مجموعة البيانات.
M هو عدد الروابط ثنائية الاتجاه التي تم إنشاؤها لكل عنصر جديد أثناء إنشاء الفهرس. نطاق معقول لـ M هو 2-100. تعمل القيم العالية M بشكل أفضل على مجموعات البيانات ذات الأبعاد الجوهرية العالية و/أو الاستدعاء العالي ، في حين أن القيم المنخفضة M تعمل بشكل أفضل لمجموعات البيانات ذات الأبعاد الداخلية المنخفضة و/أو الاستدعاء المنخفض. تحدد المعلمة أيضًا استهلاك ذاكرة الخوارزميات ، وهو ما يقرب من M * 8-10 بايت لكل عنصر مخزن.
يتحكم EFConstruction في وقت بناء الفهرس والدقة. تؤدي قيم البناء الكبرى الأكبر إلى أوقات بناء أطول ولكن جودة فهرس أفضل. في مرحلة ما ، لا يؤدي زيادة بناء EFC -Bonstruction إلى تحسين جودة الفهرس. للتحقق مما إذا كانت قيمة EFConstruction المحددة مناسبة ، قم بقياس استدعاء Mivers Mistrict Arive عند EFSearch = efconstruction. إذا كان الاستدعاء أقل من 0.9 ، فهناك مجال للتحسين.
عند استخدام HNSWLIB-WASM ، من الضروري اختيار القيم المناسبة لـ M و EFSearch و EFConstruction استنادًا إلى حجم مجموعات البيانات الخاصة بك. نظرًا لأن HNSWLIB-WASM قيد التشغيل في المتصفح ، يجب عليك النظر في قيود الذاكرة والأداء المتاحة. فيما يلي بعض التوصيات:
اختر قيمة في نطاق 12-48 ، حيث تعمل بشكل جيد لمعظم حالات الاستخدام. قد تحتاج إلى تجربة للعثور على القيمة المثلى لمجموعة البيانات المحددة.
ابدأ بقيمة قريبة من M وضبطها بناءً على المفاضلة المطلوبة بين سرعة البحث والدقة. ستكون القيم المنخفضة أسرع ولكنها أقل دقة ، في حين أن القيم الأعلى ستكون أكثر دقة ولكنها أبطأ.
حدد هذه القيمة بالنظر إلى حجم الاستعلام المتوقع. إذا كنت تتوقع انخفاض حجم الاستعلام ، فيمكنك تعيين قيمة أعلى للبناء efconstruction لتحسين الاستدعاء مع الحد الأدنى من التأثير على وقت البحث ، خاصة عند استخدام قيم M أقل.
تذكر أن قيم M الأعلى ستزيد من استخدام ذاكرة الفهرس ، لذلك يجب أن توازن بين قيود الأداء والذاكرة عند اختيار المعلمات الخاصة بك لـ HNSWLIB-WASM.
تعلم HNSW بواسطة Pinecone
فهارس المتجهات بواسطة pinecone
صور من pinecone.io
يتوفر HNSWLIB-WASM كمصدر مفتوح بموجب شروط ترخيص APACHE-2.0.
لبناء
yarn install
make rebuild
yarn build
للاختبار
yarn test
اتصل بـ shravansunder أولاً!