Aller au contenu

Recherche hybride : vectorielle + mots-clés + métadonnées

Concevoir une recherche hybride résiliente : combiner signaux vectoriels, lexicaux, de métadonnées et temporels pour le RAG de sites web.

retrieval • hybrid • search • rag

La recherche par modalité unique échoue dans les cas limites : les vecteurs denses manquent les tokens rares et les ID ; la recherche purement lexicale manque les paraphrases et la similarité sémantique. La recherche hybride fusionne des signaux complémentaires — sémantique dense, lexical clairsemé, métadonnées structurées, fraîcheur temporelle — pour produire des ensembles de candidats stables et de haute précision. Cet article détaille l’architecture, la normalisation, la fusion des scores, la gestion des défaillances et l’évaluation.

Motivation

Scénarios de défaillance :

  • Noms propres / codes SKU manqués par le modèle dense.
  • Requêtes sur les changements de prix qui remontent un instantané périmé faute de boost temporel.
  • Longues questions en langage naturel surpondérées sur les mots vides dans un système purement clairsemé.
  • Faux positifs vectoriels sur des pages sémantiquement larges (remplissage marketing) sans ancrage lexical.

L’approche hybride atténue cela en capturant des dimensions de preuve orthogonales.

Couches de composants

Flux recommandé :

  1. Plongement de la requête → recherche ANN (k_vec)
  2. Recherche lexicale (BM25 / SPLADE / Elasticsearch) (k_lex)
  3. Union → normalisation des scores (mise à l’échelle par source)
  4. Passe de filtrage par métadonnées (locale, access_tier, page_type)
  5. Ajustements de diversité et de fraîcheur
  6. Ré-ordonnanceur croisé/mono optionnel
  7. Troncature finale (top K)

Conservez les scores bruts d’avant-fusion pour l’audit.

Normalisation de la requête

Étapes :

  • Normalisation Unicode NFKC
  • Mise en minuscules (conservez un instantané de la casse pour le formatage de la réponse si nécessaire)
  • Tokeniser et conserver les mots vides (les plongements sémantiques peuvent exploiter le contexte)
  • Expansion des synonymes / alias : ajoutez des tokens alternatifs pour la correspondance des noms de code internes des produits (non insérés dans le prompt du modèle ; utilisés uniquement pour la recherche clairsemée).
  • Extraction des nombres et des versions : capturez les motifs X.Y.Z pour un scoring lexical ciblé.

Filtres de métadonnées et d’attributs

Les filtres appliqués après l’union initiale des candidats minimisent la perte de rappel. Champs courants : locale, access_tier, page_type, product_area, updated_bucket. Appliquez les filtres de sécurité (tenant / tier) AVANT la fusion des scores pour empêcher les fuites d’influencer le ré-ordonnancement. Proposez un mode de débogage renvoyant l’ensemble filtered_out à des fins d’inspection.

Stratégie de ré-ordonnancement

Utilisez un cross-encoder léger (modèle distillé) sur les N premiers (10–20). Si la latence > budget, dégradez : sautez le ré-ordonnancement OU réduisez le nombre de candidats en augmentant le poids lexical. Suivez re_rank_delta = MRR_post - MRR_pre pour justifier le coût. Mettez en cache les résultats du ré-ordonnancement pour des ensembles d’union identiques dans un TTL court.

Fraîcheur et signaux temporels

Calculez freshness_weight = exp(-lambda * age_days) où lambda est ajusté par type de contenu (plus élevé pour les prix, plus bas pour une API stable). Combinez : final_score = w_sem * sem_score + w_lex * lex_score + w_fresh * freshness_weight + w_meta * meta_priors. Normalisez d’abord chaque composant (z-score ou min-max) pour éviter qu’un seul ne domine.

Modes de défaillance

DéfaillanceCauseAtténuation
Biais de popularitéSurpondération du tf-idf lexicalPlafonner la contribution de la fréquence des termes
Résultats périmésPoids de fraîcheur mal régléRecalibrer lambda à l’aide d’un jeu d’évaluation
Fuite de localeApplication tardive du filtreDéplacer les filtres de sécurité plus tôt
Dérive sémantiqueMise à niveau du modèle de plongementDouble indexation et comparaison A/B avant le déploiement
Bruit de sur-fusionTaille d’union non bornéeLimiter l’union, élagage par diversité

Cadre d’évaluation

Expériences :

  • Ablation : (vectoriel seul, lexical seul, hybride sans ré-ordonnancement, complet) mesure Recall@k, MRR.
  • Réglage des poids de fusion : recherche en grille des poids à l’aide d’un jeu de référence de validation.
  • Budget de latence : suivez la latence de recherche moyenne + P95 par configuration.
  • Dérive : surveillez la variation relative hebdomadaire du rappel pour les requêtes fréquentes par rapport à la longue traîne.

Maintenez un manifeste d’évaluation avec des hachages de configuration.

Boucle d’optimisation

Cycle :

  1. Journalisez les traces de recherche (query, candidates, scores, source_tag).
  2. Identifiez les échecs (faible fidélité en aval ou faible nombre de citations) → classez la cause racine (candidat lexical manquant, faux positif sémantique, contenu périmé).
  3. Ajustez les poids / seuils ; exécutez la suite hors ligne.
  4. Déployez en canari les nouveaux poids de fusion derrière un feature flag.
  5. Promouvez en cas d’amélioration statistiquement significative.

Points clés à retenir

  • La recherche hybride est un système de cadrans réglables ; instrumentez sans relâche.
  • Appliquez tôt les filtres de sécurité et d’accès ; évitez les fuites dans le scoring.
  • Le ré-ordonnancement doit justifier la latence par un gain mesurable de MRR / Recall.
  • La décroissance temporelle empêche les pages périmées à forte autorité de dominer.
  • Traitez les changements de fusion comme du code : versionnez, évaluez, avancez ou revenez en arrière.