HNSW_PQ
تستفيدHNSW_PQ من الرسوم البيانية للعالم الصغير القابل للتنقل الهرمي (HNSW) مع فهرس كمي للمنتج (PQ)، مما يؤدي إلى إنشاء طريقة فهرسة متجهة متقدمة توفر مفاضلة بين الحجم والدقة يمكن التحكم فيها. بالمقارنة مع HNSW_SQ، يوفر هذا النوع من الفهرس معدل استرجاع أعلى بنفس مستوى الضغط، وإن كان ذلك مع سرعة معالجة استعلام أقل ووقت أطول في إنشاء الفهرس.
نظرة عامة
يجمع HNSW_PQ بين تقنيتي فهرسة: HNSW للتنقل السريع القائم على الرسم البياني وPQ لضغط المتجهات بكفاءة.
HNSW
ينشئ HNSW رسمًا بيانيًا متعدد الطبقات حيث تتوافق كل عقدة مع متجه في مجموعة البيانات. في هذا الرسم البياني، ترتبط العُقد في هذا الرسم البياني بناءً على تشابهها، مما يتيح التنقل السريع عبر فضاء البيانات. يسمح الهيكل الهرمي لخوارزمية البحث بتضييق نطاق الجيران المرشحين، مما يسرّع عملية البحث بشكل كبير في المساحات عالية الأبعاد.
لمزيد من المعلومات، راجع HNSW.
PQ
PQ هي تقنية ضغط المتجهات التي تقوم بتقسيم المتجهات عالية الأبعاد إلى متجهات فرعية أصغر، ثم يتم تكميمها وضغطها. يقلل الضغط بشكل كبير من متطلبات الذاكرة ويسرع من عمليات حساب المسافات.
لمزيد من المعلومات، راجع IVF_PQ.
HNSW + PQ
يجمع HNSW_PQ بين نقاط قوة HNSW و PQ لتمكين البحث التقريبي الفعال لأقرب جار. فهي تستخدم PQ لضغط البيانات (وبالتالي تقليل استخدام الذاكرة)، ثم تقوم ببناء رسم بياني HNSW على هذه المتجهات المضغوطة لتمكين الاسترجاع السريع للمرشحين. أثناء البحث، يمكن للخوارزمية اختياريًا تنقيح النتائج المرشحة باستخدام بيانات عالية الدقة لتحسين الدقة. إليك كيفية عمل العملية:
ضغط البيانات: تقوم PQ بتقسيم كل متجه إلى عدة متجهات فرعية وتكميمها باستخدام دفتر رموز من المراكز، يتم التحكم فيه بواسطة معلمات مثل
m(عدد المتجهات الفرعية) وnbits(بت لكل متجه فرعي).بناء الرسم البياني: يتم استخدام المتجهات المضغوطة بعد ذلك لبناء رسم بياني HNSW. نظرًا لأن المتجهات مخزنة في شكل مضغوط، فإن الرسم البياني الناتج عادةً ما يكون أصغر حجمًا، ويتطلب ذاكرة أقل، ويمكن اجتيازه بسرعة أكبر - مما يسرع بشكل كبير من خطوة استرجاع المرشحين.
استرجاع المرشح: عندما يتم تنفيذ استعلام، تستخدم الخوارزمية البيانات المضغوطة في الرسم البياني HNSW لتحديد مجموعة من الجيران المرشحين بكفاءة. يقلل هذا البحث المستند إلى الرسم البياني بشكل كبير من عدد المتجهات التي يجب أخذها في الاعتبار، مما يحسن من زمن الاستجابة للاستعلام مقارنةً بعمليات البحث الغاشمة.
(اختياري) تنقيح النتائج: يمكن تنقيح النتائج الأولية المرشحة للحصول على دقة أفضل، بناءً على المعلمات التالية:
refine: يتحكم فيما إذا كانت خطوة التنقيح هذه مفعلة أم لا. عند ضبطها علىtrue، يقوم النظام بإعادة حساب المسافات باستخدام تمثيلات عالية الدقة أو غير مضغوطة.refine_type: يحدد مستوى دقة البيانات المستخدمة أثناء التنقيح (على سبيل المثال، SQ6 أو SQ8 أو BF16). يمكن أن يؤدي الاختيار ذو الدقة الأعلى مثلFP32إلى نتائج أكثر دقة ولكنه يتطلب المزيد من الذاكرة. يجب أن يتجاوز هذا دقة مجموعة البيانات المضغوطة الأصليةsq_type.refine_k: يعمل كعامل تكبير. على سبيل المثال، إذا كان أعلى k هو 100 وrefine_kهو 2، فإن النظام يعيد ترتيب أفضل 200 مرشح ويعيد أفضل 100 مرشح، مما يعزز الدقة الإجمالية.
للحصول على قائمة كاملة بالمعلمات والقيم الصالحة، راجع بارامز الفهرس.
إنشاء فهرس
لإنشاء فهرس HNSW_PQ على حقل متجه في ميلفوس، استخدم طريقة 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_PQ", # 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": 30, # Maximum number of neighbors each node can connect to in the graph
"efConstruction": 360, # Number of candidate neighbors considered for connection during index construction
"m": 384,
"nbits": 8,
"refine": true, # Whether to enable the refinement step
"refine_type": "SQ8" # Precision level of data used for refinement
} # Index building params
)
في هذا التكوين
index_type: نوع الفهرس المراد إنشاؤه. في هذا المثال، اضبط القيمة علىHNSW_PQ.metric_type: الطريقة المستخدمة لحساب المسافة بين المتجهات. تتضمن القيم المدعومةCOSINEوL2وIP. لمزيد من التفاصيل، راجع أنواع المقاييس.params: خيارات التكوين الإضافية لبناء الفهرس. لمزيد من التفاصيل، راجع بارامترات بناء الفهرس.
بمجرد تكوين معلمات الفهرس، يمكنك إنشاء الفهرس باستخدام الأسلوب create_index() مباشرةً أو تمرير بارامترات الفهرس في الأسلوب create_collection. لمزيد من التفاصيل، راجع إنشاء مجموعة.
البحث في الفهرس
بمجرد إنشاء الفهرس وإدراج الكيانات، يمكنك إجراء عمليات بحث عن التشابه على الفهرس.
search_params = {
"params": {
"ef": 10, # Parameter controlling query time/accuracy trade-off
"refine_k": 1 # The magnification factor
}
}
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=3, # TopK results to return
search_params=search_params
)
في هذا التكوين
params: خيارات تكوين إضافية للبحث على الفهرس. لمزيد من التفاصيل، راجع باراميات البحث الخاصة بالفهرس.
باراميز الفهرس
يقدم هذا القسم نظرة عامة على المعلمات المستخدمة لبناء الفهرس وإجراء عمليات البحث على الفهرس.
معلمات بناء الفهرس
يسرد الجدول التالي المعلمات التي يمكن تكوينها في params عند إنشاء فهرس.
المعلمة |
الوصف |
نطاق القيمة |
اقتراح الضبط |
|
|---|---|---|---|---|
HNSW |
|
الحد الأقصى لعدد الوصلات (أو الحواف) التي يمكن أن تحتويها كل عقدة في الرسم البياني، بما في ذلك الحواف الصادرة والواردة. تؤثر هذه المعلمة بشكل مباشر على كل من بناء الفهرس والبحث. |
النوع: عدد صحيح المدى: [2, 2048] القيمة الافتراضية: |
يؤدي وجود ضع في اعتبارك تقليل في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [5, 100]. |
|
عدد الجيران المرشحين الذين تم أخذهم في الاعتبار للاتصال أثناء إنشاء الفهرس. يتم تقييم مجموعة أكبر من المرشحين لكل عنصر جديد، ولكن يظل الحد الأقصى لعدد الاتصالات التي تم إنشاؤها بالفعل محدودًا بـ |
النوع: عدد صحيح المدى: [1، int_max] القيمة الافتراضية: |
يؤدي ارتفاع فكر في تقليل في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [50, 500]. |
|
PQ |
|
عدد المتجهات الفرعية (المستخدمة في التكميم) لتقسيم كل متجه عالي الأبعاد إلى متجهات عالية الأبعاد أثناء عملية التكميم. |
النوع: عدد صحيح المدى: [1, 65536] القيمة الافتراضية: لا يوجد |
يمكن للقيمة الأعلى في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [D/8، D]. |
|
عدد البتات المستخدمة لتمثيل فهرس مركزية كل متجه فرعي في النموذج المضغوط. وهو يحدد مباشرةً حجم كل دفتر رموز، حيث سيحتوي كل دفتر رموز على 2 بت من النقطتين المركزيتين. على سبيل المثال، إذا تم ضبط |
النوع: عدد صحيح المدى: [1, 24] القيمة الافتراضية: |
تسمح القيمة الأعلى |
|
|
علامة منطقية تتحكم فيما إذا كان يتم تطبيق خطوة تنقية أثناء البحث. تتضمن عملية التنقيح إعادة ترتيب النتائج الأولية عن طريق حساب المسافات الدقيقة بين متجه الاستعلام والمرشحين. |
النوع: نطاق منطقي: [ القيمة الافتراضية: |
اضبط على |
|
|
يحدد دقة البيانات المستخدمة أثناء عملية التنقيح. يجب أن تكون هذه الدقة أعلى من دقة المتجهات المضغوطة (كما تم تعيينها بواسطة المعلمات |
النوع: سلسلة النطاق: [ القيمة الافتراضية: لا يوجد |
استخدم |
بارامترات البحث الخاصة بالفهرس
يسرد الجدول التالي المعلمات التي يمكن تكوينها في search_params.params عند البحث في الفهرس.
المعلمة |
الوصف |
نطاق القيمة |
اقتراح الضبط |
|
|---|---|---|---|---|
HNSW |
|
يتحكم في اتساع نطاق البحث أثناء استرجاع أقرب جار. وهي تحدد عدد العقد التي تتم زيارتها وتقييمها كأقرب جيران محتملين. تؤثر هذه المعلمة على عملية البحث فقط وتطبق حصرياً على الطبقة السفلية من الرسم البياني. |
النوع: عدد صحيح المدى: [1، int_max] القيمة الافتراضية: الحد (أقرب عدد من الجيران الأقرب إلى أقرب جيران للإرجاع) |
يؤدي وجود ضع في اعتبارك تقليل في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [K, 10K]. |
PQ |
|
عامل التكبير الذي يتحكم في عدد المرشحين الإضافيين الذين يتم فحصهم أثناء مرحلة التنقيح (إعادة الترتيب)، بالنسبة لأعلى النتائج K المطلوبة. |
النوع: عائم المدى: [1, float_max) القيمة الافتراضية: 1 |
يمكن أن تؤدي القيم الأعلى ل |