Vektorindexe verwalten
In diesem Dokument wird beschrieben, wie Sie Vektorindexe erstellen und verwalten, um Ihre Vektorsuchen zu beschleunigen.
Ein Vektorindex ist eine Datenstruktur, die die effizientere Ausführung der Funktion VECTOR_SEARCH und der Funktion AI.SEARCH ermöglicht, insbesondere bei großen Datasets.
Bei Verwendung eines Index nutzen diese Suchfunktionen ANN-Algorithmen (Approximate Nearest Neighbor), um die Abfragelatenz und die Rechenkosten zu senken. ANN führt zwar zu einer gewissen Annäherung, was bedeutet, dass die Trefferquote möglicherweise nicht 100 % beträgt. Die Leistungssteigerungen bieten jedoch in der Regel einen Vorteil für die meisten Anwendungen.
Rollen und Berechtigungen
Zum Erstellen eines Vektorindex benötigen Sie die IAM-Berechtigung bigquery.tables.createIndex für die Tabelle, in der Sie den Index erstellen. Zum Löschen eines Vektorindex benötigen Sie die Berechtigung bigquery.tables.deleteIndex. Jede der folgenden vordefinierten IAM-Rollen enthält die Berechtigungen, die Sie benötigen, um mit Vektorindexen zu arbeiten:
- BigQuery Dateninhaber (
roles/bigquery.dataOwner) - BigQuery Datenmitbearbeiter (
roles/bigquery.dataEditor)
Vektorindextyp auswählen
BigQuery bietet zwei Vektorindex-Typen, IVF und TreeAH, die jeweils unterschiedliche Anwendungsfälle unterstützen. BigQuery unterstützt das Batching für die Vektorsuche, indem mehrere Zeilen der Eingabedaten im VECTOR_SEARCH verarbeitet werden.
Für kleine Batchabfragen werden IVF-Indizes bevorzugt. Für große Abfragebatches werden TreeAH-Indizes bevorzugt, die mit dem ScaNN-Algorithmus von Google erstellt werden.
IVF-Index
IVF ist ein Index mit invertierter Datei, der einen k-Means-Algorithmus verwendet, um die Vektordaten zu clustern und dann die Vektordaten basierend auf diesen Clustern zu partitionieren. Die Funktionen VECTOR_SEARCH und AI.SEARCH können diese Partitionen verwenden, um die Datenmenge zu reduzieren, die zum Ermitteln eines Ergebnisses gelesen werden muss.
TreeAH-Index
Der TreeAH-Indextyp hat seinen Namen von der Kombination aus einer baumartigen Struktur und der Verwendung von asymmetrischem Hashing (Asymmetric Hashing, AH), einer wichtigen Quantisierungstechnik des zugrunde liegenden ScaNN-Algorithmus. Ein TreeAH-Index funktioniert so:
- Die Basistabelle wird in kleinere, besser verwaltbare Shards unterteilt.
- Ein Clustering-Modell wird trainiert. Die Anzahl der Cluster wird aus der Option
leaf_node_embedding_countim Argumenttree_ah_optionsder AnweisungCREATE VECTOR INDEXabgeleitet. - Die Vektoren werden mit der Produktquantisierung komprimiert, einer Technik, die die Speichernutzung reduziert. Die komprimierten Vektoren werden dann anstelle der Originalvektoren in den Indextabellen gespeichert, wodurch die Größe des Vektorindex reduziert wird.
- Wenn die Funktion
VECTOR_SEARCHoderAI.SEARCHausgeführt wird, wird mithilfe von asymmetrischem Hashing effizient eine Kandidatenliste für jeden Abfragevektor berechnet. Dieses Verfahren ist hardwareoptimiert für ungefähre Distanzberechnungen. Diese Kandidaten werden dann mit genauen Einbettungen neu bewertet und neu eingestuft.
Der TreeAH-Algorithmus ist für Batchabfragen optimiert, bei denen Hunderte oder mehr Abfragevektoren verarbeitet werden. Durch die Verwendung von Produktquantisierung können Latenz und Kosten erheblich gesenkt werden, möglicherweise um Größenordnungen im Vergleich zu IVF. Aufgrund des erhöhten Overheads ist der IVF-Algorithmus jedoch möglicherweise besser geeignet, wenn Sie eine kleinere Anzahl von Abfragevektoren haben.
Wir empfehlen den Index-Typ „TreeAH“, wenn Ihr Anwendungsfall die folgenden Kriterien erfüllt:
Ihre Tabelle enthält maximal 200 Millionen Zeilen.
Sie führen häufig große Batchabfragen mit Hunderten oder mehr Abfragevektoren aus.
Bei Anfragen mit kleinen Batches mit dem TreeAH-Indextyp kann VECTOR_SEARCH oder AI.SEARCH auf die Brute-Force-Suche zurückgreifen.
In diesem Fall wird ein IndexUnusedReason angegeben, um zu erklären, warum der Vektorindex nicht verwendet wurde.
IVF-Vektorindex erstellen
Verwenden Sie zum Erstellen eines IVF-Vektorindex die Datendefinitionssprachen-Anweisung (DDL) CREATE VECTOR INDEX:
Rufen Sie die Seite BigQuery auf.
Führen Sie im Abfrageeditor folgende SQL-Anweisung aus:
So erstellen Sie einen IVF-Vektorindex:
CREATE [ OR REPLACE ] VECTOR INDEX [ IF NOT EXISTS ] INDEX_NAME ON DATASET_NAME.TABLE_NAME(COLUMN_NAME) STORING(STORED_COLUMN_NAME [, ...]) OPTIONS(index_type = 'IVF', distance_type = 'DISTANCE_TYPE', ivf_options = '{"num_lists":NUM_LISTS}')
Ersetzen Sie Folgendes:
INDEX_NAME: Der Name des Vektorindex, den Sie erstellen. Da der Index immer im selben Projekt und Dataset wie die Basistabelle erstellt wird, müssen Sie Projekt und Dataset nicht im Namen angeben.DATASET_NAME: der Name des Datasets, das die Tabelle enthält.TABLE_NAME: der Name der Tabelle, die die Spalte mit Einbettungsdaten enthält.COLUMN_NAME: Der Name einer Spalte, die die Einbettungsdaten enthält. Die Spalte muss den TypARRAY<FLOAT64>haben. Wenn Sie die autonome Einbettungserstellung verwenden, muss sie den TypSTRUCT<result ARRAY<FLOAT64>, status STRING>haben.In allen Fällen müssen alle Elemente im Einbettungsarray nicht
NULLsein und alle Werte in der Spalte müssen dieselben Arraydimensionen haben.Wenn der Spaltentyp
STRUCT<result ARRAY<FLOAT64>, status STRING>ist, kann derSTRUCT-WertNULLsein oder dasresult-Array kannNULLsein. Alle Zeilen mitNULLfür diese Werte werden ignoriert.STORED_COLUMN_NAME: Der Name einer Spalte der obersten Ebene in der Tabelle, die im Vektorindex gespeichert werden soll. Der Spaltentyp darf nichtRANGEsein. Gespeicherte Spalten werden nicht verwendet, wenn die Tabelle eine Zugriffsrichtlinie auf Zeilenebene oder die Spalte ein Richtlinien-Tag hat. Informationen zum Aktivieren gespeicherter Spalten finden Sie unter Spalten speichern und vorfiltern.DISTANCE_TYPE: Gibt den Standarddistanztyp an, der bei der Vektorsuche mit diesem Index verwendet werden soll. Die unterstützten Werte sindEUCLIDEAN,COSINEundDOT_PRODUCT. Standardmäßig istEUCLIDEANausgewählt.Beim Erstellen des Index wird immer die
EUCLIDEAN-Distanz für das Training verwendet. Die Distanz, die in Ihrer Suchfunktion verwendet wird, kann jedoch unterschiedlich sein.Wenn Sie einen Wert für das Argument
distance_typeder FunktionVECTOR_SEARCHoderAI.SEARCHangeben, wird dieser Wert anstelle des WertsDISTANCE_TYPEverwendet.NUM_LISTS: einINT64-Wert, der die Anzahl der Listen angibt, in die die IVF-Indexcluster Ihre Vektordaten partitionieren. Dieser Wert muss 5.000 oder weniger betragen. Bei der Indexierung werden Vektoren der Liste zugewiesen, die dem Schwerpunkt des nächstgelegenen Clusters entspricht. Wenn Sie dieses Argument weglassen, bestimmt BigQuery einen Standardwert basierend auf den Eigenschaften Ihrer Daten. Der Standardwert ist für die meisten Anwendungsfälle geeignet.Mit
NUM_LISTSwird der Detaillierungsgrad der Anfrageoptimierung gesteuert. Höhere Werte führen zu mehr Listen. Sie können die Optionfraction_lists_to_searchIhrer Suchfunktion so festlegen, dass ein kleinerer Prozentsatz des Index gescannt wird. Beispiel: 1% von 100 Listen scannen anstatt 10% von 10 Listen. So lässt sich die Suchgeschwindigkeit und der Recall besser steuern, die Indexierungskosten steigen jedoch leicht. Legen Sie diesen Argumentwert entsprechend der Genauigkeit fest, mit der Sie den Abfragebereich anpassen müssen.
Im folgenden Beispiel wird ein Vektorindex für die Spalte embedding von my_table erstellt:
CREATE TABLE my_dataset.my_table(embedding ARRAY<FLOAT64>); CREATE VECTOR INDEX my_index ON my_dataset.my_table(embedding) OPTIONS(index_type = 'IVF');
Im folgenden Beispiel wird ein Vektorindex für die Spalte embedding von my_table erstellt. Außerdem werden der zu verwendende Distanztyp und die IVF-Optionen angegeben:
CREATE TABLE my_dataset.my_table(embedding ARRAY<FLOAT64>); CREATE VECTOR INDEX my_index ON my_dataset.my_table(embedding) OPTIONS(index_type = 'IVF', distance_type = 'COSINE', ivf_options = '{"num_lists": 2500}')
Im folgenden Beispiel wird eine Tabelle mit aktivierter autonomer Einbettungsgenerierung erstellt und ein Vektorindex für die Tabelle erstellt. Die Spalte description_embedding-Einbettung wird automatisch auf Grundlage der Spalte description generiert.
CREATE TABLE mydataset.products ( description STRING, description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING> GENERATED ALWAYS AS ( AI.EMBED(description, connection_id => 'us.example_connection', endpoint => 'text-embedding-005')) STORED OPTIONS( asynchronous = TRUE )); CREATE VECTOR INDEX my_index ON my_dataset.my_table(description_embedding) OPTIONS(index_type = 'IVF');
TreeAH-Vektorindex erstellen
Verwenden Sie zum Erstellen eines TreeAH-Vektorindex die Datendefinitionssprachen-Anweisung (DDL) CREATE VECTOR INDEX:
Rufen Sie die Seite BigQuery auf.
Führen Sie im Abfrageeditor folgende SQL-Anweisung aus:
CREATE [ OR REPLACE ] VECTOR INDEX [ IF NOT EXISTS ] INDEX_NAME ON DATASET_NAME.TABLE_NAME(COLUMN_NAME) STORING(STORED_COLUMN_NAME [, ...]) OPTIONS(index_type = 'TREE_AH', distance_type = 'DISTANCE_TYPE', tree_ah_options = '{"leaf_node_embedding_count":LEAF_NODE_EMBEDDING_COUNT, "normalization_type":"NORMALIZATION_TYPE"}')
Ersetzen Sie Folgendes:
INDEX_NAME: Der Name des Vektorindex, den Sie erstellen. Da der Index immer im selben Projekt und Dataset wie die Basistabelle erstellt wird, müssen Sie Projekt und Dataset nicht im Namen angeben.DATASET_NAME: der Name des Datasets, das die Tabelle enthält.TABLE_NAME: der Name der Tabelle, die die Spalte mit Einbettungsdaten enthält.COLUMN_NAME: Der Name einer Spalte, die die Einbettungsdaten enthält. Die Spalte muss den TypARRAY<FLOAT64>haben. Wenn Sie die autonome Einbettungserstellung verwenden, muss sie den TypSTRUCT<result ARRAY<FLOAT64>, status STRING>haben.In allen Fällen müssen alle Elemente im Einbettungsarray nicht
NULLsein und alle Werte in der Spalte müssen dieselben Arraydimensionen haben. Die Array-Dimension muss mindestens 2 sein.Wenn der Spaltentyp
STRUCT<result ARRAY<FLOAT64>, status STRING>ist, kann derSTRUCT-WertNULLsein oder dasresult-Array kannNULLsein. Alle Zeilen mitNULLfür diese Werte werden ignoriert.STORED_COLUMN_NAME: Der Name einer Spalte der obersten Ebene in der Tabelle, die im Vektorindex gespeichert werden soll. Der Spaltentyp darf nichtRANGEsein. Gespeicherte Spalten werden nicht verwendet, wenn die Tabelle eine Zugriffsrichtlinie auf Zeilenebene oder die Spalte ein Richtlinien-Tag hat. Informationen zum Aktivieren gespeicherter Spalten finden Sie unter Spalten speichern und vorfiltern.DISTANCE_TYPE: Ein optionales Argument, das den Standarddistanztyp angibt, der bei der Vektorsuche mit diesem Index verwendet werden soll. Die unterstützten Werte sindEUCLIDEAN,COSINEundDOT_PRODUCT. Standardmäßig istEUCLIDEANausgewählt.Beim Erstellen des Index wird immer die
EUCLIDEAN-Distanz für das Training verwendet. Die Distanz, die in der Suchfunktion verwendet wird, kann jedoch unterschiedlich sein.Wenn Sie einen Wert für das Argument
distance_typeder FunktionVECTOR_SEARCHoderAI.SEARCHangeben, wird dieser Wert anstelle des WertsDISTANCE_TYPEverwendet.LEAF_NODE_EMBEDDING_COUNT: einINT64-Wert, der größer oder gleich 500 ist und die ungefähre Anzahl der Vektoren in jedem Blattknoten des Baums angibt, den der TreeAH-Algorithmus erstellt. Der TreeAH-Algorithmus unterteilt den gesamten Datenbereich in eine Reihe von Listen, wobei jede Liste etwaLEAF_NODE_EMBEDDING_COUNTDatenpunkte enthält. Ein niedrigerer Wert führt zu mehr Listen mit weniger Datenpunkten, ein höherer Wert zu weniger Listen mit mehr Datenpunkten. Der Standardwert ist 1.000, was für die meisten Datasets angemessen ist.NORMALIZATION_TYPE: EinSTRING-Wert Folgende Werte werden unterstützt:NONEL2. Der Standardwert istNONE. Die Normalisierung erfolgt vor der Verarbeitung sowohl der Daten der Basistabelle als auch der Abfragedaten. Die EinbettungsspalteCOLUMN_NAMEinTABLE_NAMEwird dabei jedoch nicht geändert. Je nach Dataset, Einbettungsmodell und Distanztyp, der bei der Suche verwendet wird, kann die Normalisierung der Einbettungen den Recall verbessern.
Im folgenden Beispiel wird ein Vektorindex für die Spalte embedding von my_table erstellt. Außerdem werden der zu verwendende Distanztyp und die TreeAH-Optionen angegeben:
CREATE TABLE my_dataset.my_table(id INT64, embedding ARRAY<FLOAT64>); CREATE VECTOR INDEX my_index ON