Boost-RangiererCompatible with Milvus v2.6.2+
Anstatt sich nur auf die semantische Ähnlichkeit zu verlassen, die auf der Grundlage von Vektorabständen berechnet wird, können Sie mit Boost Ranker die Suchergebnisse auf sinnvolle Art und Weise beeinflussen. Sie sind ideal für die schnelle Anpassung von Suchergebnissen mit Hilfe von Metadaten-Filterung.
Wenn eine Suchanfrage eine Boost Ranker-Funktion enthält, verwendet Milvus die optionale Filterbedingung innerhalb der Funktion, um Übereinstimmungen unter den Suchergebniskandidaten zu finden und erhöht die Punktzahlen dieser Übereinstimmungen durch Anwendung der angegebenen Gewichtung, wodurch die Rangfolge der übereinstimmenden Entitäten im Endergebnis verbessert oder verschlechtert wird.
Wann sollte Boost Ranker verwendet werden?
Im Gegensatz zu anderen Rankern, die sich auf Cross-Encoder-Modelle oder Fusionsalgorithmen stützen, fügt ein Boost Ranker optionale metadatengesteuerte Regeln direkt in den Ranking-Prozess ein, wodurch er sich für die folgenden Szenarien besser eignet.
Anwendungsfall |
Beispiele |
Warum Boost Ranker gut funktioniert |
|---|---|---|
Business-gesteuerte Inhaltspriorisierung |
|
Ohne die Notwendigkeit, Indizes neu zu erstellen oder Vektoreinbettungsmodelle zu ändern - Vorgänge, die zeitaufwändig sein können - können Sie bestimmte Elemente in den Suchergebnissen sofort auf- oder abwerten, indem Sie optionale Metadatenfilter in Echtzeit anwenden. Dieser Mechanismus ermöglicht ein flexibles, dynamisches Suchranking, das sich problemlos an sich verändernde Geschäftsanforderungen anpassen lässt. |
Strategische Herabstufung von Inhalten |
|
Sie können auch mehrere Boost Ranker kombinieren, um eine dynamischere und robustere gewichtsbasierte Rankingstrategie zu implementieren.
Mechanismus von Boost Ranker
Das folgende Diagramm veranschaulicht den Hauptarbeitsablauf von Boost Rankern.
Boost Ranker-Mechanismus
Wenn Sie Daten einfügen, verteilt Milvus diese auf Segmente. Während einer Suche gibt jedes Segment eine Reihe von Kandidaten zurück, und Milvus ordnet diese Kandidaten aus allen Segmenten ein, um die endgültigen Ergebnisse zu erhalten. Wenn eine Suchanfrage einen Boost Ranker enthält, wendet Milvus diesen auf die Kandidatenergebnisse aus jedem Segment an, um einen potenziellen Präzisionsverlust zu verhindern und den Recall zu verbessern.
Bevor die Ergebnisse abgeschlossen werden, verarbeitet Milvus diese Kandidaten mit dem Boost Ranker wie folgt:
Wendet den optionalen Filterausdruck an, der im Boost Ranker angegeben ist, um die Entitäten zu identifizieren, die mit dem Ausdruck übereinstimmen.
Wendet die im Boost Ranker angegebene Gewichtung an, um die Punktzahlen der identifizierten Entitäten zu erhöhen.
Sie können den Boost Ranker nicht als Ranker in einer hybriden Suche mit mehreren Vektoren verwenden. Sie können ihn jedoch als Ranker in jeder seiner Unterabfragen verwenden (AnnSearchRequest).
Beispiele für Boost Ranker
Das folgende Beispiel veranschaulicht die Verwendung eines Boost Rankers in einer Einzelvektorsuche, bei der die fünf relevantesten Entitäten zurückgegeben werden müssen und den Ergebnissen von Entitäten mit dem abstrakten Dokumenttyp Gewichtungen hinzugefügt werden.
Sammeln Sie Suchergebniskandidaten in Segmenten.
In der folgenden Tabelle wird davon ausgegangen, dass Milvus die Entitäten in zwei Segmente(0001 und 0002) verteilt, wobei jedes Segment fünf Kandidaten zurückgibt.
ID
DokTyp
Punktzahl
Rang
Segment
117
abstrakt
0.344
1
0001
89
abstrakt
0.456
2
0001
257
Körper
0.578
3
0001
358
Titel
0.788
4
0001
168
Körper
0.899
5
0001
46
Körper
0.189
1
0002
48
Körper
0265
2
0002
561
abstrakt
0.366
3
0002
344
abstrakt
0.444
4
0002
276
abstrakt
0.845
5
0002
Wenden Sie den im Boost Ranker angegebenen Filterausdruck an (
doctype='abstract').Wie im Feld
DocTypein der folgenden Tabelle angegeben, markiert Milvus alle Entitäten, derendoctypeaufabstractgesetzt ist, für die weitere Verarbeitung.ID
DokTyp
Bewertung
Rang
Segment
117
abstrakt
0.344
1
0001
89
abstrakt
0.456
2
0001
257
Körper
0.578
3
0001
358
Titel
0.788
4
0001
168
Körper
0.899
5
0001
46
Körper
0.189
1
0002
48
Körper
0265
2
0002
561
abstrakt
0.366
3
0002
344
abstrakt
0.444
4
0002
276
abstrakt
0.845
5
0002
Wenden Sie die im Boost Ranker angegebene Gewichtung an (
weight=0.5).Alle im vorangegangenen Schritt identifizierten Entitäten werden mit der im Boost Ranker angegebenen Gewichtung multipliziert, was zu einer Änderung ihres Ranges führt.
ID
DokTyp
Punktzahl
Gewichtete Punktzahl
(= Punktzahl x Gewichtung)
Rang
Segment
117
abstrakt
0.344
0.172
1
0001
89
abstrakt
0.456
0.228
2
0001
257
Körper
0.578
0.578
3
0001
358
Titel
0.788
0.788
4
0001
168
Körper
0.899
0.899
5
0001
561
abstrakt
0.366
0.183
1
0002
46
Körper
0.189
0.189
2
0002
344
abstrakt
0.444
0.222
3
0002
48
Körper
0.265
0.265
4
0002
276
abstrakt
0.845
0.423
5
0002
Die Gewichtung muss eine Gleitkommazahl sein, die Sie selbst wählen. In Fällen wie dem obigen Beispiel, in dem eine geringere Punktzahl auf eine höhere Relevanz hinweist, verwenden Sie eine Gewichtung kleiner als 1, ansonsten eine Gewichtung größer als 1.
Aggregieren Sie die Kandidaten aus allen Segmenten auf der Grundlage der gewichteten Punktzahlen, um die Ergebnisse zu vervollständigen.
ID
DokTyp
Punktzahl
Gewichtete Punktzahl
Rang
Segment
117
abstrakt
0.344
0.172
1
0001
561
abstrakt
0.366
0.183
2
0002
46
Körper
0.189
0.189
3
0002
344
abstrakt
0.444
0.222
4
0002
89
abstrakt
0.456
0.228
5
0001
Verwendung von Boost Ranker
In diesem Abschnitt sehen Sie Beispiele für die Verwendung von Boost Ranker, um die Ergebnisse einer Einzelvektorsuche zu beeinflussen.
Erstellen eines Boost Rankers
Bevor Sie einen Boost Ranker als Reranker einer Suchanfrage übergeben, sollten Sie den Boost Ranker wie folgt als Reranking-Funktion definieren:
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 |
Erforderlich? |
Beschreibung |
Wert/Beispiel |
|---|---|---|---|
|
Ja |
Eindeutiger Bezeichner für diese Funktion |
|
|
Ja |
Liste der Vektorfelder, auf die die Funktion angewendet werden soll (muss für Boost Ranker leer sein) |
|
|
Ja |
Der Typ der aufzurufenden Funktion; verwenden Sie |
|
|
Ja |
Gibt den Typ des Rerankers an. Muss auf |
|
|
Ja |
Gibt die Gewichtung an, die mit den Punktzahlen aller übereinstimmenden Entitäten in den rohen Suchergebnissen multipliziert wird. Der Wert sollte eine Fließkommazahl sein.
|
|
|
Keine |
Gibt den Filterausdruck an, der verwendet wird, um Entitäten unter den Suchergebnis-Entitäten abzugleichen. Es kann ein beliebiger gültiger grundlegender Filterausdruck sein, der in Filtering Explained erwähnt wird. Hinweis: Verwenden Sie nur einfache Operatoren wie |
|
|
Nein |
Gibt die Zufallsfunktion an, die einen Wert zwischen
|
|
Suche mit einem einzigen Boost Ranker
Sobald die Boost Ranker-Funktion fertig ist, können Sie sie in einer Suchanfrage referenzieren. Im folgenden Beispiel wird davon ausgegangen, dass Sie bereits eine Sammlung mit den folgenden Feldern erstellt haben: id, vector und doctype.
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
Suche mit mehreren Boost Rankern
Sie können mehrere Boost Rankers in einer einzigen Suche kombinieren, um die Suchergebnisse zu beeinflussen. Erstellen Sie dazu mehrere Boost Rankers, verweisen Sie auf sie in einer FunctionScore-Instanz und verwenden Sie die FunctionScore-Instanz als Ranker in der Suchanfrage.
Das folgende Beispiel zeigt, wie die Punktzahlen aller identifizierten Entitäten durch Anwendung einer Gewichtung zwischen 0,8 und 1,2 geändert werden können.
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
Konkret gibt es zwei Boost Ranker: Einer wendet eine feste Gewichtung auf alle gefundenen Entitäten an, während der andere ihnen eine zufällige Gewichtung zuweist. Anschließend referenzieren wir diese beiden Ranker in einer FunctionScore, die auch definiert, wie die Gewichtungen die Punktzahlen der gefundenen Entitäten beeinflussen.
In der folgenden Tabelle sind die Parameter aufgeführt, die zur Erstellung einer FunctionScore-Instanz erforderlich sind.
Parameter |
Erforderlich? |
Beschreibung |
Wert/Beispiel |
|---|---|---|---|
|
Ja |
Gibt die Namen der Ziel-Rangierer in einer Liste an. |
|
|
Nein |
Gibt an, wie die angegebenen Gewichtungen die Punktzahlen aller übereinstimmenden Entitäten beeinflussen. Mögliche Werte sind:
|
|
|
Keine |
Gibt an, wie die gewichteten Werte aus verschiedenen Boost Rankers verarbeitet werden. Mögliche Werte sind:
|
|