Une plongée profonde dans Qdrant, la base de données vectorielle basée sur Rust

Une plongée fascinante dans Qdrant, la base de données vectorielle révolutionnaire basée sur Rust

Introduction

Les bases de données vectorielles sont devenues l’endroit privilégié pour stocker et indexer les représentations de données non structurées et structurées. Ces représentations sont les embeddings vectoriels générés par les modèles d’embedding. Les vector stores sont devenus une partie intégrante du développement d’applications avec des modèles d’apprentissage profond, en particulier les grands modèles de langage. Dans le paysage en constante évolution des vector stores, Qdrant est l’une des bases de données vectorielles qui a été récemment introduite et qui regorge de fonctionnalités. Plongeons-nous et apprenons-en davantage.

Objectifs d’apprentissage

  • Se familiariser avec les terminologies de Qdrant pour mieux le comprendre
  • Explorer Qdrant Cloud et créer des clusters
  • Apprendre à créer des embeddings de nos documents et les stocker dans les collections Qdrant
  • Explorer le fonctionnement des requêtes dans Qdrant
  • Expérimenter le filtrage dans Qdrant pour vérifier son fonctionnement

Cet article a été publié dans le cadre du Data Science Blogathon.

Qu’est-ce que les embeddings ?

Les embeddings vectoriels sont un moyen d’exprimer des données sous forme numérique, c’est-à-dire sous forme de nombres dans un espace multidimensionnel ou sous forme de vecteur numérique, quelle que soit le type de données (texte, photos, audio, vidéos, etc.). Les embeddings nous permettent de regrouper des données liées de cette manière. Certaines entrées peuvent être transformées en vecteurs à l’aide de certains modèles. Un modèle d’embedding bien connu créé par Google qui traduit les mots en vecteurs (les vecteurs étant des points avec n dimensions) s’appelle Word2Vec. Chacun des grands modèles de langage a un modèle d’embedding qui génère un embedding pour le LLM.

À quoi servent les embeddings ?

Un avantage de la traduction des mots en vecteurs est qu’elle permet la comparaison. Lorsqu’on donne deux mots en tant qu’entrées numériques ou vecteurs d’embedding, un ordinateur peut les comparer même s’il ne peut pas les comparer directement. Il est possible de regrouper des mots ayant des embeddings comparables. Par exemple, les termes “Roi”, “Reine”, “Prince” et “Princesse” apparaitront dans un groupe car ils sont liés les uns aux autres.

De cette manière, les embeddings nous aident à localiser les mots liés à un terme donné. Cela peut être utilisé dans les phrases, où nous saisissons une phrase et les données fournies renvoient des phrases liées. Cela sert de base à de nombreux cas d’utilisation, notamment les chatbots, la similarité des phrases, la détection d’anomalies et la recherche sémantique. Les chatbots que nous développons pour répondre aux questions basées sur un PDF ou un document utilisent cette notion d’embedding. Cette méthode est utilisée par tous les grands modèles de langage génératif pour obtenir un contenu qui est connecté de manière similaire aux requêtes qui leur sont fournies.

Qu’est-ce que les bases de données vectorielles ?

Comme mentionné précédemment, les embeddings sont des représentations de tout type de données, généralement des données non structurées, sous forme numérique dans un espace multidimensionnel. Maintenant, où les stockons-nous ? Les systèmes de gestion de bases de données relationnelles traditionnels ne peuvent pas être utilisés pour stocker ces embeddings vectoriels. C’est là que les Vector Stores / Vector Databases entrent en jeu. Les Vector Databases sont conçues pour stocker et récupérer des embeddings vectoriels de manière efficace. Il existe de nombreux Vector Stores, qui diffèrent par les modèles d’embedding qu’ils prennent en charge et le type d’algorithme de recherche qu’ils utilisent pour obtenir des vecteurs similaires.

Qu’est-ce que Qdrant ?

