IVF_SQ8

Der IVF_SQ8-Index ist ein quantisierungsbasierter Indizierungsalgorithmus, der für die Bewältigung umfangreicher Ähnlichkeitssuchen entwickelt wurde. Dieser Indextyp ermöglicht eine schnellere Suche mit einem wesentlich geringeren Speicherbedarf im Vergleich zu erschöpfenden Suchmethoden.

Überblick

Der IVF_SQ8-Index basiert auf zwei Schlüsselkomponenten:

  • Inverted File (IVF): Organisiert die Daten in Clustern, so dass sich der Suchalgorithmus nur auf die relevantesten Teilmengen von Vektoren konzentrieren kann.

  • Skalare Quantisierung (SQ8): Komprimiert die Vektoren in eine kompaktere Form, wodurch die Speichernutzung drastisch reduziert wird, während gleichzeitig eine ausreichende Präzision für schnelle Ähnlichkeitsberechnungen erhalten bleibt.

IVF

IVF ist wie die Erstellung eines Index in einem Buch. Anstatt jede Seite (oder in unserem Fall jeden Vektor) zu durchsuchen, suchen Sie nach bestimmten Schlüsselwörtern (Clustern) im Index, um die relevanten Seiten (Vektoren) schnell zu finden. In unserem Szenario werden die Vektoren in Clustern gruppiert, und der Algorithmus sucht in einigen wenigen Clustern, die nahe am Abfragevektor liegen.

Und so funktioniert's:

  1. Clustering: Ihr Vektordatensatz wird mithilfe eines Clustering-Algorithmus wie k-means in eine bestimmte Anzahl von Clustern unterteilt. Jeder Cluster hat einen Zentroid (einen repräsentativen Vektor für den Cluster).

  2. Zuweisung: Jeder Vektor wird dem Cluster zugewiesen, dessen Zentroid ihm am nächsten ist.

  3. Invertierter Index: Es wird ein Index erstellt, der jeden Clusterschwerpunkt auf die Liste der diesem Cluster zugeordneten Vektoren abbildet.

  4. Suche: Bei der Suche nach den nächsten Nachbarn vergleicht der Suchalgorithmus Ihren Abfragevektor mit den Clusterschwerpunkten und wählt den/die vielversprechendsten Cluster aus. Die Suche wird dann auf die Vektoren innerhalb dieser ausgewählten Cluster eingegrenzt.

Mehr über die technischen Details erfahren Sie unter IVF_FLAT.

SQ8

Die Skalarquantisierung (SQ) ist eine Technik zur Verringerung der Größe von hochdimensionalen Vektoren, indem ihre Werte durch kleinere, kompaktere Darstellungen ersetzt werden. Die SQ8-Variante verwendet 8-Bit-Ganzzahlen anstelle der typischen 32-Bit-Gleitkommazahlen, um jeden Dimensionswert eines Vektors zu speichern. Dadurch wird der für die Speicherung der Daten erforderliche Speicherplatz erheblich reduziert.

So funktioniert SQ8:

  1. Identifizierung des Bereichs: Zunächst werden die Mindest- und Höchstwerte innerhalb des Vektors ermittelt. Dieser Bereich definiert die Grenzen für die Quantisierung.

  2. Normalisierung: Normalisieren Sie die Vektorwerte mithilfe der Formel auf einen Bereich zwischen 0 und 1:

    normalized_value=valueminmaxmin\text{normalized\_value} = \frac{\text{value} - \text{min}}{\text{max} - \text{min}}

    Dadurch wird sichergestellt, dass alle Werte proportional innerhalb eines standardisierten Bereichs abgebildet werden, um sie für die Komprimierung vorzubereiten.

  3. 8-Bit-Komprimierung: Multiplizieren Sie den normalisierten Wert mit 255 (dem Höchstwert für eine 8-Bit-Ganzzahl) und runden Sie das Ergebnis auf die nächste Ganzzahl. Auf diese Weise wird jeder Wert effektiv in eine 8-Bit-Darstellung komprimiert.

Nehmen wir an, Sie haben einen Dimensionswert von 1,2, mit einem Minimalwert von -1,7 und einem Maximalwert von 2,3. Die folgende Abbildung zeigt, wie SQ8 angewendet wird, um einen float32-Wert in eine int8-Ganzzahl zu konvertieren.

Ivf Sq8 Ivf Sq8

IVF + SQ8

Der Index IVF_SQ8 kombiniert IVF und SQ8, um Ähnlichkeitssuchen effizient durchzuführen:

  1. IVF grenzt den Suchbereich ein: Der Datensatz wird in Cluster unterteilt, und wenn eine Abfrage gestellt wird, vergleicht IVF die Abfrage zunächst mit den Clusterschwerpunkten und wählt die relevantesten Cluster aus.

  2. SQ8 beschleunigt die Abstandsberechnungen: Innerhalb der ausgewählten Cluster komprimiert SQ8 die Vektoren in 8-Bit-Ganzzahlen, wodurch die Speichernutzung reduziert und die Abstandsberechnungen beschleunigt werden.

Durch den Einsatz von IVF zur Fokussierung der Suche und SQ8 zur Beschleunigung der Berechnungen erreicht IVF_SQ8 sowohl schnelle Suchzeiten als auch Speichereffizienz.

Index erstellen

Um einen IVF_SQ8 -Index für ein Vektorfeld in Milvus zu erstellen, verwenden Sie die Methode add_index(), wobei Sie die Parameter index_type, metric_type und zusätzliche Parameter für den Index angeben.

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_SQ8", # 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 to create using the k-means algorithm during index building
    } # Index building params
)

In dieser Konfiguration:

  • index_type: Der Typ des zu erstellenden Index. In diesem Beispiel setzen Sie den Wert auf IVF_SQ8.

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

    • nlist: Anzahl der Cluster, die während der Indexerstellung mit dem k-means-Algorithmus erstellt werden.

    Weitere Informationen zu den für den Index IVF_SQ8 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": 8, # Number of clusters to search for candidates
    }
}

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.

    • nprobe: Anzahl der Cluster, in denen nach Kandidaten gesucht werden soll.

    Weitere Suchparameter, die für den Index IVF_SQ8 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

IVF

nlist

Die Anzahl der Cluster, die mit dem k-means-Algorithmus während der Indexerstellung erstellt werden.

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. Optimieren Sie den Wert je nach Größe des Datensatzes und der verfügbaren Ressourcen. 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

IVF

nprobe

Die Anzahl der Cluster, in denen nach Kandidaten gesucht wird.

Typ: Integer Bereich: [1, nlist]

Standardwert: 8

Höhere Werte ermöglichen die Suche nach mehr Clustern, was die Wiederauffindbarkeit durch die Erweiterung des Suchbereichs verbessert, jedoch auf Kosten einer erhöhten Abfragelatenz. 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 festzulegen: [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?