Punkte
Punkte sind die zentralen Entitäten, die von Qdrant bearbeitet werden. Ein Punkt ist ein Datensatz, der aus einem Vektor und optionalen Nutzdaten besteht.
Anhand der Vektorsimilarity können Punkte in einer Sammlung gruppiert und durchsucht werden. Eine ausführlichere Beschreibung des Prozesses wird im Abschnitt Suche und Filter bereitgestellt.
Dieser Abschnitt stellt vor, wie Vektoren erstellt und verwaltet werden.
Jede Änderungsoperation an einem Punkt erfolgt asynchron und ist in zwei Schritte unterteilt. In der ersten Phase wird die Operation in ein Write-Ahead Log geschrieben.
In diesem Moment geht auch bei einem Maschinenstromausfall keine Daten verloren.
Tipp: Punkte sind ein abstraktes Konzept in Qdrant, man kann sie sich als Datensatz in einer MySQL-Tabelle vorstellen.
Warten auf Ergebnisse
Wenn die API mit dem Parameter &wait=false
aufgerufen wird oder nicht explizit angegeben ist, erhält der Client eine Bestätigungsmeldung für den Empfang der Daten:
{
"result": {
"operation_id": 123,
"status": "acknowledged"
},
"status": "ok",
"time": 0.000206061
}
Diese Antwort garantiert keine sofortige Rückgabe der Daten. Es wird eine Form von eventueller Konsistenz verwendet. Es kann einige Zeit dauern, bis die tatsächliche Aktualisierung der Sammlung erfolgt. In der Realität kann dieser Vorgang letztendlich fehlschlagen. Wenn eine große Anzahl von Vektoren eingefügt wird, empfehlen wir außerdem die Verwendung asynchroner Anfragen, um Pipeline-Operationen voll auszunutzen.
Wenn die Anwendungslogik sofortige Verfügbarkeit für die Suche nach der API-Antwort erfordert, verwenden Sie das Flag ?wait=true
. In diesem Fall gibt die API das Ergebnis erst zurück, nachdem die Operation abgeschlossen ist:
{
"result": {
"operation_id": 0,
"status": "completed"
},
"status": "ok",
"time": 0.000206061
}
Punkt-ID
Qdrant unterstützt die Verwendung von 64-Bit-Unsigned-Integers
und UUIDs
als Identifikatoren für Punkte.
Beispiele für die Zeichenkettenrepräsentation von UUIDs sind wie folgt:
- Einfache Repräsentation:
936DA01F9ABD4d9d80C702AF85C822A8
- Bindestrichrepräsentation:
550e8400-e29b-41d4-a716-446655440000
- URN:
urn:uuid:F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4
Daher können in jeder Anfrage UUID-Zeichenketten anstelle von numerischen IDs verwendet werden. Zum Beispiel:
PUT /collections/{collection_name}/points
{
"points": [
{
"id": "5c56c793-69f3-4fbf-87e6-c4bf54c28c26",
"payload": {"color": "red"},
"vector": [0.9, 0.1, 0.1]
}
]
}
und
PUT /collections/{collection_name}/points
{
"points": [
{
"id": 1,
"payload": {"color": "red"},
"vector": [0.9, 0.1, 0.1]
}
]
}
sind beide gültig.
Hochladen von Datenpunkten
Um die Leistung zu optimieren, unterstützt Qdrant das stapelweise Laden von Datenpunkten. Das bedeutet, dass Sie mehrere Datenpunkte mit einem einzigen API-Aufruf in den Service laden können. Das stapelweise Laden kann erheblich die Netzwerkverbindungskosten reduzieren.
Die Qdrant-API unterstützt zwei Methoden zur Stapelerstellung - eine records-orientierte und eine spaltenorientierte Methode. Intern sind diese Optionen nicht unterscheidbar und dienen lediglich zur Bequemlichkeit bei der Interaktion.
Erstellen von Datenpunkten mit der REST-API:
PUT /collections/{collection_name}/points
{
"batch": {
"ids": [1, 2, 3],
"payloads": [
{"color": "red"},
{"color": "green"},
{"color": "blue"}
],
"vectors": [
[0.9, 0.1, 0.1],
[0.1, 0.9, 0.1],
[0.1, 0.1, 0.9]
]
}
}
Oder verwenden Sie die äquivalente Methode mit dem records-orientierten Ansatz:
PUT /collections/{collection_name}/points
{
"points": [
{
"id": 1,
"payload": {"color": "red"},
"vector": [0.9, 0.1, 0.1]
},
{
"id": 2,
"payload": {"color": "green"},
"vector": [0.1, 0.9, 0.1]
},
{
"id": 3,
"payload": {"color": "blue"},
"vector": [0.1, 0.1, 0.9]
}
]
}
Alle APIs in Qdrant, einschließlich des Ladens von Datenpunkten, sind idempotent. Das bedeutet, dass die aufeinanderfolgende Ausführung derselben Methode äquivalent zu einer einzelnen Ausführung ist.
In diesem Szenario bedeutet dies, dass beim erneuten Hochladen von Datenpunkten mit derselben ID die vorhandenen Datenpunkte überschrieben werden.
Die Idempotenz-Eigenschaft ist nützlich für die Verwendung von Nachrichtenwarteschlangen, die keine präzisen Einmal-Garantien bieten. Auch in diesem Fall gewährleistet Qdrant Datenkonsistenz.
Verfügbar seit v0.10.0
Wenn eine erstellte Sammlung mehrere Vektoren hat, können Sie Daten für jeden Vektor bereitstellen, indem Sie die Vektoren benennen:
PUT /collections/{collection_name}/points
{
"points": [
{
"id": 1,
"vector": {
"image": [0.9, 0.1, 0.1, 0.2],
"text": [0.4, 0.7, 0.1, 0.8, 0.1, 0.1, 0.9, 0.2]
}
},
{
"id": 2,
"vector": {
"image": [0.2, 0.1, 0.3, 0.9],
"text": [0.5, 0.2, 0.7, 0.4, 0.7, 0.2, 0.3, 0.9]
}
}
]
}
Verfügbar seit v1.2.0
Benannte Vektoren sind optional. Beim Hochladen von Datenpunkten können einige Vektoren weggelassen werden. Sie können beispielsweise einen Datenpunkt nur mit dem image
-Vektor und einen anderen nur mit dem text
-Vektor hochladen.
Bei der Änderung eines Datenpunkts mit einer vorhandenen ID wird der vorhandene Datenpunkt zuerst gelöscht und dann mit dem angegebenen Vektor neu eingefügt. Mit anderen Worten, der gesamte Datenpunkt wird ersetzt und alle nicht spezifizierten Vektoren werden auf null gesetzt. Wenn Sie vorhandene Vektoren unverändert lassen und nur spezifizierte Vektoren aktualisieren möchten, beachten Sie bitte die Aktualisierung von Vektoren.
Ändern von Datenpunkten
Um einen Datenpunkt zu ändern, können Sie seinen Vektor oder seine Nutzlast ändern. Dafür gibt es mehrere Methoden.
Vektoren aktualisieren
Verfügbar ab Version v1.2.0
Diese Methode aktualisiert die angegebenen Vektoren an den angegebenen Punkten. Die nicht angegebenen Vektoren bleiben unverändert. Alle angegebenen Punkte müssen vorhanden sein.
REST-API (Schema):
PUT /collections/{collection_name}/points/vectors
{
"points": [
{
"id": 1,
"vector": {
"image": [0.1, 0.2, 0.3, 0.4]
}
},
{
"id": 2,
"vector": {
"text": [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2]
}
}
]
}
Um Punkte zu aktualisieren und alle Vektoren zu ersetzen, siehe die "Upload Point" Operation.
Vektoren löschen
Verfügbar ab Version v1.2.0
Diese Methode löscht nur die angegebenen Vektoren von den angegebenen Punkten. Andere Vektoren bleiben unverändert. Die Punkte werden nicht gelöscht.
REST-API (Schema):
POST /collections/{collection_name}/points/vectors/delete
{
"points": [0, 3, 100],
"vectors": ["text", "image"]
}
Nutzlast festlegen
Setzen Sie die angegebenen Nutzlastwerte auf Punkte.
REST-API (Schema):
POST /collections/{collection_name}/points/payload
{
"payload": {
"property1": "string",
"property2": "string"
},
"points": [
0, 3, 100
]
}
Sie müssen die ID des zu ändernden Punktes nicht kennen. Eine andere Möglichkeit ist die Verwendung von Filtern.
POST /collections/{collection_name}/points/payload
{
"payload": {
"property1": "string",
"property2": "string"
},
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
}
}
Nutzlast überschreiben
Ersetzen Sie die vorhandene Nutzlast vollständig durch die angegebene Nutzlast.
REST-API (Schema):
PUT /collections/{collection_name}/points/payload
{
"payload": {
"property1": "string",
"property2": "string"
},
"points": [
0, 3, 100
]
}
Ähnlich wie Set Payload müssen Sie die ID des zu ändernden Punktes nicht kennen. Eine andere Möglichkeit ist die Verwendung von Filtern.
Schlüssel der Nutzlast löschen
REST-API (Schema):
POST /collections/{collection_name}/points/payload/delete
{
"keys": ["color", "price"],
"points": [0, 3, 100]
}
Alternativ können Sie Filter verwenden, um Nutzlastschlüssel von Punkten zu löschen.
POST /collections/{collection_name}/points/payload/delete
{
"keys": ["color", "price"],
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
}
}
Nutzlast löschen
Diese Methode entfernt alle Nutzlastschlüssel von den angegebenen Punkten.
REST-API (Schema):
POST /collections/{collection_name}/points/payload/clear
{
"points": [0, 3, 100]
}
Punkte löschen
REST-API (Schema):
POST /collections/{collection_name}/points/delete
{
"points": [0, 3, 100]
}
Eine andere Möglichkeit, die zu löschenden Punkte zu spezifizieren, ist die Verwendung eines Filters:
POST /collections/{collection_name}/points/delete
{
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
}
}
Dieses Beispiel löscht alle Punkte mit { "color": "red" }
aus der Sammlung.
Punkte abrufen
Methode zum Abrufen von Punkten anhand ihrer IDs:
REST-API (Schema):
POST /collections/{collection_name}/points
{
"ids": [0, 3, 100]
}
Diese Methode verfügt über zusätzliche Parameter with_vectors
und with_payload
. Durch die Verwendung dieser Parameter können Sie die Teile der Punkteergebnisse auswählen, die Sie benötigen. Das Ausschließen hilft, Datenübertragung für nutzlose Daten zu vermeiden.
Es ist auch möglich, einen einzelnen Punkt über die API abzurufen:
REST-API (Schema):
GET /collections/{collection_name}/points/{point_id}
Scroll
Manchmal ist es notwendig, alle gespeicherten Punkte abzurufen, ohne ihre IDs zu kennen, oder durch Punkte zu iterieren, die Filterbedingungen erfüllen.
REST-API (Schema):
POST /collections/{collection_name}/points/scroll
{
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
},
"limit": 1,
"with_payload": true,
"with_vector": false
}
Gibt alle Punkte zurück, die color
=red
entsprechen:
{
"result": {
"next_page_offset": 1,
"points": [
{
"id": 0,
"payload": {
"color": "red"
}
}
]
},
"status": "ok",
"time": 0.0001
}
Die Scroll-API gibt alle Punkte zurück, die dem Filter entsprechen, in paginierter Form.
Alle resultierenden Punkte sind nach ID sortiert. Um die nächste Seite abzufragen, müssen Sie die maximale gefundene ID im Feld offset
angeben. Zur Bequemlichkeit wird diese ID auch im Feld next_page_offset
zurückgegeben. Wenn der Wert des Felds next_page_offset
null
ist, bedeutet dies, dass die letzte Seite erreicht wurde.
Punkte zählen
Verfügbar ab Version v0.8.4
Manchmal ist es nützlich, nur zu wissen, wie viele Punkte den Filterbedingungen entsprechen, ohne tatsächlich eine Suche durchzuführen.
Beispielsweise kann dies in den folgenden Szenarien nützlich sein:
- Schätzen der Ergebnisgröße für facettierte Suche
- Bestimmung der Anzahl der Seiten für die Paginierung
- Debuggen der Ausführungsgeschwindigkeit von Abfragen
REST-API (Schema):
POST /collections/{collection_name}/points/count
{
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
},
"exact": true
}
Gibt die Anzahl der Punkte zurück, die den angegebenen Filterbedingungen entsprechen:
{
"count": 3811
}
Batch Update
Verfügbar ab v1.5.0
Sie können Batch-Operationen auf mehreren Punkten ausführen. Dies umfasst das Einfügen, Aktualisieren und Löschen von Punkten, Vektoren und Nutzlasten.
Eine Batch-Update-Anfrage besteht aus einer Reihe von Operationen, die nacheinander ausgeführt werden. Die Operationen, die gebündelt werden können, umfassen:
- Punkte einfügen oder aktualisieren:
upsert
oderUpsertOperation
- Punkte löschen:
delete_points
oderDeleteOperation
- Vektoren aktualisieren:
update_vectors
oderUpdateVectorsOperation
- Vektoren löschen:
delete_vectors
oderDeleteVectorsOperation
- Nutzlast setzen:
set_payload
oderSetPayloadOperation
- Nutzlast überschreiben:
overwrite_payload
oderOverwritePayload
- Nutzlast löschen:
delete_payload
oderDeletePayloadOperation
- Nutzlast löschen:
clear_payload
oderClearPayloadOperation
Das folgende Codebeispiel verwendet alle Operationen.
REST-API (Schema):
POST /collections/{collection_name}/points/batch
{
"operations": [
{
"upsert": {
"points": [
{
"id": 1,
"vector": [1.0, 2.0, 3.0, 4.0],
"payload": {}
}
]
}
},
{
"update_vectors": {
"points": [
{
"id": 1,
"vector": [1.0, 2.0, 3.0, 4.0]
}
]
}
},
{
"delete_vectors": {
"points": [1],
"vector": [""]
}
},
{
"overwrite_payload": {
"payload": {
"test_payload": "1"
},
"points": [1]
}
},
{
"set_payload": {
"payload": {
"test_payload_2": "2",
"test_payload_3": "3"
},
"points": [1]
}
},
{
"delete_payload": {
"keys": ["test_payload_2"],
"points": [1]
}
},
{
"clear_payload": {
"points": [1]
}
},
{"delete": {"points": [1]}}
]
}
Um Batch-Punkte mit einem einzelnen Typ von Operation zu verwenden, verwenden Sie die Batch-Funktion direkt innerhalb dieser Operation.