Qdrant est le nouveau moteur de recherche de similarité vectorielle et une base de données vectorielle, offrant un service prêt à l’emploi construit en Rust, le langage connu pour sa sécurité. Qdrant est livré avec une API conviviale conçue pour stocker, rechercher et gérer des Points de haute dimension (Les Points sont simplement des embeddings vectoriels) enrichis de métadonnées appelées payloads. Ces payloads deviennent des informations précieuses, améliorant la précision de la recherche et fournissant des données instructives aux utilisateurs. Si vous êtes familier avec d’autres bases de données vectorielles comme Chroma, un Payload est similaire aux métadonnées, il contient des informations sur les vecteurs.

Le fait que Qdrant soit écrit en Rust en fait un Vector Store rapide et fiable même sous des charges importantes. Ce qui différencie Qdrant des autres bases de données, c’est le nombre d’API client qu’il prend en charge. Actuellement, Qdrant prend en charge Python, TypeSciprt/JavaScript, Rust et Go. Il utilise HSNW (Hierarchical Navigable Small World Graph) pour l’indexation vectorielle et propose de nombreuses métriques de distance telles que le cosinus, le produit scalaire et l’euclidienne. Il dispose également d’une API de recommandation incluse.

Connaître la Terminologie Qdrant

Pour commencer en douceur avec Qdrant, il est bon de se familiariser avec la terminologie / les principaux composants utilisés dans la base de données vectorielle Qdrant.

Collections

Les collections sont des ensembles de points nommés, où chaque point contient un vecteur et une ID facultative et une charge utile. Les vecteurs de la même collection doivent avoir la même dimensionalité et être évalués avec une seule métrique choisie.

Métrique de Distance

Essentiels pour mesurer la proximité entre les vecteurs, les métriques de distance sont sélectionnées lors de la création d’une collection. Qdrant propose les métriques de distance suivantes : Dot, Cosinus et Euclidienne.

Points

L’entité fondamentale dans Qdrant, les points sont composés d’un plongement vectoriel, d’une ID facultative et d’une charge utile associée, où id: un identifiant unique pour chaque plongement vectoriel vector: Une représentation multidimensionnelle des données, qui peut être structurée ou non structurée, comme des images, du texte, des documents, des PDF, des vidéos, de l’audio, etc. payload: Un objet JSON optionnel contenant des données associées à un vecteur. Cela peut être considéré comme similaire aux métadonnées et nous pouvons travailler avec cela pour filtrer le processus de recherche.

Stockage

Qdrant propose deux options de stockage :

  • Stockage en mémoire : Stocke tous les vecteurs en RAM, optimisant la vitesse en minimisant l’accès au disque pour les tâches de persistance.
  • Stockage memmap : Crée un espace d’adressage virtuel lié à un fichier sur disque, en équilibrant la vitesse et les exigences de persistance.

Voici les concepts principaux dont nous devons être conscients pour pouvoir commencer rapidement avec Qdrant.

Qdrant Cloud – Création de notre Premier Cluster

Qdrant propose un service cloud évolutif pour stocker et gérer des vecteurs. Il fournit même un Cluster gratuit de 1 Go, sans avoir besoin d’informations de carte de crédit. Dans cette section, nous passerons en revue le processus de création d’un compte avec Qdrant Cloud et de création de notre premier cluster.

En allant sur le site Web de Qdrant, nous verrons une page d’accueil comme celle ci-dessus. Nous pouvons nous inscrire à Qdrant soit avec un compte Google, soit avec un compte GitHub.

Après vous être connecté, vous verrez l’interface utilisateur indiquée ci-dessus. Pour créer un cluster, allez dans le volet de gauche et cliquez sur l’option Clusters sous le tableau de bord. Comme nous venons de nous connecter, nous n’avons aucun cluster. Cliquez sur Créer un cluster pour en créer un nouveau.

Maintenant, nous pouvons donner un nom à notre cluster. Assurez-vous que toutes les configurations sont définies sur la position de départ, car cela nous donne un cluster gratuit. Nous pouvons choisir l’un des fournisseurs indiqués ci-dessus et choisir l’une des régions qui y sont associées.

Vérifiez la configuration actuelle

Nous pouvons voir à gauche la configuration actuelle, c’est-à-dire 0,5 vCPU, 1 Go de RAM et 4 Go de stockage sur disque. Cliquez sur Créer pour créer notre cluster.

