Les profils de requête permettent de contrôler le ranking à l'exécution d'une requête sans modifier votre schéma. Chaque profil regroupe un profil de ranking, des poids de fonctions et des paramètres de requête dans une configuration nommée, que vous pouvez sélectionner à chaque requête.

Pour comprendre les concepts liés aux profils de requête, voir Structure d'une application Vespa.

Profil de requête par défaut

Profil de requête par défaut

Lorsque vous créez un schéma avec create_default_schema() ou create_schema(), le plugin génère automatiquement un profil de requête par défaut. Il comprend :

  • Une requête YQL pour la recherche hybride (mot-clé + vecteur) ou recherche sur mots-clés uniquement
  • Le profil de ranking weighted-rank2
  • Les champs de type de requête pour tous les poids de fonctions

Le nom du profil par défaut correspond à celui du schéma, sauf si vous le remplacez via default_query_profile_name :

create_default_schema(
    name="articles",
    mode=SearchMode.INDEX,
    embedding_dimensions=1024,
    schema_version=1,
    default_query_profile_name="articles-default",
)

Avec le profil par défaut, tous les poids de ranking sont initialisés à 0. Attribuez une ou plusieurs valeurs non nulles lors de la requête pour activer le ranking.

Créer des profils de requête personnalisés

Créer des profils de requête personnalisés

Commencez par générer un nouveau fichier de migration :

uv run mistral-vespa generate-migration --app-dir ./vespa_app add_custom_query_profiles

Modifiez ensuite le fichier généré pour définir vos profils à l'aide de add_query_profiles :

from vespa.package import QueryField

from mistralai.search.toolkit.plugins.vespa.app.schemas.query_profile import QueryProfile
from mistralai.search.toolkit.plugins.vespa.migration import VespaMigration, add_query_profiles


class AddCustomQueryProfiles(VespaMigration):
    def migrate(self) -> None:
        add_query_profiles(
            [
                QueryProfile(
                    name="keyword-search",
                    fields=[
                        QueryField(name="ranking.features.query(bm25_title_weight)", value=100),
                        QueryField(name="ranking.features.query(bm25_content_weight)", value=50),
                        QueryField(name="hits", value=10),
                        QueryField(name="ranking.profile", value="weighted-rank1"),
                    ],
                ),
                QueryProfile(
                    name="hybrid-search",
                    fields=[
                        QueryField(name="ranking.features.query(bm25_title_weight)", value=100),
                        QueryField(
                            name="ranking.features.query(content_embedding_cosine_similarity_score_weight)",
                            value=80,
                        ),
                        QueryField(
                            name="ranking.features.query(freshness_created_at_weight)",
                            value=20,
                        ),
                        QueryField(name="hits", value=10),
                        QueryField(name="ranking.profile", value="weighted-rank2"),
                    ],
                ),
            ]
        )

Chaque QueryProfile comprend :

ParamètreTypeDescription
namestrNom du profil, utilisé au moment de la requête
fieldslist[QueryField]Liste des champs de requête avec valeurs par défaut

Chaque QueryField comprend :

ParamètreTypeDescription
namestrNom du paramètre de requête Vespa
valuestr | int | floatValeur par défaut pour ce paramètre
Champs de requête courants

Champs de requête courants

ChampDescription
ranking.profileProfil de ranking à utiliser (weighted-rank1, weighted-rank2, match-only)
ranking.features.query(<weight_name>)Poids attribué à une fonction de ranking (voir Référence ranking)
hitsNombre de résultats à renvoyer

Les noms de poids respectent le format <function_name>_weight. Par exemple, bm25_title devient bm25_title_weight.

Profils de requête versionnés

Profils de requête versionnés

Utilisez une chaîne de version, séparée par deux-points, pour gérer plusieurs versions d'un profil :

add_query_profiles(
    [
        QueryProfile(
            name="search:1.0.0",
            fields=[
                QueryField(name="ranking.features.query(bm25_title_weight)", value=50),
                QueryField(name="hits", value=3),
                QueryField(name="ranking.profile", value="weighted-rank2"),
            ],
        ),
        QueryProfile(
            name="search:2.0.0",
            fields=[
                QueryField(name="ranking.features.query(bm25_title_weight)", value=100),
                QueryField(
                    name="ranking.features.query(freshness_created_at_weight)",
                    value=20,
                ),
                QueryField(name="hits", value=5),
                QueryField(name="ranking.profile", value="weighted-rank2"),
            ],
        ),
    ]
)

Sélectionnez la version lors de la création d'un QueryProfile au moment de l'exécution de la requête :

from mistralai.search.toolkit.plugins.vespa.search import QueryProfile

query_profile = QueryProfile(name="search", version="2.0.0")
Utiliser un profil de requête à l'exécution

Utiliser un profil de requête à l'exécution

Transmettez un objet QueryProfile à app.get_search_index() pour sélectionner le profil souhaité pour la récupération :

import os

from mistralai.search.toolkit.plugins.vespa import VespaClientConfig
from mistralai.search.toolkit.plugins.vespa.search import QueryProfile
from vespa_app import app

collection_name = "articles"
vespa_config = VespaClientConfig(
    endpoint=os.environ.get("VESPA_ENDPOINT", "http://localhost:18080"),
)
vector_store = app.get_search_index(
    vespa_config,
    collection_name=collection_name,
    query_profile=QueryProfile(name="hybrid-search"),
)

Si query_profile n'est pas renseigné, le profil de requête par défaut du schéma est utilisé automatiquement.

Voir aussi

Voir aussi