نظرة عامة على مصنف التضاؤلCompatible with Milvus 2.6.x

في البحث المتجه التقليدي، يتم ترتيب النتائج في البحث المتجه التقليدي عن طريق التشابه المتجهي فقط - أي مدى تطابق المتجهات في الفضاء الرياضي. ولكن في تطبيقات العالم الحقيقي، غالباً ما يعتمد ما يجعل المحتوى وثيق الصلة حقاً على أكثر من مجرد التشابه الدلالي.

فكّر في هذه السيناريوهات اليومية:

  • البحث عن الأخبار حيث يجب أن يحتل مقال الأمس مرتبة أعلى من مقال مشابه من ثلاث سنوات مضت

  • أداة البحث عن المطاعم التي تعطي الأولوية للأماكن التي تبعد 5 دقائق عن تلك التي تتطلب 30 دقيقة بالسيارة

  • منصة للتجارة الإلكترونية تعزز المنتجات الشائعة حتى عندما تكون أقل تشابهًا مع استعلام البحث

تشترك جميع هذه السيناريوهات في حاجة مشتركة: موازنة التشابه المتجه مع عوامل رقمية أخرى مثل الوقت أو المسافة أو الشعبية.

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

ملاحظات الاستخدام

  • لا يمكن استخدام ترتيب التضاؤل مع عمليات بحث التجميع.

  • يجب أن يكون الحقل المستخدم لترتيب الاضمحلال رقميًا (INT8 أو INT16 أو INT32 أو INT64 أو FLOAT أو DOUBLE).

  • يمكن لكل مرتبة اضمحلال استخدام حقل رقمي واحد فقط.

  • اتساق الوحدة الزمنية: عند استخدام تصنيف الاضمحلال المستند إلى الوقت، يجب أن تتطابق وحدات المعلمات origin و scale و offset مع الوحدات المستخدمة في بيانات مجموعتك:

    • إذا كانت مجموعتك تخزن الطوابع الزمنية بالثواني، فاستخدم الثواني لجميع المعلمات

    • إذا كانت مجموعتك تخزن الطوابع الزمنية بالمللي ثانية، استخدم المللي ثانية لجميع المعلمات

    • إذا كانت مجموعتك تخزن الطوابع الزمنية بالميكروثانية، فاستخدم الميكروثانية لجميع المعلمات

كيف يعمل

يعمل ترتيب التضاؤل على تحسين البحث المتجه التقليدي من خلال دمج عوامل رقمية مثل الوقت أو المسافة الجغرافية في عملية الترتيب. تتبع العملية بأكملها المراحل التالية:

المرحلة 1: حساب درجات التشابه المعيارية

أولاً، يقوم Milvus بحساب درجات تشابه المتجهات وتطبيعها لضمان اتساق المقارنة:

  • بالنسبة لمقاييس المسافة L2 و JACCARD (حيث تشير القيم المنخفضة إلى تشابه أعلى):

    normalized_score = 1.0 - (2 × arctan(score))/π
    

    يؤدي ذلك إلى تحويل المسافات إلى درجات تشابه بين 0-1، حيث يكون الأعلى أفضل.

  • بالنسبة لمقاييس IP وCOSINE وBM25 (حيث تشير الدرجات الأعلى بالفعل إلى تطابق أفضل): تُستخدم الدرجات مباشرةً دون تطبيع.

المرحلة 2: حساب درجات الاضمحلال

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

  • يقوم كل مصنف اضمحلال بتحويل القيم الرقمية الأولية إلى درجات ملاءمة طبيعية بين 0-1

  • تمثل درجة التضاؤل مدى ملاءمة العنصر بناءً على "المسافة" بينه وبين النقطة المثالية

تختلف معادلة الحساب المحددة بناءً على نوع مصنف التضاؤل. للحصول على تفاصيل حول كيفية حساب درجة التضاؤل، راجع الصفحات المخصصة للتضاؤل الغاوسي، والتضاؤل الأسي، والتضاؤل الخطي.

المرحلة 3: حساب الدرجات النهائية

أخيرًا، يجمع Milvus بين درجة التشابه الطبيعي ودرجة التضاؤل لإنتاج درجة الترتيب النهائية:

final_score = normalized_similarity_score × decay_score

في حالات البحث المختلط (الجمع بين حقول متجهات متعددة)، يأخذ Milvus أقصى درجة تشابه طبيعية بين طلبات البحث:

final_score = max([normalized_score₁, normalized_score₂, ..., normalized_scoreₙ]) × decay_score

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

ترتيب الاضمحلال أثناء العمل

دعونا نرى ترتيب الاضمحلال في سيناريو عملي - البحث عن "أوراق بحثية للذكاء الاصطناعي" مع اضمحلال زمني:

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

الأوراق

متجه التشابه

درجة التشابه المعيارية

تاريخ النشر

درجة الاضمحلال

النتيجة النهائية

الترتيب النهائي

الورقة أ

عالية

0.85 (COSINE)

منذ 2 أسابيع

0.80

0.68

2

الورقة ب

عالية جداً

0.92 (COSINE)

منذ 6 أشهر

0.45

0.41

3

