كيفية استخدام مصنف Milvus Boost Ranker للبحث عن المتجهات الواعية للأعمال

  • Tutorials
March 24, 2026
Wei Zang

يصنّف البحث في المتجهات النتائج من خلال تضمين التشابه - كلما اقتربت المتجهات من بعضها البعض، كلما كانت النتيجة أعلى. تضيف بعض الأنظمة أداة إعادة ترتيب قائمة على النموذج (BGE، Voyage، Cohere) لتحسين الترتيب. لكن لا يعالج أي من النهجين متطلبًا أساسيًا في الإنتاج: سياق العمل مهم بقدر أهمية الصلة الدلالية، وأحيانًا أكثر.

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

تعملميزة Boost Ranker، التي تم تقديمها في الإصدار 2.6 من Milvus، على حل هذه المشكلة. فهو يتيح لك تعديل تصنيفات نتائج البحث باستخدام قواعد البيانات الوصفية - دون إعادة بناء الفهرس أو تغيير النموذج. يغطي هذا المقال كيفية عمله، ومتى يتم استخدامه، وكيفية تطبيقه مع التعليمات البرمجية.

ما هو بووست رانكر المعزز؟

بووست رانكر Boost Ranker هي ميزة إعادة ترتيب خفيفة الوزن وقائمة على القواعد في Milvus 2.6.2 والتي تعدل نتائج البحث المتجه باستخدام حقول البيانات الوصفية القياسية. على عكس برامج إعادة الترتيب المستندة إلى النماذج التي تستدعي خدمات LLMs الخارجية أو خدمات التضمين، يعمل Boost Ranker بالكامل داخل Milvus باستخدام قواعد تصفية وترجيح بسيطة. لا توجد تبعيات خارجية، والحد الأدنى من الكمون الزائد - مناسب للاستخدام في الوقت الحقيقي.

يمكنك تكوينه من خلال واجهة برمجة التطبيقات الوظيفية. بعد أن يقوم البحث المتجه بإرجاع مجموعة من المرشحين، يطبق Boost Ranker ثلاث عمليات:

  1. تصفية: تحديد النتائج المطابقة لشروط محددة (على سبيل المثال، is_official == true)
  2. التعزيز: ضرب درجاتهم في وزن تم تكوينه
  3. خلط ورق اللعب: إضافة عامل عشوائي صغير (0-1) اختياريًا لإدخال التنوع

كيف يعمل تحت الغطاء

يعمل Boost Ranker داخل Milvus كخطوة ما بعد المعالجة:

  1. البحث في المتجهات - يقوم كل مقطع بإرجاع المرشحين مع المعرفات ودرجات التشابه والبيانات الوصفية.
  2. تطبيق القواعد - يقوم النظام بتصفية السجلات المطابقة وتعديل درجاتها باستخدام الوزن المكوّن واختياري random_score.
  3. الدمج والفرز - يتم دمج جميع المرشحين وإعادة فرزهم حسب الدرجات المحدّثة للحصول على النتائج النهائية لأعلى K.

نظرًا لأن برنامج Boost Ranker يعمل فقط على المرشحين الذين تم استرجاعهم بالفعل - وليس على مجموعة البيانات الكاملة - فإن التكلفة الحسابية الإضافية لا تُذكر.

متى يجب عليك استخدام بووست رانكر المعزز؟

تعزيز النتائج المهمة

حالة الاستخدام الأكثر شيوعًا: وضع قواعد عمل بسيطة فوق البحث الدلالي.

  • التجارة الإلكترونية: تعزيز المنتجات من المتاجر الرئيسية أو البائعين الرسميين أو العروض الترويجية المدفوعة. ادفع العناصر ذات المبيعات الحديثة العالية أو معدلات النقر إلى أعلى.
  • منصات المحتوى: إعطاء الأولوية للمحتوى المنشور حديثًا عبر حقل publish_time ، أو تعزيز المنشورات من الحسابات التي تم التحقق منها.
  • بحث المؤسسة: إعطاء أولوية أعلى للمستندات حيث doctype == "policy" أو is_canonical == true.

كل ذلك قابل للتكوين باستخدام مرشح + وزن. لا تغييرات في نموذج التضمين ولا إعادة بناء الفهرس.

التخفيض دون إزالة

