Auf dieser Seite wird beschrieben, wie Sie gespeicherte Einbettungen verwenden, um Indexe zu generieren und Einbettungen mit einem HNSW-Index in AlloyDB Omni abzufragen.
Weitere Informationen zum Speichern von Einbettungen finden Sie unter Vektoreinbettungen speichern.
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 Omni-Datenbank hinzugefügt.
Die
vector-Erweiterungsversion0.5.0oder höher, die aufpgvectorbasiert und von Google für AlloyDB Omni erweitert wurde, ist installiert.CREATE EXTENSION IF NOT EXISTS vector;
HNSW-Index erstellen
AlloyDB Omni unterstützt das Erstellen eines graphbasierten hnsw-Index, der mit pgvector über die AlloyDB Omni-Erweiterung pgvector verfügbar ist. Bei Verwendung eines hnsw-Index wird eine Greedy-Suche durchgeführt, bei der der Graph durchlaufen und ständig nach dem Nachbarn gesucht wird, der dem Abfragevektor am nächsten ist, bis ein optimales Ergebnis gefunden wird. Das sorgt im Vergleich zu IVF für eine schnellere Abfrageleistung bei längeren Build-Zeiten.
Weitere Informationen zum HNSW-Algorithmus finden Sie unter Hierarchical Navigable Small World-Graphen.
Führen Sie die folgende Abfrage aus, um einen hnsw-Index zu erstellen:
CREATE INDEX INDEX_NAME ON TABLE
USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');
Ersetzen Sie Folgendes:
INDEX_NAME: Der Name des Index, den Sie erstellen möchten, z. B.my-hnsw-index.TABLE: Die Tabelle, der der Index hinzugefügt werden soll.EMBEDDING_COLUMN: eine Spalte, in dervector-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:
vector_l2_opsInneres Produkt:
vector_ip_opsKosinus-Distanz:
vector_cosine_ops
NUMBER_OF_CONNECTIONS: Die maximale Anzahl von Verbindungen pro Knoten im Diagramm. Sie können mit dem Standardwert16beginnen und je nach Größe Ihres Datasets höhere Werte testen.CANDIDATE_LIST_SIZE: Die Größe einer Kandidatenliste, die während der Grapherstellung verwaltet wird und die aktuellen besten Kandidaten für die nächsten Nachbarn eines Knotens ständig aktualisiert. Legen Sie hierfür einen beliebigen Wert fest, der höher als das Doppelte desm-Werts ist, z. B.64.
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 graph wird nach der Indexerstellung nicht mehr angezeigt.
Informationen zum Abstimmen des Index für ein bestimmtes Gleichgewicht zwischen Recall und QPS finden Sie unter hnsw-Index abstimmen.
Abfrage ausführen
Nachdem Sie die Einbettungen in Ihrer Datenbank gespeichert und indexiert haben, können Sie mit der pgvector-Abfragefunktion Abfragen starten.
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-hnsw-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
1an, 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.
Nächste Schritte
- ScaNN-Index erstellen
- Suchen nach Vektorähnlichkeiten durchführen
- Leistung von Vektorabfragen optimieren
- Messwerte für Vektorindexe
- Informationen zum Erstellen eines Smart Shopping Assistant mit AlloyDB, pgvector und der Verwaltung von Modellendpunkten