# Vektorsuche

Die Vektorsuche ist eine Suchmethode, bei der Daten als Vektoren dargestellt werden. Sie wird häufig in Anwendungen wie der Bildersuche, Videosuche und Textsuche verwendet, sowie in maschinellen Lernanwendungen wie der Bildklassifizierung und Clusterbildung.

In diesem Abschnitt wird erläutert, wie man Vektorindizes erstellt und manipuliert, um die Vektorsuche zu beschleunigen, sowie wie man verschiedene Arten von Vektorindizes konfiguriert.

# Befehlsreferenz

# Erstellen einer Tabelle mit Vektoren

Derzeit unterstützen wir zwei Arten von Vektoren: Array aus float32 und Binärstring. Entsprechend werden Einbettungsvektoren als Array(Float32) oder FixedString in MyScale dargestellt.

WARNING

Der Binärstringtyp von Vektoren ist nur für die DB-Version 1.3.1 oder höher anwendbar.

TIP

Alle Vektoren einer Einbettungsvektorspalte müssen dieselbe Dimension haben.

  • Für Arrays aus float32-Vektoren verwenden Sie CONSTRAINT, um Fehler zu vermeiden. Zum Beispiel CONSTRAINT constraint_name_1 CHECK length(data) = 128.
  • Für Binärstringvektoren stellen Sie diese als festlängentyp FixedString(N) dar. Folglich ist es nicht notwendig, die dimensionalen Einschränkungen für diese Vektoren anzugeben, da die Dimension jedes Vektors konsistent sein und 8 * N entsprechen muss.

Im Folgenden sind Beispiele für das Erstellen von Tabellen für verschiedene Arten von Vektordaten aufgeführt.

-- Erstellen Sie eine Tabelle mit einem Array von float32-Vektoren in 128 Dimensionen und einer Vektorspalte mit Längenbeschränkung
CREATE TABLE test_float_vector
(
    id    UInt32,
    data  Array(Float32),
    CONSTRAINT check_length CHECK length(data) = 128,
    date  Date,
    label Enum8('person' = 1, 'building' = 2, 'animal' = 3)
) ENGINE = MergeTree ORDER BY id
-- Erstellen Sie eine Tabelle mit 128-dimensionalen Binärstringvektoren (16 Bytes)
CREATE TABLE test_binary_vector
(
    id    UInt32,
    binary_data  FixedString(16),
    date  Date,
    label Enum8('person' = 1, 'building' = 2, 'animal' = 3)
) ENGINE = MergeTree ORDER BY id

HINWEIS

Datentypnamen sind groß- und kleinschreibungsempfindlich, und es wird ein Fehler zurückgegeben, wenn die Groß-/Kleinschreibung falsch ist.

# Erstellen eines Vektorindex

Ein Vektorindex muss erstellt werden, bevor eine Vektorsuche durchgeführt werden kann. Die Syntax zum Erstellen eines Vektorindex lautet wie folgt:

ALTER TABLE [db.]table_name
ADD VECTOR INDEX index_name column_name
[TYPE index_type('param1 = value1', 'param2 = value2', ...)]
  • index_name: der Name des Vektorindex.
  • column_name: der Name der Spalte, für die der Vektorindex erstellt wird. Diese Spalte muss entweder vom Typ Array(Float32) oder FixedString sein. Wenn sie vom Typ Array(Float32) ist, muss sie eine Einschränkung haben, die die Länge des Arrays angibt.
  • index_type: der spezifische Typ des Vektorindex.

TIP

Für ein Array von float32-Vektoren empfehlen wir dringend, den MSTG-Algorithmus für optimale Ergebnisse zu verwenden. Die folgenden anderen Indextypen sind jedoch ebenfalls verfügbar.

  • FLAT: der Brute-Force-Algorithmus zum Vergleich
  • ScaNN: der von Google Research entwickelte Algorithmus für skalierbare nächste Nachbarn
  • IVF-Familie: einschließlich IVFFLAT, IVFSQ und IVFPQ
  • HNSW-Familie: einschließlich HNSWFLAT, HNSWSQ und HNSWPQ

Für binäre Zeichenfolgenvektoren stehen die Indextypen BinaryMSTG, BinaryFLAT, BinaryIVF und BinaryHNSW zur Verfügung. Von diesen empfehlen wir auch dringend die Verwendung des Algorithmus BinaryMSTG für optimale Ergebnisse.