الورق ج

متوسط

0.75 (COSINE)

منذ 1 يوم

0.98

0.74

1

الورقة د

متوسط-عالي

0.76 (COSINE)

منذ 3 أسابيع

0.70

0.53

4

بدون إعادة ترتيب الاضمحلال، ستحتل الورقة (ب) أعلى مرتبة بناءً على التشابه البحت للمتجهات (0.92). ومع ذلك، مع تطبيق إعادة ترتيب الاضمحلال:

  • تقفز الورقة (ج) إلى المركز رقم 1 على الرغم من التشابه المتوسط لأنها حديثة جدًا (نُشرت بالأمس)

  • تنخفض الورقة ب إلى المركز رقم 3 على الرغم من التشابه الممتاز لأنها قديمة نسبيًا

  • تستخدم الورقة D المسافة L2 (حيث يكون الأقل أفضل)، لذلك يتم تطبيع درجتها من 1.2 إلى 0.76 قبل تطبيق التضاؤل

اختر مصنف الاضمحلال الصحيح

يقدم ميلفوس مصنفات اضمحلال متميزة - gauss ، exp ، linear ، وكل منها مصمم لحالات استخدام محددة:

مصنف الاضمحلال

الخصائص

حالات الاستخدام المثالية

مثال على السيناريو

غاوسي (gauss)

انخفاض تدريجي طبيعي الشعور يمتد بشكل معتدل

  • عمليات البحث العامة التي تتطلب نتائج متوازنة

  • التطبيقات التي يكون لدى المستخدمين فيها إحساس بديهي بالمسافة

  • عندما لا ينبغي أن تؤدي المسافة المعتدلة إلى معاقبة النتائج بشدة

في بحث عن مطعم، تظل الأماكن ذات الجودة العالية التي تبعد 3 كم قابلة للاكتشاف، على الرغم من أنها تحتل مرتبة أقل من الخيارات القريبة

أسي (exp)

يتناقص بسرعة في البداية ولكنه يحافظ على ذيل طويل

  • موجز الأخبار حيث يكون التكرار أمرًا بالغ الأهمية

  • وسائل التواصل الاجتماعي حيث يجب أن يهيمن المحتوى الجديد

  • عندما يكون القرب مفضلاً بقوة ولكن يجب أن تظل العناصر البعيدة الاستثنائية مرئية

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

خطي (linear)

الانخفاض المتسق والمتوقع مع وجود حد فاصل واضح

  • التطبيقات ذات الحدود الطبيعية

  • الخدمات ذات حدود المسافة

  • محتوى بتواريخ انتهاء صلاحية أو حدود واضحة

في أداة البحث عن الأحداث، لا تظهر الأحداث التي تتجاوز نافذة مستقبلية لمدة أسبوعين على الإطلاق

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

مثال على التنفيذ

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

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

إنشاء مصنف اضمحلال

لتنفيذ تصنيف الاضمحلال، قم أولاً بتعريف كائن Function بالتكوين المناسب:

from pymilvus import Function, FunctionType

# Create a decay function for timestamp-based decay
# Note: All time parameters must use the same unit as your collection data
decay_ranker = Function(
    name="time_decay",                  # Function identifier
    input_field_names=["timestamp"],    # Numeric field to use for decay
    function_type=FunctionType.RERANK,  # Must be set to RERANK for decay rankers
    params={
        "reranker": "decay",            # Specify decay reranker. Must be "decay"
        "function": "gauss",            # Choose decay function type: "gauss", "exp", or "linear"
        "origin": int(datetime.datetime(2025, 1, 15).timestamp()),    # Reference point (seconds)
        "scale": 7 * 24 * 60 * 60,      # 7 days in seconds (must match collection data unit)
        "offset": 24 * 60 * 60,         # 1 day no-decay zone (must match collection data unit)
        "decay": 0.5                    # Half score at scale distance
    }
)
import io.milvus.v2.service.vector.request.ranker.DecayRanker;

import java.time.ZoneId;
import java.time.ZonedDateTime;

ZonedDateTime zdt = ZonedDateTime.of(2025, 1, 25, 0, 0, 0, 0, ZoneId.systemDefault());

DecayRanker ranker = DecayRanker.builder()
        .name("time_decay")
        .inputFieldNames(Collections.singletonList("timestamp"))
        .function("gauss")
        .origin(zdt.toInstant().toEpochMilli())
        .scale(7 * 24 * 60 * 60)
        .offset(24 * 60 * 60)
        .decay(0.5)
        .build();


import {FunctionType } from "@zilliz/milvus2-sdk-node";

const decayRanker = {
  name: "time_decay",
  input_field_names: ["timestamp"],
  function_type: FunctionType.RERANK,
  params: {
    reranker: "decay",
    function: "gauss",
    origin: new Date(2025, 1, 15).getTime(),
    scale: 7 * 24 * 60 * 60,
    offset: 24 * 60 * 60,
    decay: 0.5,
  },
};

// go
# restful

المعلمة

مطلوب؟

الوصف

القيمة/مثال

name

نعم

معرّف للدالة المستخدمة عند تنفيذ عمليات البحث. اختر اسمًا وصفيًا مناسبًا لحالة الاستخدام الخاصة بك.

