HNSW
فهرس HNSW عبارة عن خوارزمية فهرسة قائمة على الرسم البياني يمكنها تحسين الأداء عند البحث عن المتجهات العائمة عالية الأبعاد. وهي توفر دقة بحث ممتازة وزمن استجابة منخفض، بينما تتطلب ذاكرة عالية للحفاظ على بنية الرسم البياني الهرمي.
نظرة عامة
تُنشئ خوارزمية العالم الصغير القابل للملاحة الهرمي (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]. |