FAISSCompatible with Milvus 3.0.0+
يُعد نوع الفهرس FAISS ميزة تمرير على مستوى الخبراء متوفرة في Milvus 3.0.0 والإصدارات الأحدث. تتيح لك هذه الميزة توفير سلسلة مصنع فهرس Faiss بدلاً من اختيار نوع فهرس Milvus ثابت.
استخدم FAISS إذا كان لديك بالفعل وصفة Faiss تم اختبارها وتحتاج إلى التحكم المباشر في تكوينها. بالنسبة للوصفات الشائعة التي لها نوع فهرس Milvus مخصص، يفضل استخدام النوع المخصص لأنه يتمتع بعقد معلمات مستقر وموثق.
لا يدعم Milvus تلقائيًا سلسلة مصنع الفهرس التي يقبلها Faiss الأصلي. يعتمد التوافق على نوع حقل المتجه، والمقياس، والأبعاد، ووحدات Faiss المُدمجة في صورة Milvus، وما إذا كان الفهرس الناتج يدعم العمليات التي يتطلبها Milvus.
القيود
FAISSيدعم الحقولFLOAT_VECTORوBINARY_VECTOR. ولا يدعم الحقولFLOAT16_VECTORوBFLOAT16_VECTORوINT8_VECTORوSPARSE_FLOAT_VECTOR.يعمل محول
FAISSالعام على وحدة المعالجة المركزية (CPU). وهو ليس نوع فهرس Faiss الخاص بوحدة معالجة الرسومات (GPU).يُعد معلمة البناء
faiss_index_nameإلزامية. يقوم Milvus بتمرير قيمتها إلى Faiss دون تحويل الوصفة إلى نوع فهرس Milvus مخصص.معلمات البناء والبحث خاصة بكل مصنع. قد يرفض مصنع ما معلمة يدعمها مصنع آخر.
يتطلب التصفية القياسية أن يدعم فهرس Faiss الأساسي محدد المعرف (ID selector). تغطي اختبارات Milvus 3.0.0 البحث المُصفى باستخدام مصانع الأرقام العائمة
FlatوIVF64,FlatوHNSW16,Flat. لا تفترض أن كل مصنع يدعم المرشحات أو أن الفهارس الثنائيةFAISSتدعم التصفية القياسية.لا يتم دعم مكررات البحث.
لا يوفر المُهايئ استرجاع المتجهات الأولية.
يعتمد دعم البحث عن النطاق على المصنع. يتمتع Float
Flatبتغطية الإصدار. لا تستخدم البحث عن النطاق مع الفهارس الثنائيةFAISS.يمكن أن يتم إنشاء المصنع بنجاح ولكنه يرفض مع ذلك بعض عمليات البحث في Milvus. على سبيل المثال، يرفض
PQ8x4المستقل المحدد المستخدم في البحث المُصفى سكاليارياً. تحقق من صحة الاستخدام غير المُصفى بشكل منفصل.في Milvus 3.0.0، تحقق من صحة نتائج
COSINEوعتبات البحث عن النطاق بعد إعادة تحميل الفهرس. لا يستعيد Knowhere v3.0.6 حالة تطبيع جيب التمام لمحولFAISSأثناء عملية إزالة التسلسل.
كيفية العمل
سير عمل تمرير فهرس FAISS
لبناء الفهرس، يقوم Milvus بإعادة توجيه faiss_index_name ونوع حقل المتجه والمقياس ومعلمات البناء الأخرى إلى محول Knowhere FAISS. يستدعي المحول faiss::index_factory() لحقول FLOAT_VECTOR أو faiss::index_binary_factory() لحقول BINARY_VECTOR. الكائن الناتج هو فهرس Faiss أصلي تتم إدارته من خلال دورة حياة فهرس Milvus العادية.
بالنسبة للبحث، يقوم المُهايئ بتحويل المعلمات المحددة الخاصة بالمصنع إلى كائن Faiss المطابق SearchParameters. وبالنسبة لمصانع الأرقام العائمة المدعومة، فإنه يمرر أيضًا مجموعة بتات مرشح Milvus كمحدد Faiss. دعم المحدد خاص بالمصنع، ولا تُنشئ الاختبارات التي تم إصدارها تصفية قياسية لمؤشرات FAISS الثنائية. ولهذا السبب يمكن أن تكون الوصفة صالحة في Faiss المستقل ولكنها ترفض عملية مطلوبة من قبل مسار البحث في Milvus.
المتطلبات الأساسية
- Milvus 3.0.0 أو أحدث
- PyMilvus 3.0.0 أو أحدث
- الإلمام بصيغة مصنع الفهرس Faiss ومتطلبات التدريب الخاصة بالمصنع المحدد
للحصول على إرشادات التثبيت، راجع تثبيت PyMilvus.
اختر سلسلة مصنع
تصف سلسلة المصنع فهرس Faiss كسلسلة من المكونات. الأمثلة التالية مشمولة في اختبار إصدار Milvus 3.0.0. هذه القائمة ليست شاملة.
| سلسلة المصنع | نوع الحقل | المقاييس المستخدمة في اختبارات الإصدار | معلمات البحث | ملاحظات |
|---|---|---|---|---|
Flat | FLOAT_VECTOR | L2، IP ، COSINE | لا شيء | البحث الدقيق. |
IVF64,Flat | FLOAT_VECTOR | L2، IP ، COSINE | nprobe | IVF مع 64 قائمة مقلوبة ومتجهات غير مضغوطة. |
HNSW16,Flat | FLOAT_VECTOR | L2، IP ، COSINE | efSearch | رسم بياني HNSW مع تخزين متجهات مسطحة. |
OPQ16,IVF64,PQ16x4 | FLOAT_VECTOR | L2 | خاص بالمصنع | يجمع بين OPQ و IVF و PQ. تحقق من صحة حجم التدريب ومعدل الاسترجاع باستخدام بياناتك. |
IVF64,PQ8x4,RFlat | FLOAT_VECTOR | L2 | nprobe، k_factor | يستخدم مُحسِّنًا مسطحًا بعد استرجاع المرشحين من PQ. |
PQ8x4 | FLOAT_VECTOR | L2 | لا شيء | يتضمن اختبارات الإصدار. يفشل البحث المُصفى بالقيم العددية لأن الفهرس يرفض المُحدد؛ تحقق من الاستخدام غير المُصفى بشكل منفصل. |
BFlat | BINARY_VECTOR | HAMMING | لا شيء | البحث الدقيق عن المتجهات الثنائية. |
تشير إدخالات " COSINE " إلى تغطية اختبارات البناء والبحث الأولية. بالنسبة لـ Milvus 3.0.0، لا تحدد هذه الإدخالات صحة النتيجة أو البحث عن النطاق بعد إعادة تحميل الفهرس. انظر "الحدود".
إنشاء فهرس عائم والبحث فيه
يُنشئ المثال التالي 3,000 متجهًا ذي 128 بُعدًا. ويوفر هذا بيانات تدريب كافية لوصفة « IVF64,Flat » المستخدمة في المثال. قم بتوسيع كتلة الإعداد وتشغيلها قبل إنشاء الفهرس والبحث فيه.
import random
from pymilvus import DataType, MilvusClient
client = MilvusClient(uri="http://localhost:19530")
collection_name = "faiss_float_example"
if client.has_collection(collection_name):
client.drop_collection(collection_name)
rng = random.Random(42)
vectors = [[rng.random() for _ in range(128)] for _ in range(3000)]
schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field("id", DataType.INT64, is_primary=True)
schema.add_field("category", DataType.VARCHAR, max_length=32)
schema.add_field("vector", DataType.FLOAT_VECTOR, dim=128)
client.create_collection(collection_name=collection_name, schema=schema)
rows = [
{
"id": i,
"category": "reference" if i % 2 == 0 else "query",
"vector": vector,
}
for i, vector in enumerate(vectors)
]
client.insert(collection_name=collection_name, data=rows)
client.flush(collection_name=collection_name)
إنشاء الفهرس
اضبط « index_type » على « FAISS »، واستخدم « faiss_index_name » لاختيار الوصفة الأصلية لمصنع Faiss.
index_params = client.prepare_index_params()
index_params.add_index(
field_name="vector",
index_name="faiss_ivf_flat",
index_type="FAISS",
metric_type="L2",
params={"faiss_index_name": "IVF64,Flat"},
)
client.create_index(collection_name=collection_name, index_params=index_params)
client.load_collection(collection_name=collection_name)
تقوم سلسلة المصنع IVF64,Flat بإنشاء فهرس IVF يحتوي على 64 قائمة معكوسة وتخزين المتجهات غير المضغوطة في كل قائمة.
البحث في الفهرس
قم بتعيين معلمات البحث الخاصة بالمصنع داخل search_params.params. بالنسبة لمصنع IVF، يتحكم nprobe في عدد القوائم المقلوبة التي يبحث فيها Faiss.
search_params = {
"params": {"nprobe": 8},
}
results = client.search(
collection_name=collection_name,
data=[vectors[0]],
anns_field="vector",
filter='category == "reference"',
search_params=search_params,
limit=5,
output_fields=["category"],
)
for hits in results:
for hit in hits:
print(hit)
يستخدم الاستعلام nprobe=8 ، لذا يبحث Faiss في 8 قوائم معكوسة من أصل 64. يقصر المرشح النتائج على الكيانات التي تكون قيمة category الخاصة بها هي reference.
إنشاء فهرس ثنائي والبحث فيه
بالنسبة لحقول BINARY_VECTOR ، استخدم سلسلة مصنع ثنائية مثل BFlat ومقياس ثنائي متوافق. قم بتوسيع كتلة الإعداد وتشغيلها قبل إنشاء الفهرس والبحث فيه.
import random
from pymilvus import DataType, MilvusClient
client = MilvusClient(uri="http://localhost:19530")
collection_name = "faiss_binary_example"
if client.has_collection(collection_name):
client.drop_collection(collection_name)
rng = random.Random(7)
vectors = [bytes(rng.getrandbits(8) for _ in range(16)) for _ in range(300)]
schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field("id", DataType.INT64, is_primary=True)
schema.add_field("binary_vector", DataType.BINARY_VECTOR, dim=128)
client.create_collection(collection_name=collection_name, schema=schema)
client.insert(
collection_name=collection_name,
data=[{"id": i, "binary_vector": vector} for i, vector in enumerate(vectors)],
)
client.flush(collection_name=collection_name)
إنشاء الفهرس
استخدم BFlat كسلسلة مصنع و HAMMING كمقياس لهذا المثال الخاص بالمتجهات الثنائية.
index_params = client.prepare_index_params()
index_params.add_index(
field_name="binary_vector",
index_name="faiss_binary_flat",
index_type="FAISS",
metric_type="HAMMING",
params={"faiss_index_name": "BFlat"},
)
client.create_index(collection_name=collection_name, index_params=index_params)
client.load_collection(collection_name=collection_name)
البحث في الفهرس
BFlat لا يحتوي على معلمة بحث خاصة بالعائلة. قم بتمرير تعيين فارغ لـ params عند إنشاء طلب البحث.
search_params = {"params": {}}
results = client.search(
collection_name=collection_name,
data=[vectors[0]],
anns_field="binary_vector",
search_params=search_params,
limit=5,
)
for hits in results:
for hit in hits:
print(hit)
يُمثَّل كل متجه ثنائي ذي 128 بُعدًا بـ 16 بايت. لمزيد من المعلومات، راجع «المتجه الثنائي».
تكوين معلمات الإنشاء والبحث
يحتوي نوع الفهرس FAISS على معلمة إنشاء واحدة مطلوبة للتمرير.
| المعلمة | الموقع | الوصف |
|---|---|---|
faiss_index_name | params في add_index() | سلسلة مصنع الفهرس Faiss. على سبيل المثال، IVF64,Flat. |
قم بتعيين معلمات البحث الخاصة بالمصنع داخل search_params.params. يسرد الجدول التالي أمثلة شائعة، وهو ليس شاملاً.
| المعلمة | مصنع مثال | الوصف |
|---|---|---|
nprobe | IVF64,Flat | عدد القوائم المقلوبة المطلوب البحث فيها. |
efSearch | HNSW16,Flat | حجم قائمة المرشحين للبحث HNSW. |
k_factor | IVF64,PQ8x4,RFlat | عدد المرشحين المقدمين إلى أداة التصفية بالنسبة إلى أفضل K المطلوب. |
يقوم Milvus بإعادة توجيه المعلمات الإضافية التي يتعرف عليها المُهايئ فقط. يتم رفض مفاتيح البناء ومفاتيح البحث غير المعروفة التي لا تدعمها عائلة المصانع المحددة. لا يحتفظ Milvus بمخطط معلمات عام لكل مصنع محتمل. راجع وثائق Faiss الخاصة بالمصنع المحدد، ثم تحقق من صحة تدفق البناء والبحث بالكامل مقابل الإصدار والصورة الدقيقين لـ Milvus اللذين تخطط لنشرهما.
التعامل مع الأخطاء والعمليات غير المدعومة
إذا كانت سلسلة المصنع غير صالحة أو غير متوفرة في بنية Milvus، يفشل إنشاء الفهرس. تحقق من حالة الفهرس وسبب الفشل قبل تحميل المجموعة.
إذا كان نوع المعلمة غير صحيح، يفشل البحث. على سبيل المثال، يتم رفض
nprobe="invalid"لأنnprobeيجب أن يكون رقميًا.إذا كانت إحدى المعلمات لا تنطبق على المصنع الذي تم إنشاؤه، فإن المحول يرفضها باعتبارها غير مدعومة.
إذا كان المصنع لا يدعم محدد Milvus، فقد يفشل البحث المُصفى حتى عندما يكون بإمكان المصنع نفسه البحث في Faiss المستقل.
لا تستخدم
search_iterator()مع فهرسFAISS.
ما هي الخطوة التالية
- تعرف على كيفية تنظيم فهارس Milvus في «شرح الفهرس».
- قارن بين أنواع الفهارس المخصصة IVF_FLAT و HNSW.
- راجع " أنواع المقاييس " قبل اختيار مقياس للمصنع.