IVF_FLAT
إن فهرس IVF_FLAT هو خوارزمية فهرسة يمكنها تحسين أداء البحث لمتجهات الفاصلة العائمة.
يعد هذا النوع من الفهرس مثاليًا لمجموعات البيانات واسعة النطاق التي تتطلب استجابات سريعة للاستعلام ودقة عالية، خاصةً عندما يمكن أن يؤدي تجميع مجموعة البيانات الخاصة بك إلى تقليل مساحة البحث وتوفر ذاكرة كافية لتخزين بيانات المجموعة.
نظرة عامة
يرمز المصطلح IVF_FLAT إلى الملف المقلوب المسطح (Inverted File Flat)، والذي يغلف النهج ثنائي الطبقات للفهرسة والبحث عن متجهات الفاصلة العائمة:
- الملف المقلوب (IVF): يشير إلى تجميع مساحة المتجه إلى مناطق يمكن التحكم فيها باستخدام تجميع k-means. يتم تمثيل كل مجموعة بنقطة مركزية تعمل كنقطة مرجعية للمتجهات داخلها.
- مسطح: يشير إلى أنه داخل كل مجموعة، يتم تخزين المتجهات في شكلها الأصلي (بنية مسطحة)، دون أي ضغط أو تكميم، لإجراء حسابات دقيقة للمسافات.
يوضّح الشكل التالي كيفية عملها:
ivf-flat-1 .png
تعمل طريقة الفهرسة هذه على تسريع عملية البحث، ولكنها تأتي مع عيب محتمل: قد لا يكون المرشح الذي تم العثور عليه كأقرب تضمين للاستعلام هو الأقرب بالضبط. يمكن أن يحدث هذا إذا كان أقرب تضمين إلى تضمين الاستعلام موجودًا في مجموعة مختلفة عن المجموعة المختارة بناءً على أقرب نقطة مركزية (انظر التصور أدناه).
ولمعالجة هذه المشكلة، يوفر IVF_FLAT معيارين فائقين يمكننا ضبطهما:
nlist
: تحديد عدد الأقسام المراد إنشاؤها باستخدام خوارزمية k-means.nprobe
: يحدد عدد الأقسام التي يجب أخذها في الاعتبار أثناء البحث عن المرشحين.
الآن إذا قمنا بتعيين nprobe
إلى 3 بدلاً من 1، نحصل على النتيجة التالية:
ivf-flat-2 .png
من خلال زيادة القيمة nprobe
، يمكنك تضمين المزيد من الأقسام في البحث، مما قد يساعد في ضمان عدم تفويت أقرب تضمين للاستعلام، حتى لو كان موجودًا في قسم مختلف. ومع ذلك، فإن هذا يأتي على حساب زيادة وقت البحث، حيث يجب تقييم المزيد من المرشحين. لمزيد من المعلومات حول ضبط معلمات الفهرس، راجع بارامز الفهرس.
إنشاء فهرس
لإنشاء فهرس IVF_FLAT
على حقل متجه في ميلفوس، استخدم الطريقة 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="IVF_FLAT", # 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={
"nlist": 64, # Number of clusters for the index
} # Index building params
)
في هذا التكوين
index_type
: نوع الفهرس المراد إنشاؤه. في هذا المثال، اضبط القيمة علىIVF_FLAT
.metric_type
: الطريقة المستخدمة لحساب المسافة بين المتجهات. تتضمن القيم المدعومةCOSINE
وL2
وIP
. لمزيد من التفاصيل، راجع أنواع المقاييس.params
: : خيارات التكوين الإضافية لبناء الفهرس.nlist
: عدد المجموعات لتقسيم مجموعة البيانات.
لمعرفة المزيد من معلمات البناء المتوفرة للفهرس
IVF_FLAT
، راجع بارامز بناء الفهرس.
بمجرد تكوين معلمات الفهرس، يمكنك إنشاء الفهرس باستخدام الأسلوب create_index()
مباشرةً أو تمرير بارامترات الفهرس في الأسلوب create_collection
. لمزيد من التفاصيل، راجع إنشاء مجموعة.
البحث في الفهرس
بمجرد إنشاء الفهرس وإدراج الكيانات، يمكنك إجراء عمليات بحث عن التشابه على الفهرس.
search_params = {
"params": {
"nprobe": 10, # Number of clusters to 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=3, # TopK results to return
search_params=search_params
)
في هذا التكوين
params
: خيارات التكوين الإضافية للبحث على الفهرس.nprobe
: عدد المجموعات المطلوب البحث عنها.
لمعرفة المزيد من معلمات البحث المتوفرة للفهرس
IVF_FLAT
، راجع باراميات البحث الخاصة بالفهرس.
بارامترات الفهرس
يقدم هذا القسم نظرة عامة على المعلمات المستخدمة لبناء الفهرس وإجراء عمليات البحث على الفهرس.
معلمات بناء الفهرس
يسرد الجدول التالي المعلمات التي يمكن تكوينها في params
عند إنشاء فهرس.
المعلمة | الوصف | نطاق القيمة | اقتراح الضبط |
---|---|---|---|
nlist | عدد العناقيد المراد إنشاؤها باستخدام خوارزمية k-means أثناء بناء الفهرس، حيث تخزن كل عنقود، ممثلة بنقطة مركزية، قائمة من المتجهات. تؤدي زيادة هذه المعلمة إلى تقليل عدد المتجهات في كل مجموعة، مما يؤدي إلى إنشاء أقسام أصغر وأكثر تركيزًا. | النوع: عدد صحيح المدى: [1, 65536] القيمة الافتراضية: 128 | تعمل القيم الأكبر nlist على تحسين الاستدعاء من خلال إنشاء مجموعات أكثر دقة ولكنها تزيد من وقت بناء الفهرس. قم بالتحسين بناءً على حجم مجموعة البيانات والموارد المتاحة، وفي معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [32, 4096]. |
بارامترات البحث الخاصة بالفهرس
يسرد الجدول التالي المعلمات التي يمكن تكوينها في search_params.params
عند البحث في الفهرس.
المعلمة | الوصف | نطاق القيمة | اقتراح الضبط |
---|---|---|---|
nprobe | عدد المجموعات للبحث عن المرشحين، تسمح القيم الأعلى بالبحث عن المزيد من المجموعات، مما يحسن الاستدعاء من خلال توسيع نطاق البحث ولكن على حساب زيادة زمن انتقال الاستعلام. | النوع: عدد صحيح المدى: [1, nlist] القيمة الافتراضية: 8 | تؤدي زيادة هذه القيمة إلى تحسين الاستدعاء ولكنها قد تؤدي إلى إبطاء البحث.قم بتعيين nprobe بشكل متناسب مع nlist لتحقيق التوازن بين السرعة والدقة.في معظم الحالات، نوصي بتعيين قيمة ضمن هذا النطاق: [1, nlist]. |