يمكن لـ Boost Ranker أيضًا خفض الترتيب لنتائج معينة - وهو بديل أكثر ليونة للتصفية الصعبة.

  • المنتجات منخفضة المخزون: إذا كان stock < 10 ، خفض وزنها قليلاً. لا يزال من الممكن العثور عليها، ولكن لن تهيمن على المراكز العليا.
  • المحتوى الحساس: خفض وزن المحتوى الذي تم الإبلاغ عنه بدلاً من إزالته بالكامل. يحد من التعرض دون رقابة صارمة.
  • المستندات القديمة: يتم تصنيف المستندات التي تم الإبلاغ عنها year < 2020 في مرتبة أقل بحيث يظهر المحتوى الأحدث أولاً.

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

إضافة التنوع مع العشوائية المتحكم بها

عندما يكون للعديد من النتائج نتائج متشابهة، يمكن أن تبدو أعلى K متطابقة عبر الاستعلامات. تُدخل معلمة random_score الخاصة بـ Boost Ranker تباينًا طفيفًا:

"random_score": {
  "seed": 126,
  "field": "id"
}
  • seed: يتحكم في العشوائية الشاملة من أجل التكرار
  • field: عادة ما يكون المفتاح الأساسي id ، يضمن حصول نفس السجل على نفس القيمة العشوائية في كل مرة

هذا مفيد لتنويع التوصيات (منع نفس العناصر من الظهور أولًا دائمًا) والاستكشاف (الجمع بين أوزان الأعمال الثابتة مع الاضطرابات العشوائية الصغيرة).

الجمع بين مصنف التعزيز مع مصنفات أخرى

يتم تعيين Boost Ranker عبر واجهة برمجة التطبيقات الوظيفية مع params.reranker = "boost". هناك أمران يجب معرفتهما بشأن الجمع بينه

  • التقييد: في البحث الهجين (متعدد النواقل)، لا يمكن أن يكون Boost Ranker هو المصنف الأعلى مستوى. ولكن يمكن استخدامه داخل كل AnnSearchRequest فردي لضبط النتائج قبل دمجها.
  • التوليفات الشائعة:
    • RRRF + Boo st: استخدام RRF لدمج النتائج متعددة النماذج، ثم تطبيق Boost للضبط الدقيق القائم على البيانات الوصفية.
    • مصنفالنموذج + Boost: استخدم مصنف قائم على النموذج للجودة الدلالية، ثم استخدم Boost لقواعد العمل.

كيفية تكوين مصنف Boost Ranker

يتم تكوين مصنف Boost Ranker من خلال واجهة برمجة التطبيقات الوظيفية. للحصول على منطق أكثر تعقيدًا، ادمجه مع FunctionScore لتطبيق قواعد متعددة معًا.

الحقول المطلوبة

عند إنشاء كائن Function

  • name: أي اسم مخصص
  • input_field_names: يجب أن يكون قائمة فارغة []
  • function_type: يجب أن يكون FunctionType.RERANK
  • params.reranker: يجب أن يكون "boost"

معلمات المفتاح

params.weight (مطلوب)

المضاعف المطبق على درجات السجلات المطابقة. تعتمد كيفية تعيينه على المقياس:

نوع المقياسلتعزيز النتائجلتخفيض النتائج
الأعلى هو الأفضل (COSINE، IP)weight > 1weight < 1
الأدنى هو الأفضل (L2/إقليديوس)weight < 1weight > 1

params.filter (اختياري)

شرط يحدد السجلات التي يتم تعديل درجاتها:

  • "doctype == 'abstract'"
  • "is_premium == true"
  • "views > 1000 and category == 'tech'"

تتأثر السجلات المطابقة فقط. كل شيء آخر يحتفظ بدرجاته الأصلية.

params.random_score (اختياري)

يضيف قيمة عشوائية بين 0 و1 للتنوع. راجع قسم العشوائية أعلاه للحصول على التفاصيل.

قاعدة واحدة مقابل قواعد متعددة

قاعدة واحدة - عندما يكون لديك قيد عمل واحد (على سبيل المثال، تعزيز المستندات الرسمية)، قم بتمرير المصنف مباشرةً إلى search(..., ranker=ranker).

قواعد متعددة - عندما تحتاج إلى عدة قيود (إعطاء الأولوية للعناصر الموجودة في المخزون + تخفيض رتبة المنتجات ذات التصنيف المنخفض + إضافة العشوائية)، قم بإنشاء عدة Function كائنات ودمجها مع FunctionScore. يمكنك تكوين:

  • boost_mode: كيف تتحد كل قاعدة مع النتيجة الأصلية (multiply أو add)
  • function_mode: كيفية دمج قواعد متعددة مع بعضها البعض (multiply أو add)

