← Zurück

FLAT vs IVF: Wie der Inverted-File-Index funktioniert

Gleiche Daten, gleiche Abfrage – aber eine andere Suchstrategie. Ziehen Sie den Abfragepunkt, passen Sie nprobeund klicken Sie auf „Suche ausführen“, um zu sehen, wie „ IVF “ den Großteil der Daten überspringt.

nprobe2
Such 2 e von „ 8 “-Clustern
Geschwindigkeit20ms
Niedriger = schnellere Animation

FLAT — Vollständige Suche

durchsucht jeden Punkt
Vergleiche
200 / 200
Status
✓ Fertig
Recall
100%

IVF — Invertierte Datei

Suchen nprobe -Cluster
Vergleiche
33 / 33
Status
✓ Fertig
Recall@5
100%

Was passiert gerade?

  1. Aufbauphase (bereits abgeschlossen): K-Means hat die 200 Punkte in 8 Cluster partitioniert. Jeder Cluster hat ein Zentrum (die ×-Markierungen).
  2. Schritt 1 – Auswertung der Zentren: „ IVF “ berechnet zunächst den Abstand der Abfrage zu jedem Zentrum. Das sind lediglich „ 8 “ Vergleiche, unabhängig von der Größe des Datensatzes.
  3. Schritt 2 – Wählen Sie die nächstgelegenen „ nprobe “-Cluster aus: Diese leuchten auf. Alle anderen Cluster werden vollständig übersprungen.
  4. Schritt 3 – Durchsuchen der Punkte innerhalb der ausgewählten Cluster: nur ~50 e der 200 Punkte.

Der Kompromiss: Je größer nprobe → mehr gescannte Cluster → höhere Recall-Rate, aber langsamer. Kleiner nprobe → schneller, aber es können echte Nachbarn übersehen werden, die sich in nicht gescannten Clustern befinden. Versuchen Sie, nprobe = 1 und ziehen Sie die Abfrage in die Nähe einer Clustergrenze, um zu sehen, wie der Recall sinkt.

Was ist ein „ IVF -Index“?

IVF (Inverted File) ist ein auf Clustering basierender Index für die ungefähre Suche nach dem nächsten Nachbarn. Bei der Erstellung partitioniert k-means alle Vektoren in nlist Cluster, die jeweils durch ihren Zentroid repräsentiert werden. Bei der Abfrage vergleicht die Suche zunächst die Abfrage ausschließlich mit den Zentroiden, wählt den nächstgelegenen nprobe Cluster aus und durchsucht nur die darin enthaltenen Vektoren – alles andere wird übersprungen.

Milvus enthält mehrere Varianten von „ IVF “, die Speicherplatz gegen Genauigkeit eintauschen: IVF_FLAT speichert Rohvektoren (höchste Genauigkeit), IVF_SQ8 komprimiert jede Dimension auf ein Byte (~4× weniger Speicher, geringer Recall-Aufwand) und IVF_PQ wendet Produktquantisierung für eine deutlich höhere Komprimierung bei höheren Recall-Kosten an.

Optimierungs nlist und nprobe

  • nlist (Build-Zeit): die Anzahl der k-Means-Cluster. Ein gängiger Ausgangspunkt ist „ 4 × sqrt(N) “ für N Vektoren. Mehr Cluster bedeuten, dass jeder einzelne kleiner ist – schnellere Durchläufe, aber der Zentrid-Durchlauf ist aufwendiger und die Randeffekte nehmen zu.
  • nprobe (Abfragezeit): Wie viele Cluster sollen pro Abfrage durchsucht werden? Dies ist der wichtigste Regler für Recall und Latenz – genau das, was der Schieberegler oben steuert. Beginnen Sie bei etwa nlist / 16 und erhöhen Sie den Wert, bis der Recall Ihren Zielwert erreicht.
  • Variantenauswahl: Beginnen Sie mit „ IVF_FLAT “. Wechseln Sie zu „ IVF_SQ8 “, wenn der Speicher knapp ist, und erst dann zu „ IVF_PQ “, wenn der Datensatz zu groß für „ SQ8 “ ist – und überprüfen Sie den Recall anhand Ihrer eigenen Daten nach jedem Schritt nach unten.