Pour accéder à notre tout nouveau cluster créé, nous avons besoin d’une clé API. Pour créer une nouvelle clé API, allez dans le contrôle d’accès aux données sous le tableau de bord. Cliquez sur le bouton Créer pour créer une nouvelle clé API.

Comme indiqué ci-dessus, nous serons présentés avec un menu déroulant où nous sélectionnons le Cluster pour lequel nous devons créer l’API. Comme nous n’avons qu’un seul Cluster, nous le sélectionnons et cliquons sur le bouton OK.

Ensuite, vous serez présenté avec le jeton API indiqué ci-dessus. De plus, si nous regardons la partie inférieure de l’image, nous disposons même du fragment de code pour connecter notre Cluster, que nous utiliserons dans la prochaine section.

Qdrant – Pratique

Dans cette section, nous travaillerons avec la base de données vectorielle de Qdrant. Tout d’abord, nous commencerons par importer les bibliothèques nécessaires.

!pip install sentence-transformers!pip install qdrant_client

La première ligne installe la bibliothèque Python sentence-transformer. La bibliothèque sentence transformer est utilisée pour générer des incorporations de phrases, de texte et d’images. Nous pouvons utiliser cette bibliothèque pour importer différents modèles d’incorporation afin de créer des incorporations. La déclaration suivante installe le client qdrant pour Python. Commençons par créer notre client.

from qdrant_client import QdrantClientclient = QdrantClient(url="YOUR CLUSTER URL", api_key="YOUR API KEY",)

QdrantClient

Dans le code ci-dessus, nous instancions le client en important la classe QdrantClient et en fournissant l’URL du Cluster et la clé API que nous venons de créer il y a un moment. Ensuite, nous allons importer notre modèle d’incorporation.

# importer notre modèle d'incorporationfrom sentence_transformers import SentenceTransformermodel = SentenceTransformer('sentence-transformers/all-mpnet-base-v2')

Dans le code ci-dessus, nous utilisons la classe SentenceTransformer pour instancier un modèle. Le modèle d’incorporation que nous utilisons est le all-mpnet-base-v2. Il s’agit d’un modèle d’incorporation vectorielle généraliste largement populaire. Ce modèle prendra du texte en entrée et produira un vecteur à 768 dimensions. Définissons maintenant nos données.

# donnéesdocuments = [    """Les éléphants, les plus grands mammifères terrestres, font preuve d'une intelligence remarquable et de liens sociaux, s'appuyant sur leurs puissantes trompes pour communiquer et effectuer diverses tâches telles que soulever des objets et chercher de la nourriture.""",    """Les pingouins, des oiseaux incapables de voler adaptés à la vie dans l'eau, présentent des structures sociales solides et des compétences exceptionnelles en matière de parentalité. Leur silhouette élancée leur permet de nager efficacement et ils endurent les conditions difficiles de l'Antarctique dans des colonies très soudées.""",    """Les voitures, des modes de transport polyvalents, existent en différentes formes et tailles, des petites voitures citadines aux puissants véhicules de sport, offrant un éventail de fonctionnalités pour différents besoins et préférences.""",    """Les motos, des machines agiles à deux roues, offrent une expérience de conduite excitante et libératrice, attirant les enthousiastes qui apprécient la vitesse, l'agilité et la liberté de la route ouverte.""",    """Les tigres, majestueux félins, sont des chasseurs solitaires au pelage rayé distinctif. Leur corpulence puissante et leurs mouvements furtifs en font des prédateurs redoutables, mais leurs populations sont menacées en raison de la perte d'habitat et du braconnage."""]

Dans le code ci-dessus, nous avons une variable appelée “documents” qui contient une liste de 5 chaînes de caractères (considérons chacune d’entre elles comme un seul document). Chaque chaîne de données est liée à un sujet particulier. Certaines données sont liées aux éléments et d’autres aux automobiles. Créons maintenant des incorporations pour les données.

# incorporation des donnésembbeddings = model.encode(documents)print(embeddings.shape)

