Boost RankerCompatible with Milvus v2.6.2+
Au lieu de s'appuyer uniquement sur la similarité sémantique calculée sur la base des distances vectorielles, les Boost Rankers vous permettent d'influencer les résultats de recherche de manière significative. Il est idéal pour ajuster rapidement les résultats de recherche à l'aide du filtrage des métadonnées.
Lorsqu'une demande de recherche inclut une fonction Boost Ranker, Milvus utilise la condition de filtrage facultative dans la fonction pour trouver des correspondances parmi les candidats aux résultats de recherche et augmente les scores de ces correspondances en appliquant le poids spécifié, ce qui permet de promouvoir ou de rétrograder les classements des entités correspondantes dans le résultat final.
Quand utiliser Boost Ranker ?
Contrairement à d'autres outils de classement qui s'appuient sur des modèles d'encodage croisé ou des algorithmes de fusion, un Boost Ranker injecte directement des règles optionnelles basées sur les métadonnées dans le processus de classement, ce qui le rend plus approprié dans les scénarios suivants.
Cas d'utilisation |
Exemples de cas d'utilisation |
Pourquoi Boost Ranker fonctionne bien |
|---|---|---|
Hiérarchisation du contenu en fonction de l'activité de l'entreprise |
|
Sans avoir à reconstruire les index ou à modifier les modèles d'intégration des vecteurs, opérations qui peuvent prendre beaucoup de temps, vous pouvez instantanément promouvoir ou rétrograder des éléments spécifiques dans les résultats de recherche en appliquant des filtres de métadonnées optionnels en temps réel. Ce mécanisme permet d'obtenir des classements de recherche flexibles et dynamiques qui s'adaptent facilement à l'évolution des besoins de l'entreprise. |
Rétrogradation stratégique du contenu |
|
Vous pouvez également combiner plusieurs Boost Rankers pour mettre en œuvre une stratégie de classement plus dynamique et plus robuste basée sur le poids.
Mécanisme de Boost Ranker
Le diagramme suivant illustre le flux de travail principal des Boost Rankers.
Mécanisme de Boost Ranker
Lorsque vous insérez des données, Milvus les répartit entre les segments. Lors d'une recherche, chaque segment renvoie un ensemble de candidats et Milvus classe ces candidats à partir de tous les segments pour produire les résultats finaux. Lorsqu'une demande de recherche inclut un Boost Ranker, Milvus l'applique aux résultats des candidats de chaque segment afin d'éviter toute perte potentielle de précision et d'améliorer le rappel.
Avant de finaliser les résultats, Milvus traite ces candidats avec le Boost Ranker comme suit :
Il applique l'expression de filtrage facultative spécifiée dans le Boost Ranker pour identifier les entités qui correspondent à l'expression.
Il applique la pondération spécifiée dans le Boost Ranker pour augmenter les scores des entités identifiées.
Vous ne pouvez pas utiliser Boost Ranker comme outil de classement dans une recherche hybride multi-vectorielle. Cependant, vous pouvez l'utiliser comme classificateur dans n'importe laquelle de ses sous-requêtes (AnnSearchRequest).
Exemples de Boost Ranker
L'exemple suivant illustre l'utilisation d'un Boost Ranker dans une recherche à vecteur unique qui nécessite de renvoyer les cinq entités les plus pertinentes et d'ajouter des poids aux scores des entités ayant le type de document abstrait.
Rassembler les candidats aux résultats de la recherche par segments.
Le tableau suivant suppose que Milvus distribue les entités en deux segments(0001 et 0002), chaque segment renvoyant cinq candidats.
ID
Type de document
Score
Rang
segment
117
abstrait
0.344
1
0001
89
abstrait
0.456
2
0001
257
corps
0.578
3
0001
358
titre
0.788
4
0001
168
corps
0.899
5
0001
46
corps
0.189
1
0002
48
corps
0265
2
0002
561
abstrait
0.366
3
0002
344
abstrait
0.444
4
0002
276
abstrait
0.845
5
0002
Appliquer l'expression de filtrage spécifiée dans le Boost Ranker (
doctype='abstract').Comme l'indique le champ
DocTypedans le tableau suivant, Milvus marquera toutes les entités dont le champdoctypeest défini surabstractpour la suite du traitement.ID
DocType
Score
Rang
segment
117
abstrait
0.344
1
0001
89
abstrait
0.456
2
0001
257
corps
0.578
3
0001
358
titre
0.788
4
0001
168
corps
0.899
5
0001
46
corps
0.189
1
0002
48
corps
0265
2
0002
561
abstrait
0.366
3
0002
344
abstrait
0.444
4
0002
276
abstrait
0.845
5
0002
Appliquer le poids spécifié dans le Boost Ranker (
weight=0.5).Toutes les entités identifiées à l'étape précédente seront multipliées par le poids spécifié dans le Boost Ranker, ce qui modifiera leur classement.
ID
DocType
Score
Score pondéré
(= score x poids)
Rang
segment
117
abstrait
0.344
0.172
1
0001
89
abstrait
0.456
0.228
2
0001
257
corps
0.578
0.578
3
0001
358
titre
0.788
0.788
4
0001
168
corps
0.899
0.899
5
0001
561
abstrait
0.366
0.183
1
0002
46
corps
0.189
0.189
2
0002
344
abstrait
0.444
0.222
3
0002
48
corps
0.265
0.265
4
0002
276
abstrait
0.845
0.423
5
0002
La pondération doit être un nombre à virgule flottante que vous choisissez. Dans des cas comme l'exemple ci-dessus, où un score plus faible indique une plus grande pertinence, utilisez une pondération inférieure à 1. Dans le cas contraire, utilisez une pondération supérieure à 1.
Agrégez les candidats de tous les segments sur la base des scores pondérés pour finaliser les résultats.
ID
Type de document
Score
Score pondéré
Rang
segment
117
abstrait
0.344
0.172
1
0001
561
abstrait
0.366
0.183
2
0002
46
corps
0.189
0.189
3
0002
344
abstrait
0.444
0.222
4
0002
89
abstrait
0.456
0.228
5
0001
Utilisation de Boost Ranker
Dans cette section, vous verrez des exemples d'utilisation de Boost Ranker pour influencer les résultats d'une recherche sur un seul vecteur.
Créer un Boost Ranker
Avant de passer un Boost Ranker en tant que reranker d'une requête de recherche, vous devez définir correctement le Boost Ranker en tant que fonction de reranking comme suit :
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
Paramètre |
Nécessaire ? |
Description de la fonction |
Valeur/Exemple |
|---|---|---|---|
|
Oui |
Identifiant unique pour cette fonction |
|
|
Oui |
Liste des champs vectoriels auxquels appliquer la fonction (doit être vide pour Boost Ranker) |
|
|
Oui |
Type de fonction à invoquer ; utiliser |
|
|
Oui |
Spécifie le type de reranker. Doit être défini sur |
|
|
Oui |
Spécifie le poids qui sera multiplié par les scores de toutes les entités correspondantes dans les résultats de recherche bruts. La valeur doit être un nombre à virgule flottante.
|
|
|
Non |
Spécifie l'expression de filtre qui sera utilisée pour faire correspondre les entités parmi les entités des résultats de la recherche. Il peut s'agir de n'importe quelle expression de filtre de base valide mentionnée dans Filtering Explained (Le filtrage expliqué). Remarque: n'utilisez que des opérateurs de base, tels que |
|
|
Non |
Spécifie la fonction aléatoire qui génère une valeur entre
|
|
Recherche avec un seul Boost Ranker
Une fois que la fonction Boost Ranker est prête, vous pouvez la référencer dans une requête de recherche. L'exemple suivant suppose que vous avez déjà créé une collection avec les champs suivants : id, vector et 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
Recherche avec plusieurs Boost Rankers
Vous pouvez combiner plusieurs Boost Rankers dans une seule recherche afin d'influencer les résultats de la recherche. Pour ce faire, créez plusieurs Boost Rankers, référencez-les dans une instance de FunctionScore, et utilisez l'instance de FunctionScore comme ranker dans la requête de recherche.
L'exemple suivant montre comment modifier les scores de toutes les entités identifiées en appliquant un poids compris entre 0,8 et 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
Spécifiquement, il y a deux Boost Rankers : l'un applique un poids fixe à toutes les entités trouvées, tandis que l'autre leur attribue un poids aléatoire. Ensuite, nous référençons ces deux Rankers dans une FunctionScore, qui définit également comment les poids influencent les scores des entités trouvées.
Le tableau suivant répertorie les paramètres nécessaires à la création d'une instance de FunctionScore.
Paramètre |
Nécessaire ? |
Description |
Valeur/Exemple |
|---|---|---|---|
|
Oui |
Spécifie les noms des classeurs cibles dans une liste. |
|
|
Non |
Indique comment les pondérations spécifiées influencent les scores des entités correspondantes. Les valeurs possibles sont les suivantes :
|
|
|
Non |
Indique comment les valeurs pondérées des différents Boost Rankers sont traitées. Les valeurs possibles sont les suivantes
|
|