🚀 جرب Zilliz Cloud، الـ Milvus المدارة بالكامل، مجاناً — تجربة أداء أسرع بـ 10 أضعاف! جرب الآن>>

milvus-logo
LFAI

بدء استخدام HNSWlib

  • Engineering
November 25, 2024
Haziqa Sajid

يسمحالبحث الدلالي للآلات بفهم اللغة وتحقيق نتائج بحث أفضل، وهو أمر ضروري في الذكاء الاصطناعي وتحليلات البيانات. بمجرد تمثيل اللغة على شكل تضمينات، يمكن إجراء البحث باستخدام طرق دقيقة أو تقريبية. البحث التقريبي لأقرب جار تقريبي(ANN) هو طريقة تُستخدم للعثور بسرعة على النقاط في مجموعة البيانات الأقرب إلى نقطة استعلام معينة، على عكس البحث الدقيق لأقرب جار، والذي يمكن أن يكون مكلفًا حسابيًا للبيانات عالية الأبعاد. تسمح ANN باسترجاع أسرع من خلال توفير نتائج قريبة تقريبًا من أقرب الجيران.

إحدى خوارزميات البحث عن الجار الأقرب التقريبي (ANN) هي HNSW (العوالم الصغيرة القابلة للتنقل الهرمي)، التي يتم تنفيذها ضمن HNSWlib، والتي ستكون محور مناقشة اليوم. في هذه المدونة، سنقوم بـ

  • فهم خوارزمية HNSW.

  • استكشاف HNSWlib وميزاته الرئيسية.

  • إعداد HNSWlib، مع تغطية بناء الفهرس وتنفيذ البحث.

  • مقارنته مع ميلفوس.

فهم HNSW

العوالم الصغيرة القابلة للتنقل الهرمية القابلة للتنقل (HNSW) هي بنية بيانات قائمة على الرسم البياني تسمح بإجراء عمليات بحث فعالة عن التشابه، خاصةً في المساحات عالية الأبعاد، من خلال بناء رسم بياني متعدد الطبقات لشبكات "العوالم الصغيرة". يعالج HNSW، الذي تم تقديمه في عام 2016، مشكلات قابلية التوسع المرتبطة بأساليب البحث التقليدية مثل عمليات البحث القائمة على القوة الغاشمة والبحث القائم على الأشجار. وهو مثالي للتطبيقات التي تتضمن مجموعات بيانات كبيرة، مثل أنظمة التوصيات والتعرف على الصور وتوليد الاسترجاع المعزز (RAG).

سبب أهمية HNSW

يعمل HNSW على تحسين أداء البحث الأقرب من الجوار في المساحات عالية الأبعاد بشكل كبير. فالجمع بين البنية الهرمية وقابلية التنقل في العالم الصغير يتجنب عدم الكفاءة الحسابية للطرق القديمة، مما يمكّنها من الأداء الجيد حتى مع مجموعات البيانات الضخمة والمعقدة. لفهم ذلك بشكل أفضل، دعونا نلقي نظرة على كيفية عملها الآن.

كيف يعمل HNSW

  1. الطبقات الهرمية: ينظّم HNSW البيانات في تسلسل هرمي من الطبقات، حيث تحتوي كل طبقة على عقد متصلة بحواف. تكون الطبقات العليا متناثرة، مما يسمح "بتخطي" واسع عبر الرسم البياني، مثل تصغير الخريطة لرؤية الطرق السريعة الرئيسية فقط بين المدن. تزداد كثافة الطبقات السفلى كثافة، مما يوفر تفاصيل أدق والمزيد من الروابط بين الجيران الأقرب.

  2. مفهوم العوالم الصغيرة القابلة للملاحة: تعتمد كل طبقة في HNSW على مفهوم شبكة "العوالم الصغيرة"، حيث تكون العقد (نقاط البيانات) على بعد بضع "قفزات" فقط من بعضها البعض. وتبدأ خوارزمية البحث من أعلى طبقة متناثرة وتعمل باتجاه الأسفل، وتنتقل إلى طبقات أكثر كثافة بشكل تدريجي لتحسين البحث. ويشبه هذا النهج الانتقال من رؤية شاملة نزولاً إلى التفاصيل على مستوى الجوار، مما يؤدي إلى تضييق منطقة البحث تدريجياً.

