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:

Scann Scannen

  1. 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.

  2. 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.

  3. 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 auf SCANN.

  • metric_type: Die Methode zur Berechnung des Abstands zwischen Vektoren. Unterstützte Werte sind COSINE, L2 und IP. 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 SCANN Index 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 SCANN 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 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

nlist

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.

with_raw_data

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: true, false

Standardwert: true

Setzen Sie diesen Wert auf true, um eine höhere Suchgenauigkeit zu erzielen und wenn der Speicherplatz keine große Rolle spielt. Die ursprünglichen Vektordaten ermöglichen präzisere Ähnlichkeitsberechnungen bei der Neueinstufung.

Setzen Sie den Wert auf false, um den Speicheraufwand und die Speichernutzung zu reduzieren, insbesondere bei großen Datensätzen. Dies kann jedoch zu einer etwas geringeren Suchgenauigkeit führen, da in der Phase der Neueinordnung quantisierte Vektoren verwendet werden.

Empfohlen: Verwenden Sie true für Produktionsanwendungen, bei denen die Genauigkeit entscheidend ist.

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

reorder_k

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 reorder_k führt im Allgemeinen zu einer höheren Suchgenauigkeit, da in der letzten Verfeinerungsphase mehr Kandidaten berücksichtigt werden. Allerdings erhöht sich dadurch auch die Suchzeit aufgrund der zusätzlichen Berechnungen.

Erwägen Sie eine Erhöhung von reorder_k, wenn eine hohe Wiederfindungsrate entscheidend ist und die Suchgeschwindigkeit weniger wichtig ist. Ein guter Ausgangspunkt ist das 2-5fache der gewünschten limit (TopK-Ergebnisse, die zurückgegeben werden).

Ziehen Sie in Erwägung, reorder_k zu verringern, um schnelleren Suchen den Vorzug zu geben, insbesondere in Szenarien, in denen eine leichte Verringerung der Genauigkeit akzeptabel ist.

In den meisten Fällen empfehlen wir Ihnen, einen Wert innerhalb dieses Bereichs festzulegen:[limit, limit * 5].

nprobe

Die Anzahl der Cluster, in denen nach Kandidaten gesucht werden soll.

Typ: Integer

Bereich: [1, nlist]

Standardwert: 8

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 nprobe proportional zu nlist ein, um Geschwindigkeit und Genauigkeit auszugleichen.

In den meisten Fällen wird empfohlen, einen Wert innerhalb dieses Bereichs einzustellen: [1, nlist].

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

War diese Seite hilfreich?