NOTE

Die Vektor-Index-Typen von MSTG und BinaryMSTG werden ausschließlich in den SaaS/BYOC-Versionen angeboten, während alle anderen Typen in allen Versionen verfügbar sind, einschließlich Open Source, SaaS und BYOC.

Es gibt auch zwei Möglichkeiten, einen Standardvektorindex zu erstellen, ohne einen index_type anzugeben:

  1. Erstelle einen Vektorindex mit index_type gleich DEFAULT.
  2. Es ist nicht erforderlich, das Feld TYPE index_type(...) anzugeben, wenn Sie einen Vektorindex erstellen.

TIP

In den Open-Source-Versionen erstellen wir standardmäßig ScaNN- und BinaryIVF-Vektorindizes. In den SaaS/BYOC-Versionen erstellen wir standardmäßig MSTG- und BinaryMSTG-Vektorindizes.

Beispiel: Um einen Vektorindex namens idx des Typs MSTG für die vector-Spalte in der Tabelle test_float_vector in SaaS zu erstellen, verwenden Sie einen der folgenden Befehle:

-- Geben Sie den Vektorindextyp an.
ALTER TABLE test_float_vector ADD VECTOR INDEX idx vector TYPE MSTG
-- Erstelle einen Vektorindex mit index_type gleich DEFAULT.
ALTER TABLE test_float_vector ADD VECTOR INDEX idx vector TYPE DEFAULT
-- Der Vektorindextyp ist nicht angegeben.
ALTER TABLE test_float_vector ADD VECTOR INDEX idx vector

TIP

Für detaillierte Informationen zu Parametern für bestimmte Typen siehe den Abschnitt Erklärung der Konfigurationsoptionen für Vektorindizes. Für Vorschläge zur Leistungsoptimierung siehe den Abschnitt Ratschläge zur Leistungsoptimierung.

Ab der DB-Version v1.4.0 oder höher ermöglicht MyScale das Erstellen mehrerer Vektorindizes in einer Tabelle. Es ist jedoch nur ein Vektorindex auf einer Vektorspalte erlaubt. Zum Beispiel kann eine Tabelle mit mehreren Vektor-Spalten erstellt werden:

-- Tabelle mit zwei Float32-Vektor-Spalten mit unterschiedlichen Dimensionen erstellen
CREATE TABLE test_multiple_vectors
(
    id    UInt32,
    vec1  Array(Float32),
    vec2  Array(Float32),
    CONSTRAINT check_length CHECK length(vec1) = 128,
    CONSTRAINT check_length CHECK length(vec2) = 64,
    date  Date,
    label Enum8('person' = 1, 'building' = 2, 'animal' = 3)
) ENGINE = MergeTree ORDER BY id

Dann kann ein Vektorindex auf jeder Vektorspalte erstellt werden:

-- MSTG-Indextyp auf Spalte vec1 hinzufügen
ALTER TABLE test_multiple_vectors ADD VECTOR INDEX idx1 vec1 TYPE MSTG
-- Ein weiterer MSTG-Vektorindex auf Spalte vec2 hinzufügen
ALTER TABLE test_multiple_vectors ADD VECTOR INDEX idx2 vec2 TYPE MSTG

# Löschen eines Vektorindex

Die folgende Syntax kann verwendet werden, um einen Vektorindex zu löschen. Dadurch wird der Index entfernt und die damit verbundenen Speicher- und Festplattenressourcen freigegeben. Wenn der Index derzeit erstellt wird, wird der Erstellungsprozess ebenfalls sofort gestoppt.

ALTER TABLE [db.]table_name DROP VECTOR INDEX index_name

# Überprüfen des Status von Vektorindizes

Um den aktuellen Status von Vektorindizes anzuzeigen, können Sie die Tabelle system.vector_indices verwenden. Die folgende Syntax ermöglicht es Ihnen, alle vorhandenen Vektorindizes anzuzeigen:

SELECT * FROM system.vector_indices

Sie können eine WHERE-Klausel verwenden, um die Ergebnisse nach Tabellennamen oder anderen Kriterien zu filtern. Um beispielsweise die Vektorindizes für eine bestimmte Tabelle wie test_float_vector anzuzeigen, können Sie den folgenden Befehl verwenden:

