SCANN
مدعومًا بمكتبة ScaNN من Google، تم تصميم فهرس SCANN في Milvus لمعالجة تحديات البحث عن التشابه المتجهي المتدرج، وتحقيق التوازن بين السرعة والدقة، حتى على مجموعات البيانات الكبيرة التي عادةً ما تشكل تحديات لمعظم خوارزميات البحث.
نظرة عامة
تم تصميم ScaNN لحل أحد أكبر التحديات في البحث عن المتجهات: العثور بكفاءة على المتجهات الأكثر صلة في المساحات عالية الأبعاد، حتى مع نمو مجموعات البيانات بشكل أكبر وأكثر تعقيدًا. تقسم بنيتها عملية البحث عن المتجهات إلى مراحل متميزة:
المسح
التقسيم: تقسيم مجموعة البيانات إلى مجموعات. تعمل هذه الطريقة على تضييق مساحة البحث من خلال التركيز فقط على مجموعات البيانات الفرعية ذات الصلة بدلاً من مسح مجموعة البيانات بأكملها، مما يوفر الوقت وموارد المعالجة. غالبًا ما تستخدم شبكة ScaNN خوارزميات التجميع، مثل k-means، لتحديد المجموعات، مما يسمح لها بإجراء عمليات البحث عن التشابه بكفاءة أكبر.
التكميم: تطبق ScaNN عملية تكميم تُعرف باسم التكميم الكمي المتباين الخواص بعد التقسيم. يركز التكميم الكمي التقليدي على تقليل المسافة الكلية بين المتجهات الأصلية والمضغوطة إلى الحد الأدنى، وهو أمر غير مثالي لمهام مثل البحث عن الضرب الداخلي الأقصى (MIPS)، حيث يتم تحديد التشابه من خلال الضرب الداخلي للمتجهات بدلاً من المسافة المباشرة. وبدلاً من ذلك، يعطي التكميم المتباين الأولوية للحفاظ على المكونات المتوازية بين المتجهات، أو الأجزاء الأكثر أهمية لحساب المنتجات الداخلية الدقيقة. يسمح هذا النهج لـ ScaNN بالحفاظ على دقة MIPS عالية من خلال محاذاة المتجهات المضغوطة بعناية مع الاستعلام، مما يتيح عمليات بحث أسرع وأكثر دقة في التشابه.
إعادة الترتيب: مرحلة إعادة الترتيب هي الخطوة النهائية، حيث تقوم ScaNN بضبط نتائج البحث من مرحلتي التقسيم والتكميم. تطبق عملية إعادة الترتيب هذه عمليات حسابية دقيقة للمنتج الداخلي على أفضل المتجهات المرشحة، مما يضمن دقة النتائج النهائية بدقة عالية. تُعد إعادة التصنيف أمرًا بالغ الأهمية في محركات التوصية عالية السرعة أو تطبيقات البحث عن الصور حيث تعمل التصفية الأولية والتجميع كطبقة خشنة، وتضمن المرحلة النهائية إعادة النتائج الأكثر صلة فقط للمستخدم.
يتم التحكم في أداء SCANN من خلال معلمتين رئيسيتين تتيحان لك ضبط التوازن بين السرعة والدقة:
with_raw_data: يتحكم فيما إذا كان يتم تخزين البيانات المتجهة الأصلية إلى جانب التمثيلات الكمية. يؤدي تمكين هذه المعلمة إلى تحسين الدقة أثناء إعادة الترتيب ولكنه يزيد من متطلبات التخزين.reorder_k: يحدد عدد المرشحين الذين يتم تنقيحهم أثناء مرحلة إعادة الترتيب النهائية. تعمل القيم الأعلى على تحسين الدقة ولكنها تزيد من زمن انتقال البحث.
للحصول على إرشادات مفصلة حول تحسين هذه المعلمات لحالة الاستخدام الخاصة بك، راجع بارامترات الفهرس.
إنشاء فهرس
لإنشاء فهرس SCANN على حقل متجه في ميلفوس، استخدم الطريقة 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="SCANN", # 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={
"with_raw_data": True, # Whether to hold raw data
} # Index building params
)
في هذا التكوين
index_type: نوع الفهرس المراد إنشاؤه. في هذا المثال، اضبط القيمة علىSCANN.metric_type: الطريقة المستخدمة لحساب المسافة بين المتجهات. تتضمن القيم المدعومةCOSINEوL2وIP. لمزيد من التفاصيل، راجع أنواع المقاييس.params: : خيارات التكوين الإضافية لبناء الفهرس.with_raw_data: ما إذا كان سيتم تخزين بيانات المتجه الأصلية إلى جانب التمثيل الكمي.
لمعرفة المزيد من معلمات البناء المتوفرة للفهرس
SCANN، راجع بارامترات بناء الفهرس.
بمجرد تكوين معلمات الفهرس، يمكنك إنشاء الفهرس باستخدام الأسلوب create_index() مباشرةً أو تمرير بارامترات الفهرس في الأسلوب create_collection. لمزيد من التفاصيل، راجع إنشاء مجموعة.
البحث في الفهرس
بمجرد إنشاء الفهرس وإدراج الكيانات، يمكنك إجراء عمليات بحث عن التشابه على الفهرس.
search_params = {
"params": {
"reorder_k": 10, # Number of candidates to refine
"nprobe": 8 # Number of clusters to search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field 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: خيارات التكوين الإضافية للبحث على الفهرس.reorder_k: عدد المرشحين المطلوب تنقيحهم أثناء مرحلة إعادة الترتيب.nprobe: عدد المجموعات المطلوب البحث عنها.
لمعرفة المزيد من معلمات البحث المتوفرة للفهرس
SCANN، راجع باراميات البحث الخاصة بالفهرس.
بارامترات الفهرس
يقدم هذا القسم نظرة عامة على المعلمات المستخدمة لبناء الفهرس وإجراء عمليات البحث على الفهرس.
معلمات بناء الفهرس
يسرد الجدول التالي المعلمات التي يمكن تكوينها في params عند إنشاء فهرس.
المعلمة |
الوصف |
نطاق القيمة |
اقتراح الضبط |
|---|---|---|---|
|
عدد وحدات المجموعة |
[1, 65536] |
تزيد القائمة النونية الأعلى من كفاءة التقليم وعادةً ما تسرّع البحث الخشن، لكن يمكن أن تصبح الأقسام صغيرة جدًا، مما قد يقلل من التذكر؛ بينما تقوم القائمة النونية الأقل بمسح مجموعات أكبر، مما يحسن التذكر لكن يبطئ البحث. |
|
ما إذا كان سيتم تخزين بيانات المتجه الأصلية إلى جانب التمثيل الكمي. عند التمكين، يسمح هذا الأمر بإجراء حسابات تشابه أكثر دقة أثناء مرحلة إعادة الترتيب باستخدام المتجهات الأصلية بدلاً من التقديرات التقريبية المكمّمة. |
النوع: منطقية النطاق: القيمة الافتراضية: |
تعيين إلى تم التعيين على موصى به: استخدم |
بارامترات البحث الخاصة بالفهرس
يسرد الجدول التالي المعلمات التي يمكن تكوينها في search_params.params عند البحث في الفهرس.
المعلمة |
الوصف |
نطاق القيمة |
اقتراح الضبط |
|---|---|---|---|
|
تتحكم في عدد المتجهات المرشحة التي يتم تنقيحها أثناء مرحلة إعادة الترتيب. تحدد هذه المعلمة عدد أفضل المتجهات المرشحة من مرحلتي التقسيم والتكميم الأولي التي يتم إعادة تقييمها باستخدام حسابات تشابه أكثر دقة. |
النوع: عدد صحيح المدى: [1، int_max] القيمة الافتراضية: لا يوجد |
يؤدي وجود ضع في اعتبارك زيادة ضع في اعتبارك تقليل في معظم الحالات، نوصيك بتعيين قيمة ضمن هذا النطاق:[الحد، الحد * 5]. |
|
عدد المجموعات للبحث عن المرشحين. |
النوع: عدد صحيح النطاق: [1, nlist] القيمة الافتراضية: |
تسمح القيم الأعلى بالبحث في المزيد من المجموعات، مما يحسن الاستدعاء من خلال توسيع نطاق البحث ولكن على حساب زيادة زمن وصول الاستعلام. قم بتعيين في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [1, nlist]. |