Nous utilisons la fonction encode() de l’objet modèle pour encoder nos données. Pour encoder, nous passons directement la liste des documents à la fonction encode() et stockons les vecteurs d’incorporation résultants dans la variable “embeddings”. Nous imprimons également la forme des incorporations, qui sera ici de (5, 768). Cela est dû au fait que nous avons 5 points de données, c’est-à-dire 5 documents, et pour chaque document, un vecteur d’incorporation de 768 dimensions est créé.

Créez votre collection

Nous allons maintenant créer notre collection.

from qdrant_client.http.models import VectorParams, Distanceclient.create_collection(collection_name = "my-collection",vectors_config = VectorParams(size=768,distance=Distance.COSINE))
  • Pour créer une Collection, nous travaillons avec la fonction create_collection() de l’objet client, et à “Collection_name”, nous passons notre nom de Collection, c’est-à-dire “ma-collection”
  • VectorParams : Cette classe de qdrant est utilisée pour la configuration des vecteurs, comme la taille de l’encastrement vectoriel, la métrique de distance, etc.
  • Distance : Cette classe de qdrant est utilisée pour définir la métrique de distance à utiliser pour interroger les vecteurs
  • Maintenant, pour la variable vector_config, nous passons notre configuration, c’est-à-dire la taille des encastrements vectoriels, c’est-à-dire 786, et la métrique de distance que nous voulons utiliser, qui est COSINE

Ajouter des encastrements vectoriels

Nous avons maintenant créé avec succès notre Collection. Maintenant, nous allons ajouter nos encastrements vectoriels à cette Collection.

from qdrant_client.http.models import Batchclient.upsert (    collection_name = "ma-collection",    points = Batch(        ids = [1,2,3,4,5],        payloads= [            {"category":"animaux"},            {"category":"animaux"},            {"category":"automobiles"},            {"category":"automobiles"},            {"category":"animaux"}        ],        vectors = embeddings.tolist()    ))
  • Pour ajouter des données à qdrant, nous appelons la méthode upsert() et passons le nom de la Collection et les Points. Comme nous l’avons appris précédemment, un Point est composé de vecteurs, d’un index facultatif et de charges utiles. La classe Batch de qdrant nous permet d’ajouter des données par lots au lieu de les ajouter une par une.
  • ids : Nous attribuons un ID à nos documents. Actuellement, nous attribuons une plage de valeurs de 1 à 5 car nous avons 5 documents sur notre liste.
  • payloads : Comme nous l’avons vu précédemment, la charge utile contient des informations sur les vecteurs, comme des métadonnées. Nous les fournissons sous forme de paires clé-valeur. Pour chaque document, nous avons fourni une charge utile ici, nous attribuons les informations de catégorie pour chaque document.
  • vectors : Ce sont les encastrements vectoriels des documents. Nous les convertissons en liste à partir d’un tableau numpy et les nourrissons.

Ainsi, après l’exécution de ce code, les encastrements vectoriels sont ajoutés à la Collection. Pour vérifier s’ils ont été ajoutés, nous pouvons visiter le tableau de bord cloud fourni par Qdrant Cloud. Pour cela, nous faisons ce qui suit :

Nous cliquons sur le tableau de bord, puis une nouvelle page s’ouvre.

C’est le tableau de bord de qdrant. Vérifiez ici la collection “ma-collection“. Cliquez dessus pour voir ce qu’elle contient.

Dans le cloud Qdrant, nous constatons que nos Points (vecteurs + charge utile + ID) sont effectivement ajoutés à notre Collection dans notre Cluster. Dans la section de suivi, nous apprendrons comment interroger ces vecteurs.

Interroger la base de données de vecteurs Qdrant

Dans cette section, nous allons passer en revue l’interrogation de la base de données de vecteurs et même essayer d’ajouter des filtres pour obtenir un résultat filtré. Pour interroger notre base de données de vecteurs qdrant, nous devons d’abord créer un vecteur de requête, ce que nous pouvons faire en :

query = model.encode(['Les animaux vivent dans la forêt'])

Vecteur de requête

Ce qui suit va créer notre encastrement de requête. Ensuite, en utilisant cela, nous interrogerons notre magasin de vecteurs pour obtenir les encastrements vectoriels les plus pertinents.

