# 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 BeispielCONSTRAINT 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 und8 * 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 TypArray(Float32)
oderFixedString
sein. Wenn sie vom TypArray(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 VergleichScaNN
: der von Google Research entwickelte Algorithmus für skalierbare nächste NachbarnIVF
-Familie: einschließlichIVFFLAT
,IVFSQ
undIVFPQ
HNSW
-Familie: einschließlichHNSWFLAT
,HNSWSQ
undHNSWPQ
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:
- Erstelle einen Vektorindex mit
index_type
gleichDEFAULT
. - 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:
Built
: Dieser Status gibt an, dass der Index erfolgreich erstellt wurde und einsatzbereit ist.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.Error
: Wenn der Index während des Aufbaus oder der Verwendung einen Fehler aufweist, wechselt er in den StatusError
. 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 denIVFFLAT
-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 Formatchar(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 Formatunbin('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 Formatunhex('FFEEDDCC...112233')
.
- Verwenden Sie die Funktion
- Die Funktion
distance()
sollte mitORDER BY
undLIMIT
-Klausel verwendet werden, um die besten Kandidaten zu erhalten. - Die Sortierrichtungen der Spalte der
distance()
-Funktion in derORDER BY
-Klausel müssen den Metriktypen (Cosinus, IP usw.) des Vektorindex entsprechen, sonst wird ein Fehler gemeldet. Wenn der MetriktypIP
ist, muss die SortierrichtungDESC
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-MetrikORDER 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.
- Für ein Array von Float32-Vektoren sind drei Optionen verfügbar, wobei
# 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 vonncentroids
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
: SieheIVFFLAT
.M = int
: Reduziert die ursprüngliche Vektordimension aufM
.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:
nprobe = int
: SieheIVFFLAT
.
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
: SieheIVFFlat
.bit_size = string
: Zulässige Werte sind8bit
,6bit
,4bit
,8bit_uniform
,8bit_direct
,4bit_uniform
undQT_fp16
mit einem Standardwert von8bit
.
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:
nprobe = int
: SieheIVFFlat
.
# 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ößeresm
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ößeresef_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ößeresef_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:
ef_s = int
: SieheHNSWFLAT
.
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:
- Tabelle mit
CREATE TABLE ...
erstellen; - Daten mit
INSERT INTO ...
einfügen; - Tabelle optimieren;
- Vektorindex mit
ALTER TABLE ... ADD VECTOR INDEX
erstellen; - Warten, bis der Vektorindex erstellt ist;
- 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.