# 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 String-Vektoren sind die verfügbaren Indextypen BinaryFLAT und BinaryMSTG, und wir empfehlen ebenfalls dringend, den BinaryMSTG-Algorithmus für optimale Ergebnisse zu verwenden.

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.

Zum Beispiel, um einen Vektorindex mit dem Namen idx vom Typ MSTG für die Spalte vector in der Tabelle test_float_vector zu erstellen, verwenden Sie den folgenden Befehl:

ALTER TABLE test_float_vector ADD VECTOR INDEX idx vector TYPE MSTG

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.

# 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

# 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: Mon Apr 29 2024 08:19:07 GMT+0000