Tous les produits
Search
Centre de documentation

Tablestore:Recherche vectorielle

Dernière mise à jour :Aug 18, 2026

La recherche vectorielle Tablestore (KnnVectorQuery) effectue des requêtes de plus proche voisin approximatif à l'aide de vecteurs numériques pour identifier les éléments de données les plus similaires au sein d'ensembles de données à grande échelle. Les cas d'utilisation courants incluent la génération augmentée par récupération (RAG), les systèmes de recommandation, la détection de similarité, le traitement du langage naturel et la recherche sémantique.

Scénarios

La recherche vectorielle s'applique aux systèmes de recommandation, à la recherche d'images et de vidéos, au traitement du langage naturel ainsi qu'à la recherche sémantique.

  • Génération augmentée par récupération (RAG)

    Le RAG est un framework d'IA qui combine la récupération d'informations avec les grands modèles de langage (LLM) afin d'améliorer la précision des résultats générés, en particulier pour les données privées ou professionnelles. Le RAG est largement utilisé dans les scénarios de bases de connaissances.

  • Système de recommandation

    Sur les plateformes de commerce électronique, les réseaux sociaux et les services de streaming, les comportements des utilisateurs, leurs préférences et les caractéristiques du contenu sont encodés sous forme de vecteurs. La recherche vectorielle permet ensuite de trouver des produits, articles ou vidéos correspondants, offrant ainsi des recommandations personnalisées qui améliorent la satisfaction et la fidélisation des utilisateurs.

  • Détection de similarité (images, vidéos et voix)

    Dans les domaines de la reconnaissance d'images, de vidéos, de la voix, des empreintes vocales et des visages, les données non structurées sont converties en représentations vectorielles. La recherche vectorielle identifie alors les cibles les plus similaires. Par exemple, lorsqu'un utilisateur télécharge une image sur une plateforme de e-commerce, le système recherche des images de produits présentant des styles, des couleurs ou des motifs similaires.

  • Traitement du langage naturel et recherche sémantique

    En traitement du langage naturel (NLP), le texte est converti en représentations vectorielles telles que les embeddings Word2Vec ou BERT. La recherche vectorielle fait ensuite correspondre la sémantique de la requête pour trouver les documents, actualités ou paires questions-réponses les plus pertinents, améliorant ainsi la pertinence des résultats de recherche et l'expérience utilisateur.

  • Graphe de connaissances et chatbot IA

    Les nœuds et les relations d'un graphe de connaissances peuvent être représentés sous forme de vecteurs. La recherche vectorielle accélère la liaison d'entités, l'inférence de relations et les temps de réponse des chatbots IA, permettant ainsi de fournir des réponses plus précises à des questions complexes.

Principaux avantages

Coût réduit

Le moteur principal utilise la technologie DiskAnn optimisée. Contrairement à l'algorithme HNSW (Hierarchical Navigable Small World), DiskAnn ne charge pas toutes les données d'index en mémoire. Il offre un taux de rappel et des performances comparables à ceux de HNSW tout en utilisant moins de 10 % de la mémoire, ce qui réduit considérablement les coûts par rapport aux systèmes similaires.

Facilité d'utilisation

  • La recherche vectorielle est une sous-fonctionnalité serverless de l'index de recherche. Aucune construction ni déploiement de système n'est requis. Pour commencer, créez simplement une instance dans la console Tablestore.

  • Cette fonctionnalité prend en charge la méthode de facturation au paiement à l'utilisation, sans gestion des niveaux d'utilisation ni mise à l'échelle manuelle nécessaire. Le système met à l'échelle horizontalement le stockage et le calcul. La recherche vectorielle prend en charge jusqu'à plusieurs centaines de milliards d'entrées de données, tandis que la recherche non vectorielle prend en charge jusqu'à dix billions d'entrées.

  • Lors d'une recherche vectorielle, le moteur interne utilise un optimiseur de requêtes pour sélectionner automatiquement le meilleur algorithme et le chemin d'exécution optimal. Un taux de rappel élevé et de bonnes performances sont atteignables sans réglage approfondi des paramètres, ce qui abaisse la barrière à l'entrée et raccourcit le cycle de développement.

  • La recherche vectorielle est accessible via SQL, des SDK pour plusieurs langages tels que Java, Go, Python et Node.js, ainsi que des frameworks open source comme LangChain, LangChain4J et LlamaIndex.

Présentation des fonctionnalités

Une requête KnnVectorQuery identifie les éléments de données les plus similaires dans un ensemble de données volumineux en effectuant une requête de plus proche voisin approximatif sur des vecteurs numériques.

