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

milvus-logo
LFAI
الصفحة الرئيسية
  • دليل المستخدم
  • Home
  • Docs
  • دليل المستخدم

  • الفهارس

  • فهارس المتجهات

  • HNSW

HNSW

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

نظرة عامة

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

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

إليك كيفية عملها

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

HNSW HNSW

يعتمد أداء HNSW على العديد من المعلمات الرئيسية التي تتحكم في كل من بنية الرسم البياني وسلوك البحث. وتشمل هذه المعلمات

  • M: الحد الأقصى لعدد الحواف أو الوصلات التي يمكن أن تمتلكها كل عقدة في الرسم البياني في كل مستوى من مستويات التسلسل الهرمي. يؤدي ارتفاع M إلى رسم بياني أكثر كثافة ويزيد من التذكر والدقة لأن البحث لديه المزيد من المسارات لاستكشافها، وهو ما يستهلك أيضًا المزيد من الذاكرة ويبطئ وقت الإدراج بسبب الاتصالات الإضافية. كما هو موضح في الصورة أعلاه، يشير M = 5 إلى أن كل عقدة في الرسم البياني HNSW متصلة مباشرةً بخمس عقد أخرى كحد أقصى. وهذا يخلق بنية رسم بياني معتدلة الكثافة حيث يكون للعقد مسارات متعددة للوصول إلى العقد الأخرى.
  • efConstruction: عدد المرشحين الذين تم أخذهم في الاعتبار أثناء بناء الفهرس. يؤدي ارتفاع efConstruction عمومًا إلى الحصول على رسم بياني بجودة أفضل ولكنه يتطلب وقتًا أطول للبناء.
  • ef: عدد الجيران الذين يتم تقييمهم أثناء البحث. زيادة ef يحسن من احتمالية العثور على أقرب الجيران ولكنه يبطئ عملية البحث.

للحصول على تفاصيل حول كيفية ضبط هذه الإعدادات لتناسب احتياجاتك، راجع بارامز الفهرس.

إنشاء فهرس

لإنشاء فهرس HNSW على حقل متجه في ميلفوس، استخدم الطريقة add_index() ، مع تحديد index_type و metric_type ومعلمات إضافية للفهرس.

from pymilvus import MilvusClient

# Prepare index building params
index_params = MilvusClient.prepare_index_params()

index_params.add_index(
    field_name="your_vector_field_name", # Name of the vector field to be indexed
    index_type="HNSW", # Type of the index to create
    index_name="vector_index", # Name of the index to create
    metric_type="L2", # Metric type used to measure similarity
    params={
        "M": 64, # Maximum number of neighbors each node can connect to in the graph
        "efConstruction": 100 # Number of candidate neighbors considered for connection during index construction
    } # Index building params
)

في هذا التكوين

  • index_type: نوع الفهرس المراد إنشاؤه. في هذا المثال، اضبط القيمة على HNSW.

  • metric_type: الطريقة المستخدمة لحساب المسافة بين المتجهات. تتضمن القيم المدعومة COSINE و L2 و IP. لمزيد من التفاصيل، راجع أنواع المقاييس.

  • params: : خيارات التكوين الإضافية لبناء الفهرس.

    • M: الحد الأقصى لعدد الجيران الذين يمكن لكل عقدة الاتصال بهم.
    • efConstruction: : عدد الجيران المرشحين للاتصال أثناء بناء الفهرس.

    لمعرفة المزيد من معلمات البناء المتوفرة للفهرس HNSW ، راجع بارامز بناء الفهرس.

بمجرد تكوين معلمات الفهرس، يمكنك إنشاء الفهرس باستخدام الأسلوب create_index() مباشرةً أو تمرير بارامترات الفهرس في الأسلوب create_collection. لمزيد من التفاصيل، راجع إنشاء مجموعة.

البحث في الفهرس

بمجرد إنشاء الفهرس وإدراج الكيانات، يمكنك إجراء عمليات بحث عن التشابه على الفهرس.

search_params = {
    "params": {
        "ef": 10, # Number of neighbors to consider during the search
    }
}

res = MilvusClient.search(
    collection_name="your_collection_name", # Collection name
    data=[[0.1, 0.2, 0.3, 0.4, 0.5]],  # Query vector
    limit=10,  # TopK results to return
    search_params=search_params
)