التدريب العملي: تحديد أولويات الوثائق الرسمية

دعنا نتناول مثالاً ملموسًا: جعل المستندات الرسمية تحتل مرتبة أعلى في نظام البحث عن المستندات.

المخطط

مجموعة تسمى milvus_collection مع هذه الحقول:

الحقلالنوعالغرض
idINT64المفتاح الأساسي
contentVARCHARنص المستند
embeddingمتجه_عائم (3072)متجه دلالي
sourceVARCHARالأصل: "رسمي" أو "مجتمع" أو "تذكرة"
is_officialبوولTrue إذا source == "official"

الحقلان source و is_official هما حقلا البيانات الوصفية التي سيستخدمها Boost Ranker لضبط التصنيفات.

رمز الإعداد

from pymilvus import (
    MilvusClient,
    DataType,
    Function,
    FunctionType,
)

# 1. Connect to Milvus client = MilvusClient(uri=“http://localhost:19530”) collection_name = “milvus_collection”

# If it already exists, drop it first for repeated testing if collection_name in client.list_collections(): client.drop_collection(collection_name)

# 2. Define schema schema = MilvusClient.create_schema( auto_id=False, enable_dynamic_field=False, )

schema.add_field( field_name=“id”, datatype=DataType.INT64, is_primary=True, ) schema.add_field( field_name=“content”, datatype=DataType.VARCHAR, max_length=512, ) schema.add_field( field_name=“source”, datatype=DataType.VARCHAR, max_length=32, ) schema.add_field( field_name=“is_official”, datatype=DataType.BOOL, ) schema.add_field( field_name=“embedding”, datatype=DataType.FLOAT_VECTOR, dim=3072, )

text_embedding_function = Function( name=“openai_embedding”, function_type=FunctionType.TEXTEMBEDDING, input_field_names=[“content”], output_field_names=[“embedding”], params={ “provider”: “openai”, “model_name”: “text-embedding-3-large” } )

schema.add_function(text_embedding_function)

# 3. Create Collection client.create_collection( collection_name=collection_name, schema=schema, )

# 4. Create index index_params = client.prepare_index_params()

index_params.add_index( field_name=“embedding”, index_type=“IVF_FLAT”, metric_type=“COSINE”, params={“nlist”: 16}, )

client.create_index( collection_name=collection_name, index_params=index_params, )

# 5. Load Collection into memory client.load_collection(collection_name=collection_name)

docs = [ { “id”: 1, “content”: "How to deploy Milvus on Kubernetes (Official Guide)", “source”: “official”, “is_official”: True }, { “id”: 2, “content”: "Quick deployment of Milvus with Docker Compose (Official Tutorial)", “source”: “official”, “is_official”: True }, { “id”: 3, “content”: “Community experience: Lessons learned from deploying Milvus”, “source”: “community”, “is_official”: False }, { “id”: 4, “content”: “Ticket record: Milvus deployment issue”, “source”: “ticket”, “is_official”: False }, ]

client.insert( collection_name=collection_name, data=docs, )

مقارنة النتائج: مع وبدون تعزيز التصنيف

أولاً، قم بإجراء بحث أساسي بدون Boost Ranker. ثم قم بإضافة Boost Ranker مع filter: is_official == true و weight: 1.2 ، وقارن.

# 6. Baseline search (without Boost Ranker)
query_vector = "how to deploy milvus"

search_params = { “metric_type”: “COSINE”, “params”: {“nprobe”: 2}, }

results = client.search( collection_name=collection_name, data=[query_vector], anns_field=“embedding”, search_params=search_params, limit=4, output_fields=[“content”, “source”, “is_official”], )

print(“=== Baseline search (no Boost Ranker) ===”) for hit in results[0]: entity = hit[“entity”] print( f"id={hit[‘id’]}, " f"score={hit[‘distance’]:.4f}, " f"source={entity[‘source’]}, " f"is_official={entity[‘is_official’]}" )

# 7. Define Boost Ranker: apply weight to documents where is_official == true boost_official_ranker = Function( name=“boost_official”, input_field_names=[], # Boost Ranker requires this to be an empty list function_type=FunctionType.RERANK, params={ “reranker”: “boost”, # Specify Boost Ranker “filter”: “is_official==true”, # For COSINE / IP (higher score is better), use weight > 1 to boost “weight”: 1.2 }, )

boosted_results = client.search( collection_name=collection_name, data=[query_vector], anns_field=“embedding”, search_params=search_params, limit=4, output_fields=[“content”, “source”, “is_official”], ranker=boost_official_ranker, )