IVF vs HNSW vs DiskANN

IVF Lässt sich schnell aufbauen, verursacht nur einen geringen zusätzlichen Speicherbedarf zusätzlich zu den Vektoren und ist leicht nachzuvollziehen – bei gleichem Recall-Ziel beantwortet „ HNSW “ Abfragen im Speicher jedoch in der Regel schneller. Wählen Sie „ IVF “, wenn Sie Indizes häufig neu aufbauen (schneller Aufbau ist wichtig), wenn der Speicher begrenzt ist (IVF_SQ8/IVF_PQ) oder wenn Sie ein vorhersehbares, anpassbares Scan-Verhalten wünschen. Wählen Sie „ HNSW “ für die geringste Abfragelatenz im Arbeitsspeicher und „ DiskANN “, wenn Vektoren überhaupt nicht mehr in „ RAM “ passen.

Häufig gestellte Fragen

Was ist der Unterschied zwischen „ IVF_FLAT “, „ IVF_SQ8 “ und „ IVF_PQ “?

Alle drei gruppieren Vektoren auf dieselbe Weise; sie unterscheiden sich darin, wie Vektoren innerhalb der Cluster gespeichert werden. „ IVF_FLAT “ behält rohe Float-Vektoren bei (beste Recall-Rate). „ IVF_SQ8 “ quantisiert jede Dimension auf 8 Bit, wodurch der Speicherbedarf um etwa das Vierfache reduziert wird, bei einem geringen Verlust an Recall-Rate. „ IVF_PQ “ ersetzt Vektoren durch kurze Produktquantisierungscodes, was die höchste Komprimierung und den größten Verlust an Recall-Rate zur Folge hat.

Wie soll ich zwischen „ nlist “ und „ nprobe “ wählen?

Eine gängige Faustregel lautet: „ nlist “ = 4 × sqrt(N) für N Vektoren; optimieren Sie anschließend „ nprobe “ zum Zeitpunkt der Abfrage. Größere „ nprobe “-Werte scannen mehr Cluster: höhere Recall-Rate, höhere Latenz. Beginnen Sie bei etwa „ nlist/16“ und erhöhen Sie den Wert, bis die Recall-Rate bei einem zurückbehaltenen Abfragesatz Ihr Ziel erreicht.

Warum übersieht „ IVF “ einige echte nächste Nachbarn?

Aufgrund von Clustergrenzen. Wenn die Abfrage nahe am Rand eines Clusters landet, können sich einige ihrer tatsächlichen Nachbarn in einem benachbarten Cluster befinden, der nicht zu den gescannten „ nprobe “-Clustern gehörte. Sie können dies in der Visualisierung erkennen, indem Sie den Abfragepunkt nahe an eine Grenze mit „ nprobe “ = 1 ziehen.

Sollte ich „ IVF “ oder „ HNSW “ verwenden?

Bei gleichem Recall ist „ HNSW “ in der Regel schneller für die In-Memory-Suche, benötigt jedoch mehr Speicher und lässt sich langsamer aufbauen. „ IVF “ lässt sich schnell aufbauen und lässt sich gut mit Quantisierung (SQ8/PQ) kombinieren, wenn der Speicher knapp ist. Für Datensätze, die RAM vollständig überschreiten, sollten Sie stattdessen DiskANN in Betracht ziehen.

Vertiefung: Lesen Sie die Dokumentation zu „IVF_FLAT “ für Indexparameter oder sehen Sie sich „Index Explained“ an, um den vollständigen Leitfaden zur Entscheidungsfindung zu erhalten.

Erkunden Sie weiter