SELECT table, name, status FROM system.vector_indices
WHERE table = 'test_float_vector'

Dies gibt Informationen über den Vektorindex aus, einschließlich seines aktuellen Status, der einer der folgenden sein kann:

  1. Built: Dieser Status gibt an, dass der Index erfolgreich erstellt wurde und einsatzbereit ist.
  2. InProgress: Dieser Status bedeutet, dass der Index derzeit erstellt oder aktualisiert wird. Während dieser Zeit kann der Index unvollständig sein und die Vektorsuche auf Daten, die nicht indiziert wurden, wird auf den Brute-Force-Algorithmus zurückfallen, der viel langsamer ist.
  3. Error: Wenn der Index während des Aufbaus oder der Verwendung einen Fehler aufweist, wechselt er in den Status Error. Dies kann verschiedene Gründe haben, wie ungültige Eingabedaten oder Systemfehler. Wenn der Index sich in diesem Status befindet, ist er in der Regel nicht verfügbar, bis der Fehler behoben ist.

Für Vektorindizes im Status Error können Sie die Fehlergründe mit dem folgenden Befehl anzeigen:

SELECT table, name, latest_failed_part, latest_fail_reason
FROM system.vector_indices WHERE status = 'Error'

# Grundlegende Vektorsuche

Die Funktion distance() wird verwendet, um Vektorsuchen in MyScale durchzuführen. Sie berechnet den Abstand zwischen einem angegebenen Vektor und allen Vektordaten in einer angegebenen Spalte und gibt die besten Kandidaten zurück. Die grundlegende Syntax für die Funktion distance() lautet wie folgt:

distance('param1 = value1', 'param2 = value2')(column_name, query_vector)
  • params repräsentiert suchspezifische Parameter. params kann auch indexspezifische Parameter enthalten, wie z.B. nprobe = 1 für den IVFFLAT-Vektorindex, um den Suchbereich festzulegen.
  • column_name bezieht sich auf die Spalte, die die zu durchsuchenden Vektordaten enthält.
  • query_vector ist der Vektor, der durchsucht wird.

TIP

  • Für ein Array von Float32-Vektoren ist es wichtig, einen Dezimalpunkt im Abfragevektor einzuschließen, um zu verhindern, dass er als Array(UInt64)-Typ erkannt wird, was zu einem Fehler bei der Ausführung der Abfrage führen würde. Zum Beispiel ein 128D-Array von Float32-Vektoren im Format [3.0, 9, ..., 4].
  • Für binäre Stringvektoren ist es möglicherweise nicht so einfach, sie anzuzeigen und einzugeben wie andere Typen, aber wir können sie mit Hilfe spezifischer Funktionen manipulieren.
    • Verwenden Sie die Funktion char(), um einen binären Vektor zu erzeugen. Diese Funktion gibt den binären String mit der Länge als Anzahl der übergebenen Argumente zurück, und jedes Byte hat den Wert des entsprechenden Arguments. Zum Beispiel ein 128D binärer Stringvektor im Format char(128, 254, ... 127, 100).
    • Verwenden Sie die Funktion unbin(), um einen binären Vektor zu erzeugen. Diese Funktion interpretiert jedes Paar von Binärziffern (im Argument) als eine Zahl und konvertiert es in das Byte, das durch die Zahl dargestellt wird. Zum Beispiel ein 128D binärer Stringvektor im Format unbin('01010...01010').
    • Verwenden Sie die Funktion unhex(), um einen binären Vektor zu erzeugen. Diese Funktion interpretiert jedes Paar von Hexadezimalziffern (im Argument) als eine Zahl und konvertiert es in das Byte, das durch die Zahl dargestellt wird. Zum Beispiel ein 128D binärer Stringvektor im Format unhex('FFEEDDCC...112233').
  • Die Funktion distance() sollte mit ORDER BY und LIMIT-Klausel verwendet werden, um die besten Kandidaten zu erhalten.
  • Die Sortierrichtungen der Spalte der distance()-Funktion in der ORDER BY-Klausel müssen den Metriktypen (Cosinus, IP usw.) des Vektorindex entsprechen, sonst wird ein Fehler gemeldet. Wenn der Metriktyp IP ist, muss die Sortierrichtung DESC sein.