print(“\n=== Search with Boost Ranker (official boosted) ===”) for hit in boosted_results[0]: entity = hit[“entity”] print( f"id={hit[‘id’]}, " f"score={hit[‘distance’]:.4f}, " f"source={entity[‘source’]}, " f"is_official={entity[‘is_official’]}" )

النتائج

=== Baseline search (no Boost Ranker) ===
id=1, score=0.7351, source=official, is_official=True
id=4, score=0.7017, source=ticket, is_official=False
id=3, score=0.6706, source=community, is_official=False
id=2, score=0.6435, source=official, is_official=True

=== Search with Boost Ranker (official boosted) === id=1, score=0.8821, source=official, is_official=True id=2, score=0.7722, source=official, is_official=True id=4, score=0.7017, source=ticket, is_official=False id=3, score=0.6706, source=community, is_official=False

التغيير الرئيسي: قفز المستند id=2 (الرسمي) من المركز الرابع إلى المركز الثاني لأنه تم ضرب نتيجته في 1.2. لم تتم إزالة منشورات المجتمع وسجلات التذاكر - بل تم حذفها فقط في مرتبة أقل. هذا هو الهدف من Boost Ranker: الحفاظ على البحث الدلالي كأساس، ثم وضع قواعد العمل في الأعلى.

الخلاصة

يمنحكBoost Ranker طريقة لإدخال منطق العمل في نتائج البحث المتجه دون المساس بالتضمينات أو إعادة بناء الفهارس. قم بتعزيز المحتوى الرسمي، وخفض رتبة النتائج التي لا معنى لها، وإضافة تنوع محكوم - كل ذلك من خلال تكوين بسيط للمرشح + الوزن في واجهة برمجة تطبيقات Milvus Function.

سواء كنت تنشئ خطوط أنابيب RAG أو أنظمة توصية أو بحث مؤسسي، يساعدك Boost Ranker في سد الفجوة بين ما هو متشابه دلاليًا وما هو مفيد بالفعل لمستخدميك.

إذا كنت تعمل على تصنيف البحث وتريد مناقشة حالة الاستخدام الخاصة بك:


بعض الأسئلة التي تظهر عندما تبدأ الفرق في استخدام Boost Ranker:

هل يمكن لـ Boost Ranker أن يحل محل أداة إعادة التصنيف القائمة على النموذج مثل Cohere أو BGE؟تقوم أدوات إعادة التصنيف القائمة على النموذج بإعادة تصنيف النتائج حسب الجودة الدلالية - فهي جيدة في تحديد "أي مستند يجيب بالفعل على السؤال". بينما يقوم بووست رانكر Boost Ranker بضبط الدرجات حسب قواعد العمل - فهو يقرر "أي مستند ذي صلة يجب أن يظهر أولاً." من الناحية العملية، غالبًا ما تحتاج إلى كليهما معًا: مصنف نموذجي للأهمية الدلالية، ثم مصنف معزز لمنطق الأعمال في الأعلى.

هل يضيف برنامج Boost Ranker وقت استجابة كبير؟لا، فهو يعمل على مجموعة المرشحين التي تم استرجاعها بالفعل (عادةً ما تكون أعلى K من البحث المتجه)، وليس مجموعة البيانات الكاملة. العمليات عبارة عن عمليات تصفية ومضاعفة بسيطة، لذا فإن النفقات العامة لا تُذكر مقارنةً بالبحث المتجه نفسه.

كيف أضبط قيمة الوزن؟ابدأ بتعديلات صغيرة. بالنسبة لتشابه COSINE (الأعلى هو الأفضل)، عادةً ما يكون الوزن من 1.1 إلى 1.3 كافيًا لتحويل التصنيفات بشكل ملحوظ دون تجاوز الصلة الدلالية تمامًا. اختبر ذلك باستخدام بياناتك الفعلية - إذا بدأت النتائج المعززة ذات التشابه المنخفض في الهيمنة، فاخفض الوزن.

هل يمكنني الجمع بين عدة قواعد لتعزيز التصنيف؟نعم. قم بإنشاء عدة كائنات Function ودمجها باستخدام FunctionScore. يمكنك التحكم في كيفية تفاعل القواعد من خلال boost_mode (كيف تتحد كل قاعدة مع النتيجة الأصلية) و function_mode (كيف تتحد القواعد مع بعضها البعض) - كلاهما يدعم multiply و add.

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

    استمر في القراءة