Generative KI-Anwendungen mit AlloyDB AI erstellen

In diesem Abschnitt wird beschrieben, wie Sie Vorhersagen aufrufen und Einbettungen mit der pgvector-Erweiterung abfragen und indexieren. Diese KI-Funktionen, die auf maschinellem Lernen basieren, sind über AlloyDB AI verfügbar. AlloyDB AI ist eine Reihe von AlloyDB for PostgreSQL-Funktionen, mit denen Sie die semantischen und prädiktiven Möglichkeiten von ML-Modellen (maschinelles Lernen) auf Ihre Daten anwenden können.

Weitere Informationen zu AlloyDB AI finden Sie unter https://cloud.google.com//alloydb/docs/ai.

Vorhersagen aufrufen

So binden Sie Vertex AI in AlloyDB Omni ein und führen Vorhersagen für in Vertex AI gespeicherte Modelle aus:

Hinweise

  1. Vertex AI-Onlinevorhersagen in GDC aktivieren
  2. Erstellen Sie mit dem folgenden Befehl ein Kubernetes-Secret basierend auf dem Dienstkontoschlüssel, der in den vorherigen Schritten heruntergeladen wurde. Achten Sie darauf, dass Sie das Kubernetes-Secret im selben Namespace wie Ihre DBCluster-Ressource erstellen.

    kubectl create secret generic SECRET_NAME \
    --from-file=PATH_TO_SERVICE_ACCOUNT_KEY/private-key.json \
    -n NAMESPACE

    Ersetzen Sie Folgendes:

    • SECRET_NAME: Der Name des Secrets, das beim Erstellen eines DBCluster-Manifests verwendet wird, damit AlloyDB Omni auf Distributed Cloud AI-Funktionen zugreifen kann. Beispiel: vertex-ai-key-alloydb

    • PATH_TO_SERVICE_ACCOUNT_KEY: Der Pfad zum Speicherort, an dem Sie den private-key.json-Dienstkontoschlüssel heruntergeladen haben.

    • NAMESPACE: der Namespace des Datenbankclusters.

  3. Installieren Sie den AlloyDB Omni-Operator anhand der Schritte unter Datenbankmodul auswählen und Datenbankcluster erstellen.

  4. Erstellen Sie einen Datenbankcluster mit AlloyDB AI und legen Sie vertexAIKeyRef auf das Kubernetes-Secret fest, das in den vorherigen Schritten im Feld googleMLExtension im DBCluster-Manifest erstellt wurde.

    apiVersion: v1
    kind: Secret
    metadata:
      name: db-pw-DBCLUSTER_NAME
      namespace: USER_PROJECT
    type: Opaque
    data:
      DBCLUSTER_NAME: "BASE64_PASSWORD"
    ---
    apiVersion: DBENGINE_NAME.dbadmin.gdc.goog/v1
    kind: DBCluster
    metadata:
      name: DBCLUSTER_NAME
      namespace: USER_PROJECT
    spec:
      primarySpec:
        adminUser:
          passwordRef:
            name: db-pw-DBCLUSTER_NAME
        features:
          googleMLExtension:
            config:
              vertexAIKeyRef: SECRET_NAME
        version: "DB_VERSION"
        resources:
          memory: DB_MEMORY
          cpu: DB_CPU
          disks:
          - name: DataDisk
            size: DB_DATA_DISK
    

    Ersetzen Sie die folgenden Variablen:

    • DBCLUSTER_NAME: der Name des Datenbankclusters.
    • USER_PROJECT: Der Name des Nutzerprojekts, in dem der Datenbankcluster erstellt wird.
    • BASE64_PASSWORD: Die Base64-Codierung des Administratorpassworts der Datenbank.
    • DBENGINE_NAME: der Name der Datenbank-Engine. Setze dies auf alloydbomni.
    • DB_VERSION: die Version des Datenbankmoduls.
    • DB_MEMORY: die Größe des Arbeitsspeichers, der dem Datenbankcluster zugewiesen ist, z. B. 5Gi.
    • DB_CPU: Die Anzahl der CPUs, die dem Datenbankcluster zugewiesen sind, z. B. 2.
    • DB_DATA_DISK: die Menge an Speicherplatz, die dem Datenbankcluster zugewiesen ist, z. B. 10 Gi.

    Wenden Sie das Manifest an.

    kubectl apply -f DB_CLUSTER_YAML

    Ersetzen Sie Folgendes:

    • DB_CLUSTER_YAML: Der Name dieser Manifestdatei für den Datenbankcluster, z. B. alloydb-omni-db-cluster.yaml.
  5. Installieren Sie die google_ml_integration-Erweiterung.

    CREATE EXTENSION google_ml_integration CASCADE;
    

Vorhersage aufrufen