Eine typische Abfrage für die Suche nach einem Array von Float32-Vektoren würde folgendermaßen aussehen:

SELECT id, date, label,
  distance(data, [3.0, 9, 45, 22, 28, 11, 4, 3, 77, 10, 4, 1, 1, 4, 3, 11, 23, 0, 0, 0, 26, 49, 6, 7, 5, 3, 3, 1, 11, 50, 8, 9, 11, 7, 15, 21, 12, 17, 21, 25, 121, 12, 4, 7, 4, 7, 4, 41, 28, 2, 0, 1, 10, 42, 22, 20, 1, 1, 4, 9, 31, 79, 16, 3, 23, 4, 6, 26, 31, 121, 87, 40, 121, 82, 16, 12, 15, 41, 6, 10, 76, 48, 5, 3, 21, 42, 41, 50, 5, 17, 18, 64, 86, 54, 17, 6, 43, 62, 56, 84, 116, 108, 38, 26, 58, 63, 20, 87, 105, 37, 2, 2, 121, 121, 38, 25, 44, 33, 24, 46, 3, 16, 27, 74, 121, 55, 9, 4]) AS dist
FROM test_float_vector
ORDER BY dist LIMIT 10

Diese Abfrage gibt die id, date, label und den Abstand zwischen der Vektor-Spalte und dem Abfragevektor [3.0, 9, ..., 4] aus der Tabelle test_float_vector zurück. Die Klausel ORDER BY dist LIMIT 10 gibt an, dass die 10 nächsten Ergebnisse zurückgegeben werden sollen.

Ausgabe:

id date label dist
3 "2024-08-11" "animal" 0
790110 "2001-10-14" "person" 102904
396372 "1987-12-15" "animal" 108579
401952 "1975-08-24" "animal" 117388
603558 "1999-09-26" "animal" 118487
25589 "1978-08-29" "animal" 119259
12632 "2019-02-25" "animal" 119662
800289 "2000-07-09" "building" 119673
16298 "1997-03-11" "animal" 120011
395903 "2020-08-19" "animal" 121352

Das Abfrageergebnis ist eine Tabelle mit drei Spalten: id, date, label und dist, die die ID des Vektors, das Datum, das Label und den Abstand zwischen den besten Vektorergebnissen und dem Abfragevektor zeigt.

Entsprechend würde eine typische Abfrage für die Suche nach einem binären Stringvektor folgendermaßen aussehen:

SELECT id, date, label,
  distance(binary_data, unhex('ABCDEF0123456789ABCDEF0123456789')) AS dist
FROM test_binary_vector
ORDER BY dist LIMIT 10

# Vektorsuche mit Filtern

Die Vektorsuche mit Filtern ermöglicht es Ihnen, die Ergebnisse basierend auf Werten aus anderen Spalten oder Abstandswerten einzuschränken. Zum Beispiel liefert die folgende Abfrage die ID, den Vektor und den Abstand zwischen der Vektor-Spalte und dem Abfragevektor [3.0, 9, ..., 4] aus der Tabelle test_float_vector, aber nur für Zeilen, bei denen die ID-Spalte größer als 100000 ist:

SELECT id, date, label,
  distance(data, [3.0, 9, 45, 22, 28, 11, 4, 3, 77, 10, 4, 1, 1, 4, 3, 11, 23, 0, 0, 0, 26, 49, 6, 7, 5, 3, 3, 1, 11, 50, 8, 9, 11, 7, 15, 21, 12, 17, 21, 25, 121, 12, 4, 7, 4, 7, 4, 41, 28, 2, 0, 1, 10, 42, 22, 20, 1, 1, 4, 9, 31, 79, 16, 3, 23, 4, 6, 26, 31, 121, 87, 40, 121, 82, 16, 12, 15, 41, 6, 10, 76, 48, 5, 3, 21, 42, 41, 50, 5, 17, 18, 64, 86, 54, 17, 6, 43, 62, 56, 84, 116, 108, 38, 26, 58, 63, 20, 87, 105, 37, 2, 2, 121, 121, 38, 25, 44, 33, 24, 46, 3, 16, 27, 74, 121, 55, 9, 4]) AS dist
