نظرة عامة على مصنف التضاؤل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 ( |
منذ 2 أسابيع |
0.80 |
0.68 |
2 |
الورقة ب |
عالية جداً |
0.92 ( |
منذ 6 أشهر |
0.45 |
0.41 |
3 |
الورق ج |
متوسط |
0.75 ( |
منذ 1 يوم |
0.98 |
0.74 |
1 |
الورقة د |
متوسط-عالي |
0.76 ( |
منذ 3 أسابيع |
0.70 |
0.53 |
4 |
بدون إعادة ترتيب الاضمحلال، ستحتل الورقة (ب) أعلى مرتبة بناءً على التشابه البحت للمتجهات (0.92). ومع ذلك، مع تطبيق إعادة ترتيب الاضمحلال:
تقفز الورقة (ج) إلى المركز رقم 1 على الرغم من التشابه المتوسط لأنها حديثة جدًا (نُشرت بالأمس)
تنخفض الورقة ب إلى المركز رقم 3 على الرغم من التشابه الممتاز لأنها قديمة نسبيًا
تستخدم الورقة D المسافة L2 (حيث يكون الأقل أفضل)، لذلك يتم تطبيع درجتها من 1.2 إلى 0.76 قبل تطبيق التضاؤل
اختر مصنف الاضمحلال الصحيح
يقدم ميلفوس مصنفات اضمحلال متميزة - gauss ، exp ، linear ، وكل منها مصمم لحالات استخدام محددة:
مصنف الاضمحلال |
الخصائص |
حالات الاستخدام المثالية |
مثال على السيناريو |
|---|---|---|---|
غاوسي ( |
انخفاض تدريجي طبيعي الشعور يمتد بشكل معتدل |
|
في بحث عن مطعم، تظل الأماكن ذات الجودة العالية التي تبعد 3 كم قابلة للاكتشاف، على الرغم من أنها تحتل مرتبة أقل من الخيارات القريبة |
أسي ( |
يتناقص بسرعة في البداية ولكنه يحافظ على ذيل طويل |
|
في تطبيق الأخبار، تحتل قصص الأمس مرتبة أعلى بكثير من المحتوى الذي مضى عليه أسبوع، ولكن يمكن أن تظل المقالات القديمة ذات الصلة الوثيقة بالموضوع تظهر |
خطي ( |
الانخفاض المتسق والمتوقع مع وجود حد فاصل واضح |
|
في أداة البحث عن الأحداث، لا تظهر الأحداث التي تتجاوز نافذة مستقبلية لمدة أسبوعين على الإطلاق |
للحصول على معلومات مفصلة حول كيفية حساب كل مصنف اضمحلال للنتائج وأنماط اضمحلال محددة، راجع الوثائق المخصصة:
مثال على التنفيذ
يمكن تطبيق مصنفات التضاؤل على كل من عمليات البحث المتجه القياسية وعمليات البحث المختلطة في ميلفوس. فيما يلي مقتطفات الشيفرة الرئيسية لتنفيذ هذه الميزة.
قبل استخدام دوال الاضمحلال، يجب عليك أولاً إنشاء مجموعة تحتوي على حقول رقمية مناسبة (مثل الطوابع الزمنية والمسافات وغيرها) والتي سيتم استخدامها لحسابات الاضمحلال. للحصول على أمثلة عملية كاملة بما في ذلك إعداد المجموعة وتعريف المخطط وإدراج البيانات، راجع البرنامج التعليمي: تنفيذ الترتيب المستند إلى الوقت في ميلفوس.
إنشاء مصنف اضمحلال
لتنفيذ تصنيف الاضمحلال، قم أولاً بتعريف كائن 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
المعلمة |
مطلوب؟ |
الوصف |
القيمة/مثال |
|---|---|---|---|
|
نعم |
معرّف للدالة المستخدمة عند تنفيذ عمليات البحث. اختر اسمًا وصفيًا مناسبًا لحالة الاستخدام الخاصة بك. |
|
|
نعم |
حقل رقمي لحساب درجة التضاؤل. يحدد سمة البيانات التي سيتم استخدامها لحساب التضاؤل (على سبيل المثال، الطوابع الزمنية للتضاؤل المستند إلى الوقت، والإحداثيات للتضاؤل المستند إلى الموقع). يجب أن يكون حقلاً في مجموعتك يحتوي على قيم رقمية ذات صلة. يدعم INT8/16/32/64، وFLOAT، وDouble. |
|
|
نعم |
يحدد نوع الدالة التي يتم إنشاؤها. يجب تعيينها على |
|
|
نعم |
يحدد طريقة إعادة الترتيب المراد استخدامها. يجب تعيينها إلى |
|
|
نعم |
تحديد مصنف التضاؤل الرياضي المطلوب تطبيقه. يحدد شكل المنحنى الخاص بانخفاض الأهمية. راجع قسم اختيار مصنف التضاؤل الصحيح للحصول على إرشادات حول اختيار الدالة المناسبة. |
|
|
نعم |
النقطة المرجعية التي يتم من خلالها حساب درجة التضاؤل. تحصل العناصر عند هذه القيمة على أقصى درجات الملاءمة. بالنسبة للتضاؤل المستند إلى الوقت، يجب أن تتطابق وحدة الوقت مع بيانات المجموعة الخاصة بك. |
|
|
نعم |
المسافة أو الوقت الذي تنخفض فيه الصلة إلى القيمة بالنسبة للتضاؤل المستند إلى الوقت، يجب أن تتطابق وحدة الوقت مع بيانات المجموعة الخاصة بك. تؤدي القيم الأكبر إلى انخفاض تدريجي أكثر في الملاءمة؛ بينما تؤدي القيم الأصغر إلى انخفاض أكثر حدة. |
|
|
لا يوجد |
ينشئ "منطقة عدم اضمحلال" حول بالنسبة للاضمحلال المستند إلى الوقت، يجب أن تتطابق وحدة الوقت مع بيانات المجموعة الخاصة بك. تحافظ العناصر داخل هذا النطاق من |
|
|
لا يوجد |
تتحكم قيمة الدرجة في المسافة يجب أن تكون بين 0 و1. |
|
تنطبق على البحث المتجه القياسي
بعد تحديد مصنف الانحدار، يمكنك تطبيقه أثناء عمليات البحث عن طريق تمريره إلى المعلمة 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