La recherche vectorielle hérite de toutes les fonctionnalités d'un index de recherche. En tant que service prêt à l'emploi et facturé au paiement à l'utilisation, elle ne nécessite aucun déploiement de système. La création d'index basée sur des flux permet d'interroger les données en quasi temps réel après leur écriture. Elle prend également en charge des ajouts, mises à jour et suppressions à haut débit, avec des performances de requête comparables à celles des systèmes basés sur HNSW.

Pour utiliser KnnVectorQuery, spécifiez le vecteur de requête, le champ vectoriel à rechercher et le nombre de plus proches voisins (TopK) à récupérer. La requête renvoie les vecteurs TopK les plus similaires au vecteur de requête. Vous pouvez la combiner avec d'autres fonctionnalités de recherche non vectorielle pour filtrer les résultats selon vos besoins.

Description du champ vectoriel

Avant d'utiliser KnnVectorQuery, configurez un champ vectoriel lors de la création d'un index de recherche. Spécifiez les dimensions du vecteur, le type de données et l'algorithme de mesure de distance.

Le champ correspondant dans la table de données doit utiliser le type de données String, et l'index de recherche doit utiliser une chaîne de tableau Float32. Pour plus de détails sur la configuration du champ vectoriel, consultez le tableau suivant.

Élément de configuration

Description

dimension

Les dimensions du vecteur. La dimension maximale prise en charge est de 4096. La valeur doit correspondre à la dimension des vecteurs produits par le système d'embedding en amont.

La longueur du tableau du champ vectoriel doit être égale au paramètre de dimension configuré. Par exemple, si la valeur du champ vectoriel est la chaîne [1, 5,1, 4,7, 0,08], la dimension de ce champ est 4.

Remarque

Seuls les vecteurs denses sont pris en charge. La dimension du champ vectoriel doit correspondre à la dimension définie dans le schéma lors de la création de l'index. Une incompatibilité entraîne l'échec de la création de l'index pour cette ligne.

dataType

Le type de données du vecteur. Seul Float32 est pris en charge. Float32 ne prend pas en charge les valeurs extrêmes telles que NaN et Infinite.

Le type de données doit correspondre au type de données vectorielles produit par le système d'embedding en amont.

Remarque

Pour utiliser des vecteurs d'autres types de données, soumettez un ticket pour nous contacter.

metricType

L'algorithme utilisé pour mesurer la distance entre les vecteurs. Valeurs valides : euclidean, cosine et dot_product.

L'algorithme de mesure de distance doit correspondre à l'algorithme recommandé par le système d'embedding en amont. Pour plus d'informations, consultez Algorithmes de mesure de distance.

Remarque

Différents modèles ou versions d'un système d'embedding produisent des vecteurs ayant des propriétés différentes, notamment en termes de dimension, de type de données et d'algorithme de mesure de distance. Les propriétés du champ vectoriel dans le système de recherche vectorielle (dimension, type de données et algorithme de mesure de distance) doivent correspondre aux propriétés des vecteurs produits par le système d'embedding. Pour plus d'informations sur la génération de vecteurs, consultez Deux méthodes pour générer des vecteurs.

Algorithmes de mesure de distance

La recherche vectorielle prend en charge trois algorithmes de mesure de distance : euclidean, cosine et dot_product. Un score plus élevé indique une plus grande similarité entre deux vecteurs.

MetricType

Formule de scoring

Performance

Description

Distance euclidienne

(euclidean)

image

Élevée

La distance euclidienne mesure la distance en ligne droite entre deux vecteurs dans un espace multidimensionnel. Pour des raisons de performance, l'implémentation Tablestore omet le calcul final de la racine carrée. Un score plus élevé indique une plus grande similarité.

Produit scalaire

(dot_product)

image

La plus élevée

Le produit scalaire multiplie les coordonnées correspondantes de deux vecteurs de même dimension et additionne les résultats. Un score plus élevé indique une plus grande similarité.

Important

Normalisez les vecteurs Float32 avant de les écrire dans une table, par exemple en utilisant la norme L2. Sans normalisation, des problèmes tels que de mauvais résultats de requête, une lenteur de la création de l'index vectoriel et de mauvaises performances de requête peuvent survenir. Pour un exemple de normalisation de vecteur, consultez Annexe 2 : Exemple de normalisation de vecteur.

Similarité cosinus

(cosine)

image

Faible

Mesure le cosinus de l'angle entre deux vecteurs. Un score plus élevé indique une plus grande similarité. La similarité cosinus est couramment utilisée pour les données textuelles.

Étant donné que la division par zéro n'est pas définie, la similarité cosinus ne peut pas être calculée si la somme des carrés d'un vecteur Float32 est égale à 0.

Important

Le calcul de la similarité cosinus est complexe. Nous vous recommandons de normaliser les vecteurs avant d'écrire les données dans la table, puis d'utiliser dot_product comme algorithme de mesure de distance. Pour un exemple de normalisation de vecteur, consultez Annexe 2 : Exemple de normalisation de vecteur.