FROM test_float_vector
WHERE id > 100000
ORDER BY dist LIMIT 10

Ausgabe:

id date label dist
790110 "2001-10-14" "person" 102904
396372 "1987-12-15" "animal" 108579
401952 "1975-08-24" "animal" 117388
603558 "1999-09-26" "animal" 118487
800289 "2000-07-09" "building" 119673
395903 "2020-08-19" "animal" 121352
600737 "1972-08-25" "animal" 125027
790101 "1990-02-22" "person" 129224
790265 "2019-05-26" "building" 133267
198290 "1974-04-22" "building" 134178

Um nach distance-Werten zu filtern, verwenden Sie die WHERE-Klausel wie folgt:

SELECT id, date, label,
  distance(data, [3.0, 9, 45, 22, 28, 11, 4, 3, 77, 10, 4, 1, 1, 4, 3, 11, 23, 0, 0, 0, 26, 49, 6, 7, 5, 3, 3, 1, 11, 50, 8, 9, 11, 7, 15, 21, 12, 17, 21, 25, 121, 12, 4, 7, 4, 7, 4, 41, 28, 2, 0, 1, 10, 42, 22, 20, 1, 1, 4, 9, 31, 79, 16, 3, 23, 4, 6, 26, 31, 121, 87, 40, 121, 82, 16, 12, 15, 41, 6, 10, 76, 48, 5, 3, 21, 42, 41, 50, 5, 17, 18, 64, 86, 54, 17, 6, 43, 62, 56, 84, 116, 108, 38, 26, 58, 63, 20, 87, 105, 37, 2, 2, 121, 121, 38, 25, 44, 33, 24, 46, 3, 16, 27, 74, 121, 55, 9, 4]) AS dist
FROM test_float_vector
WHERE dist < 110000
ORDER BY dist LIMIT 10

Diese Abfrage gibt die ID, das Datum, das Label und den Abstand zwischen der Vektor-Spalte und dem Abfragevektor [3.0, 9, ..., 4] aus der Tabelle test_float_vector zurück, aber nur für Zeilen, bei denen der Abstand kleiner als 110000 ist.

Ausgabe:

id date label dist
3 "2024-08-11" "animal" 0
790110 "2001-10-14" "person" 102904
396372 "1987-12-15" "animal" 108579

# Mehrfache Vektorsuchen

Hinweis

Diese Funktion ist nur in der DB-Version v1.8 oder höher verfügbar.

Mehrfache Vektorsuchen ermöglichen es Ihnen, mehrere distance()-Funktionen in einer Vektorsuchabfrage zu verwenden. Die besten Kandidaten für mehrere distance()-Funktionen werden basierend auf Teil- und Zeilen-ID kombiniert. Der Ergebnistyp der distance()-Funktion ist Float32. Daher erscheint für eine Zeile mit zwei Vektoren, vec1 und vec2, nur ein Vektor in den besten Kandidaten, der distance()-Wert des anderen Vektors wäre NaN. Eine typische Abfrage für mehrfache Vektorsuchen würde wie folgt aussehen:

SELECT id, date, label, distance(vec1, [3.0, 9, 45, 22, 28, 11, 4, 3, 77, 10, 4, 1, 1, 4, 3, 11, 23, 0, 0, 0, 26, 49, 6, 7, 5, 3, 3, 1, 11, 50, 8, 9, 11, 7, 15, 21, 12, 17, 21, 25, 121, 12, 4, 7, 4, 7, 4, 41, 28, 2, 0, 1, 10, 42, 22, 20, 1, 1, 4, 9, 31, 79, 16, 3, 23, 4, 6, 26, 31, 121, 87, 40, 121, 82, 16, 12, 15, 41, 6, 10, 76, 48, 5, 3, 21, 42, 41, 50, 5, 17, 18, 64, 86, 54, 17, 6, 43, 62, 56, 84, 116, 108, 38, 26, 58, 63, 20, 87, 105, 37, 2, 2, 121, 121, 38, 25, 44, 33, 24, 46, 3, 16, 27, 74, 121, 55, 9, 4]) AS dist1,
distance(vec2, [3.0, 9, 45, 22, 28, 11, 4, 3, 77, 10, 4, 1, 1, 4, 3, 11, 23, 0, 0, 0, 26, 49, 6, 7, 5, 3, 3, 1, 11, 50, 8, 9, 11, 7, 15, 21, 12, 17, 21, 25, 121, 12, 4, 7, 4, 7, 4, 41, 28, 2, 0, 1, 10, 42, 22, 20, 1, 1, 4, 9, 31, 79, 16, 3]) AS dist2
FROM test_multiple_vectors
ORDER BY dist1 + dist2
LIMIT 10;
  • Die Vektorsuchauswahlabfrage sollte mit den Order-by- und Limit-Klauseln verwendet werden, um die besten Kandidaten zu erhalten.
  • Für Fälle, in denen distance()-Werte NaN enthalten, können Sie einen Ausdruck wie ifNotFinite(dist1, <default_value>) verwenden, um einen geeigneten Standardwert für den NaN-Wert bereitzustellen.