“`html

client.search(collection_name = "my-collection", query_vector = query[0], limit = 4)

Requête de recherche()

Pour effectuer une requête, nous utilisons la méthode search() de l’objet client en lui passant les paramètres suivants:

  • Collection_name: Le nom de notre Collection
  • query_vector: Le vecteur de requête sur lequel nous voulons effectuer la recherche dans le vecteur store
  • limit: Le nombre de résultats de recherche que nous voulons limiter pour la fonction search()

L’exécution du code produira le résultat suivant:

Nous constatons que pour notre requête, les documents les plus pertinents sont de la catégorie animaux. Nous pouvons donc dire que la recherche est efficace. Essayons maintenant avec une autre requête pour obtenir des résultats différents. Les vecteurs ne sont pas affichés/récupérés par défaut, ils sont donc définis sur None.

query = model.encode(['Les véhicules polluent le monde'])client.search(collection_name = "my-collection", query_vector = query[0], limit = 3)

Cette fois, nous avons fourni une requête liée aux véhicules et la base de données de vecteurs a réussi à récupérer les documents de la catégorie pertinente (automobile) en premier. Et maintenant, que faire si nous voulons effectuer un filtrage? Nous pouvons le faire en utilisant :

from qdrant_client.http.models import Filter, FieldCondition, MatchValuequery = model.encode(['Les animaux vivent dans la forêt'])custom_filter = Filter(must = [FieldCondition(key = "category", match = MatchValue(value="animaux"))])
  • Tout d’abord, nous créons notre vecteur/donées de requête
  • Ici, nous importons les classes Filter, FieldCondition et MatchValue de la bibliothèque qdrant.
  • Filter: Utilisez cette classe pour créer un objet filtre
  • FieldCondition: Cette classe sert à créer le filtre, en précisant sur quoi nous voulons appliquer le filtrage de la recherche
  • MatchValue: Cette classe sert à préciser sur quelle valeur pour une clé donnée nous voulons que la base de données de vecteurs de qdrant effectue un filtrage

Ainsi, dans le code ci-dessus, nous disons essentiellement que nous créons un Filtre qui vérifie que la FieldCondition avec la clé “catégorie” dans la Payload correspond(MatchValue) à la valeur “animaux“. Cela semble un peu long pour un simple filtre, mais cette approche rendra notre code plus structuré lorsque nous traiterons une Payload contenant beaucoup d’informations et que nous voulons filtrer sur plusieurs clés. Maintenant, utilisons le filtre dans notre recherche.

client.search(collection_name = "my-collection", query_vector = query[0], query_filter = custom_filter, limit = 4)

Filtre de requête

Ici, cette fois, nous utilisons même une variable query_filter qui prend le Filtre personnalisé que nous avons défini. Notez que nous avons limité la recherche aux 4 meilleurs documents correspondants. La requête concerne les animaux. L’exécution du code donnera le résultat suivant:

Dans la sortie, nous n’avons reçu que les 3 meilleurs documents les plus proches, même si nous avons 5 documents. C’est parce que nous avons défini notre filtre pour choisir uniquement les catégories d’animaux et qu’il n’y a que 3 documents avec cette catégorie. De cette manière, nous pouvons stocker les vecteurs d’encodage dans le cloud de qdrant, effectuer une recherche vectorielle sur ces vecteurs d’encodage et récupérer les plus proches, et même appliquer des filtres pour filtrer les résultats :

“`

Applications

