Les profils de requête vous permettent de contrôler le classement au moment de la requête sans modifier votre schéma. Chaque profil regroupe un profil de classement, des pondérations de fonctions et des paramètres de requête dans une configuration nommée que vous pouvez changer d'une requête à l'autre.

Pour les concepts associés aux profils de requête, consultez Anatomie 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_schema(), le plugin génère automatiquement un profil de requête par défaut. Il inclut :

  • Une requête YQL pour la recherche hybride (mot-clé + vecteur) ou la recherche par mots-clés uniquement
  • Le profil de classement weighted-rank2
  • Des champs de type requête pour toutes les pondérations de fonctions

Le nom du profil par défaut correspond au nom du schéma, sauf si vous le remplacez avec default_query_profile_name :

from mistralai.search.toolkit.embedding import MistralEmbeddingPreset

create_schema(
    name="articles",
    mode=SearchMode.INDEX,
    embedding_model=MistralEmbeddingPreset.MISTRAL_EMBED_DIM_1024,
    indexing_mode=IndexingMode.DOCUMENT_PER_CHUNK,
    default_query_profile_name="articles-default",
)

Avec le profil par défaut, toutes les pondérations de classement commencent à 0. Définissez-en une ou plusieurs sur une valeur non nulle lors de la requête pour activer le classement.

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 avec 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 comporte :

ParamètreTypeDescription
namestrNom du profil, utilisé pour le sélectionner au moment de la requête
fieldslist[QueryField]Liste des champs de requête avec des valeurs prédéfinies

Chaque QueryField comporte :

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

Champs de requête courants

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

Les noms de pondération suivent le modèle <function_name>_weight. Par exemple, bm25_title a pour pondération 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 des 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 la requête :

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

query_profile = QueryProfile(name="search", version="2.0.0")
Utiliser des profils de requête au moment de la requête

Utiliser des profils de requête au moment de la requête

Passez un QueryProfile à app.get_search_index() pour sélectionner le profil à utiliser 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"),
)

Lorsque query_profile est omis, le profil de requête par défaut du schéma est utilisé automatiquement.

Voir aussi

Voir aussi