IVF_FLAT
Der IVF_FLAT-Index ist ein Indizierungsalgorithmus, der die Suchleistung für Fließkomma-Vektoren verbessern kann.
Dieser Indextyp ist ideal für große Datensätze, die schnelle Abfrageantworten und hohe Genauigkeit erfordern, vor allem, wenn das Clustering Ihres Datensatzes den Suchraum verkleinern kann und ausreichend Speicher für die Speicherung von Clusterdaten zur Verfügung steht.
Übersicht
Der Begriff IVF_FLAT steht für Inverted File Flat, was den zweistufigen Ansatz für die Indizierung und Suche nach Fließkomma-Vektoren umschreibt:
- Inverted File (IVF): Bezieht sich auf das Clustering des Vektorraums in überschaubare Regionen unter Verwendung von k-means clustering. Jeder Cluster wird durch einen Zentroid repräsentiert, der als Referenzpunkt für die Vektoren darin dient.
- Flach: Gibt an, dass die Vektoren innerhalb jedes Clusters in ihrer ursprünglichen Form (flache Struktur) gespeichert werden, ohne Komprimierung oder Quantisierung, um präzise Abstandsberechnungen zu ermöglichen.
Die folgende Abbildung zeigt, wie das funktioniert:
ivf-flat-1.png
Diese Indizierungsmethode beschleunigt den Suchprozess, hat aber auch einen potenziellen Nachteil: Der Kandidat, der als der nächstgelegene zur Einbettung der Anfrage gefunden wurde, ist möglicherweise nicht der exakt nächstgelegene. Dies kann der Fall sein, wenn die nächstgelegene Einbettung zur Abfrageeinbettung in einem anderen Cluster liegt als demjenigen, der auf der Grundlage des nächstgelegenen Schwerpunkts ausgewählt wurde (siehe Visualisierung unten).
Um dieses Problem zu lösen, bietet IVF_FLAT zwei Hyperparameter, die wir einstellen können:
nlist
: Gibt die Anzahl der Partitionen an, die mit dem k-means-Algorithmus erstellt werden sollen.nprobe
: Legt die Anzahl der Partitionen fest, die bei der Suche nach Kandidaten berücksichtigt werden sollen.
Wenn wir nun nprobe
auf 3 statt auf 1 setzen, erhalten wir das folgende Ergebnis:
ivf-flat-2.png
Wenn Sie den Wert nprobe
erhöhen, können Sie mehr Partitionen in die Suche einbeziehen, was dazu beitragen kann, dass die der Abfrage am nächsten liegende Einbettung nicht übersehen wird, selbst wenn sie sich in einer anderen Partition befindet. Dies hat jedoch den Nachteil, dass sich die Suchzeit erhöht, da mehr Kandidaten evaluiert werden müssen. Weitere Informationen zur Einstellung der Indexparameter finden Sie unter Indexparameter.
Index erstellen
Um einen IVF_FLAT
-Index für ein Vektorfeld in Milvus zu erstellen, verwenden Sie die Methode add_index()
und geben Sie die Parameter index_type
, metric_type
und zusätzliche Parameter für den Index an.
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="IVF_FLAT", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"nlist": 64, # Number of clusters for the index
} # Index building params
)
In dieser Konfiguration:
index_type
: Der Typ des zu erstellenden Index. In diesem Beispiel setzen Sie den Wert aufIVF_FLAT
.metric_type
: Die Methode zur Berechnung des Abstands zwischen Vektoren. Unterstützte Werte sindCOSINE
,L2
undIP
. Einzelheiten finden Sie unter Metrische Typen.params
: Zusätzliche Konfigurationsoptionen für den Aufbau des Index.nlist
: Anzahl der Cluster zur Unterteilung des Datensatzes.
Weitere Informationen zu den für den Index
IVF_FLAT
verfügbaren Erstellungsparametern finden Sie unter Indexerstellungsparameter.
Sobald die Indexparameter konfiguriert sind, können Sie den Index erstellen, indem Sie die Methode create_index()
direkt verwenden oder die Indexparameter in der Methode create_collection
übergeben. Weitere Informationen finden Sie unter Sammlung erstellen.
Suche im Index
Sobald der Index erstellt und die Entitäten eingefügt sind, können Sie Ähnlichkeitssuchen im Index durchführen.
search_params = {
"params": {
"nprobe": 10, # Number of clusters to search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # TopK results to return
search_params=search_params
)
In dieser Konfiguration:
params
: Zusätzliche Konfigurationsoptionen für die Suche im Index.nprobe
: Anzahl der Cluster, nach denen gesucht werden soll.
Weitere Suchparameter, die für den Index
IVF_FLAT
verfügbar sind, finden Sie unter Indexspezifische Suchparameter.
Index-Parameter
Dieser Abschnitt gibt einen Überblick über die Parameter, die für den Aufbau eines Index und die Durchführung von Suchen im Index verwendet werden.
Indexaufbau-Parameter
In der folgenden Tabelle sind die Parameter aufgeführt, die in params
beim Aufbau eines Index konfiguriert werden können.
Parameter | Beschreibung | Wertebereich | Tuning-Vorschlag |
---|---|---|---|
nlist | Die Anzahl der Cluster, die bei der Indexerstellung mit dem k-means-Algorithmus erstellt werden. Jeder Cluster, der durch einen Schwerpunkt dargestellt wird, speichert eine Liste von Vektoren. Durch Erhöhen dieses Parameters wird die Anzahl der Vektoren in jedem Cluster reduziert, wodurch kleinere, konzentriertere Partitionen entstehen. | Typ: Integer Bereich: [1, 65536] Standardwert: 128 | Größere nlist Werte verbessern die Wiederauffindbarkeit durch die Erstellung von feineren Clustern, erhöhen aber die Indexerstellungszeit. In den meisten Fällen wird empfohlen, einen Wert innerhalb dieses Bereichs festzulegen: [32, 4096]. |
Indexspezifische Suchparameter
In der folgenden Tabelle sind die Parameter aufgeführt, die in search_params.params
für die Suche im Index konfiguriert werden können.
Parameter | Beschreibung | Wertebereich | Tuning-Vorschlag |
---|---|---|---|
nprobe | Höhere Werte erlauben es, mehr Cluster zu durchsuchen, was die Wiederauffindbarkeit durch Erweiterung des Suchbereichs verbessert, allerdings auf Kosten einer erhöhten Abfragelatenz. | Typ: Integer Bereich: [1, nlist] Standardwert: 8 | Eine Erhöhung dieses Wertes verbessert die Wiederauffindbarkeit, kann aber die Suche verlangsamen. Setzen Sie nprobe proportional zu nlist , um ein Gleichgewicht zwischen Geschwindigkeit und Genauigkeit herzustellen.In den meisten Fällen wird empfohlen, einen Wert innerhalb dieses Bereichs einzustellen: [1, nlist]. |