# Erklärung der Konfigurationsoptionen für Vektorindexe

Vektorindexe haben zwei Arten von Parametern: Indexerstellungparameter und Suchparameter.

Indexerstellungparameter werden bei der Indexerstellung angegeben, zum Beispiel

ALTER TABLE [db.]table_name
ADD VECTOR INDEX index_name column_name
[TYPE index_type
(
  'creation_param1 = value1',
  'creation_param2 = value2',
  ...
)]

Suchparameter werden während der Suche angegeben, zum Beispiel

SELECT
  id,
  distance('search_param1 = value1', 'search_param2 = value2')(column_name, query_vector) as dist
FROM [db.]table_name
ORDER BY dist LIMIT 10

# Allgemeine Parameter zur Indexerstellung

Die folgenden Parameter können bei der Erstellung eines beliebigen Vektorindexes verwendet werden:

  • metric_type: Dieser Parameter bestimmt die Distanzmetrik, die bei der Vektorsuche verwendet wird.
    • Für ein Array von Float32-Vektoren sind drei Optionen verfügbar, wobei L2 der Standardwert ist.
      • L2: Die L2-Metrik, auch bekannt als euklidischer Abstand.
      • Cosine: Der Kosinusabstand, der auf der Kosinusähnlichkeit basiert. Die Formel für den Kosinusabstand wird berechnet als:

        Die Kosinusähnlichkeit kann durch Subtraktion des Abstandswertes von 1 erhalten werden.
      • IP: Die Metrik des inneren Produkts (IP). Bitte beachten Sie, dass bei Verwendung der IP-Metrik ORDER BY ... DESC verwendet werden muss, da höhere IP-Werte eine größere Ähnlichkeit anzeigen.
    • Für binäre Stringvektoren ist eine Option verfügbar, wobei Hamming der Standardwert ist.
      • Hamming: Der Hamming-Abstand zwischen zwei gleich langen Vektoren ist die Anzahl der unterschiedlichen Symbole an entsprechenden Positionen.
      • Jaccard: Der Jaccard-Abstand misst die Unähnlichkeit. Die Formel für den Jaccard-Abstand wird berechnet als:

        Der Jaccard-Koeffizient kann durch Subtraktion des Abstandswertes von 1 erhalten werden.

# ScaNN / MSTG / BinaryMSTG Parameter

ScaNN ist ein von Google entwickelter Algorithmus für eine schnelle und skalierbare Suche nach nächsten Nachbarn in hochdimensionalen Vektorräumen.

Der Multi-Scale Tree Graph (MSTG)-Algorithmus, entwickelt von MyScale, ist eine proprietäre Lösung, die eine hohe Datendichte und hohe Leistung für Standard- und gefilterte Vektorsuchoperationen bietet.

Parameter zur Indexerstellung:

ScaNN, MSTG und BinaryMSTG nehmen während der Indexerstellung keine Parameter an, außer dem oben beschriebenen metric_type.

Suchparameter:

  • alpha = float: Dieser Parameter steuert die Genauigkeit der Suchoperation. Je höher der Wert, desto genauer die Suche, aber desto geringer die QPS. Der Standardwert ist 3, und der gültige Bereich liegt zwischen 1 und 4.

# FLAT / BinaryFLAT Parameter

