Recherche hybride dans Manticore Search : Combiner BM25 et KNN
La recherche hybride dans Manticore Search combine la recherche textuelle BM25 et la recherche vectorielle KNN en une seule requête. Cela permet de prendre en compte simultanément les mots-clés exacts et la similarité sémantique. Pour une requête comme "chaussures de course pas chères", BM25 fournira des correspondances basées sur les tokens, tandis que KNN capturera le sens de phrases telles que "chaussures confortables pour le jogging".
La méthode utilise la Fusion de Rangs Réciproques (RRF) pour fusionner les listes classées. Les documents bien positionnés dans l'une ou l'autre recherche sont prioritaires dans le classement final.
Avantages de l'approche hybride
La recherche textuelle est efficace pour les termes rares, les références produits et les codes d'erreur. La recherche vectorielle capture les synonymes et le langage naturel, car les embeddings de concepts liés sont positionnés proches dans l'espace vectoriel.
Faiblesses de chaque méthode :
- BM25 a du mal avec les synonymes.
- KNN ignore les identifiants exacts sans signification sémantique.
La récupération hybride améliore le rappel pour les requêtes mixtes, minimisant le besoin d'une logique complexe.
Cas d'utilisation
La recherche hybride est pertinente dans les scénarios suivants :
- Requêtes avec intention et détails, par exemple
erreur python 403 forbidden— le code d'erreur via BM25, la description via KNN. - Pipelines RAG pour les LLM — alimenter les extraits de texte les plus pertinents.
- Catalogues avec données structurées (modèles de produits) et non structurées (descriptions).
- Modèles d'utilisateurs imprévisibles — phrases exactes ou langage descriptif.
Dans l'e-commerce, la recherche hybride traite en parallèle les noms, descriptions et embeddings visuels.
Mécanisme RRF
RRF agrège les rangs sans normaliser les scores. Formule : 1 / (rank_constant + rang). Par défaut rank_constant=60.
Exemple de fusion des 3 premiers :
| Document | Rang BM25 | Rang KNN | Score RRF |
|----------|-----------|----------|-----------|
| Doc A | 1 | 2 | 0.0325 |
| Doc C | 3 | 1 | 0.0323 |
| Doc B | 2 | - | 0.0161 |
| Doc D | - | 3 | 0.0159 |
Doc A mène grâce à ses bonnes positions dans les deux listes. RRF est préférable à la fusion basée sur les scores car elle ne nécessite pas d'étalonnage d'échelle.
Les sous-requêtes (MATCH et KNN) s'exécutent en parallèle ; les filtres s'appliquent à toutes.
Exemple pratique avec des bases de connaissances
Dans les bases de données d'assistance, requête "Impossible de se connecter au serveur" + code d'erreur E-5020.
Résultats KNN :
| # | Titre | Distance |
|---|-------|----------|
|1| E-5030 : DNS | 0.572 |
|2| E-2091 : Timeout | 0.583 |
|3| E-5020 : SSL | 0.605 |
Hybride avec MATCH('E-5020') et KNN :
SELECT titre, hybrid_score()
FROM articles_assistance
WHERE knn(embedding, 'impossible de se connecter au serveur')
AND MATCH('E-5020')
LIMIT 5
OPTION fusion_method='rrf';
| # | Titre | Score hybride |
|---|-------|--------------|
|1| Erreur E-5020 : Incompatibilité de certificat SSL | 0.032 |
|2| E-5030 | 0.016 |
|3| E-2091 | 0.016 |
E-5020 passe en première place : BM25 capture le code exact, KNN capture le contexte.
Exécuter une recherche hybride
Mode automatique avec hybrid_match() :
SELECT id, hybrid_score()
FROM produits
WHERE hybrid_match('chaussures de course');
API JSON :
POST /search
{
"table": "produits",
"hybride": { "requête": "chaussures de course" }
}
Manticore génère les embeddings, effectue les recherches et fusionne les résultats.
Contrôle explicite :
SELECT id, hybrid_score()
FROM produits
WHERE match('chaussures de course')
AND knn(embedding, (0.12, 0.45, 0.78, ...))
OPTION fusion_method='rrf';
Métriques disponibles : hybrid_score(), weight() (BM25), knn_dist().
Paramètres de fusion
rank_constant: dominance des premières positions (des valeurs plus basses augmentent l'accent).fusion_weights: poids des sous-requêtes, par exemple (texte=0.5, knn=0.3).window_size: volume des résultats intermédiaires.
KNN multiples :
SELECT id, hybrid_score()
FROM produits
WHERE match('chaussures de course') AS texte
AND knn(title_vec, (0.12, 0.45, ...)) AS title_sim
AND knn(image_vec, (0.88, 0.21, ...)) AS image_sim
OPTION fusion_method='rrf',
fusion_weights=(texte=0.5, title_sim=0.3, image_sim=0.2);
Points clés à retenir
- La recherche hybride distribue les signaux : identifiants via BM25, signification via KNN.
- RRF assure une fusion stable sans étalonnage.
- Prise en charge de multiples espaces vectoriels pour les données multimodales.
- L'exécution parallèle minimise la latence.
- La génération automatique d'embeddings simplifie l'intégration.
— Editorial Team
Aucun commentaire pour le moment.