"time_decay"

input_field_names

نعم

حقل رقمي لحساب درجة التضاؤل. يحدد سمة البيانات التي سيتم استخدامها لحساب التضاؤل (على سبيل المثال، الطوابع الزمنية للتضاؤل المستند إلى الوقت، والإحداثيات للتضاؤل المستند إلى الموقع).

يجب أن يكون حقلاً في مجموعتك يحتوي على قيم رقمية ذات صلة. يدعم INT8/16/32/64، وFLOAT، وDouble.

["timestamp"]

function_type

نعم

يحدد نوع الدالة التي يتم إنشاؤها.

يجب تعيينها على RERANK لجميع مرتبات الاضمحلال.

FunctionType.RERANK

params.reranker

نعم

يحدد طريقة إعادة الترتيب المراد استخدامها.

يجب تعيينها إلى "decay" لتمكين وظيفة ترتيب الاضمحلال.

"decay"

params.function

نعم

تحديد مصنف التضاؤل الرياضي المطلوب تطبيقه. يحدد شكل المنحنى الخاص بانخفاض الأهمية.

راجع قسم اختيار مصنف التضاؤل الصحيح للحصول على إرشادات حول اختيار الدالة المناسبة.

"gauss" "exp" ، أو "linear"

params.origin

نعم

النقطة المرجعية التي يتم من خلالها حساب درجة التضاؤل. تحصل العناصر عند هذه القيمة على أقصى درجات الملاءمة.

بالنسبة للتضاؤل المستند إلى الوقت، يجب أن تتطابق وحدة الوقت مع بيانات المجموعة الخاصة بك.

  • بالنسبة للطوابع الزمنية: الوقت الحالي (على سبيل المثال، int(time.time()))

  • بالنسبة للموقع الجغرافي: إحداثيات المستخدم الحالية

params.scale

نعم

المسافة أو الوقت الذي تنخفض فيه الصلة إلى القيمة decay. يتحكم في مدى سرعة انخفاض الصلة بالموضوع.

بالنسبة للتضاؤل المستند إلى الوقت، يجب أن تتطابق وحدة الوقت مع بيانات المجموعة الخاصة بك.

تؤدي القيم الأكبر إلى انخفاض تدريجي أكثر في الملاءمة؛ بينما تؤدي القيم الأصغر إلى انخفاض أكثر حدة.

  • للوقت: الفترة بالثواني (على سبيل المثال، 7 * 24 * 60 * 60 لمدة 7 أيام)

  • للمسافة: بالأمتار (على سبيل المثال، 5000 لـ 5 كم)

params.offset

لا يوجد

ينشئ "منطقة عدم اضمحلال" حول origin حيث تحافظ العناصر على الدرجات الكاملة (درجة الاضمحلال = 1.0).

بالنسبة للاضمحلال المستند إلى الوقت، يجب أن تتطابق وحدة الوقت مع بيانات المجموعة الخاصة بك.

تحافظ العناصر داخل هذا النطاق من origin على أقصى قدر من الملاءمة.

  • بالنسبة للوقت: الفترة بالثواني (على سبيل المثال، 24 * 60 * 60 لمدة يوم واحد)

  • للمسافة: بالأمتار (على سبيل المثال، 500 لـ 500 متر)

params.decay

لا يوجد

تتحكم قيمة الدرجة في المسافة scale في انحدار المنحنى. تؤدي القيم المنخفضة إلى إنشاء منحنيات انحدار أكثر حدة؛ بينما تؤدي القيم الأعلى إلى إنشاء منحنيات انحدار أكثر تدرجًا.

يجب أن تكون بين 0 و1.

0.5 (افتراضي)

بعد تحديد مصنف الانحدار، يمكنك تطبيقه أثناء عمليات البحث عن طريق تمريره إلى المعلمة ranker:

# Use the decay function in standard vector search
results = milvus_client.search(
    collection_name,
    data=[your_query_vector], # Replace with your query vector
    anns_field="vector_field",
    limit=10,
    output_fields=["document", "timestamp"],  # Include the decay field in outputs to see values
    ranker=decay_ranker,                      # Apply the decay ranker here
    consistency_level="Strong"
)
import io.milvus.v2.service.vector.request.SearchReq;
import io.milvus.v2.service.vector.response.SearchResp;
import io.milvus.v2.service.vector.request.data.EmbeddedText;

SearchReq searchReq = SearchReq.builder()
        .collectionName(COLLECTION_NAME)
        .data(Collections.singletonList(new EmbeddedText("search query")))
        .annsField("vector_field")
        .limit(10)
        .outputFields(Arrays.asList("document", "timestamp"))
        .functionScore(FunctionScore.builder()
                .addFunction(ranker)
                .build())
        .build();
SearchResp searchResp = client.search(searchReq);
const result = await milvusClient.search({
  collection_name: "collection_name",
  data: [your_query_vector], // Replace with your query vector
  anns_field: "dense",
  limit: 10,
  output_fields: ["document", "timestamp"],
  rerank: ranker,
  consistency_level: "Strong",
});
// go
# restful