الشكل 1: مثال على الرسم البياني للعالم الصغير القابل للتنقل

  1. الهيكل الشبيه بقائمة التخطي: يشبه الجانب الهرمي من HNSW قائمة التخطي، وهي بنية بيانات احتمالية حيث تحتوي الطبقات العليا على عدد أقل من العقد، مما يسمح بإجراء عمليات بحث أولية أسرع.

تين 2: مثال على بنية قائمة التخطي

للبحث عن 96 في قائمة التخطي المحددة، نبدأ من المستوى الأعلى في أقصى اليسار عند عقدة الرأس. بالانتقال إلى اليمين، نواجه 31، أي أقل من 96، لذا نواصل إلى العقدة التالية. والآن، نحتاج إلى الانتقال إلى أسفل مستوى حيث نرى 31 مرة أخرى؛ وبما أنه لا يزال أقل من 96، فإننا ننزل مستوى آخر. نجد 31 مرة أخرى، ثم نتحرك إلى اليمين ونصل إلى 96، وهي القيمة المستهدفة. وهكذا، نحدد موقع 96 دون الحاجة إلى النزول إلى أدنى مستويات قائمة التخطي.

  1. كفاءة البحث: تبدأ خوارزمية HNSW من عقدة دخول في أعلى طبقة، وتتقدم إلى الجيران الأقرب مع كل خطوة. وهي تنزل عبر الطبقات، مستخدمةً كل واحدة منها للاستكشاف الخشن إلى الدقيق، حتى تصل إلى أدنى طبقة حيث من المحتمل أن تكون العقد الأكثر تشابهًا. يقلل هذا التنقل بين الطبقات من عدد العقد والحواف التي يجب استكشافها، مما يجعل البحث سريعًا ودقيقًا.

  2. الإدراج والصيانة: عند إضافة عقدة جديدة، تحدد الخوارزمية طبقة دخولها بناءً على الاحتمالية وتربطها بالعقد القريبة باستخدام إرشادات اختيار الجار. تهدف هذه الاستدلالية إلى تحسين الاتصال، وإنشاء روابط تحسّن إمكانية التنقل مع تحقيق التوازن بين كثافة الرسم البياني. يحافظ هذا النهج على قوة البنية وقابليتها للتكيف مع نقاط البيانات الجديدة.

في حين أن لدينا فهمًا أساسيًا لخوارزمية HNSW، إلا أن تطبيقها من الصفر قد يكون أمرًا صعبًا. لحسن الحظ، قام المجتمع بتطوير مكتبات مثل HNSWlib لتبسيط الاستخدام، مما يجعل الوصول إليها سهلًا دون أن تحك رأسك. لذا، دعونا نلقي نظرة فاحصة على HNSWlib.

نظرة عامة على HNSWlib

HNSWlib، وهي مكتبة شائعة تطبق HNSWlib، وهي مكتبة عالية الكفاءة وقابلة للتطوير، وتعمل بشكل جيد حتى مع ملايين النقاط. وهي تحقق تعقيدًا زمنيًا دون الخطي من خلال السماح بالقفز السريع بين طبقات الرسم البياني وتحسين البحث عن البيانات الكثيفة عالية الأبعاد. فيما يلي الميزات الرئيسية لـ HNSWlib ما يلي:

  • بنية قائمة على الرسم البياني: رسم بياني متعدد الطبقات يمثل نقاط البيانات، مما يسمح بإجراء عمليات بحث سريعة وأقرب إلى الأقرب.

  • كفاءة عالية الأبعاد: مُحسَّن للبيانات عالية الأبعاد، مما يوفر عمليات بحث تقريبية سريعة ودقيقة.

  • وقت بحث شبه خطي: يحقق تعقيدًا شبه خطي من خلال تخطي الطبقات، مما يحسن السرعة بشكل كبير.

  • تحديثات ديناميكية: يدعم إدراج العقد وحذفها في الوقت الفعلي دون الحاجة إلى إعادة بناء رسم بياني كامل.

  • كفاءة الذاكرة: استخدام فعال للذاكرة، مناسب لمجموعات البيانات الكبيرة.

  • قابلية التوسع: يتسع بشكل جيد لملايين نقاط البيانات، مما يجعله مثاليًا للتطبيقات متوسطة الحجم مثل أنظمة التوصيات.

