مصنف مرجح
يجمع المُصنِّف الموزون بين النتائج من مسارات بحث متعددة ويحدد أولوياتها بذكاء من خلال تعيين أوزان أهمية مختلفة لكل منها. على غرار الطريقة التي يوازن بها الطاهي الماهر بين مكونات متعددة لإعداد الطبق المثالي، يوازن مُصنِّف التصنيف الموزون بين نتائج البحث المختلفة لتقديم النتائج المجمعة الأكثر صلة. هذا النهج مثالي عند البحث عبر عدة حقول أو طرائق متجهة حيث يجب أن تساهم بعض الحقول في الترتيب النهائي بشكل أكبر من غيرها.
متى تستخدم أداة التصنيف المرجحة
تم تصميم أداة التصنيف المرجحة خصيصًا لسيناريوهات البحث المختلطة حيث تحتاج إلى دمج النتائج من مسارات بحث متجهة متعددة. وهو فعال بشكل خاص لـ
حالة الاستخدام |
مثال |
لماذا يعمل المصنف المرجح بشكل جيد |
|---|---|---|
بحث التجارة الإلكترونية |
البحث عن المنتج الذي يجمع بين تشابه الصورة والوصف النصي |
يسمح لبائعي التجزئة بإعطاء الأولوية للتشابه المرئي لعناصر الموضة مع التركيز على الأوصاف النصية للمنتجات التقنية |
البحث عن محتوى الوسائط |
استرجاع الفيديو باستخدام كل من الميزات المرئية والنصوص الصوتية |
يوازن بين أهمية المحتوى المرئي وأهمية الحوار المنطوق بناءً على هدف الاستعلام |
استرجاع المستندات |
البحث عن المستندات المؤسسية مع تضمينات متعددة لأقسام مختلفة |
يعطي وزناً أكبر للعنوان والملخصات المضمنة مع مراعاة تضمينات النص الكامل |
إذا كان تطبيق البحث المختلط الخاص بك يتطلب الجمع بين مسارات بحث متعددة مع التحكم في أهميتها النسبية، فإن مصنف الموزون هو خيارك المثالي.
آلية المصنف المرجح
سير العمل الرئيسي لإستراتيجية المُصنِّف الموزون على النحو التالي:
جمع نتائج البحث: جمع النتائج والنتائج من كل مسار بحث متجه (النتيجة_1، النتيجة_2).
تطبيع النتيجة: قد يستخدم كل بحث مقاييس تشابه مختلفة، مما ينتج عنه توزيعات درجات متنوعة. على سبيل المثال، يمكن أن يؤدي استخدام الضرب الداخلي (IP) كنوع تشابه إلى درجات تتراوح بين [- ∞، + ∞]، بينما يؤدي استخدام المسافة الإقليدية (L2) إلى درجات تتراوح بين [0، + ∞]. نظرًا لأن نطاقات الدرجات من عمليات البحث المختلفة تختلف ولا يمكن مقارنتها مباشرة، فمن الضروري تطبيع الدرجات من كل مسار بحث. عادة، يتم تطبيق الدالة
arctanلتحويل الدرجات إلى نطاق بين [0، 1] (الدرجة_1_مطبعة، الدرجة_2_مطبع). تشير الدرجات الأقرب إلى 1 إلى تشابه أعلى.تعيين الأوزان: استنادًا إلى الأهمية المعينة لحقول المتجهات المختلفة، يتم تخصيص الأوزان(wi) للدرجات المعيارية (الدرجة_1_المعيارية، الدرجة_2_المعيارية). يجب أن تتراوح أوزان كل مسار بين [0،1]. الدرجات المرجحة الناتجة هي الدرجة_1_ المرجحة والدرجة_2_ المرجحة.
دمج الدرجات: يتم ترتيب الدرجات الموزونة (الدرجة_1_ المرجحة والدرجة_2_ المرجحة) من الأعلى إلى الأقل لإنتاج مجموعة نهائية من الدرجات (الدرجة_ النهائية).
المصنف الموزون
مثال على مصنف مرجح
يوضّح هذا المثال بحثًا هجينًا متعدد الوسائط (topK=5) يتضمن صورًا ونصوصًا ويوضح كيف تقوم استراتيجية المُصنّف المرجّح بإعادة ترتيب النتائج من عمليتي بحث في الشبكة العصبية الاصطناعية.
نتائج بحث الشبكة العصبية الاصطناعية على الصور (topK=5):
المعرف
النتيجة (الصورة)
101
0.92
203
0.88
150
0.85
198
0.83
175
0.8
نتائج بحث الشبكة العصبية الاصطناعية على النصوص (topK=5):
المعرف
النتيجة (نص)
198
0.91
101
0.87
110
0.85
175
0.82
250
0.78
استخدم WeightedRanker لتعيين أوزان لنتائج البحث عن الصور والنصوص. لنفترض أن وزن البحث في الصورة ANN هو 0.6 ووزن البحث في النص هو 0.4.
المعرف
النتيجة (صورة)
النتيجة (النص)
النتيجة المرجحة
101
0.92
0.87
0.6×0.92+0.4×0.87=0.90
203
0.88
غير متاح
0.6×0.88+0.4×0=0.528
150
0.85
غير متاح
0.6×0.85+0.4×0=0.51
198
0.83
0.91
0.6×0.83+0.4×0.91=0.86
175
0.80
0.82
0.6×0.80+0.4×0.82=0.81
110
غير موجود في الصورة
0.85
0.6×0+0.4×0.85=0.34
250
غير موجود في الصورة
0.78
0.6×0+0.4×0.78=0.312
النتائج النهائية بعد إعادة الترتيب (توب ك = 5):النتائج النهائية بعد إعادة الترتيب
الرتبة
المعرف
النتيجة النهائية
1
101
0.90
2
198
0.86
3
175
0.81
4
203
0.528
5
150
0.51
استخدام مصنف الرتب المرجحة
عند استخدام إستراتيجية المُصنِّف المرجِّح، من الضروري إدخال قيم الترجيح. يجب أن يتوافق عدد قيم الترجيح التي يجب إدخالها مع عدد طلبات البحث الأساسية للشبكة العصبية الاصطناعية في البحث الهجين. يجب أن تقع قيم الوزن الترجيحي للإدخال في نطاق [0،1]، حيث تشير القيم الأقرب إلى 1 إلى أهمية أكبر.
إنشاء مرتبة مرجحة
على سبيل المثال، لنفترض أن هناك طلبين أساسيين للبحث في البحث الهجين: البحث النصي والبحث عن الصور. إذا كان البحث النصي يعتبر أكثر أهمية، فيجب أن يتم تعيين وزن أكبر له.
يتيح لك Milvus 2.6.x والإصدارات الأحدث تكوين استراتيجيات إعادة الترتيب مباشرةً عبر واجهة برمجة التطبيقات Function. إذا كنت تستخدم إصدارًا سابقًا (قبل الإصدار 2.6.0)، فارجع إلى وثائق إعادة الترتيب للحصول على تعليمات الإعداد.
from pymilvus import Function, FunctionType
rerank = Function(
name="weight",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "weighted",
"weights": [0.1, 0.9],
"norm_score": True # Optional
}
)
import io.milvus.common.clientenum.FunctionType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq.Function rerank = CreateCollectionReq.Function.builder()
.name("weight")
.functionType(FunctionType.RERANK)
.param("reranker", "weighted")
.param("weights", "[0.1, 0.9]")
.param("norm_score", "true")
.build();
import { FunctionType } from '@zilliz/milvus2-sdk-node';
const rerank = {
name: "weight",
input_field_names: [],
function_type: FunctionType.RERANK,
params: {
reranker: "weighted",
weights: [0.1, 0.9],
norm_score: true
}
};
// Go
# Restful
المعلمة |
هل هي مطلوبة؟ |
الوصف |
القيمة/مثال |
|---|---|---|---|
|
نعم |
المعرف الفريد لهذه الوظيفة |
|
|
نعم |
قائمة بالحقول المتجهة المراد تطبيق الدالة عليها (يجب أن تكون فارغة لمصنف مرجح) |
[] |
|
نعم |
نوع الدالة المراد استدعاؤها؛ استخدم |
|
|
نعم |
يحدد طريقة إعادة الترتيب المراد استخدامها. يجب ضبطها على |
|
|
نعم |
مصفوفة من الأوزان المقابلة لكل مسار بحث؛ القيم ∈ [0،1]. لمزيد من التفاصيل، راجع آلية مصنف الترجيح. |
|
|
لا |
ما إذا كان سيتم تطبيع الدرجات الأولية (باستخدام الأكتان) قبل الترجيح. لمزيد من التفاصيل، ارجع إلى آلية المصنف المرجح. |
|
تنطبق على البحث المختلط
تم تصميم أداة التصنيف المرجحة خصيصًا لعمليات البحث المختلط التي تجمع بين عدة حقول متجهة. عند إجراء بحث مختلط، يجب تحديد الأوزان لكل مسار بحث:
from pymilvus import MilvusClient, AnnSearchRequest
# Connect to Milvus server
milvus_client = MilvusClient(uri="http://localhost:19530")
# Assume you have a collection setup
# Define text vector search request
text_search = AnnSearchRequest(
data=["modern dining table"],
anns_field="text_vector",
param={},
limit=10
)
# Define image vector search request
image_search = AnnSearchRequest(
data=[image_embedding], # Image embedding vector
anns_field="image_vector",
param={},
limit=10
)
# Apply Weighted Ranker to product hybrid search
# Text search has 0.8 weight, image search has 0.3 weight
hybrid_results = milvus_client.hybrid_search(
collection_name,
[text_search, image_search], # Multiple search requests
ranker=rerank, # Apply the weighted ranker
limit=10,
output_fields=["product_name", "price", "category"]
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.AnnSearchReq;
import io.milvus.v2.service.vector.request.HybridSearchReq;
import io.milvus.v2.service.vector.response.SearchResp;
import io.milvus.v2.service.vector.request.data.EmbeddedText;
import io.milvus.v2.service.vector.request.data.FloatVec;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
List<AnnSearchReq> searchRequests = new ArrayList<>();
searchRequests.add(AnnSearchReq.builder()
.vectorFieldName("text_vector")
.vectors(Collections.singletonList(new EmbeddedText("\"modern dining table\"")))
.limit(10)
.build());
searchRequests.add(AnnSearchReq.builder()
.vectorFieldName("image_vector")
.vectors(Collections.singletonList(new FloatVec(imageEmbedding)))
.limit(10)
.build());
HybridSearchReq hybridSearchReq = HybridSearchReq.builder()
.collectionName(COLLECTION_NAME)
.searchRequests(searchRequests)
.ranker(ranker)
.limit(10)
.outputFields(Arrays.asList("product_name", "price", "category"))
.build();
SearchResp searchResp = client.hybridSearch(hybridSearchReq);
import { MilvusClient, FunctionType } from "@zilliz/milvus2-sdk-node";
const milvusClient = new MilvusClient({ address: "http://localhost:19530" });
const text_search = {
data: ["modern dining table"],
anns_field: "text_vector",
param: {},
limit: 10,
};
const image_search = {
data: [image_embedding],
anns_field: "image_vector",
param: {},
limit: 10,
};
const rerank = {
name: "weight",
input_field_names: [],
function_type: FunctionType.RERANK,
params: {
reranker: "weighted",
weights: [0.1, 0.9],
norm_score: true,
},
};
const search = await milvusClient.search({
collection_name: collection_name,
limit: 10,
data: [text_search, image_search],
rerank: rerank,
output_fields = ["product_name", "price", "category"],
});
// go
# restful
لمزيد من المعلومات عن البحث الهجين، راجع البحث الهجين متعدد المتجهات.