أداء البحث عن التشابه بين النواقص

يقدم هذا الموضوع كيفية استخدام Milvus للبحث عن الكيانات.

في Milvus ، يقوم البحث عن التشابه النمطي بحساب المسافة بين ناقل الاستعلام والنواقص في المجموعة (باستخدام قياس تشابه محدد) ويُرجع النتائج الأكثر تشابهًا. يمكنك تنفيذ بحث مختلط عن طريق تحديد تعبير بولياني لتصفية الحقول المقيمة أو المفتاح الأساسي.

يوضح المثال التالي كيفية أداء البحث عن التشابه النمطي على مجموعة بيانات تحتوي على 2000 صف من البيانات، بما في ذلك ID الكتاب (المفتاح الرئيسي)، وعدد الكلمات (حقل مقيم)، وملخص الكتاب (حقل نواقص)، لمحاكاة البحث عن الكتب الخاصة بناءً على وصفها المتجهي. ستعيد Milvus النتائج الأكثر تشابهًا استنادًا إلى ناقل الاستعلام ومعلمات البحث التي تحددها.

تحميل المجموعة

يتم تنفيذ جميع عمليات البحث والاستعلام داخل Milvus في الذاكرة. قبل أداء البحث عن التشابه النمطي، قم بتحميل المجموعة في الذاكرة.

from pymilvus import Collection
collection = Collection("book")      # الحصول على المجموعة الحالية.
collection.load()

تحضير معلمات البحث

قم بتحضير المعلمات المقابلة لسيناريو البحث الخاص بك. يحدد المثال التالي المعلمات التي ستستخدمها البحث لحساب المسافة باستخدام المسافة الأوروبية واسترجاع النواقص من العشرة مجموعات الأقرب التي تم إنشاؤها بواسطة فهرس IVF_FLAT.

search_params = {
    "metric_type": "L2",
    "offset": 5,
    "ignore_growing": False,
    "params": {"nprobe": 10}
}
المعلمة الوصف
metric_type الأسلوب المستخدم لقياس المسافة بين النواقص أثناء البحث. يجب أن يكون نفس الأسلوب المحدد أثناء عملية بناء الفهرس. راجع مقاييس التشابه لمزيد من المعلومات.
offset عدد الكيانات لتخطيها أثناء البحث. يجب أن يكون مجموع هذا القيمة وقيمة الحد الأقصى لأسلوب البحث أقل من 16384. على سبيل المثال، إذا كنت ترغب في استعلام الجيران الأقرب التاسع والعاشر لناقل البحث، فقم بتعيين القيمة الحد الأقصى إلى 2 و الصدمة إلى 8.
ignore_growing ما إذا كان سيتجاهل الأقسام المتنامية أثناء البحث عن التشابه. القيمة الافتراضية هي False، مما يشير إلى أن البحث يتضمن الأقسام المتنامية.
params معلمات البحث الخاصة بنوع الفهرس المحدد. راجع فهرس النواقص لمزيد من المعلومات. الخيارات الممكنة تشمل: - nprobe يشير إلى عدد وحدات التجميع للبحث. تكون هذه المعلمة متاحة فقط عند تعيين نوع الفهرس إلى IVF_FLAT، IVF_SQ8، أو IVF_PQ. يجب أن تكون القيمة أقل من قيمة nlist المحددة أثناء عملية بناء الفهرس. - ef يشير إلى نطاق البحث. تكون هذه المعلمة متاحة فقط عند تعيين نوع الفهرس إلى HNSW. يجب أن تكون القيمة بين أفضل_k و 32768. - نصف القطر يشير إلى الزاوية التي يوجد فيها النواقص مع التشابه الأقل. - مرشح_النطاق يشير إلى المرشح المستخدم لتصفية قيم حقل النواقص التي يقع تشابهها مع ناقل البحث ضمن نطاق محدد.

البحث عن النَّاقل الصِّفَائي

استخدم Milvus للبحث عن النَّاقل الصِّفَائي. للبحث ضمن قسم محدد، قُم بتحديد قائمة بأسماء الأقسام.

يدعم Milvus ضبط مستوى الاتساق لعمليات البحث. يُضبط المثال في هذا الموضوع مستوى الاتساق إلى "قوي". يُمكنك أيضًا ضبط مستوى الاتساق على "محدود", "جلسة" أو "في النهاية". لمزيد من المعلومات حول الأمان في Milvus، انظر الأمان.

