Sammlungen
Das Konzept der Sammlungen in der Qdrant-Vektordatenbank kann analog zur Tabellenstruktur in MYSQL sein, die zur einheitlichen Speicherung derselben Art von Vektordaten verwendet wird. Jedes in einer Sammlung gespeicherte Datum wird in Qdrant als Punkt bezeichnet. Hier ist ein Punkt ähnlich dem mathematischen geometrischen Raumkonzept und stellt die Darstellung eines Vektors im geometrischen Raum dar (betrachten Sie ihn einfach als ein Datenstück).
In derselben Sammlung muss der Vektor jedes Punktes dieselben Dimensionen aufweisen und mit einer einzelnen Metrik verglichen werden. Benannte Vektoren können verwendet werden, um mehrere Vektoren in einem einzigen Punkt zu enthalten, wobei jeder Vektor eigene Dimensionen und metrische Anforderungen hat.
Distanzmetriken werden zur Messung der Ähnlichkeit zwischen Vektoren verwendet. Die Wahl der Metrik hängt davon ab, wie die Vektoren erhalten werden, insbesondere die Methode, die zur Schulung von neuronalen Netzwerkencodern verwendet wird.
Qdrant unterstützt die folgenden beliebten Arten von Metriken:
- Punktprodukt: Dot
- Kosinus-Ähnlichkeit: Cosine
- Euklidischer Abstand: Euclid
Zur Verbesserung der Sucheffizienz wird die Kosinus-Ähnlichkeit durch das Skalarprodukt von normalisierten Vektoren erreicht. Beim Hochladen werden Vektoren automatisch normalisiert. Neben Metriken und Vektorgrößen verwendet jede Sammlung auch eine eigene Reihe von Parametern zur Steuerung der Sammlungsoptimierung, Indexerstellung und Bereinigung. Diese Einstellungen können jederzeit über die entsprechenden Anfragen geändert werden.
Einrichten von Multi-Tenancy
Wie viele Sammlungen sollten erstellt werden? In den meisten Fällen reicht es aus, nur eine einzelne Sammlung mit partitionierter Payload zu verwenden. Dieser Ansatz wird als Multi-Tenancy bezeichnet. Für die meisten Benutzer ist dies effizient, erfordert jedoch zusätzliche Konfiguration. Erfahren Sie, wie Sie Multi-Tenancy einrichten.
Wann sollten mehrere Sammlungen erstellt werden? Wenn Sie nur eine begrenzte Anzahl von Benutzern haben und eine Isolierung benötigen. Dieser Ansatz ist flexibler, kann jedoch teurer sein, da das Erstellen einer großen Anzahl von Sammlungen zu Ressourcenüberlastung führen kann. Außerdem müssen Sie sicherstellen, dass sie sich in keiner Weise gegenseitig beeinflussen, einschließlich in Bezug auf die Leistung.
Erstellen einer Sammlung
PUT /collections/{sammlungsname}
{
"vektoren": {
"größe": 300,
"abstand": "Cosine"
}
}
Zusätzlich zu den erforderlichen Optionen können auch benutzerdefinierte Werte für die folgenden Sammlungsoptionen festgelegt werden:
-
hnsw_config
- Für Indexdetails siehe den Indexabschnitt. -
wal_config
- Konfiguration im Zusammenhang mit dem Write-Ahead-Logging. Für genauere Informationen zum WAL siehe die entsprechende Dokumentation. -
optimizers_config
- Für Details zu Optimierern siehe den Optimizerabschnitt. -
shard_number
- Definiert, wie viele Shards die Sammlung haben sollte. Weitere Informationen finden Sie im Abschnitt zur verteilten Bereitstellung. -
on_disk_payload
- Definiert den Speicherort für die Speicherung von Payload-Daten. Wenn auftrue
gesetzt, werden die Payload-Daten nur auf der Festplatte gespeichert. Dies kann sehr nützlich sein, um den RAM-Verbrauch bei der Arbeit mit großen Payloads zu begrenzen. -
quantization_config
- Detaillierte Informationen zur Quantisierung finden Sie unter Quantisierung.
Die Standardparameter für optionale Sammlungsparameter sind in der Konfigurationsdatei definiert.
Für weitere Informationen zu Sammlungs- und Vektorparametern siehe Schema-Definition und Konfigurationsdatei.
Verfügbar ab v1.2.0
Vektoren werden im RAM gespeichert, um einen sehr schnellen Zugriff zu ermöglichen. Der on_disk
-Parameter kann in der Vektor-Konfiguration festgelegt werden. Wenn er auf true gesetzt ist, werden alle Vektoren auf der Festplatte gespeichert. Dies ermöglicht die Verwendung von Memory Mapping, was bei der Arbeit mit großen Datenmengen geeignet ist.
Erstellen einer Sammlung aus einer anderen Sammlung
Verfügbar ab v1.0.0
Eine Sammlung kann aus einer anderen vorhandenen Sammlung initialisiert werden.
Dies kann nützlich sein, um schnell verschiedene Konfigurationen desselben Datensatzes auszuprobieren.
Beim Festlegen der Vektor-Konfiguration in der neuen Sammlung stellen Sie sicher, dass die Vektoren dieselbe Größe und Abstandsfunktion wie in der ursprünglichen Sammlung haben.
PUT /collections/{sammlungsname}
{
"vektoren": {
"größe": 300,
"abstand": "Cosine"
},
"init_from": {
"sammlung": {from_collection_name}
}
}
Multi-Vektor-Sammlung
Verfügbar ab v0.10.0
Jeder Datensatz kann mehrere Vektoren enthalten. Diese Funktion ermöglicht es, mehrere Vektoren in einer Sammlung zu speichern. Um die Vektoren innerhalb eines Datensatzes zu unterscheiden, definieren Sie ihre eindeutigen Namen bei der Erstellung der Sammlung. Jeder benannte Vektor unter diesem Schema hat seine eigene Distanz und Größe:
PUT /collections/{collection_name}
{
"vectors": {
"image": {
"size": 4,
"distance": "Punkt"
},
"text": {
"size": 8,
"distance": "Cosinus"
}
}
}
In einigen besonderen Fällen kann auch eine Sammlung ohne Vektorspeicher erstellt werden.
Verfügbar ab v1.1.1
Für jeden benannten Vektor können Sie optional hnsw_config
oder quantization_config
angeben, um von der Sammlungskonfiguration abzuweichen. Dies kann genutzt werden, um die Suchleistung auf Vektorebene zu optimieren.
Verfügbar ab v1.2.0
Vektoren werden im Speicher für einen schnellen Zugriff gespeichert. Für jeden Vektor kann on_disk
auf true
gesetzt werden, um alle Vektoren dauerhaft auf der Festplatte zu speichern. Dies ermöglicht Memory-Mapping und ist geeignet für die Aufnahme großer Datenmengen.
Löschen einer Sammlung
DELETE /collections/{collection_name}
Aktualisierung von Sammlungsparametern
Dynamische Parameteraktualisierungen können hilfreich sein, z.B. für effizienteres initiales Laden von Vektoren. Sie können z.B. das Indexieren während des Hochladens deaktivieren und unmittelbar nach Abschluss des Hochladens aktivieren. Auf diese Weise verschwenden Sie keine zusätzlichen Rechenressourcen für den Wiederaufbau des Index.
Der folgende Befehl aktiviert das Indexieren für ein Segment mit Vektoren, die größer als 10000 kB sind:
PATCH /collections/{collection_name}
{
"optimizers_config": {
"indexing_threshold": 10000
}
}
Die folgenden Parameter können aktualisiert werden:
-
optimizers_config
- Siehe detaillierte Beschreibungen der Optimierer. -
hnsw_config
- Siehe detaillierte Beschreibungen des Index. -
quantization_config
- Siehe detaillierte Beschreibungen der Quantisierung. -
vectors
- Konfiguration für spezifische Vektoren, einschließlich ihrer jeweiligenhnsw_config
,quantization_config
undon_disk
-Einstellungen. -
params
- Weitere Sammlungsparameter, einschließlichwrite_consistency_factor
undon_disk_payload
.
Die vollständige API-Spezifikation finden Sie in den Schema-Definitionen.
Verfügbar seit v1.4.0
Qdrant 1.4 ermöglicht die Aktualisierung weiterer Sammlungsparameter zur Laufzeit. HNSW-Index, Quantisierung und Konfiguration für die Festplatte können nun geändert werden, ohne die Sammlung neu zu erstellen. Segmente (mit Index- und Quantisierungsdaten) werden im Hintergrund automatisch neu erstellt, um den aktualisierten Parametern zu entsprechen.
Im folgenden Beispiel werden die gesamte Sammlung und die HNSW-Index- und Quantisierungsparameter für my_vector
aktualisiert:
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
}
}
}
Hinweis: Um Vektorparameter in einer Sammlung ohne benannte Vektoren zu aktualisieren, kann ein leerer Name (""
) verwendet werden.
Aufrufe dieses Endpunkts können blockieren, während auf den Abschluss der existierenden Optimierer gewartet wird. Wir empfehlen die Verwendung dieses Features nicht in einer Produktionsdatenbank, da der Wiederaufbau des Index signifikante Overheads verursachen kann.
Informationen zur Kollektion
Qdrant ermöglicht die Bestimmung von Konfigurationsparametern für eine vorhandene Kollektion, um eine bessere Vorstellung von der Verteilung der Punkte und der Indexierungssituation zu erhalten.
GET /collections/{collection_name}
{
"result": {
"status": "green",
"optimizer_status": "ok",
"vectors_count": 1068786,
"indexed_vectors_count": 1024232,
"points_count": 1068786,
"segments_count": 31,
"config": {
"params": {
"vectors": {
"size": 384,
"distance": "Cosine"
},
"shard_number": 1,
"replication_factor": 1,
"write_consistency_factor": 1,
"on_disk_payload": false
},
"hnsw_config": {
"m": 16,
"ef_construct": 100,
"full_scan_threshold": 10000,
"max_indexing_threads": 0
},
"optimizer_config": {
"deleted_threshold": 0.2,
"vacuum_min_vector_number": 1000,
"default_segment_number": 0,
"max_segment_size": null,
"memmap_threshold": null,
"indexing_threshold": 20000,
"flush_interval_sec": 5,
"max_optimization_threads": 1
},
"wal_config": {
"wal_capacity_mb": 32,
"wal_segments_ahead": 0
}
},
"payload_schema": {}
},
"status": "ok",
"time": 0.00010143
}
Wenn Vektoren in die Kollektion eingefügt werden, kann sich das Feld status
während der Optimierung auf "gelb" ändern und wird wieder "grün", sobald alle Punkte erfolgreich verarbeitet wurden.
Die folgenden Farbzustände können auftreten:
- ?
grün
: Kollektion ist bereit - ?
gelb
: Kollektion wird optimiert - ?
rot
: Die Engine hat einen nicht wiederherstellbaren Fehler festgestellt
Einige andere interessante Eigenschaften sind:
-
points_count
- Gesamtanzahl von Objekten (Vektoren und deren Payloads), die in der Kollektion gespeichert sind -
vectors_count
- Gesamtanzahl von Vektoren in der Kollektion. Wenn jedes Objekt mehrere Vektoren hat, entspricht dies möglicherweise nichtpoints_count
. -
indexed_vectors_count
- Gesamtanzahl der Vektoren, die im HNSW-Index gespeichert sind. Qdrant speichert nicht alle Vektoren im Index, sondern nur diejenigen, die auf Grundlage der gegebenen Konfiguration Indexsegmente erstellen können.
Indizierung von Vektoren in HNSW
In einigen Fällen kann es vorkommen, dass der Wert von indexed_vectors_count
kleiner ist als vectors_count
. Dies ist ein beabsichtigtes Verhalten, das von der Konfiguration des Optimierers abhängt. Ein neues Indexsegment wird erstellt, wenn die Größe der nicht indizierten Vektoren den Wert von indexing_threshold
(in KB) überschreitet. Wenn Ihre Kollektion sehr klein ist oder die Vektordimension niedrig ist, können möglicherweise keine HNSW-Segmente erstellt werden, und indexed_vectors_count
kann 0
entsprechen.
Sie können den Wert von indexing_threshold
in den Kollektionsparametern reduzieren, um ein neues Indexsegment in der vorhandenen Kollektion zu erstellen.
Kollektionsalias
In einer Produktionsumgebung kann es erforderlich sein, nahtlos zwischen verschiedenen Versionen von Vektoren zu wechseln, z. B. ein Upgrade auf eine neue Version neuronaler Netzwerke.
In solchen Fällen ist es möglicherweise nicht machbar, den Dienst zu stoppen und die Kollektion mit den neuen Vektoren neu aufzubauen. Ein Alias ist ein zusätzlicher Name für eine vorhandene Kollektion. Abfragen können vollständig unter Verwendung des Alias anstelle des Kollektionsnamens ausgeführt werden.
Daher kann im Hintergrund eine zweite Kollektion erstellt werden, und dann kann der Alias von der alten Kollektion auf die neue Kollektion umgeschaltet werden. Da Aliasänderungen atomar sind, werden gleichzeitig auftretende Anfragen während des Umschaltvorgangs nicht beeinträchtigt.
Alias erstellen
POST /collections/aliases
{
"actions": [
{
"create_alias": {
"alias_name": "production_collection",
"collection_name": "example_collection"
}
}
]
}
Alias löschen
POST /collections/aliases
{
"actions": [
{
"delete_alias": {
"alias_name": "production_collection"
}
}
]
}
Kollektion umschalten
Mehrere Aliasoperationen können atomar ausgeführt werden. Beispielsweise können Sie den folgenden Befehl verwenden, um die zugrunde liegende Kollektion umzuschalten:
POST /collections/aliases
{
"actions": [
{
"delete_alias": {
"alias_name": "production_collection"
}
},
{
"create_alias": {
"alias_name": "production_collection",
"collection_name": "new_collection"
}
}
]
}
Auflistung von Sammlung Aliasen
GET /sammlungen/{sammlungsname}/aliasen
Auflistung aller Aliase
GET /aliase
Auflistung aller Sammlungen
GET /sammlungen