Pourquoi et quand avez-vous besoin d'une base de données vectorielle spécifique ?
Cet article a été publié à l'origine sur le site de l'AIAI et est reproduit ici avec l'autorisation de l'auteur.
La popularité croissante de ChatGPT et d'autres grands modèles de langage (LLM) a stimulé l'essor des technologies de recherche vectorielle, y compris les bases de données vectorielles spécifiques telles que Milvus et Zilliz Cloud, les bibliothèques de recherche vectorielle telles que FAISS et les plugins de recherche vectorielle intégrés aux bases de données traditionnelles. Cependant, le choix de la solution la mieux adaptée à vos besoins peut s'avérer difficile. Tout comme le choix entre un restaurant haut de gamme et une chaîne de restauration rapide, la sélection de la bonne technologie de recherche vectorielle dépend de vos besoins et de vos attentes.
Dans cet article, je vais donner un aperçu de la recherche vectorielle et de son fonctionnement, comparer différentes technologies de recherche vectorielle et expliquer pourquoi il est crucial d'opter pour une base de données vectorielle spécialement conçue à cet effet.
Qu'est-ce que la recherche vectorielle et comment fonctionne-t-elle ?
Larecherche vectorielle, également connue sous le nom de recherche de similarité vectorielle, est une technique permettant d'extraire les k premiers résultats les plus similaires ou sémantiquement liés à un vecteur d'interrogation donné parmi une vaste collection de données vectorielles denses.
Avant d'effectuer des recherches de similarité, nous utilisons des réseaux neuronaux pour transformer des données non structurées, telles que du texte, des images, des vidéos et des sons, en vecteurs numériques à haute dimension appelés vecteurs d'intégration. Par exemple, nous pouvons utiliser le réseau neuronal convolutionnel ResNet-50 pré-entraîné pour transformer une image d'oiseau en une collection de vecteurs d'intégration à 2 048 dimensions. Nous énumérons ici les trois premiers et les trois derniers éléments du vecteur : [0.1392, 0.3572, 0.1988, ..., 0.2888, 0.6611, 0.2909]
.
Image d'un oiseau par Patrice Bouchard
Après avoir généré des vecteurs d'intégration, les moteurs de recherche vectorielle comparent la distance spatiale entre le vecteur d'entrée de la requête et les vecteurs dans les magasins de vecteurs. Plus ils sont proches dans l'espace, plus ils sont similaires.
Arithmétique d'intégration
Technologies de recherche vectorielle populaires
De nombreuses technologies de recherche vectorielle sont disponibles sur le marché, notamment des bibliothèques d'apprentissage automatique comme NumPy de Python, des bibliothèques de recherche vectorielle comme FAISS, des plugins de recherche vectorielle construits sur des bases de données traditionnelles et des bases de données vectorielles spécialisées comme Milvus et Zilliz Cloud.
Bibliothèques d'apprentissage automatique
L'utilisation de bibliothèques d'apprentissage automatique est le moyen le plus simple de mettre en œuvre des recherches vectorielles. Par exemple, nous pouvons utiliser NumPy de Python pour mettre en œuvre un algorithme du plus proche voisin en moins de 20 lignes de code.
import numpy as np
# Function to calculate euclidean distance
def euclidean_distance(a, b):
return np.linalg.norm(a - b)
# Function to perform knn
def knn(data, target, k):
# Calculate distances between target and all points in the data
distances = [euclidean_distance(d, target) for d in data]
# Combine distances with data indices
distances = np.array(list(zip(distances, np.arange(len(data)))))
# Sort by distance
sorted_distances = distances[distances[:, 0].argsort()]
# Get the top k closest indices
closest_k_indices = sorted_distances[:k, 1].astype(int)
# Return the top k closest vectors
return data[closest_k_indices]
Nous pouvons générer 100 vecteurs bidimensionnels et trouver le plus proche voisin du vecteur [0,5, 0,5].
# Define some 2D vectors
data = np.random.rand(100, 2)
# Define a target vector
target = np.array([0.5, 0.5])
# Define k
k = 3
# Perform knn
closest_vectors = knn(data, target, k)
# Print the result
print("The closest vectors are:")
print(closest_vectors)
Les bibliothèques d'apprentissage automatique, telles que NumPy de Python, offrent une grande flexibilité à un faible coût. Cependant, elles présentent certaines limites. Par exemple, elles ne peuvent traiter qu'une petite quantité de données et ne garantissent pas la persistance des données.
Je recommande d'utiliser NumPy ou d'autres bibliothèques d'apprentissage automatique pour la recherche vectorielle uniquement dans les cas suivants :
- Vous avez besoin d'un prototypage rapide.
- Vous ne vous souciez pas de la persistance des données.
- La taille de vos données est inférieure à un million, et vous n'avez pas besoin de filtrage scalaire.
- Vous n'avez pas besoin de performances élevées.
Bibliothèques de recherche vectorielle
Les bibliothèques de recherche vectorielle peuvent vous aider à construire rapidement un prototype de système de recherche vectorielle très performant. FAISS en est un exemple typique. Il s'agit d'un logiciel libre développé par Meta pour la recherche efficace de similarités et le regroupement de vecteurs denses. FAISS peut traiter des collections de vecteurs de toute taille, même celles qui ne peuvent pas être entièrement chargées en mémoire. En outre, FAISS offre des outils d'évaluation et de réglage des paramètres. Bien qu'écrit en C++, FAISS fournit une interface Python/NumPy.
Vous trouverez ci-dessous le code d'un exemple de recherche vectorielle basé sur FAISS :
import numpy as np
import faiss
# Generate some example data
dimension = 64 # dimension of the vector space
database_size = 10000 # size of the database
query_size = 100 # number of queries to perform
np.random.seed(123) # make the random numbers predictable
# Generating vectors to index in the database (db_vectors)
db_vectors = np.random.random((database_size, dimension)).astype('float32')
# Generating vectors for query (query_vectors)
query_vectors = np.random.random((query_size, dimension)).astype('float32')
# Building the index
index = faiss.IndexFlatL2(dimension) # using the L2 distance metric
print(index.is_trained) # should return True
# Adding vectors to the index
index.add(db_vectors)
print(index.ntotal) # should return database_size (10000)
# Perform a search
k = 4 # we want to see 4 nearest neighbors
distances, indices = index.search(query_vectors, k)
# Print the results
print("Indices of nearest neighbors: \n", indices)
print("\nL2 distances to the nearest neighbors: \n", distances)
Les bibliothèques de recherche vectorielle telles que FAISS sont faciles à utiliser et suffisamment rapides pour gérer des environnements de production à petite échelle avec des millions de vecteurs. Vous pouvez améliorer les performances de leurs requêtes en utilisant la quantification et les GPU et en réduisant les dimensions des données.
Toutefois, ces bibliothèques présentent certaines limites lorsqu'elles sont utilisées en production. Par exemple, FAISS ne prend pas en charge l'ajout et la suppression de données en temps réel, les appels à distance, les langues multiples, le filtrage scalaire, l'évolutivité ou la reprise après sinistre.
Différents types de bases de données vectorielles
Les bases de données vectorielles sont apparues pour pallier les limites des bibliothèques susmentionnées et fournir une solution plus complète et plus pratique pour les applications de production.
Quatre types de bases de données vectorielles sont disponibles sur le champ de bataille :
- Les bases de données relationnelles ou en colonnes existantes qui intègrent un plugin de recherche vectorielle. PG Vector en est un exemple.
- Les moteurs de recherche traditionnels à index inversé avec prise en charge de l'indexation vectorielle dense. ElasticSearch en est un exemple.
- Bases de données vectorielles légères construites sur des bibliothèques de recherche vectorielle. Chroma en est un exemple.
- Les bases de données vectorielles conçues à cet effet. Ce type de base de données est spécifiquement conçu et optimisé pour la recherche vectorielle de bas en haut. Les bases de données vectorielles conçues à cet effet offrent généralement des fonctionnalités plus avancées, notamment l'informatique distribuée, la reprise après sinistre et la persistance des données. Milvus en est un bon exemple.
Toutes les bases de données vectorielles ne se valent pas. Chaque pile présente des avantages et des limites uniques, ce qui la rend plus ou moins adaptée à différentes applications.
Je préfère les bases de données vectorielles spécialisées aux autres solutions car elles constituent l'option la plus efficace et la plus pratique, offrant de nombreux avantages uniques. Dans les sections suivantes, j'utiliserai Milvus comme exemple pour expliquer les raisons de ma préférence.
Principaux avantages des bases de données vectorielles spécifiques
Milvus est une base de données vectorielles à code source ouvert, distribuée et conçue à cet effet, qui peut stocker, indexer, gérer et récupérer des milliards de vecteurs d'intégration. C'est également l'une des bases de données vectorielles les plus populaires pour la génération augmentée de recherche LLM. En tant qu'exemple de bases de données vectorielles construites à cet effet, Milvus partage de nombreux avantages uniques avec ses homologues.
Persistance des données et stockage rentable
Bien que la prévention de la perte de données soit l'exigence minimale pour une base de données, de nombreuses bases de données vectorielles légères et à machine unique n'accordent pas la priorité à la fiabilité des données. En revanche, les bases de données vectorielles distribuées spécialement conçues, comme Milvus, donnent la priorité à la résilience du système, à l'évolutivité et à la persistance des données en séparant le stockage et le calcul.
En outre, la plupart des bases de données vectorielles qui utilisent des index approximatifs du plus proche voisin (ANN) ont besoin de beaucoup de mémoire pour effectuer des recherches vectorielles, car elles chargent les index ANN uniquement dans la mémoire. Cependant, Milvus prend en charge les index sur disque, ce qui rend le stockage dix fois plus rentable que les index en mémoire.
Performances optimales des requêtes
Une base de données vectorielle spécialisée offre des performances de requête optimales par rapport aux autres options de recherche vectorielle. Par exemple, Milvus traite les requêtes dix fois plus rapidement que les plugins de recherche vectorielle. Milvus utilise l'algorithme ANN au lieu de l'algorithme de recherche brutale KNN pour une recherche vectorielle plus rapide. En outre, il divise ses index, ce qui réduit le temps nécessaire à la construction d'un index lorsque le volume de données augmente. Cette approche permet à Milvus de gérer facilement des milliards de vecteurs avec des ajouts et des suppressions de données en temps réel. En revanche, les autres modules complémentaires de recherche vectorielle ne conviennent qu'aux scénarios comportant moins de dizaines de millions de données et des ajouts et suppressions peu fréquents.
Milvus prend également en charge l'accélération GPU. Des tests internes montrent que l'indexation vectorielle accélérée par le GPU peut atteindre plus de 10 000 QPS lors de la recherche de dizaines de millions de données, ce qui est au moins dix fois plus rapide que l'indexation CPU traditionnelle pour les performances des requêtes sur une seule machine.
Fiabilité du système
De nombreuses applications utilisent des bases de données vectorielles pour des requêtes en ligne qui nécessitent une faible latence et un débit élevé. Ces applications exigent un basculement sur une seule machine au niveau de la minute, et certaines requièrent même une reprise après sinistre interrégionale pour les scénarios critiques. Les stratégies de réplication traditionnelles basées sur Raft/Paxos souffrent d'un gaspillage important de ressources et ont besoin d'aide pour pré-partager les données, ce qui conduit à une fiabilité médiocre. En revanche, Milvus possède une architecture distribuée qui exploite les files d'attente de messages K8s pour une haute disponibilité, ce qui réduit le temps de reprise et économise les ressources.
Exploitabilité et observabilité
Pour mieux servir les utilisateurs professionnels, les bases de données vectorielles doivent offrir une gamme de fonctionnalités de niveau professionnel pour une meilleure opérabilité et observabilité. Milvus prend en charge plusieurs méthodes de déploiement, notamment K8s Operator et Helm chart, docker-compose et pip install, ce qui le rend accessible aux utilisateurs ayant des besoins différents. Milvus fournit également un système de surveillance et d'alarme basé sur Grafana, Prometheus et Loki, améliorant ainsi son observabilité. Avec une architecture cloud-native distribuée, Milvus est la première base de données vectorielle du secteur à prendre en charge l'isolation multi-tenant, le RBAC, la limitation des quotas et les mises à niveau glissantes. Toutes ces approches simplifient considérablement la gestion et la surveillance de Milvus.
Démarrer avec Milvus en 3 étapes simples en 10 minutes
Construire une base de données vectorielle est une tâche complexe, mais en utiliser une est aussi simple que d'utiliser Numpy et FAISS. Même les étudiants peu familiarisés avec l'IA peuvent mettre en œuvre la recherche vectorielle basée sur Milvus en seulement dix minutes. Pour bénéficier de services de recherche vectorielle hautement évolutifs et performants, suivez les trois étapes suivantes :
- Déployez Milvus sur votre serveur à l'aide du document de déploiement Milvus.
- Mettez en œuvre la recherche vectorielle avec seulement 50 lignes de code en vous référant au document Hello Milvus.
- Explorez les documents d'exemple de Towhee pour vous faire une idée des cas d'utilisation les plus courants des bases de données vectorielles.
- Qu'est-ce que la recherche vectorielle et comment fonctionne-t-elle ?
- Technologies de recherche vectorielle populaires
- Principaux avantages des bases de données vectorielles spécifiques
- Démarrer avec Milvus en 3 étapes simples en 10 minutes
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word