FLAT und BinaryFLAT sind die einfachsten Formen der Vektorindizierung und berechnen die Abstände direkt anhand von Rohdaten ohne zusätzliche Optimierungsparameter. Es ist nützlich für das Prototyping und um die Genauigkeit der Suchergebnisse sicherzustellen, aber aufgrund seiner relativ langsamen Leistung wird es nicht für den Produktionseinsatz empfohlen.

# IVFFLAT-Parameter

IVFFLAT ist ein hierarchischer Index, der Clustering verwendet, um Vektoren in kleinere Cluster aufzuteilen und effizientere Suchen zu ermöglichen.

Parameter zur Indexerstellung:

  • ncentroids = int: Bestimmt die Anzahl der Cluster, in die alle Vektordaten aufgeteilt werden. Größere Werte von ncentroids führen zu längeren Aufbauzeiten der Tabelle. Der Standardwert ist 1024.

Suchparameter:

  • nprobe = int: Gibt die Anzahl der Cluster an, die während einer Suchoperation durchsucht werden sollen. Größere Werte führen zu langsameren Suchen, aber größerer Genauigkeit. Der Standardwert ist 1.

Empfohlene Parameterwerte:

Es wird empfohlen, einen Wert zwischen 1000 und 10000 für ncentroids zu wählen, wobei Werte in der Nähe der Quadratwurzel der Datenmenge bevorzugt werden. Wenn ncentroids zu groß ist, kann dies die Leistung beeinträchtigen. Ein Wert zwischen 0,1% und 10% von ncentroids wird für nprobe vorgeschlagen.

# IVFPQ-Parameter

Parameter zur Indexerstellung:

  • ncentroids = int: Siehe IVFFLAT.

  • M = int: Reduziert die ursprüngliche Vektordimension auf M. M muss durch die ursprüngliche Vektordimension teilbar sein. Der Standardwert ist 16.

  • bit_size = int: Bezieht sich auf die Größe der zur Ersetzung des ursprünglichen Vektors verwendeten Product Quantization (PQ)-Codierungstabelle. Gültige Werte sind Vielfache von 4, mit einem Standardwert von 8.

Suchparameter:

Empfohlene Parameterwerte:

Die empfohlenen Werte für ncentroids und nprobe sind ähnlich wie bei IVFFLAT. Es ist wichtig zu beachten, dass das Kompressionsverhältnis von PQ wie folgt berechnet wird: (bit_size * M) / (original_dimension * original_element_size). Für einen 128-dimensionalen Float32-Vektor beträgt das Kompressionsverhältnis bei M = 16 und bit_size = 8 entsprechend (16*8)/(128*32) = 1/32. Übermäßig hohe Kompressionsverhältnisse können die Genauigkeit der Suchergebnisse erheblich beeinträchtigen, daher wird empfohlen, bit_size auf 8 und M innerhalb von 1/4 der ursprünglichen Dimension zu halten, um dieses Problem zu vermeiden.

# IVFSQ Parameter

Parameter zur Indexerstellung:

  • ncentroids = int: Siehe IVFFlat.

  • bit_size = string: Zulässige Werte sind 8bit, 6bit, 4bit, 8bit_uniform, 8bit_direct, 4bit_uniform und QT_fp16 mit einem Standardwert von 8bit.

Der Scalar Quantization (SQ) Algorithmus wird verwendet, um jede Vektordimension zu komprimieren, während die Anzahl der Dimensionen beibehalten wird. Wenn bit_size auf 8 gesetzt ist, beträgt die Kompressionsrate etwa 25%. Die Präzision des Algorithmus nimmt in der Reihenfolge 8bit_direct, 8bit_uniform und 8bit zu, aber die Geschwindigkeit des Indexaufbaus ist umgekehrt proportional zur Präzision. 8bit_direct konvertiert float in uint_8 mit static_cast, 8bit_uniform teilt alle float-Werte gleichmäßig in 256 Bins auf und 8bit teilt jede Dimension gleichmäßig in 256 Bins auf. 4bit_uniform teilt und quantisiert Daten in 16 Bins auf. QT_fp16 ist eine Variation des SQ-Algorithmus, der halbgenaue Gleitkommazahlen verwendet, und weitere Details finden Sie unter dem Link https://gist.github.com/rygorous/2156668 (opens new window).

Parameter zur Suche:

# HNSWFLAT Parameter

