Tous les produits
Search
Centre de documentation

Tair (Redis® OSS-Compatible):Implémenter la recherche hybride avec TairVector

Dernière mise à jour :Sep 24, 2026

Aucune méthode de recherche ne couvre tous les scénarios. TairVector combine le filtrage conditionnel, la recherche en texte intégral et la recherche vectorielle au sein d'une seule requête, puis pondère les résultats à l'aide d'un paramètre unique. Ce guide présente un exemple concret basé sur un jeu de données d'images de produits pour illustrer le comportement de chaque combinaison et montrer comment ajuster le paramètre hybrid_ratio.

Pourquoi combiner les méthodes de recherche

Les grands modèles de langage (LLM) encodent les données non structurées (texte, images, audio et vidéo) sous forme de vecteurs, ce qui permet des recherches par similarité sémantique. Chaque méthode de recherche présente des avantages et des limites distincts :

Méthode Avantage Limite
Recherche vectorielle Gère plusieurs types de données ; trouve des résultats sémantiquement similaires Dépend fortement de la qualité du LLM ; peut manquer des correspondances exactes pour les termes spécifiques à un domaine
Recherche en texte intégral Fait correspondre des mots-clés et des phrases exacts Ignore les synonymes, les paraphrases et les termes sémantiquement liés ; sensible aux fautes de frappe
Filtrage conditionnel Applique des contraintes booléennes strictes sur les champs structurés Limité aux données structurées ; impossible de classer par pertinence

TairVector combine ces trois méthodes en une seule instruction. Le système note, pondère et fusionne les résultats de chaque méthode dans un ensemble final de candidats. Utilisez le paramètre hybrid_ratio pour contrôler la pondération attribuée à chaque méthode.

Fonctionnement de hybrid_ratio

Le paramètre hybrid_ratio définit la pondération de la recherche vectorielle. La pondération de la recherche en texte intégral correspond à 1 - hybrid_ratio.

**Valeur de hybrid_ratio** Effet
0.9999 Recherche quasi exclusivement vectorielle
0.5 Pondération égale entre la recherche vectorielle et la recherche en texte intégral
0.0001 Recherche quasi exclusivement en texte intégral

Lorsque la recherche vectorielle et la recherche en texte intégral renvoient le même élément, celui-ci obtient un rang plus élevé dans les résultats fusionnés.

Jeu de données d'exemple

Les exemples de ce guide utilisent le jeu de données open source fashion-product-images-small, qui contient 44 000 entrées de produits.

Lorsque vous utilisez des jeux de données open source, respectez les licences associées et les lois applicables.

Schéma des données

Champ Type
id int64
gender string
masterCategory string
subCategory string
articleType string
baseColour string
season string
year float64
usage string
productDisplayName string
image dict

Mappage des champs du jeu de données vers TairVector

TairVector utilise une structure de stockage Tair vector index Key-Key-(Key-Value). Avant d'importer les données, créez un index vectoriel (par exemple, hybrid_index) et mappez chaque champ du jeu de données au rôle TairVector approprié :

Champ du jeu de données Rôle TairVector Objectif
id Clé primaire Requêtes ponctuelles ; analyse d'un petit volume de données
image Vecteur Embeddings d'images encodés par LLM pour la recherche vectorielle
productDisplayName Description en texte intégral Texte utilisé pour la recherche en texte intégral
Tous les autres champs Paires clé-valeur Attributs pour le filtrage conditionnel (nombre illimité)

La figure suivante illustre la structure de données résultante dans TairVector.

1.jpg

Prérequis

Avant de commencer, assurez-vous d'avoir :

  • Chargé le jeu de données fashion-product-images-small

  • Configuré une instance Tair

  • Importé le jeu de données dans Tair en utilisant le mappage de champs ci-dessus

Pour obtenir le code complet de configuration et d'importation, téléchargez le fichier hybrid_search_demo.ipynb. Exécutez pip install jupyter pour installer les dépendances requises avant d'ouvrir le fichier.

