Pemeringkat Tertimbang
Weighted Ranker secara cerdas menggabungkan dan memprioritaskan hasil dari beberapa jalur pencarian dengan memberikan bobot kepentingan yang berbeda untuk masing-masing. Mirip dengan cara koki yang terampil menyeimbangkan berbagai bahan untuk menciptakan hidangan yang sempurna, Weighted Ranker menyeimbangkan hasil pencarian yang berbeda untuk memberikan hasil gabungan yang paling relevan. Pendekatan ini sangat ideal ketika mencari di beberapa bidang vektor atau modalitas di mana bidang tertentu harus berkontribusi lebih signifikan terhadap peringkat akhir daripada yang lain.
Kapan menggunakan Weighted Ranker
Weighted Ranker dirancang khusus untuk skenario pencarian hibrida di mana Anda perlu menggabungkan hasil dari beberapa jalur pencarian vektor. Ini sangat efektif untuk:
Kasus Penggunaan |
Contoh |
Mengapa Weighted Ranker Bekerja dengan Baik |
|---|---|---|
Pencarian e-commerce |
Pencarian produk yang menggabungkan kemiripan gambar dan deskripsi teks |
Memungkinkan pengecer memprioritaskan kemiripan visual untuk item fesyen sambil menekankan deskripsi teks untuk produk teknis |
Pencarian konten media |
Pengambilan video menggunakan fitur visual dan transkrip audio |
Menyeimbangkan pentingnya konten visual versus dialog lisan berdasarkan maksud kueri |
Pencarian dokumen |
Pencarian dokumen perusahaan dengan beberapa penyematan untuk bagian yang berbeda |
Memberikan bobot yang lebih tinggi pada sematan judul dan abstrak sambil tetap mempertimbangkan sematan teks lengkap |
Jika aplikasi pencarian hibrida Anda memerlukan penggabungan beberapa jalur pencarian sambil mengontrol kepentingan relatifnya, Weighted Ranker adalah pilihan ideal Anda.
Mekanisme Pemeringkat Tertimbang
Alur kerja utama dari strategi WeightedRanker adalah sebagai berikut:
Kumpulkan Skor Pencarian: Kumpulkan hasil dan skor dari setiap jalur pencarian vektor (skor_1, skor_2).
Normalisasi Skor: Setiap pencarian dapat menggunakan metrik kemiripan yang berbeda, menghasilkan distribusi skor yang bervariasi. Misalnya, menggunakan Inner Product (IP) sebagai tipe kemiripan dapat menghasilkan skor mulai dari [-∞, +∞], sementara menggunakan jarak Euclidean (L2) menghasilkan skor mulai dari [0, +∞]. Karena rentang skor dari pencarian yang berbeda bervariasi dan tidak dapat dibandingkan secara langsung, maka perlu dilakukan normalisasi skor dari setiap jalur pencarian. Biasanya, fungsi
arctandigunakan untuk mengubah skor menjadi rentang antara [0, 1] (skor_1_normalized, skor_2_normalized). Skor yang lebih dekat ke 1 menunjukkan kemiripan yang lebih tinggi.Menetapkan Bobot: Berdasarkan tingkat kepentingan yang diberikan pada bidang vektor yang berbeda, bobot(wi) dialokasikan pada skor yang dinormalisasi (score_1_normalized, score_2_normalized). Bobot setiap jalur harus berkisar antara [0,1]. Skor terbobot yang dihasilkan adalah skor_1_terbobot dan skor_2_terbobot.
Menggabungkan Skor: Skor terbobot (skor_1_terbobot, skor_2_terbobot) diberi peringkat dari yang tertinggi hingga terendah untuk menghasilkan satu set skor akhir (skor_akhir).
Pemeringkat Tertimbang
Contoh Pemeringkat Tertimbang
Contoh ini mendemonstrasikan Pencarian Hibrida multimodal (topK = 5) yang melibatkan gambar dan teks dan mengilustrasikan bagaimana strategi WeightedRanker menentukan peringkat hasil dari dua pencarian ANN.
Hasil pencarian ANN pada gambar (topK=5): Hasil pencarian ANN pada gambar
ID
Skor (gambar)
101
0.92
203
0.88
150
0.85
198
0.83
175
0.8
Hasil pencarian ANN pada teks (topK=5): Hasil pencarian ANN pada teks
ID
Skor (teks)
198
0.91
101
0.87
110
0.85
175
0.82
250
0.78
Gunakan WeightedRanker untuk memberikan bobot pada hasil pencarian gambar dan teks. Misalkan bobot untuk pencarian gambar ANN adalah 0,6 dan bobot untuk pencarian teks adalah 0,4.
ID
Skor (gambar)
Skor (teks)
Skor Tertimbang
101
0.92
0.87
0.6×0.92+0.4×0.87=0.90
203
0.88
N/A
0.6×0.88+0.4×0=0.528
150
0.85
N/A
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
Tidak ada dalam gambar
0.85
0.6×0+0.4×0.85=0.34
250
Tidak ada dalam Gambar
0.78
0.6×0+0.4×0.78=0.312
Hasil akhir setelah pemeringkatan ulang (topK = 5):: Hasil akhir
Peringkat
ID
Skor Akhir
1
101
0.90
2
198
0.86
3
175
0.81
4
203
0.528
5
150
0.51
Penggunaan Weighted Ranker
Ketika menggunakan strategi WeightedRanker, Anda perlu memasukkan nilai bobot. Jumlah nilai bobot yang harus dimasukkan harus sesuai dengan jumlah permintaan pencarian ANN dasar dalam Pencarian Hibrida. Nilai bobot input harus berada di kisaran [0,1], dengan nilai yang lebih dekat ke 1 menunjukkan kepentingan yang lebih besar.
Membuat Pemeringkat Berbobot
Sebagai contoh, misalkan ada dua permintaan pencarian ANN dasar dalam Pencarian Hibrida: pencarian teks dan pencarian gambar. Jika pencarian teks dianggap lebih penting, maka harus diberi bobot yang lebih besar.
Milvus 2.6.x dan yang lebih baru memungkinkan Anda mengonfigurasi strategi perangkingan secara langsung melalui API Function. Jika Anda menggunakan rilis yang lebih lama (sebelum v2.6.0), lihat dokumentasi Perangkingan Ulang untuk instruksi penyiapan.
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
Parameter |
Diperlukan? |
Deskripsi |
Nilai/Contoh |
|---|---|---|---|
|
Ya |
Pengenal unik untuk Fungsi ini |
|
|
Ya |
Daftar bidang vektor untuk menerapkan fungsi (harus kosong untuk Pemeringkat Tertimbang) |
[] |
|
Ya |
Jenis Fungsi yang akan dipanggil; gunakan |
|
|
Ya |
Menentukan metode pemeringkatan ulang yang akan digunakan. Harus diatur ke |
|
|
Ya |
Larik bobot yang sesuai dengan setiap jalur pencarian; nilai ∈ [0,1]. Untuk detailnya, lihat Mekanisme Pemeringkat Tertimbang. |
|
|
No |
Apakah akan menormalkan skor mentah (menggunakan arctan) sebelum melakukan pembobotan. Untuk detailnya, lihat Mekanisme Pemeringkat Tertimbang. |
|
Berlaku untuk pencarian hybrid
Pemeringkat Tertimbang dirancang khusus untuk operasi pencarian hibrida yang menggabungkan beberapa bidang vektor. Ketika melakukan pencarian hybrid, Anda harus menentukan bobot untuk setiap jalur pencarian:
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
Untuk informasi lebih lanjut tentang pencarian hibrida, lihat Pencarian Hibrida Multi-Vektor.