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.
nprobe “-Cluster aus: Diese leuchten auf. Alle anderen Cluster werden vollständig übersprungen.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.
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.
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.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.
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.
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.
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.
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.
Verfolgen Sie die mehrschichtige Graphensuche Schritt für Schritt – von „Highway Jumps“ bis hin zu „Local Walks“.
Sehen Sie selbst, wie Sie mit PQ-in-RAM +full-vectors-on-SSD Datensätze im Milliardenbereich auf einem Laptop durchsuchen können.
Ziehen Sie einen Abfragepunkt und wechseln Sie zwischen „ L2 “, „Cosine“ und „ IP “, um zu sehen, wie sich der „nächstgelegene“ Punkt verändert.