مصنف RRRF
مصنف دمج الرتب المتبادل (RRF) هو استراتيجية إعادة ترتيب للبحث الهجين Milvus الذي يوازن بين النتائج من مسارات بحث متعددة المتجهات بناءً على مراكز ترتيبها بدلاً من درجات التشابه الخام. مثل البطولة الرياضية التي تأخذ في الاعتبار تصنيفات اللاعبين بدلاً من الإحصائيات الفردية، يقوم RRF Ranker بدمج نتائج البحث بناءً على مدى ارتفاع ترتيب كل عنصر في مسارات البحث المختلفة، مما يؤدي إلى إنشاء ترتيب نهائي عادل ومتوازن.
متى تستخدم مصنف RRF Ranker
تم تصميم RRF Ranker خصيصًا لسيناريوهات البحث المختلطة حيث تريد موازنة النتائج من مسارات بحث متعددة متجهة دون تعيين أوزان أهمية صريحة. إنه فعال بشكل خاص لـ
حالة الاستخدام |
مثال |
لماذا يعمل مصنف RRF Ranker بشكل جيد |
|---|---|---|
البحث متعدد الوسائط بأهمية متساوية |
البحث عن الصور والنصوص حيث تكون كلتا الطريقتين متساويتين في الأهمية |
يوازن بين النتائج دون الحاجة إلى تعيينات وزن تعسفية |
بحث متجه التجميع |
الجمع بين النتائج من نماذج تضمين مختلفة |
يدمج التصنيفات بشكل ديمقراطي دون تفضيل توزيع درجات أي نموذج معين |
البحث عبر اللغات |
البحث عن المستندات عبر لغات متعددة |
ترتيب النتائج بشكل عادل بغض النظر عن خصائص التضمين الخاصة باللغة |
توصيات الخبراء |
الجمع بين التوصيات من أنظمة خبراء متعددة |
إنشاء تصنيفات توافقية عندما تستخدم أنظمة مختلفة أساليب تسجيل غير قابلة للمقارنة |
إذا كان تطبيق البحث المختلط الخاص بك يتطلب موازنة مسارات بحث متعددة بشكل ديمقراطي دون تعيين أوزان صريحة، فإن RRF Ranker هو خيارك المثالي.
آلية مصنف RRF Ranker
سير العمل الرئيسي لاستراتيجية RRRFRanker على النحو التالي:
جمع تصنيفات البحث: اجمع تصنيفات النتائج من كل مسار من مسارات البحث المتجه (الرتبة_1، الرتبة_2).
دمج التصنيفات: تحويل التصنيفات من كل مسار (rank_rf_1، rank_rf_rf_2) وفقًا لصيغة حسابية.
تتضمن الصيغة الحسابية N، والتي تمثل عدد عمليات الاسترجاع. راندي(د) هو موضع ترتيب المستند (د) الناتج عن المسترجع i(th). k هو معامل تنعيم يتم تعيينه عادةً عند 60.
الترتيب الإجمالي: إعادة تصنيف نتائج البحث بناءً على التصنيفات المجمعة لإنتاج النتائج النهائية.
مصنف RRRF
مثال على مصنف RRRF
يوضح هذا المثال بحثًا هجينًا (topK=5) على متجهات متناثرة وكثيفة ويوضح كيفية إعادة ترتيب استراتيجية RRFR Ranker للنتائج من عمليتي بحث لشبكة ANN.
نتائج بحث ANN على متجهات متناثرة من النصوص (topK=5):
المعرف
الترتيب (متناثر)
101
1
203
2
150
3
198
4
175
5
نتائج بحث الشبكة العصبية الاصطناعية على متجهات كثيفة من النصوص (topK = 5):
المعرف
الرتبة (كثيفة)
198
1
101
2
110
3
175
4
250
5
استخدم RRF لإعادة ترتيب ترتيب مجموعتي نتائج البحث. افترض أن معلمة التنعيم
kمضبوطة على 60.المعرف
النتيجة (متناثرة)
النتيجة (كثيفة)
النتيجة النهائية
101
1
2
1/(60+1)+1/(60+2) = 0.03252247
198
4
1
1/(60+4)+1/(60+1) = 0.03201844
175
5
4
1/(60+5)+1/(60+4) = 0.03100962
203
2
غير متاح
1/(60+2) = 0.01612903
150
3
غير متاح
1/(60+3) = 0.01587302
110
غير متاح
3
1/(60+3) = 0.01587302
250
غير متاح
5
1/(60+5) = 0.01538462
النتائج النهائية بعد إعادة الترتيب (توب ك = 5): النتائج النهائية بعد إعادة الترتيب
الرتبة
المعرف
النتيجة النهائية
1
101
0.03252247
2
198
0.03201844
3
175
0.03100962
4
203
0.01612903
5
150
0.01587302
5
110
0.01587302
استخدام مصنف RRF
عند استخدام استراتيجية إعادة ترتيب RRF، تحتاج إلى تكوين المعلمة k. وهي معلمة تنعيم يمكن أن تغير بشكل فعال الأوزان النسبية للبحث عن النص الكامل مقابل البحث المتجه. القيمة الافتراضية لهذه المعلمة هي 60، ويمكن ضبطها ضمن نطاق (0، 16384). يجب أن تكون القيمة أرقام فاصلة عائمة. القيمة الموصى بها هي بين [10، 100]. في حين أن k=60 هو خيار شائع، إلا أن القيمة المثلى k يمكن أن تختلف بناءً على تطبيقاتك ومجموعات البيانات الخاصة بك. نوصي باختبار هذه المعلمة وتعديلها بناءً على حالة الاستخدام الخاصة بك لتحقيق أفضل أداء.
إنشاء مصنف RRRF
بعد إعداد مجموعتك باستخدام حقول متجهة متعددة، قم بإنشاء مصنف RRF Ranker باستخدام معلمة تنعيم مناسبة:
يتيح لك الإصدار Milvus 2.6.x والإصدارات الأحدث تكوين استراتيجيات إعادة الترتيب مباشرةً عبر واجهة برمجة التطبيقات Function. إذا كنت تستخدم إصدارًا سابقًا (قبل الإصدار 2.6.0)، فارجع إلى وثائق إعادة التصنيف للحصول على تعليمات الإعداد.
from pymilvus import Function, FunctionType
ranker = Function(
name="rrf",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "rrf",
"k": 100 # Optional
}
)
import io.milvus.common.clientenum.FunctionType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq.Function rerank = CreateCollectionReq.Function.builder()
.name("rrf")
.functionType(FunctionType.RERANK)
.param("reranker", "rrf")
.param("k", "100")
.build();
import { FunctionType } from "@zilliz/milvus2-sdk-node";
const ranker = {
name: "weight",
input_field_names: [],
function_type: FunctionType.RERANK,
params: {
reranker: "weighted",
weights: [0.1, 0.9],
norm_score: true,
},
};
// Go
# Restful
المعلمة |
هل هي مطلوبة؟ |
الوصف |
القيمة/مثال |
|---|---|---|---|
|
نعم |
المعرف الفريد لهذه الوظيفة |
|
|
نعم |
قائمة بالحقول المتجهة لتطبيق الدالة عليها (يجب أن تكون فارغة لمصنف RRF) |
[] |
|
نعم |
نوع الدالة المطلوب استدعاؤها؛ استخدم |
|
|
نعم |
يحدد طريقة إعادة الترتيب المراد استخدامها. يجب تعيينها على |
|
|
لا |
معلمة التنعيم التي تتحكم في تأثير رتب المستندات؛ يقلل ارتفاع للحصول على التفاصيل، راجع آلية RRRF Ranker. |
|
تنطبق على البحث الهجين
تم تصميم RRRF Ranker خصيصًا لعمليات البحث الهجين التي تجمع بين حقول متجهات متعددة. إليك كيفية استخدامه في البحث الهجين:
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 RRF Ranker to product hybrid search
# The smoothing parameter k controls the balance
hybrid_results = milvus_client.hybrid_search(
collection_name,
[text_search, image_search], # Multiple search requests
ranker=ranker, # Apply the RRF 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 ranker = {
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,
data: [text_search, image_search],
output_fields: ["product_name", "price", "category"],
limit: 10,
rerank: ranker,
});
// go
# restful
لمزيد من المعلومات عن البحث الهجين، راجع البحث الهجين متعدد المتجهات.