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.

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 :

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 :

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 :

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 :

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_knnsearchet les paramètres pris en charge, voir TairVector.