ملاحظة: HNSWlib ممتاز لإنشاء نماذج أولية بسيطة لتطبيقات البحث المتجه. ومع ذلك، نظرًا لقيود قابلية التوسع، قد تكون هناك خيارات أفضل مثل قواعد البيانات المتجهة المصممة لهذا الغرض لسيناريوهات أكثر تعقيدًا تتضمن مئات الملايين أو حتى مليارات نقاط البيانات. دعونا نرى ذلك في العمل.

البدء باستخدام HNSWlib: دليل خطوة بخطوة

سيوضح هذا القسم استخدام HNSWlib كمكتبة بحث متجه من خلال إنشاء فهرس HNSW، وإدراج البيانات، وإجراء عمليات البحث. لنبدأ بالتثبيت:

الإعداد والواردات

لبدء استخدام HNSWlib في Python، قم أولاً بتثبيته باستخدام pip:

pip install hnswlib

ثم، قم باستيراد المكتبات الضرورية:

import hnswlib 
import numpy as np

إعداد البيانات

في هذا المثال، سنستخدم في هذا المثال NumPyلإنشاء مجموعة بيانات عشوائية تحتوي على 10000 عنصر، كل منها بحجم بُعد 256.

dim = 256  # Dimensionality of your vectors
num_elements = 10000  # Number of elements to insert

لننشئ البيانات:

data = np.random.rand(num_elements, dim).astype(np.float32)  # Example data

الآن أصبحت بياناتنا جاهزة، دعنا ننشئ فهرسًا.

بناء فهرس

عند إنشاء فهرس، نحتاج إلى تحديد أبعاد المتجهات ونوع المساحة. لنقم بإنشاء فهرس:

p = hnswlib.Index(space='l2', dim=dim)
  • space='l2': تحدد هذه المعلمة مقياس المسافة المستخدم للتشابه. ضبطه على 'l2' يعني استخدام المسافة الإقليدية (معيار L2). إذا قمت بتعيينه بدلاً من ذلك على 'ip' ، فسيستخدم الضرب الداخلي، وهو أمر مفيد لمهام مثل تشابه جيب التمام.
  • dim=dim: تحدد هذه المعلمة بُعدية نقاط البيانات التي ستعمل معها. يجب أن تتطابق مع بُعد البيانات التي تخطط لإضافتها إلى الفهرس.

إليك كيفية تهيئة الفهرس:

p.init_index(max_elements=num_elements, ef_construction=200, M=16)
  • max_elements=num_elements: يحدّد هذا الحد الأقصى لعدد العناصر التي يمكن إضافتها إلى الفهرس. Num_elements هو السعة القصوى، لذا قمنا بتعيين هذا على 10000 لأننا نعمل مع 10000 نقطة بيانات.
  • ef_construction=200: تتحكم هذه المعلمة في مفاضلة الدقة مقابل سرعة البناء أثناء إنشاء الفهرس. تعمل القيمة الأعلى على تحسين الاستدعاء (الدقة) ولكنها تزيد من استخدام الذاكرة ووقت الإنشاء. تتراوح القيم الشائعة من 100 إلى 200.
  • M=16: تحدد هذه المعلمة عدد الروابط ثنائية الاتجاه التي تم إنشاؤها لكل نقطة بيانات، مما يؤثر على الدقة وسرعة البحث. تتراوح القيم النموذجية بين 12 و48؛ وغالبًا ما تكون 16 قيمة جيدة لتحقيق توازن جيد بين الدقة والسرعة المعتدلة.
p.set_ef(50)  # This parameter controls the speed/accuracy trade-off
  • ef: تحدد المعلمة ef ، وهي اختصار لـ "عامل الاستكشاف"، عدد الجيران الذين يتم فحصهم أثناء البحث. يؤدي ارتفاع قيمة ef إلى استكشاف عدد أكبر من الجيران، مما يزيد بشكل عام من دقة (استرجاع) البحث ولكنه يجعله أبطأ أيضًا. وعلى العكس، يمكن أن تؤدي القيمة الأقل ef إلى البحث بشكل أسرع ولكنها قد تقلل من الدقة.

