Indexe erstellen und Vektoren abfragen

Wählen Sie eine Dokumentationsversion aus:

In diesem Dokument erfahren Sie, wie Sie gespeicherte Einbettungen verwenden, um Indexe zu generieren und Einbettungen abzufragen. Weitere Informationen zum Speichern von Einbettungen finden Sie unter Vektoreinbettungen speichern.

Sie können Indexe vom Typ ScaNN, IVF, IVFFlat und HNSW mit AlloyDB erstellen.

Hinweis

Bevor Sie mit dem Erstellen von Indexen beginnen können, müssen Sie die folgenden Voraussetzungen erfüllen.

  • Einbettungsvektoren wurden einer Tabelle in Ihrer AlloyDB-Datenbank hinzugefügt.

  • Die vector-Erweiterungsversion 0.5.0 oder höher, die auf pgvector basiert und von Google für AlloyDB erweitert wurde, ist installiert.

    CREATE EXTENSION IF NOT EXISTS vector;
    
  • Wenn Sie ScaNN-Indexe generieren möchten, installieren Sie zusätzlich zur Erweiterung vector die Erweiterung alloydb_scann.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Index erstellen

Sie können einen der folgenden Indextypen für Tabellen in Ihrer Datenbank erstellen.

ScaNN-Index erstellen

AlloyDB alloydb_scann, eine von Google entwickelte PostgreSQL-Erweiterung, die einen hocheffizienten Index für die Suche nach dem nächsten Nachbarn implementiert, der auf dem ScaNN-Algorithmus basiert.

Der ScaNN-Index ist ein baumbasierter Quantisierungsindex für die Suche nach dem ungefähren nächsten Nachbarn. Im Vergleich zu HNSW ist die Indexerstellung schneller und der Speicherbedarf geringer. Außerdem bietet es im Vergleich zu HNSW je nach Arbeitslast eine höhere Abfragerate pro Sekunde.

ScaNN-Index mit zweistufigem Baum

Wenn Sie einen zweistufigen Baumindex mit dem ScaNN-Algorithmus auf eine Spalte mit gespeicherten Vektoreinbettungen anwenden möchten, führen Sie die folgende DDL-Abfrage aus:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE);

Ersetzen Sie Folgendes:

  • INDEX_NAME: Der Name des Index, den Sie erstellen möchten, z. B. my-scann-index. Die Indexnamen sind in Ihrer Datenbank freigegeben. Achten Sie darauf, dass jeder Indexname für jede Tabelle in Ihrer Datenbank eindeutig ist.

  • TABLE: Die Tabelle, der der Index hinzugefügt werden soll.

  • EMBEDDING_COLUMN: eine Spalte, in der vector-Daten gespeichert werden.

  • DISTANCE_FUNCTION: Die Distanzfunktion, die für diesen Index verwendet werden soll. Wählen Sie eine der folgenden Optionen aus:

    • L2-Distanz: l2

    • Skalarprodukt: dot_product

    • Kosinus-Distanz: cosine

  • NUM_LEAVES_VALUE: Die Anzahl der Partitionen, die auf diesen Index angewendet werden sollen. Kann auf einen beliebigen Wert zwischen 1 und 1.048.576 festgelegt werden. Weitere Informationen dazu, wie Sie diesen Wert festlegen, finden Sie unter ScaNN-Index abstimmen.

Dreistufiger ScaNN-Baumindex

Wenn Sie einen dreistufigen Baumindex mit dem ScaNN-Algorithmus auf eine Spalte mit gespeicherten Vektoreinbettungen anwenden möchten, führen Sie die folgende DDL-Abfrage aus:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

Ersetzen Sie Folgendes:

  • MAX_NUM_LEVELS: die maximale Anzahl von Ebenen im K-Means-Clustering-Baum. Legen Sie 1 (Standard) für die zweistufige baumbasierte Quantisierung und 2 für die dreistufige baumbasierte Quantisierung fest.

Nachdem Sie den Index erstellt haben, können Sie Abfragen zur Suche nach nächsten Nachbarn ausführen, die den Index verwenden. Folgen Sie dazu der Anleitung unter Abfrage von nächsten Nachbarn mit einem vorgegebenen Text erstellen.

Die Indexparameter müssen mit Blick auf ein gutes Gleichgewicht zwischen QPS und Recall festgelegt werden. Weitere Informationen zum Abstimmen des ScaNN-Index finden Sie unter ScaNN-Index abstimmen.

Wenn Sie diesen Index für eine Einbettungsspalte erstellen möchten, die den Datentyp real[] anstelle von vector verwendet, wandeln Sie die Spalte in den Datentyp vector um:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

Ersetzen Sie DIMENSIONS durch die dimensionale Breite der Einbettungsspalte. Weitere Informationen zum Ermitteln der Dimensionen finden Sie unter der Funktion vector_dims in Vektorfunktionen.

Aktivieren Sie für eine konsistente Suche die automatische Wartung, wenn Sie einen ScaNN-Index erstellen. Weitere Informationen finden Sie unter Vektorindexe verwalten. Dieses Feature ist in der Vorschau verfügbar.

