SCANN
Der auf der ScaNN-Bibliothek von Google basierende Index SCANN in Milvus wurde entwickelt, um die Herausforderungen der skalierenden Vektorähnlichkeitssuche zu bewältigen und ein Gleichgewicht zwischen Geschwindigkeit und Genauigkeit herzustellen, selbst bei großen Datensätzen, die für die meisten Suchalgorithmen eine Herausforderung darstellen würden.
Überblick
ScaNN wurde entwickelt, um eine der größten Herausforderungen bei der Vektorsuche zu lösen: das effiziente Auffinden der relevantesten Vektoren in hochdimensionalen Räumen, auch wenn die Datensätze größer und komplexer werden. Seine Architektur unterteilt den Prozess der Vektorsuche in verschiedene Phasen:
Scannen
Partitionierung: Teilt den Datensatz in Cluster auf. Diese Methode engt den Suchraum ein, indem sie sich nur auf relevante Datenuntergruppen konzentriert, anstatt den gesamten Datensatz zu scannen, was Zeit und Verarbeitungsressourcen spart. ScaNN verwendet häufig Clustering-Algorithmen, wie z. B. k-means, zur Identifizierung von Clustern, wodurch die Ähnlichkeitssuche effizienter durchgeführt werden kann.
Quantisierung: ScaNN wendet nach der Partitionierung einen Quantisierungsprozess an, der als anisotrope Vektorquantisierung bekannt ist. Die herkömmliche Quantisierung konzentriert sich auf die Minimierung des Gesamtabstands zwischen Original- und komprimierten Vektoren, was für Aufgaben wie die Maximum Inner Product Search (MIPS), bei der die Ähnlichkeit durch das innere Produkt der Vektoren und nicht durch den direkten Abstand bestimmt wird, nicht ideal ist. Bei der anisotropen Quantisierung werden stattdessen vorrangig die parallelen Komponenten zwischen den Vektoren beibehalten, d. h. die Teile, die für die Berechnung genauer innerer Produkte am wichtigsten sind. Dieser Ansatz ermöglicht es ScaNN, eine hohe MIPS-Genauigkeit beizubehalten, indem komprimierte Vektoren sorgfältig an der Abfrage ausgerichtet werden, was schnellere und präzisere Ähnlichkeitssuchen ermöglicht.
Neueinstufung: Die Re-Ranking-Phase ist der letzte Schritt, in dem ScaNN die Suchergebnisse aus den Partitionierungs- und Quantisierungsphasen fein abstimmt. Diese Neueinstufung wendet präzise innere Produktberechnungen auf die Top-Kandidatenvektoren an, um sicherzustellen, dass die Endergebnisse äußerst genau sind. Die Neueinstufung ist von entscheidender Bedeutung für schnelle Empfehlungsmaschinen oder Bildsuchanwendungen, bei denen die anfängliche Filterung und das Clustering als grobe Schicht dienen und die letzte Stufe sicherstellt, dass dem Benutzer nur die relevantesten Ergebnisse angezeigt werden.
Die Leistung von SCANN wird durch zwei Schlüsselparameter gesteuert, mit denen Sie das Gleichgewicht zwischen Geschwindigkeit und Genauigkeit feinabstimmen können:
with_raw_data: Legt fest, ob die ursprünglichen Vektordaten neben den quantisierten Darstellungen gespeichert werden. Die Aktivierung dieses Parameters verbessert die Genauigkeit beim Re-Ranking, erhöht aber die Speicheranforderungen.reorder_k: Legt fest, wie viele Kandidaten in der abschließenden Phase der Neueinstufung verfeinert werden. Höhere Werte verbessern die Genauigkeit, erhöhen aber die Suchlatenz.
Eine ausführliche Anleitung zur Optimierung dieser Parameter für Ihren speziellen Anwendungsfall finden Sie unter Indexparameter.
Index erstellen
Um einen SCANN -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="SCANN", # 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={
"with_raw_data": True, # Whether to hold raw data
} # Index building params
)
In dieser Konfiguration:
index_type: Der Typ des zu erstellenden Index. In diesem Beispiel setzen Sie den Wert aufSCANN.metric_type: Die Methode zur Berechnung des Abstands zwischen Vektoren. Unterstützte Werte sindCOSINE,L2undIP. Einzelheiten finden Sie unter Metrische Typen.params: Zusätzliche Konfigurationsoptionen für den Aufbau des Index.with_raw_data: Ob die ursprünglichen Vektordaten neben der quantisierten Darstellung gespeichert werden sollen.
Weitere Informationen zu den für den
SCANNIndex verfügbaren Parametern finden Sie unter Indexerstellungsparameter.
Sobald die Index-Parameter konfiguriert sind, können Sie den Index erstellen, indem Sie die Methode create_index() direkt verwenden oder die Index-Parameter 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": {
"reorder_k": 10, # Number of candidates to refine
"nprobe": 8 # Number of clusters to search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=10, # TopK results to return
search_params=search_params
)
In dieser Konfiguration:
params: Zusätzliche Konfigurationsoptionen für die Suche im Index.reorder_k: Anzahl der zu verfeinernden Kandidaten während der Re-Ranking-Phase.nprobe: Anzahl der Cluster, nach denen gesucht werden soll.
Weitere Suchparameter, die für den Index
SCANNverfü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 Suchvorgängen 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 |
|---|---|---|---|
|
Anzahl der Cluster-Einheiten |
[1, 65536] |
Eine höhere nlist erhöht die Effizienz des Pruning und beschleunigt in der Regel die grobe Suche, aber die Partitionen können zu klein werden, was die Wiederauffindbarkeit verringern kann; eine niedrigere nlist scannt größere Cluster, was die Wiederauffindbarkeit verbessert, aber die Suche verlangsamt. |
|
Ob die ursprünglichen Vektordaten neben der quantisierten Darstellung gespeichert werden sollen. Wenn diese Option aktiviert ist, ermöglicht sie genauere Ähnlichkeitsberechnungen während der Re-Ranking-Phase, da die ursprünglichen Vektoren anstelle der quantisierten Approximationen verwendet werden. |
Typ: Boolean Bereich: Standardwert: |
Setzen Sie diesen Wert auf Setzen Sie den Wert auf Empfohlen: Verwenden Sie |
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 |
|---|---|---|---|
|
Steuert die Anzahl der Kandidatenvektoren, die während der Re-Ranking-Phase verfeinert werden. Dieser Parameter legt fest, wie viele Top-Kandidaten aus der anfänglichen Partitionierungs- und Quantisierungsphase durch genauere Ähnlichkeitsberechnungen neu bewertet werden. |
Typ: Integer Bereich: [1, int_max] Standardwert: Keine |
Eine größere Erwägen Sie eine Erhöhung von Ziehen Sie in Erwägung, In den meisten Fällen empfehlen wir Ihnen, einen Wert innerhalb dieses Bereichs festzulegen:[limit, limit * 5]. |
|
Die Anzahl der Cluster, in denen nach Kandidaten gesucht werden soll. |
Typ: Integer Bereich: [1, nlist] Standardwert: |
Höhere Werte ermöglichen die Suche nach mehr Clustern, was die Wiederauffindbarkeit durch Erweiterung des Suchbereichs verbessert, jedoch auf Kosten einer erhöhten Abfrage-Latenz. Stellen Sie In den meisten Fällen wird empfohlen, einen Wert innerhalb dieses Bereichs einzustellen: [1, nlist]. |