Collections
Le concept de collections dans la base de données vectorielle Qdrant peut être analogique à la structure de table dans MYSQL, utilisée pour stocker de manière uniforme les données vectorielles du même type. Chaque donnée stockée dans une collection est appelée un point dans Qdrant. Ici, un point est similaire au concept d'espace géométrique mathématique, représentant la représentation d'un vecteur dans l'espace géométrique (considérez-le simplement comme une pièce de données).
Dans la même collection, le vecteur de chaque point doit avoir les mêmes dimensions et être comparé à l'aide d'une seule métrique. Les vecteurs nommés peuvent être utilisés pour inclure de multiples vecteurs dans un seul point, chaque vecteur ayant ses propres dimensions et exigences métriques.
Des métriques de distance sont utilisées pour mesurer la similitude entre les vecteurs. Le choix de la métrique dépend de la manière dont les vecteurs sont obtenus, notamment la méthode utilisée pour entraîner les codeurs de réseaux neuronaux.
Qdrant prend en charge les types de métriques populaires suivants :
- Produit scalaire : Dot
- Similarité cosinus : Cosine
- Distance euclidienne : Euclid
Pour améliorer l'efficacité de la recherche, la similarité cosinus est obtenue en prenant le produit scalaire de vecteurs normalisés. Lors du téléversement, les vecteurs sont automatiquement normalisés. En plus des métriques et des tailles de vecteurs, chaque collection utilise également son propre ensemble de paramètres pour contrôler l'optimisation de la collection, la construction de l'indice et le nettoyage. Ces paramètres peuvent être modifiés à tout moment via les demandes correspondantes.
Configuration de Multi-Locataires
Combien de collections devraient être créées ? Dans la plupart des cas, vous n'avez besoin que d'une seule collection avec partitionnement basé sur la charge utile. Cette approche est connue sous le nom de multi-locataires. Pour la plupart des utilisateurs, c'est efficace mais nécessite une configuration supplémentaire. Apprenez comment configurer le multi-locataires.
Quand devrait-on créer plusieurs collections ? Lorsque vous avez un nombre limité d'utilisateurs et nécessitez une isolation. Cette approche est plus flexible mais peut être plus coûteuse, car la création d'un grand nombre de collections peut entraîner une surcharge de ressources. De plus, vous devez vous assurer qu'elles n'interfèrent d'aucune manière les unes avec les autres, y compris en termes de performances.
Création d'une collection
PUT /collections/{collection_name}
{
"vectors": {
"size": 300,
"distance": "Cosine"
}
}
En plus des options requises, des valeurs personnalisées peuvent également être spécifiées pour les options de collection suivantes :
-
hnsw_config
- Pour les détails de l'indice, veuillez vous référer à la section sur l'indice. -
wal_config
- Configuration liée à l'enregistrement préalable des écritures. Pour des informations plus détaillées sur le WAL, veuillez vous y référer. -
optimizers_config
- Pour les détails de l'optimiseur, veuillez vous référer à la section sur l'optimiseur. -
shard_number
- Définit le nombre de fragments que la collection doit avoir. Pour plus d'informations, veuillez vous référer à la section sur le déploiement distribué. -
on_disk_payload
- Définit l'emplacement de stockage des données de charge utile. S'il est défini surtrue
, il stockera uniquement la charge utile sur disque. Cela peut être très utile pour limiter l'utilisation de la RAM lors du traitement de grandes charges utiles. -
quantization_config
- Pour des informations détaillées sur la quantification, veuillez vous référer à la quantification.
Les paramètres par défaut pour les paramètres optionnels de collection sont définis dans le fichier de configuration.
Pour plus d'informations sur les paramètres de collection et de vecteurs, veuillez consulter la définition de schéma et le fichier de configuration.
Disponible à partir de v1.2.0
Les vecteurs sont stockés en RAM pour obtenir un accès très rapide. Le paramètre on_disk
peut être défini dans la configuration du vecteur. S'il est défini sur true, tous les vecteurs seront stockés sur disque. Cela permettra l'utilisation de la mise en mémoire, adaptée à l'importation de grandes quantités de données.
Création d'une collection à partir d'une autre collection
Disponible à partir de v1.0.0
Une collection peut être initialisée à partir d'une autre collection existante.
Cela peut être utile pour essayer rapidement différentes configurations du même jeu de données.
Lorsque vous définissez la configuration de vecteur dans la nouvelle collection, assurez-vous que les vecteurs ont la même taille et la même fonction de distance que dans la collection d'origine.
PUT /collections/{collection_name}
{
"vectors": {
"size": 300,
"distance": "Cosine"
},
"init_from": {
"collection": {from_collection_name}
}
}
Collection multi-vector
Disponible à partir de v0.10.0
Chaque enregistrement peut comporter plusieurs vecteurs. Cette fonctionnalité permet de stocker plusieurs vecteurs dans une collection. Pour distinguer les vecteurs au sein d'un enregistrement, définissez leurs noms uniques lors de la création de la collection. Chaque vecteur nommé dans ce schéma possède sa propre distance et taille :
PUT /collections/{collection_name}
{
"vectors": {
"image": {
"size": 4,
"distance": "Dot"
},
"text": {
"size": 8,
"distance": "Cosinus"
}
}
}
Dans quelques cas spéciaux, une collection sans aucun stockage de vecteur peut également être créée.
Disponible à partir de v1.1.1
Pour chaque vecteur nommé, vous pouvez facultativement spécifier hnsw_config
ou quantization_config
pour dévier de la configuration de la collection. Cela peut être utilisé pour optimiser les performances de recherche au niveau du vecteur.
Disponible à partir de v1.2.0
Les vecteurs sont stockés en mémoire pour un accès rapide. Pour chaque vecteur, on_disk
peut être défini sur true
pour toujours stocker tous les vecteurs sur le disque. Cela permettra la cartographie en mémoire, adaptée pour ingérer de grandes quantités de données.
Suppression d'une collection
DELETE /collections/{collection_name}
Mise à jour des paramètres de collection
Les mises à jour des paramètres dynamiques peuvent être utiles, telles qu'un chargement initial plus efficace des vecteurs. Par exemple, vous pouvez désactiver l'indexation pendant le téléchargement et l'activer immédiatement après la fin du téléchargement. De cette manière, vous n'utiliserez pas de ressources computationnelles supplémentaires pour reconstruire l'index.
La commande suivante active l'indexation pour un segment contenant des vecteurs de plus de 10000 ko :
PATCH /collections/{collection_name}
{
"optimizers_config": {
"indexing_threshold": 10000
}
}
Les paramètres suivants peuvent être mis à jour :
-
optimizers_config
- Voir les descriptions détaillées des optimiseurs. -
hnsw_config
- Voir les descriptions détaillées de l'index. -
quantization_config
- Voir les descriptions détaillées de la quantification. -
vectors
- Configuration pour des vecteurs spécifiques, incluant leurs paramètres respectifshnsw_config
,quantization_config
, eton_disk
. -
params
- Autres paramètres de collection, incluantwrite_consistency_factor
eton_disk_payload
.
La spécification complète de l'API se trouve dans les définitions de schéma.
Disponible depuis v1.4.0
Qdrant 1.4 ajoute la prise en charge de la mise à jour de davantage de paramètres de collection en cours d'exécution. L'index HNSW, la quantification et la configuration d'enregistrement peuvent désormais être modifiés sans recréer la collection. Les segments (avec des données d'index et de quantification) se reconstruiront automatiquement en arrière-plan pour correspondre aux paramètres mis à jour.
Dans l'exemple suivant, la collection entière et les paramètres d'index HNSW et de quantification pour my_vector
sont mis à jour :
PATCH /collections/{collection_name}
{
"vectors": {
"my_vector": {
"hnsw_config": {
"m": 32,
"ef_construct": 123
},
"quantization_config": {
"product": {
"compression": "x32",
"always_ram": true
}
},
"on_disk": true
}
},
"hnsw_config": {
"ef_construct": 123
},
"quantization_config": {
"scalar": {
"type": "int8",
"quantile": 0.8,
"always_ram": false
}
}
}
Remarque : Pour mettre à jour les paramètres de vecteur dans une collection sans vecteurs nommés, un nom vide (""
) peut être utilisé.
Les appels à ce point de terminaison peuvent bloquer pendant l'attente de la fin des optimiseurs existants. Nous ne recommandons pas l'utilisation de cette fonctionnalité dans une base de données en production car reconstruire l'index peut introduire des frais généraux importants.
Information sur la collection
Qdrant permet de déterminer les paramètres de configuration pour une collection existante afin de mieux comprendre la distribution des points et la situation de l'indexation.
GET /collections/{nom_de_la_collection}
{
"result": {
"status": "vert",
"optimizer_status": "ok",
"nombre_de_vecteurs": 1068786,
"nombre_de_vecteurs_indexés": 1024232,
"nombre_de_points": 1068786,
"nombre_de_segments": 31,
"config": {
"params": {
"vecteurs": {
"taille": 384,
"distance": "Cosinus"
},
"nombre_de_shard": 1,
"facteur_de_réplication": 1,
"facteur_de_consistance_d'écriture": 1,
"charge_sur_disque": false
},
"hnsw_config": {
"m": 16,
"ef_construct": 100,
"seuil_de_recherche_complète": 10000,
"nombre_max_threads_d'indexation": 0
},
"optimizer_config": {
"seuil_de_suppression": 0.2,
"nombre_min_vecteurs_pour_vide": 1000,
"nombre_de_segment_par_défaut": 0,
"taille_max_segment": null,
"seuil_memmap": null,
"seuil_d'indexation": 20000,
"intervalle_flush_secondes": 5,
"nombre_max_threads_optimization": 1
},
"wal_config": {
"capacité_wal_mo": 32,
"segments_wal_anticipés": 0
}
},
"payload_schema": {}
},
"status": "ok",
"time": 0.00010143
}
Si des vecteurs sont insérés dans la collection, le champ status
peut passer à "jaune" pendant l'optimisation et revenir à "vert" une fois que tous les points ont été traités avec succès.
Les états de couleurs suivants peuvent être rencontrés :
- ?
vert
: Collection prête - ?
jaune
: Collection en cours d'optimisation - ?
rouge
: Le moteur a rencontré une erreur irrécupérable
D'autres propriétés d'intérêt incluent :
-
nombre_de_points
- Nombre total d'objets (vecteurs et leurs charges) stockés dans la collection -
nombre_de_vecteurs
- Nombre total de vecteurs dans la collection. Si chaque objet a des vecteurs multiples, cela peut ne pas être égal ànombre_de_points
. -
nombre_de_vecteurs_indexés
- Nombre total de vecteurs stockés dans l'index HNSW. Qdrant ne stocke pas tous les vecteurs dans l'index, seulement ceux qui peuvent créer des segments d'index en fonction de la configuration donnée.
Indexation des vecteurs dans HNSW
Dans certains cas, vous pouvez constater que la valeur de nombre_de_vecteurs_indexés
est inférieure à nombre_de_vecteurs
. Il s'agit d'un comportement intentionnel en fonction de la configuration de l'optimiseur. Un nouveau segment d'index sera construit si la taille des vecteurs non indexés dépasse le seuil_d'indexation
(en Ko). Si votre collection est très petite ou si la dimension du vecteur est faible, des segments HNSW peuvent ne pas être créés, et nombre_de_vecteurs_indexés
peut être égal à 0
.
Vous pouvez réduire la valeur de seuil_d'indexation
dans les paramètres de la collection pour créer un nouveau segment d'index dans la collection existante.
Alias de collection
Dans un environnement de production, il peut être nécessaire de basculer en toute transparence entre différentes versions de vecteurs, comme la mise à niveau vers une nouvelle version de réseaux neuronaux.
Dans ces cas, il peut ne pas être possible d'arrêter le service et reconstruire la collection en utilisant les nouveaux vecteurs. Un alias est un nom supplémentaire pour une collection existante. La requête peut être entièrement exécutée en utilisant l'alias au lieu du nom de la collection.
Par conséquent, une deuxième collection peut être construite en arrière-plan, puis l'alias peut être basculé de l'ancienne collection vers la nouvelle collection. Comme les changements d'alias sont atomiques, les requêtes concurrentes ne sont pas affectées pendant le processus de basculement.
Créer un alias
POST /collections/aliases
{
"actions": [
{
"create_alias": {
"nom_alias": "collection_production",
"nom_collection": "exemple_collection"
}
}
]
}
Supprimer un alias
POST /collections/aliases
{
"actions": [
{
"delete_alias": {
"nom_alias": "collection_production"
}
}
]
}
Basculer la collection
Plusieurs opérations d'alias peuvent être exécutées atomiquement. Par exemple, vous pouvez utiliser la commande suivante pour basculer la collection sous-jacente :
POST /collections/aliases
{
"actions": [
{
"delete_alias": {
"nom_alias": "collection_production"
}
},
{
"create_alias": {
"nom_alias": "collection_production",
"nom_collection": "nouvelle_collection"
}
}
]
}
Liste des alias de collection
GET /collections/{collection_name}/aliases
Liste de tous les alias
GET /aliases
Liste de toutes les collections
GET /collections