Verwenden Sie zum Anzeigen des Indexierungsfortschritts die pg_stat_progress_create_index-Ansicht:

SELECT * FROM pg_stat_progress_create_index;

In der Spalte phase wird der aktuelle Status der Indexerstellung angezeigt. Die Phase building index: tree training wird nach der Indexerstellung nicht mehr angezeigt.

Informationen zum Abstimmen Ihres Index auf ein bestimmtes Gleichgewicht zwischen Recall und QPS finden Sie unter ScaNN-Index abstimmen.

Indexierte Tabelle analysieren

Nachdem Sie den ScaNN-Index erstellt haben, führen Sie den Befehl ANALYZE aus, um Statistiken zu Ihren Daten zu aktualisieren.

ANALYZE TABLE;

Indexe parallel erstellen

Je nach Dataset und Art des Index, den Sie erstellen möchten, kann AlloyDB automatisch mehrere parallele Worker starten, um den Index schneller zu erstellen.

Die parallele Indexerstellung wird häufig ausgelöst, wenn Sie einen ScaNN-Index mit drei Ebenen erstellen oder Ihr Dataset mehr als 100 Millionen Zeilen umfasst.

Obwohl AlloyDB die Anzahl der parallelen Worker automatisch optimiert, können Sie die parallelen Worker mit den PostgreSQL-Parametern für die Abfrageplanung max_parallel_maintenance_workers, max_parallel_workers und min_parallel_table_scan_size anpassen.

Abfrage ausführen

Nachdem Sie Einbettungen in Ihrer Datenbank gespeichert und indexiert haben, können Sie mit der pgvector-Abfragefunktion Abfragen starten. Mit der alloydb_scann-Erweiterung können keine Bulk-Suchanfragen ausgeführt werden.

Wenn Sie die semantisch nächsten Nachbarn für einen Einbettungsvektor finden möchten, können Sie die folgende Beispielabfrage ausführen. Dabei legen Sie dieselbe Distanzfunktion fest, die Sie beim Erstellen des Index verwendet haben.

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
    LIMIT ROW_COUNT

Ersetzen Sie Folgendes:

  • TABLE: Die Tabelle, die die Einbettung enthält, mit der der Text verglichen werden soll.

  • INDEX_NAME: Der Name des Index, den Sie verwenden möchten, z. B. my-scann-index.

  • EMBEDDING_COLUMN: die Spalte mit den gespeicherten Einbettungen.

  • DISTANCE_FUNCTION_QUERY: Die Distanzfunktion, die für diese Abfrage verwendet werden soll. Wählen Sie je nach der beim Erstellen des Index verwendeten Distanzfunktion eine der folgenden Optionen aus:

    • L2-Distanz: <->

    • Inneres Produkt:<#>

    • Kosinus-Distanz: <=>

  • EMBEDDING: Der Einbettungsvektor, für den Sie die nächsten gespeicherten semantischen Nachbarn finden möchten.

  • ROW_COUNT: Die Anzahl der zurückzugebenden Zeilen.

    Geben Sie 1 an, wenn Sie nur das beste Ergebnis erhalten möchten.

Weitere Beispiele hierzu finden Sie unter Abfragen.

Sie können auch die Funktion embedding() verwenden, um den Text in einen Vektor zu übersetzen. Sie wenden den Vektor auf einen der pgvector-Operatoren für den nächsten Nachbarn an, <-> für die L2-Distanz, um die Datenbankzeilen mit den semantisch ähnlichsten Einbettungen zu finden.

Da embedding() ein real-Array zurückgibt, müssen Sie den embedding()-Aufruf explizit in vector umwandeln, um diese Werte mit pgvector-Operatoren zu verwenden.

  CREATE EXTENSION IF NOT EXISTS google_ml_integration;
  CREATE EXTENSION IF NOT EXISTS vector;

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN::vector
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
    LIMIT ROW_COUNT

Ersetzen Sie Folgendes:

  • MODEL_ID: Die ID des Modells, das abgefragt werden soll.

    Wenn Sie den Vertex AI Model Garden verwenden, geben Sie text-embedding-005 als Modell-ID an. Dies sind die cloudbasierten Modelle, die AlloyDB für Texteinbettungen verwenden kann. Weitere Informationen finden Sie unter Texteinbettungen.

  • Optional: VERSION_TAG: das Versions-Tag des abzufragenden Modells. Stellen Sie @ dem Tag voran.

    Wenn Sie eines der englischen text-embedding-Modelle mit Vertex AI verwenden, geben Sie eines der Versionstags an, z. B. text-embedding-005, das unter Modellversionen aufgeführt ist.

    Google empfiehlt dringend, immer das Versions-Tag anzugeben. Wenn Sie das Versions-Tag nicht angeben, verwendet AlloyDB immer die neueste Modellversion, was zu unerwarteten Ergebnissen führen kann.

  • TEXT: Der Text, der in eine Vektoreinbettung übersetzt werden soll.

Nächste Schritte