• نبذة عن Milvus
  • ابدأ
  • المفاهيم
  • دليل المستخدم
    • المجموعات
    • المخطط وحقول البيانات
    • إدراج وحذف
    • الفهارس
      • الفهارس المتجهة العائمة
      • مؤشرات المتجهات الثنائية
      • فهارس المتجهات المتفرقة
      • الفهارس القياسية
      • الفهارس المدعومة بوحدة معالجة الرسومات (GPU)
    • بحث
    • استدلال الوظيفة والطراز
    • تحسين التخزين
    • لقطات
  • استيراد البيانات
  • أدوات الذكاء الاصطناعي
  • دليل الإدارة
  • الأدوات
  • عمليات الدمج
  • الدروس التعليمية
  • الأسئلة الشائعة
  • API Reference

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 index passthrough workflow سير عمل تمرير فهرس 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. هذه القائمة ليست شاملة.

سلسلة المصنعنوع الحقلالمقاييس المستخدمة في اختبارات الإصدارمعلمات البحثملاحظات
FlatFLOAT_VECTORL2، IP ، COSINEلا شيءالبحث الدقيق.
IVF64,FlatFLOAT_VECTORL2، IP ، COSINEnprobeIVF مع 64 قائمة مقلوبة ومتجهات غير مضغوطة.
HNSW16,FlatFLOAT_VECTORL2، IP ، COSINEefSearchرسم بياني HNSW مع تخزين متجهات مسطحة.
OPQ16,IVF64,PQ16x4FLOAT_VECTORL2خاص بالمصنعيجمع بين OPQ و IVF و PQ. تحقق من صحة حجم التدريب ومعدل الاسترجاع باستخدام بياناتك.
IVF64,PQ8x4,RFlatFLOAT_VECTORL2nprobe، k_factorيستخدم مُحسِّنًا مسطحًا بعد استرجاع المرشحين من PQ.
PQ8x4FLOAT_VECTORL2لا شيءيتضمن اختبارات الإصدار. يفشل البحث المُصفى بالقيم العددية لأن الفهرس يرفض المُحدد؛ تحقق من الاستخدام غير المُصفى بشكل منفصل.
BFlatBINARY_VECTORHAMMINGلا شيءالبحث الدقيق عن المتجهات الثنائية.

تشير إدخالات " 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_nameparams في add_index()سلسلة مصنع الفهرس Faiss. على سبيل المثال، IVF64,Flat.

قم بتعيين معلمات البحث الخاصة بالمصنع داخل search_params.params. يسرد الجدول التالي أمثلة شائعة، وهو ليس شاملاً.

المعلمةمصنع مثالالوصف
nprobeIVF64,Flatعدد القوائم المقلوبة المطلوب البحث فيها.
efSearchHNSW16,Flatحجم قائمة المرشحين للبحث HNSW.
k_factorIVF64,PQ8x4,RFlatعدد المرشحين المقدمين إلى أداة التصفية بالنسبة إلى أفضل K المطلوب.

يقوم Milvus بإعادة توجيه المعلمات الإضافية التي يتعرف عليها المُهايئ فقط. يتم رفض مفاتيح البناء ومفاتيح البحث غير المعروفة التي لا تدعمها عائلة المصانع المحددة. لا يحتفظ Milvus بمخطط معلمات عام لكل مصنع محتمل. راجع وثائق Faiss الخاصة بالمصنع المحدد، ثم تحقق من صحة تدفق البناء والبحث بالكامل مقابل الإصدار والصورة الدقيقين لـ Milvus اللذين تخطط لنشرهما.

التعامل مع الأخطاء والعمليات غير المدعومة

  • إذا كانت سلسلة المصنع غير صالحة أو غير متوفرة في بنية Milvus، يفشل إنشاء الفهرس. تحقق من حالة الفهرس وسبب الفشل قبل تحميل المجموعة.

  • إذا كان نوع المعلمة غير صحيح، يفشل البحث. على سبيل المثال، يتم رفض nprobe="invalid" لأن nprobe يجب أن يكون رقميًا.

  • إذا كانت إحدى المعلمات لا تنطبق على المصنع الذي تم إنشاؤه، فإن المحول يرفضها باعتبارها غير مدعومة.

  • إذا كان المصنع لا يدعم محدد Milvus، فقد يفشل البحث المُصفى حتى عندما يكون بإمكان المصنع نفسه البحث في Faiss المستقل.

  • لا تستخدم search_iterator() مع فهرس FAISS.

ما هي الخطوة التالية