• Tentang Milvus
  • Memulai
  • Konsep
  • Panduan Pengguna
  • Impor Data
  • Alat AI
  • Panduan Administrasi
  • Peralatan
  • Integrasi
  • Tutorial
  • Pertanyaan Umum
  • API Reference

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:

  1. Kumpulkan Skor Pencarian: Kumpulkan hasil dan skor dari setiap jalur pencarian vektor (skor_1, skor_2).

  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 arctan digunakan 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.

  3. 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.

  4. 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).

Weighted Ranker 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

name

Ya

Pengenal unik untuk Fungsi ini

"weight"

input_field_names

Ya

Daftar bidang vektor untuk menerapkan fungsi (harus kosong untuk Pemeringkat Tertimbang)

[]

function_type

Ya

Jenis Fungsi yang akan dipanggil; gunakan RERANK untuk menentukan strategi pemeringkatan

FunctionType.RERANK

params.reranker

Ya

Menentukan metode pemeringkatan ulang yang akan digunakan.

Harus diatur ke weighted untuk menggunakan Pemeringkat Tertimbang.

"weighted"

params.weights

Ya

Larik bobot yang sesuai dengan setiap jalur pencarian; nilai ∈ [0,1].

Untuk detailnya, lihat Mekanisme Pemeringkat Tertimbang.

[0.1, 0.9]

params.norm_score

No

Apakah akan menormalkan skor mentah (menggunakan arctan) sebelum melakukan pembobotan.

Untuk detailnya, lihat Mekanisme Pemeringkat Tertimbang.

True

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.

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?