Vector Search
La recherche vectorielle trouve les plongements stockés les plus proches d’un vecteur de requête, au moyen d’une recherche exacte des k plus proches voisins ou d’index approximatifs comme HNSW et IVF, pour parcourir rapidement des millions de vecteurs.
La recherche vectorielle récupère les éléments dont les plongements sont les plus proches d’un plongement de requête selon une mesure de similarité telle que la similarité cosinus, le produit scalaire ou la distance euclidienne. Un modèle de plongement place les éléments ayant un sens ou une apparence similaire à proximité les uns des autres ; les vecteurs les plus proches correspondent donc aux documents, images ou produits les plus similaires, même s’ils ne partagent aucun mot-clé avec la requête. La recherche vectorielle exacte consiste à rechercher les k plus proches voisins (k-NN) parmi tous les vecteurs stockés. À grande échelle, les systèmes utilisent des index de plus proches voisins approximatifs (ANN), qui comparent la requête à une petite fraction des vecteurs tout en renvoyant presque tous les vrais voisins.
Fonctionnement de la recherche vectorielle#
La requête et les éléments stockés sont transformés en vecteurs par le même modèle ou par une paire entraînée conjointement : un encodeur de phrases pour le texte, CLIP pour faire correspondre le texte aux images, ou un réseau dorsal de vision pour faire correspondre des images entre elles. La métrique doit correspondre à la façon dont le modèle a été entraîné. Pour des vecteurs de longueur unitaire, la similarité cosinus est égale au produit scalaire, et le classement par distance euclidienne donne le même ordre. La recherche exacte nécessite une comparaison par vecteur stocké pour chaque requête : elle est rapide pour des dizaines de milliers de vecteurs, mais trop lente pour des centaines de millions. Les grands systèmes utilisent donc l’une des quatre familles d’index ANN suivantes :
- Index par graphe comme HNSW : chaque vecteur est relié à ses voisins proches dans un graphe à plusieurs niveaux, et une requête obtient sa réponse en parcourant le graphe de manière gloutonne.
- Index de clustering (IVF) : les vecteurs sont regroupés avec k-means et seuls les groupes dont les centroïdes sont les plus proches de la requête sont parcourus.
- Quantification vectorielle : elle compresse chaque vecteur en quelques octets, comme avec la quantification produit, afin d’estimer les distances à partir de codes compacts conservés en mémoire.
- Graphes sur disque : ils conservent un index de graphe sur SSD, comme le fait DiskANN, pour rechercher des milliards de vecteurs sur une seule machine.
L’idée fondamentale d’un index IVF tient dans un court exemple avec NumPy et scikit-learn qui le compare à une recherche exacte :
import numpy as np
from sklearn.cluster import KMeans
# 20,000 embeddings grouped by topic, normalized so a dot product is cosine similarity
rng = np.random.default_rng(0)
topics = rng.normal(size=(200, 64))
vectors = topics[rng.integers(200, size=20000)] + 0.5 * rng.normal(size=(20000, 64))
vectors /= np.linalg.norm(vectors, axis=1, keepdims=True)
query = vectors[0] + 0.1 * rng.normal(size=64)
# Exact search: score every stored vector
exact = np.argsort(-(vectors @ query))[:10]
# IVF index: cluster the vectors, then scan only the lists of the 5 closest centroids
kmeans = KMeans(n_clusters=100, n_init=1, random_state=0).fit(vectors)
probed = np.argsort(-(kmeans.cluster_centers_ @ query))[:5]
candidates = np.flatnonzero(np.isin(kmeans.labels_, probed))
approx = candidates[np.argsort(-(vectors[candidates] @ query))[:10]]
print(f"scanned {len(candidates) / len(vectors):.1%} of vectors")
print(f"recall@10: {len(set(exact) & set(approx)) / 10:.0%}")Sonder 5 des 100 groupes parcourt 5,1 % des vecteurs et trouve tout de même les 10 vrais plus proches voisins, soit un rappel@10 de 100 %. Sonder davantage de groupes augmente à la fois le rappel et le coût ; le nombre de sondes est donc le principal paramètre à régler dans un index IVF.
Recherche vectorielle et termes apparentés#
- Recherche par mots-clés : elle recherche des termes exacts dans un index inversé et les classe à l’aide de formules comme BM25. Elle excelle pour les noms, les codes et les mots rares, mais ne repère pas les synonymes.
- Recherche sémantique : recherche par le sens, l’objectif le plus souvent visé par la recherche vectorielle. Les systèmes de recherche sémantique ajoutent souvent une reformulation de la requête ou un reclasseur.
- Recherche hybride : elle exécute ensemble une recherche par mots-clés et une recherche vectorielle, puis fusionne les deux listes classées.
- Base de données vectorielle : système qui stocke les vecteurs avec leurs métadonnées et fournit une recherche vectorielle avec filtrage, mises à jour et persistance.
Applications concrètes#
- Génération augmentée par récupération (RAG) : elle trouve les passages de documents dont un modèle de langage a besoin pour répondre à une question.
- Réidentification d’objets : elle compare le plongement d’apparence d’une personne ou d’un véhicule à des observations antérieures afin de relier le même objet entre plusieurs caméras.
- Reconnaissance faciale : elle compare le plongement d’un visage aux visages enregistrés et accepte le plus proche s’il est suffisamment similaire.
- Systèmes de recommandation : ils suggèrent des produits, des chansons ou des vidéos dont les plongements sont proches des choix récents d’un utilisateur.
La plateforme Ultralytics utilise la recherche vectorielle pour enrichir les jeux de données d’entraînement. Son action Rechercher des images similaires prend une image sélectionnée, recherche les images les plus proches par plongement dans les jeux de données publics, personnels et d’équipe, puis affiche jusqu’à 24 résultats avec leurs scores de similarité. Tu peux ajouter ces résultats au jeu de données comme images d’entraînement non annotées.