في هذه الحالة، يعني ضبط ef على 50 أن خوارزمية البحث ستقيّم ما يصل إلى 50 جارًا عند العثور على نقاط البيانات الأكثر تشابهًا.

ملاحظة: ef_construction يضبط جهد البحث عن الجيران أثناء إنشاء الفهرس، مما يعزز الدقة ولكنه يبطئ عملية الإنشاء. ef يتحكم في جهد البحث أثناء الاستعلام، ويوازن بين السرعة والاستدعاء ديناميكيًا لكل استعلام.

إجراء عمليات البحث

لإجراء بحث أقرب جار باستخدام HNSWlib، نقوم أولاً بإنشاء متجه استعلام عشوائي. في هذا المثال، تتطابق أبعاد المتجه مع البيانات المفهرسة.

query_vector = np.random.rand(dim).astype(np.float32)  # Example query

labels, distances = p.knn_query(query_vector, k=5)  # k is the number of nearest neighbors
  • query_vector: ينشئ هذا السطر متجهًا عشوائيًا بنفس أبعاد البيانات المفهرسة، مما يضمن التوافق مع أقرب بحث جار.
  • knn_query: تبحث الطريقة عن k أقرب جيران query_vector داخل الفهرس p. تُرجع مصفوفتين: labels ، والتي تحتوي على مؤشرات أقرب الجيران، و distances ، والتي تشير إلى المسافات من متجه الاستعلام إلى كل من هؤلاء الجيران. هنا، k=5 يحدد أننا نريد العثور على أقرب خمسة جيران.

فيما يلي النتائج بعد طباعة التسميات والمسافات:

print("Nearest neighbors' labels:", labels)
print("Distances:", distances)
> Nearest neighbors' labels: [[4498 1751 5647 4483 2471]]
> Distances: [[33.718    35.484592 35.627766 35.828312 35.91495 ]]

ها هو لدينا، دليل بسيط لبدء استخدام HNSWlib.

كما ذكرنا، HNSWlib هو محرك بحث متجه رائع للنماذج الأولية أو لتجربة مجموعات بيانات متوسطة الحجم. إذا كانت لديك متطلبات قابلية توسع أعلى أو كنت بحاجة إلى ميزات أخرى على مستوى المؤسسة، فقد تحتاج إلى اختيار قاعدة بيانات متجهة مصممة لهذا الغرض مثل قاعدة بيانات المتجهات مفتوحة المصدر Milvus أو خدمتها المدارة بالكامل على Zilliz Cloud. لذا، سنقارن في القسم التالي بين HNSWlib و Milvus.

HNSWlib مقابل قواعد البيانات المتجهة المصممة لغرض معين مثل Milvus

تقوم قاعدة البيانات المتجهة بتخزين البيانات كتمثيلات رياضية، مما يمكّن نماذج التعلم الآلي من تشغيل البحث والتوصيات وتوليد النصوص من خلال تحديد البيانات من خلال مقاييس التشابه لفهم السياق.

