Boost RankerCompatible with Milvus v2.6.2+
Alih-alih hanya mengandalkan kemiripan semantik yang dihitung berdasarkan jarak vektor, Boost Rangking memungkinkan Anda untuk memengaruhi hasil pencarian dengan cara yang berarti. Ini sangat ideal untuk menyesuaikan hasil pencarian dengan cepat menggunakan pemfilteran metadata.
Ketika permintaan pencarian menyertakan fungsi Boost Ranker, Milvus menggunakan kondisi pemfilteran opsional dalam fungsi untuk menemukan kecocokan di antara kandidat hasil pencarian dan meningkatkan skor kecocokan tersebut dengan menerapkan bobot yang ditentukan, membantu mempromosikan atau menurunkan peringkat entitas yang cocok di hasil akhir.
Kapan menggunakan Boost Ranker
Tidak seperti pemeringkat lain yang mengandalkan model penyandi silang atau algoritme fusi, Boost Ranker secara langsung menyuntikkan aturan berbasis metadata opsional ke dalam proses pemeringkatan, yang membuatnya lebih cocok dalam skenario berikut.
Kasus Penggunaan |
Contoh |
Mengapa Boost Ranker Bekerja dengan Baik |
|---|---|---|
Penentuan prioritas konten berdasarkan bisnis |
|
Tanpa perlu membangun ulang indeks atau memodifikasi model penyematan vektor-operasi yang dapat memakan waktu-Anda dapat langsung mempromosikan atau menurunkan item tertentu di hasil penelusuran dengan menerapkan filter metadata opsional secara real-time. Mekanisme ini memungkinkan peringkat pencarian yang fleksibel dan dinamis yang dengan mudah beradaptasi dengan kebutuhan bisnis yang terus berkembang. |
Penurunan peringkat konten strategis |
|
Anda juga dapat menggabungkan beberapa Boost Ranker untuk menerapkan strategi peringkat berbasis bobot yang lebih dinamis dan kuat.
Mekanisme Boost Ranker
Diagram berikut ini menggambarkan alur kerja utama Boost Rankers.
Mekanisme Boost Ranker
Ketika Anda memasukkan data, Milvus mendistribusikannya ke seluruh segmen. Selama pencarian, setiap segmen mengembalikan sekumpulan kandidat, dan Milvus memberi peringkat pada kandidat dari semua segmen untuk menghasilkan hasil akhir. Ketika permintaan pencarian menyertakan Boost Ranker, Milvus menerapkannya pada hasil kandidat dari setiap segmen untuk mencegah potensi kehilangan presisi dan meningkatkan recall.
Sebelum menyelesaikan hasil akhir, Milvus memproses kandidat-kandidat ini dengan Boost Ranker sebagai berikut:
Menerapkan ekspresi pemfilteran opsional yang ditentukan di Boost Ranker untuk mengidentifikasi entitas yang cocok dengan ekspresi tersebut.
Menerapkan bobot yang ditentukan dalam Boost Ranker untuk meningkatkan skor entitas yang teridentifikasi.
Anda tidak dapat menggunakan Boost Ranker sebagai pemeringkat dalam pencarian hibrida multi-vektor. Namun, Anda dapat menggunakannya sebagai pemeringkat di salah satu sub-permintaannya (AnnSearchRequest).
Contoh Boost Ranker
Contoh berikut ini mengilustrasikan penggunaan Boost Ranker dalam pencarian vektor tunggal yang membutuhkan pengembalian lima entitas paling relevan dan menambahkan bobot ke skor entitas dengan tipe dokumen abstrak.
Kumpulkan kandidat hasil pencarian dalam segmen-segmen.
Tabel berikut ini mengasumsikan Milvus mendistribusikan entitas ke dalam dua segmen(0001 dan 0002), dengan masing-masing segmen mengembalikan lima kandidat.
ID
JenisDokumen
Skor
Peringkat
segmen
117
abstrak
0.344
1
0001
89
abstrak
0.456
2
0001
257
tubuh
0.578
3
0001
358
judul
0.788
4
0001
168
tubuh
0.899
5
0001
46
tubuh
0.189
1
0002
48
tubuh
0265
2
0002
561
abstrak
0.366
3
0002
344
abstrak
0.444
4
0002
276
abstrak
0.845
5
0002
Terapkan ekspresi pemfilteran yang ditentukan dalam Boost Ranker (
doctype='abstract').Seperti yang dilambangkan dengan bidang
DocTypepada tabel berikut, Milvus akan menandai semua entitas dengandoctypeyang disetel keabstractuntuk diproses lebih lanjut.ID
Jenis Dokumen
Skor
Peringkat
segmen
117
abstrak
0.344
1
0001
89
abstrak
0.456
2
0001
257
tubuh
0.578
3
0001
358
judul
0.788
4
0001
168
tubuh
0.899
5
0001
46
tubuh
0.189
1
0002
48
tubuh
0265
2
0002
561
abstrak
0.366
3
0002
344
abstrak
0.444
4
0002
276
abstrak
0.845
5
0002
Terapkan bobot yang ditentukan dalam Boost Ranker (
weight=0.5).Semua entitas yang teridentifikasi pada langkah sebelumnya akan dikalikan dengan bobot yang ditentukan di Boost Ranker, sehingga menghasilkan perubahan pada peringkat mereka.
ID
Jenis Dokumen
Skor
Skor Tertimbang
(= skor x bobot)
Peringkat
segmen
117
abstrak
0.344
0.172
1
0001
89
abstrak
0.456
0.228
2
0001
257
tubuh
0.578
0.578
3
0001
358
judul
0.788
0.788
4
0001
168
tubuh
0.899
0.899
5
0001
561
abstrak
0.366
0.183
1
0002
46
tubuh
0.189
0.189
2
0002
344
abstrak
0.444
0.222
3
0002
48
tubuh
0.265
0.265
4
0002
276
abstrak
0.845
0.423
5
0002
Bobot harus berupa angka floating-point yang Anda pilih. Dalam kasus seperti contoh di atas, di mana skor yang lebih kecil menunjukkan relevansi yang lebih besar, gunakan bobot kurang dari 1. Jika tidak, gunakan bobot yang lebih besar dari 1.
Agregasikan kandidat dari semua segmen berdasarkan skor tertimbang untuk menyelesaikan hasilnya.
ID
Jenis Dokumen
Skor
Skor Tertimbang
Peringkat
segmen
117
abstrak
0.344
0.172
1
0001
561
abstrak
0.366
0.183
2
0002
46
tubuh
0.189
0.189
3
0002
344
abstrak
0.444
0.222
4
0002
89
abstrak
0.456
0.228
5
0001
Penggunaan Boost Ranker
Pada bagian ini, Anda akan melihat contoh cara menggunakan Boost Ranker untuk memengaruhi hasil pencarian vektor tunggal.
Membuat Pemeringkat Boost
Sebelum mengoper Boost Ranker sebagai perangking ulang permintaan pencarian, Anda harus mendefinisikan Boost Ranker dengan benar sebagai fungsi perangkingan ulang sebagai berikut:
from pymilvus import Function, FunctionType
ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"filter": "doctype == 'abstract'",
"random_score": {
"seed": 126,
"field": "id"
},
"weight": 0.5
}
)
import io.milvus.v2.service.vector.request.ranker.BoostRanker;
BoostRanker ranker = BoostRanker.builder()
.name("boost")
.filter("doctype == \"abstract\"")
.weight(5.0f)
.randomScoreField("id")
.randomScoreSeed(126)
.build();
// go
import {FunctionType} from '@zilliz/milvus2-sdk-node';
const ranker = {
name: "boost",
input_field_names: [],
type: FunctionType.RERANK,
params: {
reranker: "boost",
filter: "doctype == 'abstract'",
random_score: {
seed: 126,
field: "id",
},
weight: 0.5,
},
};
# restful
Parameter |
Diperlukan? |
Deskripsi |
Nilai/Contoh |
|---|---|---|---|
|
Ya |
Pengenal unik untuk Fungsi ini |
|
|
Ya |
Daftar bidang vektor untuk menerapkan fungsi (harus kosong untuk Boost Ranker) |
|
|
Ya |
Jenis Fungsi yang akan dipanggil; gunakan |
|
|
Ya |
Menentukan jenis perangking ulang. Harus diatur ke |
|
|
Ya |
Menentukan bobot yang akan dikalikan dengan skor entitas yang cocok dalam hasil pencarian mentah. Nilai harus berupa angka floating-point.
|
|
|
No |
Menentukan ekspresi filter yang akan digunakan untuk mencocokkan entitas di antara entitas hasil pencarian. Dapat berupa ekspresi filter dasar yang valid yang disebutkan dalam Penjelasan Pemfilteran. Catatan: Hanya gunakan operator dasar, seperti |
|
|
No |
Menentukan fungsi acak yang menghasilkan nilai antara
|
|
Cari dengan satu Boost Ranker
Setelah fungsi Boost Ranker siap, Anda dapat mereferensikannya dalam permintaan penelusuran. Contoh berikut ini mengasumsikan bahwa Anda telah membuat koleksi yang memiliki bidang berikut: id, vektor, dan tipe dokumen.
from pymilvus import MilvusClient
# Connect to the Milvus server
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
# Assume you have a collection set up
# Conduct a similarity search using the created ranker
client.search(
collection_name="my_collection",
data=[[-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911]],
anns_field="vector",
params={},
output_field=["doctype"],
ranker=ranker
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.SearchReq;
import io.milvus.v2.service.vector.response.SearchResp;
import io.milvus.v2.service.vector.request.data.FloatVec;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.token("root:Milvus")
.build());
SearchResp searchReq = client.search(SearchReq.builder()
.collectionName("my_collection")
.data(Collections.singletonList(new FloatVec(new float[]{-0.619954f, 0.447943f, -0.174938f, -0.424803f, -0.864845f})))
.annsField("vector")
.outputFields(Collections.singletonList("doctype"))
.functionScore(FunctionScore.builder()
.addFunction(ranker)
.build())
.build());
SearchResp searchResp = client.search(searchReq);
// go
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
// Connect to the Milvus server
const client = new MilvusClient({
address: 'localhost:19530',
token: 'root:Milvus'
});
// Assume you have a collection set up
// Conduct a similarity search
const searchResults = await client.search({
collection_name: 'my_collection',
data: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911],
anns_field: 'vector',
output_fields: ['doctype'],
rerank: ranker,
});
console.log('Search results:', searchResults);
# restful
Pencarian dengan beberapa Boost Rankers
Anda dapat menggabungkan beberapa Boost Rankers dalam satu pencarian untuk memengaruhi hasil pencarian. Untuk melakukannya, buat beberapa Boost Rankers, rujuk ke dalam instance FunctionScore, dan gunakan instance FunctionScore sebagai pemeringkat dalam permintaan pencarian.
Contoh berikut ini menunjukkan cara memodifikasi skor semua entitas yang teridentifikasi dengan menerapkan bobot antara 0,8 dan 1,2.
from pymilvus import MilvusClient, Function, FunctionType, FunctionScore
# Create a Boost Ranker with a fixed weight
fix_weight_ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"weight": 0.8
}
)
# Create a Boost Ranker with a randomly generated weight between 0 and 0.4
random_weight_ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"random_score": {
"seed": 126,
},
"weight": 0.4
}
)
# Create a Function Score
ranker = FunctionScore(
functions=[
fix_weight_ranker,
random_weight_ranker
],
params={
"boost_mode": "Multiply",
"function_mode": "Sum"
}
)
# Conduct a similarity search using the created Function Score
client.search(
collection_name="my_collection",
data=[[-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911]],
anns_field="vector",
params={},
output_field=["doctype"],
ranker=ranker
)
import io.milvus.common.clientenum.FunctionType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq.Function fixWeightRanker = CreateCollectionReq.Function.builder()
.functionType(FunctionType.RERANK)
.name("boost")
.param("reranker", "boost")
.param("weight", "0.8")
.build();
CreateCollectionReq.Function randomWeightRanker = CreateCollectionReq.Function.builder()
.functionType(FunctionType.RERANK)
.name("boost")
.param("reranker", "boost")
.param("weight", "0.4")
.param("random_score", "{\"seed\": 126}")
.build();
Map<String, String> params = new HashMap<>();
params.put("boost_mode","Multiply");
params.put("function_mode","Sum");
FunctionScore ranker = FunctionScore.builder()
.addFunction(fixWeightRanker)
.addFunction(randomWeightRanker)
.params(params)
.build()
SearchResp searchReq = client.search(SearchReq.builder()
.collectionName("my_collection")
.data(Collections.singletonList(new FloatVec(new float[]{-0.619954f, 0.447943f, -0.174938f, -0.424803f, -0.864845f})))
.annsField("vector")
.outputFields(Collections.singletonList("doctype"))
.addFunction(ranker)
.build());
SearchResp searchResp = client.search(searchReq);
// go
import {FunctionType} from '@zilliz/milvus2-sdk-node';
const fix_weight_ranker = {
name: "boost",
input_field_names: [],
type: FunctionType.RERANK,
params: {
reranker: "boost",
weight: 0.8,
},
};
const random_weight_ranker = {
name: "boost",
input_field_names: [],
type: FunctionType.RERANK,
params: {
reranker: "boost",
random_score: {
seed: 126,
},
weight: 0.4,
},
};
const ranker = {
functions: [fix_weight_ranker, random_weight_ranker],
params: {
boost_mode: "Multiply",
function_mode: "Sum",
},
};
await client.search({
collection_name: "my_collection",
data: [[-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911]],
anns_field: "vector",
params: {},
output_field: ["doctype"],
ranker: ranker
});
# restful
Secara khusus, ada dua Boost Rankers: satu menerapkan bobot tetap untuk semua entitas yang ditemukan, sementara yang lain memberikan bobot acak kepada mereka. Kemudian, kita mereferensikan kedua perangking ini dalam sebuah FunctionScore, yang juga mendefinisikan bagaimana bobot mempengaruhi skor entitas yang ditemukan.
Tabel berikut mencantumkan parameter-parameter yang diperlukan untuk membuat sebuah instance FunctionScore.
Parameter |
Diperlukan? |
Deskripsi |
Nilai/Contoh |
|---|---|---|---|
|
Ya |
Menentukan nama-nama pemeringkat target dalam daftar. |
|
|
Tidak |
Menentukan bagaimana bobot yang ditentukan mempengaruhi skor dari setiap entitas yang cocok. Nilai yang mungkin adalah:
|
|
|
Tidak |
Menentukan bagaimana nilai tertimbang dari berbagai Pemeringkat Boost diproses. Nilai yang mungkin adalah:
|
|