Der Hierarchical Navigable Small World (HNSW) Algorithmus ist ein Typ von Approximate Nearest Neighbor Search Algorithmus, der entwickelt wurde, um die nächsten Nachbarn eines gegebenen Abfragepunkts in einem hochdimensionalen Raum schnell zu finden. Dies geschieht durch die Organisation der Datenpunkte in einer mehrstufigen Graphen-Datenstruktur. Der HNSW-Algorithmus verwendet das Prinzip der "Small World"-Netzwerke, bei denen die meisten Knoten nur wenige Schritte voneinander entfernt sind, um den Graphen zu navigieren und effizient die nächsten Datenpunkte zum Abfragepunkt zu finden. Er ist bekannt für seine hohe Leistung und Skalierbarkeit bei großen Datensätzen und hochdimensionalem Raum.

Parameter zur Indexerstellung:

  • m = int: Dieser Parameter bestimmt die Anzahl der Nachbarn jedes Datenpunkts im HNSW-Diagramm und beeinflusst die Qualität des Indexes. Ein größeres m führt zu einer höheren Genauigkeit der Suchergebnisse, erhöht jedoch auch die Zeit, die für den Aufbau des Indexes benötigt wird. Standardwert ist 16.
  • ef_c = int: Dieser Parameter bestimmt die Größe der Prioritätswarteschlange, die von HNSW beim Erstellen des Indexes verwendet wird, und beeinflusst die Qualität des Indexes. Ein größeres ef_c führt zu einer höheren Präzision der Suchergebnisse, erhöht jedoch auch die Zeit, die für den Aufbau des Indexes benötigt wird. Standardwert ist 100.

Parameter zur Suche:

  • ef_s = int: Dieser Parameter bestimmt die Größe der Prioritätswarteschlange, die von HNSW während der Suchoperation verwendet wird. Ein größeres ef_s führt zu einer höheren Präzision der Suchergebnisse, erhöht jedoch auch die Suchzeit. Standardwert ist 50.

Empfohlene Parameterwerte:

Es wird im Allgemeinen empfohlen, m zwischen 8-128 und ef_c zwischen 50-400 einzustellen. Das Verdoppeln von ef_c führt ungefähr zu einer Verdopplung der Zeit für den Indexaufbau. Der Wert von ef_s sollte entsprechend den Suchanforderungen angepasst werden, und es wird empfohlen, den gleichen Wertebereich wie ef_c zu verwenden. Ein niedrigerer Wert kann gewählt werden, wenn eine geringe Latenzanforderung erforderlich ist.

# HNSWSQ Parameter

Parameter zur Indexerstellung:

Parameter zur Suche:

Empfohlene Parameterwerte:

Siehe IVFSQ für die Auswahl von bit_size und HNSWFLAT für den Rest.

# Ratschläge zur Leistungsoptimierung

Im Allgemeinen empfehlen wir die Verwendung des MSTG/BinaryMSTG-Index und der Standardwerte für die Indexerstellung, um die Leistung zu optimieren. Beim Suchen können Sie den alpha-Wert basierend auf dem gewünschten Durchsatz und der Präzision anpassen.

In MyScale wird die Daten automatisch in mehrere Teile aufgeteilt, und intern wird für jeden Teil ein Vektorindex erstellt. Für optimale Leistung empfehlen wir, die Tabelle vor der Erstellung des Vektorindex in einen Datenpart zu optimieren. Sie können den folgenden Befehl verwenden, um eine Tabelle zu optimieren:

OPTIMIZE TABLE test_vector FINAL

Daher lautet die empfohlene Reihenfolge der Operationen:

  1. Tabelle mit CREATE TABLE ... erstellen;
  2. Daten mit INSERT INTO ... einfügen;
  3. Tabelle optimieren;
  4. Vektorindex mit ALTER TABLE ... ADD VECTOR INDEX erstellen;
  5. Warten, bis der Vektorindex erstellt ist;
  6. Mit der Suche beginnen.

Es ist wichtig zu beachten, dass das Optimieren einer Tabelle nach der Indexerstellung viel Speicher verbrauchen kann. Bitte optimieren Sie daher eine Tabelle nicht nach der Indexerstellung.

Last Updated: Fri Nov 01 2024 09:02:06 GMT+0000