Remarques

Tenez compte des points suivants lors de l'utilisation de la recherche vectorielle :

  • Des limites s'appliquent au nombre de types de champs vectoriels, aux dimensions et à d'autres propriétés. Pour plus d'informations, consultez Limites de l'index de recherche.

  • L'index de recherche est partitionné côté serveur. Chaque partition renvoie ses propres plus proches voisins TopK, et les résultats sont ensuite agrégés au niveau du nœud client. Par conséquent, si un jeton est utilisé pour paginer toutes les données, le nombre total de lignes renvoyées dépend du nombre de partitions côté serveur.

  • Actuellement, la fonctionnalité de recherche vectorielle est disponible dans les régions suivantes : Chine (Hangzhou), Chine (Shanghai), Chine (Qingdao), Chine (Pékin), Chine (Zhangjiakou), Chine (Ulanqab), Chine (Shenzhen), Chine (Guangzhou), Chine (Chengdu), Chine (Hong Kong), Japon (Tokyo), Singapour, Malaisie (Kuala Lumpur), Indonésie (Jakarta), Philippines (Manille), Thaïlande (Bangkok), Allemagne (Francfort), Royaume-Uni (Londres), États-Unis (Virginie), États-Unis (Silicon Valley), Arabie saoudite (Riyad - Région partenaire).

Procédure

  1. Générez des vecteurs.

    Utilisez des modèles open source pour convertir les données de Tablestore en vecteurs et les stocker.

  2. Écrivez des données vectorielles dans Tablestore.

  3. Lorsque vous créez un index de recherche, configurez le champ vectoriel.

    Configurez le type, les dimensions et l'algorithme de mesure de distance du champ vectoriel.

  4. Utilisez la recherche vectorielle pour interroger les données.

Facturation

Pendant l'aperçu public, vous n'êtes pas facturé pour les éléments facturables spécifiques à la fonctionnalité de requête de vecteur KNN. Vous êtes facturé pour les autres éléments facturables selon les règles de facturation existantes.

Lorsque vous utilisez un index de recherche pour interroger des données, vous êtes facturé pour le débit de lecture consommé. Pour plus d'informations, consultez Éléments facturables des index de recherche.

Annexe 1 : Utilisation avec BoolQuery

KnnVectorQuery et BoolQuery peuvent être combinés de différentes manières. Les deux exemples suivants supposent un scénario où un filtre correspond à une petite quantité de données.

Supposons qu'une table contient 100 millions d'images. Un utilisateur possède au total 50 000 images, mais seulement 50 ont été ajoutées au cours des 7 derniers jours. L'utilisateur souhaite trouver les 10 images les plus similaires parmi celles ajoutées au cours des 7 derniers jours en utilisant la recherche par image. Le tableau suivant montre comment ces deux méthodes de combinaison diffèrent.

Utilisation combinée

Diagramme des conditions de requête

Description

Utiliser BoolQuery à l'intérieur du filtre de KnnVectorQuery

image

KnnVectorQuery atteint les lignes qui satisfont la condition BoolQuery et renvoie les lignes TopK les plus similaires. La réponse SearchRequest renvoie les premières lignes Size des résultats TopK.

Dans cet exemple, KnnVectorQuery utilise d'abord le filtre pour sélectionner les 50 images appartenant à l'utilisateur « a » des 7 derniers jours, puis trouve les 10 images les plus similaires parmi ces 50 et les renvoie.

Utiliser KnnVectorQuery à l'intérieur de BoolQuery

image

Chaque sous-requête dans BoolQuery est exécutée en premier, puis l'intersection de tous les résultats des sous-requêtes est calculée.

Dans cet exemple, KnnVectorQuery renvoie les 500 images les plus similaires parmi les 100 millions d'images de la table, puis trouve séquentiellement les 10 images de l'utilisateur « a » des 7 derniers jours. Cependant, les 500 premières images pourraient ne pas inclure toutes les 50 images de l'utilisateur « a » des 7 derniers jours. Par conséquent, cette méthode de requête peut ne pas trouver les 10 images les plus similaires des 7 derniers jours et pourrait même ne renvoyer aucune donnée.

Annexe 2 : Exemple de normalisation de vecteur

Le code suivant normalise un vecteur :

  public static float[] l2normalize(float[] v, boolean throwOnZero) {
    double squareSum = 0.0f;
    int dim = v.length;
    for (float x : v) {
      squareSum += x * x;
    }
    if (squareSum == 0) {
      if (throwOnZero) {
        throw new IllegalArgumentException("can't normalize a zero-length vector");
      } else {
        return v;
      }
    }
    double length = Math.sqrt(squareSum);
    for (int i = 0; i < dim; i++) {
      v[i] /= length;
    }
    return v;
  }