الاضمحلال الخطيCompatible with Milvus 2.6.x
ينشئ التضاؤل الخطي خطًا مستقيمًا ينتهى عند نقطة الصفر المطلق في نتائج بحثك. على غرار العد التنازلي للحدث القادم حيث تتلاشى الأهمية تدريجيًا حتى انقضاء الحدث، يطبق التضاؤل الخطي انخفاضًا ثابتًا ومتوقعًا في الأهمية مع ابتعاد العناصر عن النقطة المثالية حتى تختفي تمامًا. يُعد هذا الأسلوب مثاليًا عندما تريد معدل اضمحلال ثابت مع حد فاصل واضح، مما يضمن استبعاد العناصر التي تتجاوز حدًا معينًا تمامًا من النتائج.
على عكس دوال الاضمحلال الأخرى:
يتبع الاضمحلال الغاوسي منحنى جرس يقترب تدريجيًا من الصفر ولكنه لا يصل أبدًا إلى الصفر
يحافظ الاضمحلال الأسي على ذيل طويل ذي صلة بالحد الأدنى يمتد إلى أجل غير مسمى
ينشئ الاضمحلال الخطي بشكل فريد نقطة نهاية محددة، مما يجعله فعالاً بشكل خاص للتطبيقات ذات الحدود الطبيعية أو المواعيد النهائية.
متى تستخدم التضاؤل الخطي
التضاؤل الخطي فعال بشكل خاص في:
حالة الاستخدام |
مثال |
لماذا يعمل التضاؤل الخطي بشكل جيد |
|---|---|---|
قوائم الأحداث |
منصات تذاكر الحفلات الموسيقية |
يضع حداً فاصلاً واضحاً للفعاليات في المستقبل البعيد جداً |
العروض محدودة الوقت |
التخفيضات السريعة والعروض الترويجية |
يضمن عدم ظهور العروض منتهية الصلاحية أو التي ستنتهي صلاحيتها قريباً |
نصف قطر التوصيل |
توصيل الطعام وخدمات البريد السريع |
يفرض حدوداً جغرافية صارمة |
المحتوى المقيد عمرياً |
منصات المواعدة، خدمات الوسائط |
وضع حدود عمرية ثابتة |
اختر الاضمحلال الخطي عندما:
يحتوي تطبيقك على حدود أو موعد نهائي أو عتبة طبيعية
يجب استبعاد العناصر التي تتجاوز نقطة معينة تمامًا من النتائج
تحتاج إلى معدل انخفاض متسق يمكن التنبؤ به ومتسق في الأهمية
يجب أن يرى المستخدمون فرقاً واضحاً بين العناصر ذات الصلة وغير ذات الصلة
مبدأ الانحدار الثابت
يخلق الاضمحلال الخطي انخفاضًا مستقيمًا ينخفض بمعدل ثابت حتى يصل إلى الصفر تمامًا. يظهر هذا النمط في العديد من السيناريوهات اليومية مثل مؤقتات العد التنازلي، ونضوب المخزون، واقتراب الموعد النهائي حيث يكون للأهمية نقطة انتهاء صلاحية واضحة.
يجب أن تستخدم جميع معلمات الوقت (origin ، offset ، scale) نفس وحدة بيانات المجموعة. إذا كانت المجموعة الخاصة بك تخزن الطوابع الزمنية بوحدة مختلفة (ميلي ثانية، ميكروثانية)، اضبط جميع المعلمات وفقًا لذلك.
التضاؤل الخطي
يوضح الرسم البياني أعلاه كيف سيؤثر الاضمحلال الخطي على قوائم الأحداث على منصة التذاكر:
origin(التاريخ الحالي): اللحظة الحالية، حيث تكون الأهمية في أقصى حد لها (1.0).offset(يوم واحد): "نافذة "الأحداث الفورية" - جميع الأحداث التي تحدث خلال اليوم التالي تحافظ على درجات الملاءمة الكاملة (1.0)، مما يضمن عدم معاقبة الأحداث الوشيكة جدًا بسبب الاختلافات الزمنية الطفيفة.decay(0.5): الدرجة على مسافة المقياس-يتحكم هذا المتغير في معدل انخفاض الملاءمة.scale(10 أيام): الفترة الزمنية التي تنخفض عندها الملاءمة إلى قيمة الاضمحلال-الأحداث التي تبعد 10 أيام تنخفض درجات الملاءمة إلى النصف (0.5).
كما ترى من منحنى الخط المستقيم، فإن الأحداث التي تبعد 16 يومًا تقريبًا تكون أهميتها صفرًا تمامًا ولن تظهر في نتائج البحث على الإطلاق. يؤدي هذا إلى إنشاء حدود واضحة تضمن أن يرى المستخدمون الأحداث القادمة ذات الصلة فقط ضمن نافذة زمنية محددة.
يعكس هذا السلوك الطريقة التي يعمل بها تخطيط الأحداث عادةً - الأحداث الوشيكة هي الأكثر صلة، والأحداث في الأسابيع القادمة لها أهمية متناقصة، والأحداث البعيدة جدًا في المستقبل (أو التي مضت بالفعل) يجب ألا تظهر على الإطلاق.
الصيغة
المعادلة الرياضية لحساب درجة التضاؤل الخطي هي
أين:
بتوضيح ذلك بلغة بسيطة
Calculate how far the field value is from the origin:
اطرح الإزاحة (إن وجدت) ولكن لا تنخفض أبدًا إلى ما دون الصفر: \الحد الأقصى
حدد المعلمة s من قيم المقياس والتضاؤل.
اطرح المسافة المعدلة من s واقسم على s
تأكد من أن النتيجة لا تنخفض أبدًا إلى ما دون الصفر: \ ماكس 0
تقوم عملية حساب s بتحويل معلمات المقياس والتضاؤل إلى النقطة التي تصل فيها النتيجة إلى صفر. على سبيل المثال، مع التضاؤل = 0.5 والمقياس = 7، ستصل الدرجة إلى الصفر تمامًا عند المسافة = 14 (ضعف قيمة المقياس).
استخدام التضاؤل الخطي
يمكن تطبيق الاضمحلال الخطي على كل من عمليات البحث المتجه القياسية وعمليات البحث المختلطة في ميلفوس. فيما يلي مقتطفات التعليمات البرمجية الرئيسية لتطبيق هذه الميزة.
قبل استخدام دوال التضاؤل الخطي، يجب عليك أولاً إنشاء مجموعة تحتوي على حقول رقمية مناسبة (مثل الطوابع الزمنية والمسافات وغيرها) والتي سيتم استخدامها لحسابات التضاؤل. للحصول على أمثلة عملية كاملة بما في ذلك إعداد المجموعة، وتعريف المخطط، وإدراج البيانات، راجع البرنامج التعليمي لمصنف التضاؤل.
إنشاء مصنف اضمحلال
بعد إعداد مجموعتك بحقل رقمي (في هذا المثال، event_date على أنه ثوانٍ من الآن)، قم بإنشاء مصنف تضاؤل خطي:
تناسق الوحدة الزمنية: عند استخدام الاضمحلال المستند إلى الوقت، تأكد من أن المعلمات origin و scale و offset تستخدم نفس الوحدة الزمنية التي تستخدمها بيانات مجموعتك. إذا كانت مجموعتك تخزن الطوابع الزمنية بالثواني، فاستخدم الثواني لجميع المعلمات. إذا كانت تستخدم المللي ثانية، فاستخدم المللي ثانية لجميع المعلمات.
from pymilvus import Function, FunctionType
import time
# Calculate current time
current_time = int(time.time())
# Create a linear decay ranker for event listings
# Note: All time parameters must use the same unit as your collection data
ranker = Function(
name="event_relevance", # Function identifier
input_field_names=["event_date"], # Numeric field to use
function_type=FunctionType.RERANK, # Function type. Must be RERANK
params={
"reranker": "decay", # Specify decay reranker
"function": "linear", # Choose linear decay
"origin": current_time, # Current time (seconds, matching collection data)
"offset": 12 * 60 * 60, # 12 hour immediate events window (seconds)
"decay": 0.5, # Half score at scale distance
"scale": 7 * 24 * 60 * 60 # 7 days (in seconds, matching collection data)
}
)
import io.milvus.v2.service.vector.request.ranker.DecayRanker;
DecayRanker ranker = DecayRanker.builder()
.name("event_relevance")
.inputFieldNames(Collections.singletonList("event_date"))
.function("linear")
.origin(System.currentTimeMillis())
.offset(12 * 60 * 60)
.decay(0.5)
.scale(7 * 24 * 60 * 60)
.build();
import { FunctionType } from "@zilliz/milvus2-sdk-node";
const ranker = {
name: "event_relevance",
input_field_names: ["event_date"],
type: FunctionType.RERANK,
params: {
reranker: "decay",
function: "linear",
origin: new Date(2025, 1, 15).getTime(),
offset: 12 * 60 * 60,
decay: 0.5,
scale: 7 * 24 * 60 * 60,
},
};
// go
# restful
تنطبق على البحث المتجه القياسي
بعد تحديد مصنف الاضمحلال الخاص بك، يمكنك تطبيقه أثناء عمليات البحث عن طريق تمريره إلى المعلمة ranker:
# Apply decay ranker to vector search
result = milvus_client.search(
collection_name,
data=[your_query_vector], # Replace with your query vector
anns_field="dense", # Vector field to search
limit=10, # Number of results
output_fields=["title", "venue", "event_date"], # Fields to return
ranker=ranker, # Apply the decay ranker
consistency_level="Strong"
)
import io.milvus.v2.common.ConsistencyLevel;
import io.milvus.v2.service.vector.request.SearchReq;
import io.milvus.v2.service.vector.response.SearchResp;
import io.milvus.v2.service.vector.request.data.FloatVec;
SearchReq searchReq = SearchReq.builder()
.collectionName(COLLECTION_NAME)
.data(Collections.singletonList(new FloatVec(embedding)))
.annsField("dense")
.limit(10)
.outputFields(Arrays.asList("title", "venue", "event_date"))
.functionScore(FunctionScore.builder()
.addFunction(ranker)
.build())
.consistencyLevel(ConsistencyLevel.STRONG)
.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: ["title", "venue", "event_date"],
rerank: ranker,
consistency_level: "Strong",
});
// go
# restful