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
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
Commencez par générer un nouveau fichier de migration :
uv run mistral-vespa generate-migration --app-dir ./vespa_app add_custom_query_profilesModifiez 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ètre | Type | Description |
|---|---|---|
name | str | Nom du profil, utilisé pour le sélectionner au moment de la requête |
fields | list[QueryField] | Liste des champs de requête avec des valeurs prédéfinies |
Chaque QueryField comporte :
| Paramètre | Type | Description |
|---|---|---|
name | str | Nom du paramètre de requête Vespa |
value | str | int | float | Valeur par défaut du paramètre |
Champs de requête courants
| Champ | Description |
|---|---|
ranking.profile | Profil 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) |
hits | Nombre 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
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
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
- Anatomie d'une application Vespa : concept des profils de requête
- Gérer le schéma : système de migration et fonctions utilitaires
- Documentation Vespa sur les profils de requête : guide officiel Vespa