في هذا التكوين

  • params: خيارات التكوين الإضافية للبحث على الفهرس.

    • ef: عدد الكيانات المجاورة التي يجب أخذها في الاعتبار أثناء البحث.

    لمعرفة المزيد من معلمات البحث المتوفرة للفهرس HNSW ، راجع باراميات البحث الخاصة بالفهرس.

بارامترات الفهرس

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

معلمات بناء الفهرس

يسرد الجدول التالي المعلمات التي يمكن تكوينها في params عند إنشاء فهرس.

المعلمةالوصفنطاق القيمةاقتراح الضبط
Mالحد الأقصى لعدد الاتصالات (أو الحواف) التي يمكن أن تحتويها كل عقدة في الرسم البياني، بما في ذلك الحواف الصادرة والواردة.
تؤثر هذه المعلمة بشكل مباشر على كل من بناء الفهرس والبحث.
النوع: عدد صحيح
المدى: [2, 2048]
القيمة الافتراضية: 30 (حتى 30 حافة صادرة و30 حافة واردة لكل عقدة)
يؤدي وجود M أكبر بشكل عام إلى دقة أعلى ولكنه يزيد من عبء الذاكرة ويبطئ بناء الفهرس والبحث.
ضع في اعتبارك زيادة M لمجموعات البيانات ذات الأبعاد العالية أو عندما يكون الاستدعاء العالي أمرًا بالغ الأهمية.
ضع في اعتبارك تقليل M عندما يكون استخدام الذاكرة وسرعة البحث من الاهتمامات الأساسية.
في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [5, 100].
efConstructionعدد الجيران المرشحين الذين تم أخذهم في الاعتبار أثناء إنشاء الفهرس.
يتم تقييم مجموعة أكبر من المرشحين لكل عنصر جديد، ولكن لا يزال الحد الأقصى لعدد الاتصالات التي تم إنشاؤها بالفعل محدودًا بـ M.
النوع: عدد صحيح
المدى: [1، int_max]
القيمة الافتراضية: 360
يؤدي ارتفاع efConstruction عادةً إلى فهرس أكثر دقة، حيث يتم استكشاف المزيد من الاتصالات المحتملة. ومع ذلك، يؤدي هذا أيضًا إلى وقت فهرسة أطول وزيادة استخدام الذاكرة أثناء الإنشاء.
ضع في اعتبارك زيادة efConstruction لتحسين الدقة، خاصة في السيناريوهات التي يكون فيها وقت الفهرسة أقل أهمية.
فكر في تقليل efConstruction لتسريع بناء الفهرس عندما تكون قيود الموارد مصدر قلق.
في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [50, 500].

بارامترات البحث الخاصة بالفهرس

يسرد الجدول التالي المعلمات التي يمكن تكوينها في search_params.params عند البحث في الفهرس.

المعلمةالوصفنطاق القيمةضبط الاقتراح
efيتحكم في اتساع نطاق البحث أثناء استرجاع أقرب جار. تحدد عدد العقد التي تتم زيارتها وتقييمها كأقرب جيران محتملين. تؤثر هذه المعلمة على عملية البحث فقط وتطبق حصرياً على الطبقة السفلية من الرسم البياني.النوع: عدد صحيح
المدى: [1، int_max]
القيمة الافتراضية: الحد (أقرب عدد من الجيران الأقرب للإرجاع)
يؤدي وجود ef أكبر بشكل عام إلى دقة بحث أعلى حيث يتم النظر في المزيد من الجيران المحتملين. ومع ذلك، يؤدي ذلك أيضًا إلى زيادة وقت البحث.
ضع في اعتبارك زيادة ef عندما يكون تحقيق الاستدعاء العالي أمرًا بالغ الأهمية وتكون سرعة البحث أقل أهمية.
ضع في اعتبارك تقليل ef لإعطاء الأولوية لعمليات البحث الأسرع، خاصةً في السيناريوهات التي يكون فيها الانخفاض الطفيف في الدقة مقبولاً.
في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [K, 10K].

جرب Managed Milvus مجاناً

Zilliz Cloud خالي من المتاعب، ويعمل بواسطة Milvus ويعمل بسرعة 10 أضعاف.

ابدأ
التعليقات

هل كانت هذه الصفحة مفيدة؟