Rufen Sie eine Onlinevorhersage mit einem Vertex AI-Modellendpunkt auf, indem Sie die folgende SQL-Funktion ml_predict_row() ausführen:

  SELECT ml_predict_row('PREDICTION_ENDPOINT/PROJECT_NAMESPACE/ORGANIZATION/ZONE/DNS/DNS_SUFFIX', '{ "instances": [ INSTANCES ], "parameters":
  PARAMETERS');

Ersetzen Sie Folgendes:

  • PREDICTION_ENDPOINT: Der qualifizierte Name des Vertex AI-Endpunkts.

  • PROJECT_NAMESPACE: Der Namespace, in dem der Vertex AI-Endpunkt bereitgestellt wird.

  • ORGANIZATION: Der Name der Organisation, in der der Vertex AI-Endpunkt bereitgestellt wird.

  • ZONE: die Zone, in der Ihr Vertex AI-Endpunkt bereitgestellt wird

  • DNS: die DNS-Einträge für Ihre Organisation

  • DNS_SUFFIX: das Suffix des DNS-Objekts

  • INSTANCES: Die Eingaben für den Vorhersageaufruf im JSON-Format

  • PARAMETERS: Die Parameter für den Vorhersageaufruf im JSON-Format

Einbettungen mit pgvector abfragen und indexieren

Mit der PostgreSQL-Erweiterung pgvector können Sie vektorspezifische Operatoren und Funktionen verwenden, wenn Sie Texteinbettungen in Ihrer Datenbank speichern, indexieren und abfragen. AlloyDB bietet Optimierungen für die Arbeit mit pgvector, mit denen Sie Indexe erstellen können, die bestimmte Abfragen mit Einbettungen beschleunigen.

Weitere Informationen zur Verwendung von AlloyDB als LLM sowie zum Generieren und Speichern von Vektoreinbettungen auf Grundlage eines LLM finden Sie unter https://cloud.google.com/alloydb/docs/ai/work-with-embeddings#index.

Indexe erstellen und Vektoren mit ScaNN abfragen

In diesem Abschnitt erfahren Sie, wie Sie gespeicherte Einbettungen verwenden, um Index- und Anfrageeinbettungen zu generieren. Sie können ScaNN-Indizes mit AlloyDB erstellen.

Hinweise

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

  • Einbettungsvektoren werden 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-Indizes generieren möchten, installieren Sie zusätzlich zur Erweiterung vector die Erweiterung postgres_ann.

    CREATE EXTENSION IF NOT EXISTS postgres_ann;
    

ScaNN-Index erstellen

Sie können einen ScaNN-Index für Tabellen in Ihrer Datenbank erstellen.

AlloyDB postgres_ann, eine von Google entwickelte PostgreSQL-Erweiterung, die einen hocheffizienten Nearest-Neighbor-Index 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. Die Indexerstellung dauert nur kurz und der Speicherbedarf ist gering. Außerdem bietet es schnelle QPS basierend auf der Arbeitslast.

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.

Dreistufiger Baumindex ScaNN

Führen Sie die folgende DDL-Abfrage aus, um einen dreistufigen Baumindex mit dem ScaNN-Algorithmus für eine Spalte mit gespeicherten Vektoreinbettungen zu erstellen:

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 nach nächsten Nachbarn mit einem bestimmten Text erstellen.

Die Indexparameter müssen so festgelegt werden, dass ein gutes Gleichgewicht zwischen QPS und Recall erreicht wird.

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.

So rufen Sie den Indexierungsfortschritt auf:pg_stat_progress_create_index

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.

Abfrage ausführen

Nachdem Sie Embeddings in Ihrer Datenbank gespeichert und indexiert haben, können Sie mit der pgvector-Abfragefunktion beginnen. Mit der postgres_ann-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 mit der Einbettung, 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:<->

    • Skalarprodukt:<#>

    • 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.

Sie können auch die embedding()-Funktion 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. Hinweis: Sie müssen das Texteinbettungsmodell „Gecko“ zuerst registrieren, um diese Funktion verwenden zu können.

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 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 textembedding-gecko@003 als Modell-ID an. Dies sind die cloudbasierten Modelle, die von Distributed Cloud für Texteinbettungen verwendet werden können.

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

    Wenn Sie eines der textembedding-gecko-Modelle in englischer Sprache mit Vertex AI verwenden, geben Sie eines der Versions-Tags an, z. B. textembedding-gecko@003.

    Google empfiehlt dringend, immer das Versionstag anzugeben. Wenn Sie das Versionstag 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.

Messwerte für Vektorindex

In diesem Abschnitt werden die Messwerte für die Vektorindexe aufgeführt, die Sie in AlloyDB generieren. Sie können diese Messwerte in der pg_stat_ann_indexes-Ansicht aufrufen, die bei der Installation der postgres_ann-Erweiterung verfügbar ist.

Messwerte zur Nutzerfreundlichkeit

Die Messwerte zur Nutzerfreundlichkeit umfassen Messwerte, mit denen Sie den Status der Indexnutzung nachvollziehen können, z. B. die Indexkonfiguration und die Anzahl der Indexscans.

Messwertname Datentyp Beschreibung
relid OID Eindeutige Kennung der Tabelle, die den Vektorindex enthält.
indexrelid OID Eindeutige Kennung des Vektorindex.
schemaname NAME Name des Schemas, zu dem der Index gehört.
relname NAME Der Name der Tabelle, die den Index enthält.
indexrelname NAME Name des Index.
indextype NAME Typ des Index. Dieser Wert ist immer auf postgres_ann festgelegt.
indexconfig TEXT[] Konfiguration, z. B. Anzahl der Blätter und Quantisierer, die für den Index bei seiner Erstellung definiert wurden.
indexsize TEXT Größe des Index.
indexscan BIGINT Anzahl der für den Index initiierten Indexscans.

Messwerte für die Abstimmung

Mit den Tuning-Messwerten erhalten Sie Informationen zur aktuellen Indexoptimierung. So können Sie Empfehlungen für eine schnellere Abfrageleistung anwenden.

Messwertname Datentyp Beschreibung
insertcount BIGINT Anzahl der Einfügevorgänge im Index. Dieser Messwert umfasst auch eine beliebige Anzahl von Zeilen, die vor der Erstellung des Index vorhanden waren.
updatecount BIGINT Anzahl der Aktualisierungsvorgänge für den Index. Bei diesem Messwert werden keine HOT-Updates berücksichtigt.
deletecount BIGINT Anzahl der Löschvorgänge für den Index.
distribution JSONB Vektorverteilungen für alle Partitionen für den Index.

In den folgenden Feldern wird die Verteilung angezeigt:
  • maximum (INT8): Maximale Anzahl von Vektoren über alle Partitionen hinweg.
  • minimum (INT8): Mindestanzahl von Vektoren in allen Partitionen.
  • average (FLOAT) : Durchschnittliche Anzahl von Vektoren in allen Partitionen.
  • outliers (INT8[]): Die wichtigsten Ausreißer in allen Partitionen. Dieser Wert zeigt die 20 größten Ausreißer.

Hinweis:Aufgrund der inhärenten Eigenschaften des K-Means-Clustering-Algorithmus gibt es immer eine gewisse Varianz in der Verteilung von Vektoren auf Partitionen, auch wenn der Index ursprünglich erstellt wird.

Empfehlung zur Optimierung basierend auf den Messwerten

Mutation
Die Messwerte insertcount, updatecount und deletecount geben zusammen die Änderungen oder Mutationen im Vektor für den Index an.
Der Index wird mit einer bestimmten Anzahl von Vektoren und Partitionen erstellt. Wenn Vorgänge wie „insert“, „update“ oder „delete“ für den Vektorindex ausgeführt werden, wirkt sich das nur auf die ursprüngliche Gruppe von Partitionen aus, in denen sich die Vektoren befinden. Daher schwankt die Anzahl der Vektoren in jeder Partition im Laufe der Zeit, was sich möglicherweise auf den Recall, die QPS oder beides auswirkt.
Wenn Sie im Laufe der Zeit bei Ihren ANN-Suchanfragen auf Probleme mit der Geschwindigkeit oder Genauigkeit stoßen, z. B. eine niedrige QPS oder einen schlechten Recall, sollten Sie diese Messwerte überprüfen. Eine hohe Anzahl von Mutationen im Verhältnis zur Gesamtzahl der Vektoren kann darauf hindeuten, dass eine Neuindexierung erforderlich ist.
Verteilung
Der Messwert distribution zeigt die Vektorverteilungen für alle Partitionen.
Wenn Sie einen Index erstellen, wird er mit einer bestimmten Anzahl von Vektoren und festen Partitionen erstellt. Die Partitionierung und die anschließende Verteilung erfolgen auf Grundlage dieser Überlegung. Wenn zusätzliche Vektoren hinzugefügt werden, werden sie auf die vorhandenen Partitionen aufgeteilt. Das führt zu einer anderen Verteilung als bei der Erstellung des Index. Da bei der endgültigen Verteilung nicht alle Vektoren gleichzeitig berücksichtigt werden, kann sich dies auf den Recall, die Anzahl der Anfragen pro Sekunde oder beides auswirken.
Wenn Sie einen allmählichen Rückgang der Leistung Ihrer ANN-Suchanfragen feststellen, z. B. langsamere Reaktionszeiten oder eine geringere Genauigkeit der Ergebnisse (gemessen an QPS oder Recall), sollten Sie diesen Messwert prüfen und neu indexieren.