الاضمحلال الغاوسيCompatible with Milvus 2.6.x
ينشئ التضاؤل الغاوسي، المعروف أيضًا باسم التضاؤل الطبيعي، التعديل الأكثر طبيعية لنتائج بحثك. على غرار الرؤية البشرية التي تتلاشى تدريجيًا مع المسافة، يخلق التضاؤل الغاوسي منحنى سلسًا على شكل جرس يقلل بلطف من ملاءمة العناصر كلما ابتعدت العناصر عن نقطتك المثالية. هذا النهج مثالي عندما تريد اضمحلالًا متوازنًا لا يعاقب العناصر التي تقع خارج نطاقك المفضل بقسوة ولكنه يقلل بشكل كبير من أهمية العناصر البعيدة.
على عكس تصنيفات الاضمحلال الأخرى:
ينخفض التضاؤل الأسي بشكل حاد في البداية، مما يخلق عقوبة أولية أقوى
يتناقص التضاؤل الخطي بمعدل ثابت حتى يصل إلى الصفر، مما يخلق حدًا فاصلًا واضحًا
يوفر الاضمحلال الغاوسي نهجًا أكثر توازنًا وبديهيةً يبدو طبيعيًا للمستخدمين.
متى تستخدم التضاؤل الغاوسي
يكون التضاؤل الغاوسي فعالاً بشكل خاص في:
حالة الاستخدام |
مثال |
لماذا يعمل غاوسي بشكل جيد |
|---|---|---|
عمليات البحث المستندة إلى الموقع |
مكتشفات المطاعم، ومحددات مواقع المتاجر |
تحاكي الإدراك البشري الطبيعي لمدى ملاءمة المسافة |
توصيات المحتوى |
اقتراحات المقالات بناءً على تاريخ النشر |
انخفاض تدريجي في الأهمية مع تقادم المحتوى |
قوائم المنتجات |
العناصر ذات الأسعار القريبة من الهدف |
انخفاض سلس في الملاءمة مع انحراف الأسعار عن الهدف |
مطابقة الخبرة |
العثور على محترفين ذوي خبرة ذات صلة |
تقييم متوازن لأهمية الخبرة |
إذا كان تطبيقك يتطلب شعوراً طبيعياً بانخفاض الملاءمة دون عقوبات قاسية أو تخفيضات صارمة، فمن المحتمل أن يكون انحسار غاوسي هو خيارك الأفضل.
مبدأ منحنى الجرس
يخلق انحسار غاوسي منحنى سلس على شكل جرس يقلل تدريجياً من الملاءمة كلما زادت المسافة من نقطة مثالية. سُمي هذا التوزيع على اسم عالم الرياضيات كارل فريدريك غاوس، ويظهر هذا التوزيع بشكل متكرر في الطبيعة والإحصائيات، وهو ما يفسر سبب شعوره بأنه بديهي جدًا بالنسبة للإدراك البشري.
تضاؤل غاوس
يوضح الرسم البياني أعلاه كيف سيؤثر تضاؤل غاوس على تصنيفات المطاعم في تطبيق بحث على الهاتف المحمول:
origin(0 كم): موقعك الحالي، حيث تكون الأهمية في أقصى حد لها (1.0).offset(±300 m): "منطقة النتيجة المثالية" حولك - جميع المطاعم في نطاق 300 متر تحافظ على درجات الملاءمة الكاملة (1.0)، مما يضمن عدم معاقبة الخيارات القريبة جدًا دون داعٍ بسبب الاختلافات الصغيرة في المسافة.scale(± 2 كم): المسافة التي تنخفض عندها الملاءمة إلى قيمة الاضمحلال - المطاعم التي تبعد 2 كيلومتر بالضبط تنخفض درجات الملاءمة إلى النصف (0.5).decay(0.5): الدرجة عند مسافة المقياس - يتحكم هذا البارامتر بشكل أساسي في مدى سرعة تناقص الدرجات مع المسافة.
كما ترى من المنحنى، تستمر المطاعم التي تبعد أكثر من 2 كم في الانخفاض في الأهمية ولكنها لا تصل إلى الصفر تمامًا. حتى المطاعم التي تبعد 4 إلى 5 كيلومترات تحتفظ بالحد الأدنى من الأهمية، مما يسمح للمطاعم الممتازة ولكن البعيدة بالظهور في نتائجك (وإن كان ترتيبها أقل).
هذا السلوك يحاكي كيف يفكر الناس بشكل طبيعي في مدى ملاءمة المسافة - فالأماكن القريبة مفضلة لدينا، ولكننا على استعداد للسفر لمسافة أبعد للحصول على خيارات استثنائية.
المعادلة
المعادلة الرياضية لحساب درجة اضمحلال غاوسي هي:
أين:
بتوضيح ذلك بلغة بسيطة
Calculate how far the field value is from the origin:
اطرح الإزاحة (إن وجدت) ولكن لا تنخفض أبدًا إلى ما دون الصفر: \الحد الأقصى
تربيع هذه المسافة المعدّلة: 2
اقسم على \الأس وهو ما يتم حسابه من معلمات المقياس والتضاؤل
خذ الأس السالب، وهو ما يمنحك قيمة بين 0 و1: \ السالب \ الأس السالب
تحوّل عملية حساب σ2 2 معاملات المقياس والتضاؤل إلى مربع الانحراف المعياري للتوزيع الغاوسي. وهذا ما يعطي الدالة شكل الجرس المميز لها.
استخدام الاضمحلال الغاوسي
يمكن تطبيق الاضمحلال الغاوسي على كل من عمليات البحث المتجه القياسية وعمليات البحث المختلطة في ميلفوس. فيما يلي مقتطفات التعليمات البرمجية الرئيسية لتنفيذ هذه الميزة.
قبل استخدام دوال الاضمحلال، يجب عليك أولاً إنشاء مجموعة تحتوي على حقول رقمية مناسبة (مثل الطوابع الزمنية والمسافات وغيرها) والتي سيتم استخدامها لحسابات الاضمحلال. للحصول على أمثلة عملية كاملة بما في ذلك إعداد المجموعة، وتعريف المخطط، وإدراج البيانات، راجع البرنامج التعليمي: تنفيذ الترتيب المستند إلى الوقت في ميلفوس.
إنشاء مصنف اضمحلال
بعد إعداد مجموعتك بحقل رقمي (في هذا المثال، distance بالأمتار من المستخدم)، قم بإنشاء مصنف اضمحلال غاوسي:
from pymilvus import Function, FunctionType
# Create a Gaussian decay ranker for location-based restaurant search
ranker = Function(
name="restaurant_distance_decay", # Function identifier
input_field_names=["distance"], # Numeric field for distance in meters
function_type=FunctionType.RERANK, # Function type. Must be RERANK
params={
"reranker": "decay", # Specify decay reranker
"function": "gauss", # Choose Gaussian decay
"origin": 0, # Your current location (0 meters)
"offset": 300, # 300m no-decay zone
"decay": 0.5, # Half score at scale distance
"scale": 2000 # 2 km scale (2000 meters)
}
)
import io.milvus.v2.service.vector.request.ranker.DecayRanker;
DecayRanker ranker = DecayRanker.builder()
.name("restaurant_distance_decay")
.inputFieldNames(Collections.singletonList("distance"))
.function("gauss")
.origin(0)
.offset(300)
.decay(0.5)
.scale(2000)
.build();
import { FunctionType } from "@zilliz/milvus2-sdk-node";
const ranker = {
name: "restaurant_distance_decay",
input_field_names: ["distance"],
function_type: FunctionType.RERANK,
params: {
reranker: "decay",
function: "gauss",
origin: 0,
offset: 300,
decay: 0.5,
scale: 2000,
},
};
// go
# restful
تطبيقه على البحث المتجه القياسي
بعد تحديد مصنف الاضمحلال الخاص بك، يمكنك تطبيقه أثناء عمليات البحث عن طريق تمريره إلى المعلمة ranker:
# Apply decay ranker to restaurant 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=["name", "cuisine", "distance"], # 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.EmbeddedText;
SearchReq searchReq = SearchReq.builder()
.collectionName(COLLECTION_NAME)
.data(Collections.singletonList(new EmbeddedText("italian restaurants")))
.annsField("vector_field")
.limit(10)
.outputFields(Arrays.asList("name", "cuisine", "distance"))
.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: ["name", "cuisine", "distance"],
rerank: ranker,
consistency_level: "Strong",
});
// go
# restful