results = collection.search(
    data=[[0.1, 0.2]], 
    anns_field="book_intro", 
    param=search_params,
    limit=10,
    expr=None,
    output_fields=['title'],
    consistency_level="Strong"
)

results[0].ids

results[0].distances

hit = results[0][0]
hit.entity.get('title')
المعلمة الوصف
data النَّوافذ المستخدمة للبحث.
anns_field اسم الحقل الذي سيتم البحث فيه.
param معلمات البحث الخاصة بالفهرس. لمزيد من المعلومات، انظر فهرس النَّوافذ.
limit عدد النتائج المسترجعة. يجب أن يكون هذا القيمة، بالإضافة إلى offset في param، أقل من ١٦،٣٨٤.
expr تعبير منطقي لتصفية الخصائص. لمزيد من المعلومات، انظر قواعد التعبيرات البولية.
output_fields (اختياري) أسماء الحقول المراد استردادها. لا تُدعم حقول النَّوافذ في الوقت الحالي.
consistency_level (اختياري) مستوى الاتساق للبحث.

تحقق من القيم الرئيسية والمسافات للنَّوافذ الأشبه.

results[0].ids
results[0].distances

بمجرد اكتمال البحث، قم بإفراج عن المجموعة المحمّلة في Milvus لتقليل استهلاك الذاكرة.

collection.release()

القيود

الميزة الحد الأقصى
طول اسم المجموعة ٢٥٥ حرفًا
عدد الأقسام في مجموعة ٤،٠٩٦
عدد الحقول في مجموعة ٢٥٦
عدد الأضلع في مجموعة ٢٥٦
بُعد النَّاقل ٣٢،٧٦٨
أعلى كيه ١٦،٣٨٤
النَّوافذ الدُّخلية ١٦،٣٨٤

البحث المختلط

البحث المختلط هو أساسا بحث ناقلي يتم تصفيته بواسطة السمات. من خلال تحديد تعبير منطقي يُستخدم لتصفية الحقول الهادئة أو حقول المفتاح الأساسي، يُمكن تقييد البحث في ظروف معينة.

يُظهر المثال التالي كيفية القيام بالبحث المختلط استنادًا إلى البحث الناقلي العادي. فلنقل أنك ترغب في البحث عن كتب معينة استنادًا إلى ملخصات ناقلة، لكنك ترغب فقط في البحث ضمن نطاق معين لعدد الكلمات. بعد ذلك، يُمكنك تحديد تعبير منطقي في معلمات البحث لتصفية حقل ال عدد الكلمات. ستقوم Milvus بالبحث فقط عن النوافذ المتشابهة ضمن الكيانات التي تتطابق مع التعبير.

من خلال تحديد تعبير منطقي، يُمكنك تصفية الحقول الهادئة للكيانات أثناء البحث الناقلي. يُحدد المثال التالي نطاق البحث إلى النوافذ ضمن قيمة عدد الكلمات المحددة.

يُمكنك أيضًا استخدام الحقول الديناميكية في تعبير الفلترة واستخدام حقول الإخراج في طلب البحث. على سبيل المثال، انظر إلى النمط الديناميكي.

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}, "offset": 0},
  "limit": 10,
  "expr": "word_count <= 11000",
}
res = collection.search(**search_param)

تحقق من النتائج المرجعة.

assert len(res) == 1
hits = res[0]
assert len(hits) == 2
print(f"- إجمالي النتاج: {len(hits)}, معرفات النتائج: {hits.ids} ")
print(f"- أعلى معرف للنتاج: {hits[0].id}, المسافة: {hits[0].distance}, النقاط: {hits[0].score} ")

البحث الناقلي بالنطاق

البحث بالنطاق هو طريقة لتصفية نتائج البحث استنادًا إلى المسافة بين ناقل الاستعلام وقيم حقول الناقل. يُمكن استخدام مقاييس المسافة المختلفة لقياس المسافة.

عند قيام البحث بالنطاق، يقوم Milvus أولاً بتنفيذ بحث تشابه الناقل. ثم، ينفذ تصفية الناقل استنادًا إلى الشروط المسافة المحددة ويرجع النوافذ التي تقع مسافتها ضمن نطاق معين.

يُظهر المثال التالي كيفية القيام بالبحث بالنطاق استنادًا إلى البحث الناقل العادي.

تحميل المجموعة

تُنفَّذ جميع عمليات البحث والاستعلام في Milvus في الذاكرة. قبل القيام ببحث التشابه الناقل، يحتاج تحميل المجموعة في الذاكرة.