Exécuter des requêtes de recherche hybride

Tous les exemples utilisent tvs_knnsearch pour interroger l'index hybrid_index avec le paramètre topk=20. Le texte de la requête est "Green Kidswear". La valeur du paramètre hybrid_ratio est la seule variable entre les différents scénarios.

Recherche vectorielle

Définissez le paramètre hybrid_ratio sur 0.9999 pour utiliser une recherche quasi exclusivement vectorielle.

topk = 20
text = "Green Kidswear"
vector = model.encode([text])[0]
filter_str = None
kwargs = {"TEXT": text, "hybrid_ratio": 0.9999}
result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs)
top_img = [images[id_pos[int(item[0])]] for item in result]
display_result(top_img)

Résultat :

image.png

Recherche en texte intégral

Définissez le paramètre hybrid_ratio sur 0.0001 pour utiliser une recherche quasi exclusivement en texte intégral.

topk = 20
text = "Green Kidswear"
vector = model.encode([text])[0]
filter_str = None
kwargs = {"TEXT": text, "hybrid_ratio": 0.0001}
result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs)
top_img = [images[id_pos[int(item[0])]] for item in result]
display_result(top_img)

Résultat :

image.png

Recherche hybride (vectorielle + texte intégral)

Définissez le paramètre hybrid_ratio sur 0.5 pour équilibrer équitablement la recherche vectorielle et la recherche en texte intégral.

topk = 20
text = "Green Kidswear"
vector = model.encode([text])[0]
filter_str = None
kwargs = {"TEXT": text, "hybrid_ratio": 0.5}
result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs)
top_img = [images[id_pos[int(item[0])]] for item in result]
display_result(top_img)

Résultat :

image.png

Recherche hybride avec filtrage conditionnel

Ajoutez un paramètre filter_str pour restreindre les résultats à un attribut spécifique. Cet exemple filtre les résultats selon la condition subCategory == "Topwear" tout en maintenant le paramètre hybrid_ratio à 0.5.

topk = 20
text = "Green Kidswear"
vector = model.encode([text])[0]
filter_str = "subCategory == \"Topwear\""
kwargs = {"TEXT": text, "hybrid_ratio": 0.5}
result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs)
print(result)
top_img = [images[id_pos[int(item[0])]] for item in result]
display_result(top_img)

Résultat :

image.png

Choisir une stratégie de recherche

Utilisez le tableau suivant pour sélectionner la combinaison adaptée à votre scénario.

Stratégie **hybrid_ratio** Idéal pour
Recherche vectorielle ~1 (par ex. 0.9999) Similarité sémantique ; requêtes multimodales (image, audio, vidéo)
Recherche en texte intégral ~0 (par ex. 0.0001) Correspondances de mots-clés exactes ; terminologie spécifique à un domaine
Hybride (vectorielle + texte intégral) 0.5 (pondération égale) Recherche polyvalente ; équilibre entre rappel et précision
Hybride + filtre conditionnel Toute valeur, avec filter_str Recherche ciblée au sein d'un attribut spécifique (catégorie, couleur, saison)

Observations clés issues des exemples de résultats :

  • La recherche vectorielle et la recherche en texte intégral renvoient toutes deux des résultats pertinents pour la requête "Green Kidswear". La recherche en texte intégral affiche une précision légèrement supérieure dans l'ensemble de candidats classés en tête.

  • En mode hybride, les éléments récupérés par les deux méthodes obtiennent un rang plus élevé que ceux récupérés par une seule méthode. Cet effet de reclassement améliore la qualité des résultats sans nécessiter d'ajustement manuel des scores.

  • Le filtrage conditionnel réduit l'ensemble de candidats pour améliorer le taux de succès de la recherche vectorielle lorsque l'attribut cible est connu.

Étapes suivantes

  • Pour consulter la référence complète de l'API tvs_knnsearch et les paramètres pris en charge, voir TairVector.