تعمل مكتبات مؤشرات المتجهات مثل HNSWlib على تحسينالبحث عن المتجهات واسترجاعها ولكنها تفتقر إلى ميزات الإدارة الخاصة بقاعدة البيانات الكاملة. من ناحية أخرى، تم تصميم قواعد بيانات المتجهات، مثل Milvus، للتعامل مع تضمينات المتجهات على نطاق واسع، مما يوفر مزايا في إدارة البيانات والفهرسة وقدرات الاستعلام التي تفتقر إليها المكتبات المستقلة عادةً. فيما يلي بعض الفوائد الأخرى لاستخدام Milvus:

  • بحث تشابه المتجهات عالي السرعة: يوفر Milvus أداء بحث على مستوى أجزاء من الثانية عبر مجموعات بيانات متجهات بمليار من البيانات، وهو مثالي لتطبيقات مثل استرجاع الصور وأنظمة التوصيات ومعالجة اللغات الطبيعية(NLP) والتوليد المعزز للاسترجاع(RAG).

  • قابلية التوسع والتوافر العالي: صُممت Milvus للتعامل مع أحجام البيانات الضخمة، وهي مصممة للتعامل مع أحجام البيانات الضخمة، وتتوسع أفقياً وتتضمن آليات النسخ المتماثل وتجاوز الفشل من أجل الموثوقية.

  • البنية الموزعة: يستخدم Milvus بنية موزعة وقابلة للتطوير تفصل بين التخزين والحوسبة عبر عقد متعددة لتحقيق المرونة والمتانة.

  • البحث الهجين: يدعم Milvus البحث متعدد الوسائط، والبحث الهجين المتناثر والكثيف، والبحث الهجين الكثيف والبحث بالنص الكامل، مما يوفر وظائف بحث متعددة ومرنة.

  • دعم مرن للبيانات: يدعم Milvus أنواعًا مختلفة من البيانات - المتجهات والمقاييس والبيانات المهيكلة - مما يسمح بإدارة وتحليل سلس داخل نظام واحد.

  • مجتمع ودعمنشط: يوفر مجتمع مزدهر تحديثات ودروسًا تعليمية ودعمًا منتظمًا، مما يضمن بقاء ميلفوس متماشيًا مع احتياجات المستخدم والتقدم في هذا المجال.

  • تكامل الذكاء الاصطناعي: تتكامل Milvus مع العديد من أطر وتقنيات الذكاء الاصطناعي الشائعة، مما يسهل على المطورين بناء التطبيقات باستخدام حزم التقنيات المألوفة لديهم.

توفر Milvus أيضًا خدمة مُدارة بالكامل على Ziliz Cloud، وهي خدمة خالية من المتاعب وأسرع 10 مرات من Milvus.

مقارنة: ميلفوس مقابل HNSWlib

الميزةميلفوسHNSWlib
قابلية التوسعيتعامل مع مليارات المتجهات بكل سهولةمناسب لمجموعات البيانات الصغيرة بسبب استخدام ذاكرة الوصول العشوائي
مثالي لالنماذج الأولية والتجارب والتطبيقات على مستوى المؤسساتيركز على النماذج الأولية ومهام ANN خفيفة الوزن
الفهرسةيدعم أكثر من 10 خوارزميات فهرسة، بما في ذلك HNSW، وDiskANN، والتكميم الكمي، والثنائييستخدم HNSW القائم على الرسم البياني فقط
التكامليقدم واجهات برمجة التطبيقات والخدمات السحابية الأصليةتعمل كمكتبة مستقلة خفيفة الوزن ومستقلة
الأداءيحسِّن البيانات الكبيرة والاستعلامات الموزعةيوفر سرعة عالية ولكن قابلية توسع محدودة

بشكل عام، يُفضَّل استخدام Milvus بشكل عام للتطبيقات واسعة النطاق على مستوى الإنتاج ذات احتياجات الفهرسة المعقدة، بينما تُعد مكتبة HNSWlib مثالية للنماذج الأولية وحالات الاستخدام الأكثر بساطة.

الخلاصة

يمكن أن يكون البحث الدلالي كثيف الاستخدام للموارد، لذا فإن هيكلة البيانات الداخلية، مثل تلك التي يقوم بها HNSW، ضرورية لاسترجاع البيانات بشكل أسرع. تهتم مكتبات مثل HNSWlib بالتنفيذ، بحيث يكون لدى المطورين وصفات جاهزة لوضع نماذج أولية لقدرات المتجهات. مع بضعة أسطر من التعليمات البرمجية، يمكننا بناء الفهرس الخاص بنا وإجراء عمليات البحث.

HNSWlib طريقة رائعة للبدء. ومع ذلك، إذا كنت ترغب في بناء تطبيقات ذكاء اصطناعي معقدة وجاهزة للإنتاج، فإن قواعد بيانات المتجهات المصممة لهذا الغرض هي الخيار الأفضل. على سبيل المثال، Milvus هي قاعدة بيانات متجهة مفتوحة المصدر مع العديد من الميزات الجاهزة للمؤسسات مثل البحث المتجه عالي السرعة وقابلية التوسع والتوافر والمرونة من حيث أنواع البيانات ولغة البرمجة.

للمزيد من القراءة

Like the article? Spread the word

استمر في القراءة