from pymilvus import Collection
collection = Collection("book")      # احصل على مجموعة موجودة
collection.load()

ضبط مدى تصفية الفيكتورات

في المقارنة مع البحث العادي عن الفيكتورات، يتحكم البحث في المدى في Milvus من خلال إدخال معلمتين جديدتين، radius و range_filter، للحصول على النتائج المطلوبة ضمن نطاق بحث معين.

المعلمة radius تحدد الزاوية الدنيا التي يُعتبر فيها الفيكتورات متشابهة. يمكن استخدام معلمة اختيارية range_filter بالتزامن مع radius لتصفية قيم حقل الفيكتورات استنادًا إلى التشابه مع الفيكتور الاستعلام ضمن نطاق محدد. تمتلك كلٌ من المعلمتين radius و range_filter نوع بيانات FLOAT. تُعمل ضبط هاتين المعلمتين بشكل فعّال على تحقيق توازن بين دقة البحث وكفاءته.

عادةً ما يُقاس التشابه عن طريق المسافة بين قيمة حقل الفيكتور والفيكتور الاستعلام. سيؤثر اختيار مقاييس المسافة المختلفة بشكل كبير على ضبط radius و range_filter.

على سبيل المثال، في حالة مسافة L2، يجب تصفية نتائج البحث استنادًا إلى قيم حقل الفيكتورات بمسافة أقل من radius. يحدث هذا لأنه في مسافة L2، المسافات الأقل تدل على تشابه أكبر. ومن خلال هذه المعرفة، إذا كنت تريد تصفية بعض من أكثر الفيكتورات مشابهة، يمكنك تحديد قيمة فعّالة لـ range_filter تكون أقل من radius.

search_params = {
    "metric_type": "L2",
    "params": {
        "radius": 10.0,
        "range_filter" : 5.0
    }
}

في حالة المسافة IP، السيناريو مختلف. مع مسافة IP، تدل المسافة الأكبر على تشابه أكبر. لذلك، على عكس مسافة L2، قيم radius و range_filter في مسافة IP متناقضة. بمعنى آخر، عند استخدام range_filter لتصفية بعض من الفيكتورات الأكثر تشابهًا استنادًا إلى مسافة IP، يجب أن تكون قيمة فعّالة لـ range_filter أكبر من radius، ويجب أن تكون مسافة الفيكتورات الناتجة أكبر من radius ولكن تقل عن أو تساوي range_filter.

search_params = {
    "metric_type": "IP",
    "params": {
        "radius": 0.8,
        "range_filter" : 1.0
    }
}

القيام ببحث بالنطاق

من خلال تحديد radius و range_filter استنادًا إلى نوع قياس المسافة، يمكنك تعريف نطاق الفيكتورات النتائج التي سيتم إرجاعها.

القيام ببحث بالنطاق عن التشابه ضمن النطاق من 5.0 إلى 10.0 استنادًا إلى مسافة L2:

search_param = {
  "data": [[0.1, 0.2]], # الفيكتور الاستعلام
  "anns_field": "book_intro", # الحقل الذي سيتم البحث فيه
  "param": { "metric_type": "L2", "params": { "nprobe": 10, "radius": 10.0, "range_filter" : 5.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # الحقول التي سيتم إرجاعها
}

res = collection.search(**search_param)

القيام ببحث بالنطاق عن التشابه ضمن النطاق من 1.0 إلى 0.8 استنادًا إلى مسافة IP:

search_param = {
  "data": [[0.1, 0.2]], # الفيكتور الاستعلام
  "anns_field": "book_intro", # الحقل الذي سيتم البحث فيه
  "param": {"metric_type": "IP", "params": { "nprobe": 10, "radius": 0.8, "range_filter" : 1.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # الحقول التي سيتم إرجاعها
}

res = collection.search(**search_param)

الختام

في Milvus، يمكن للبحث في النطاق إرجاع نتائج فيكتورات متشابهة ضمن النطاق المحدد للمسافة. يتم تفعيل هذه الوظيفة من خلال تحديد radius و range_filter في معلمات البحث. يلخص الجدول أدناه ضبط هاتين المعلمتين لأنواع قياس المسافة المختلفة.

نوع قياس المسافة الضبط
L2 ومسافات أخرى range_filter <= المسافة < radius
مسافة IP والكوسين radius < المسافة <= range_filter