Les applications suivantes peuvent utiliser la base de données de vecteurs Qdrant :

  • Systèmes de recommandation : Qdrant peut alimenter les moteurs de recommandation en faisant correspondre efficacement les vecteurs de haute dimension, ce qui le rend adapté aux recommandations de contenu personnalisé dans des plateformes telles que les services de streaming, le commerce électronique ou les réseaux sociaux.
  • Recherche d’images et de multimédias : En exploitant la capacité de Qdrant à manipuler des vecteurs représentant des images et des contenus multimédias, les applications peuvent mettre en œuvre des fonctionnalités de recherche et de récupération efficaces pour les bases de données d’images ou les archives multimédias.
  • Applications de traitement du langage naturel (NLP) : Le support de Qdrant pour les embeddings de vecteurs le rend précieux pour les tâches de NLP, telles que la recherche sémantique, la correspondance de similarité entre documents et la recommandation de contenu dans les applications traitant de grandes quantités de jeux de données textuels.
  • Détection d’anomalies : La recherche de vecteurs haute dimension de Qdrant peut être utilisée dans les systèmes de détection d’anomalies. En comparant les vecteurs représentant un comportement normal avec les données entrantes, les anomalies peuvent être identifiées dans des domaines tels que la sécurité réseau ou la surveillance industrielle.
  • Recherche et correspondance de produits : Dans les plateformes de commerce électronique, Qdrant améliore les capacités de recherche de produits en faisant correspondre les vecteurs représentant les caractéristiques des produits, ce qui facilite des recommandations précises et efficaces basées sur les préférences des utilisateurs.
  • Filtrage basé sur le contenu dans les réseaux sociaux : La recherche de vecteurs de Qdrant peut être utilisée dans les réseaux sociaux pour le filtrage basé sur le contenu. Les utilisateurs peuvent obtenir du contenu pertinent en fonction de la similarité des représentations vectorielles, ce qui améliore l’engagement des utilisateurs.

Conclusion

À mesure que la demande en matière de représentation efficace des données augmente, Qdrant se distingue en tant qu’outil de recherche de similarité de vecteurs open source, riche en fonctionnalités, écrit dans le langage robuste et sécurisé Rust. Qdrant comprend tous les métriques de distance populaires et offre un moyen robuste de filtrer notre recherche de vecteurs. Avec ses fonctionnalités riches, son architecture native du cloud et sa terminologie robuste, Qdrant ouvre la voie à une nouvelle ère dans la technologie de recherche de similarité de vecteurs. Même s’il est nouveau dans le domaine, il propose des bibliothèques clientes pour de nombreux langages de programmation et offre un cloud qui s’adapte efficacement à la taille.

Points clés

Voici quelques points clés :

  • Créé en Rust, Qdrant garantit à la fois la vitesse et la fiabilité, même sous de lourdes charges, ce qui en fait le meilleur choix pour les magasins de vecteurs haute performance.
  • Ce qui distingue Qdrant, c’est son support pour les API clientes, qui répondent aux besoins des développeurs en Python, TypeScript/JavaScript, Rust et Go.
  • Qdrant exploite l’algorithme HSNW et propose différentes métriques de distance, notamment le produit scalaire, le cosinus et l’euclidienne, permettant aux développeurs de choisir la métrique qui correspond à leurs cas d’utilisation spécifiques.
  • Qdrant passe de manière transparente vers le cloud avec un service cloud évolutif, offrant une option gratuite pour l’exploration. Son architecture native du cloud garantit des performances optimales, quelle que soit la quantité de données.

Questions fréquemment posées

Les médias présentés dans cet article n’appartiennent pas à Analytics Vidhya et sont utilisés à la discrétion de l’auteur.

We will continue to update IPGirl; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Apprentissage automatique

Forged in Flames Une start-up fusionne l'IA générative et la vision par ordinateur pour lutter contre les incendies de forêt.

Quand le ciel de Californie est devenu orange à la suite des incendies dévastateurs, une start-up a fusionné la visio...

AI

Kick Ass Midjourney Prompts avec Poe

Essayez ce chatbot Poe pour affiner vos stimuli Midjourney et obtenir (espérons-le ?) des résultats impressionnants d...

AI

Reka AI présente Yasa-1 un assistant linguistique multimodal doté de capteurs visuels et auditifs qui peut agir par l'exécution de code.

La demande de assistants linguistiques plus avancés et polyvalents a augmenté de manière constante dans le paysage en...

AI

Meta AI publie Code Llama Un modèle de langage de pointe pour la programmation.

Dans le paysage en constante évolution du développement logiciel, le besoin d’outils de codage efficaces et pro...

AI

Exploration de NLP - Démarrage de NLP (Étape n°1)

Ce semestre, j'ai l'apprentissage automatique du langage naturel (NLP) dans mon programme. Hourra. Donc, dans le cadr...