AlloyDB-KI-Operatoren und Neubewertung

1. Einführung

In diesem Codelab erfahren Sie, wie Sie AlloyDB mit KI-Operatoren bereitstellen und für Aufgaben wie die semantische Suche, Joins und die Ergebnisrangfolge verwenden.

Voraussetzungen

  • Grundlegende Kenntnisse von Google Cloud und der Google Cloud Console
  • Grundlegende Kenntnisse der Befehlszeile und Cloud Shell

Lerninhalte

  • AlloyDB for Postgres bereitstellen
  • AlloyDB AI-Operatoren aktivieren
  • Unterschiedliche AlloyDB AI-Operatoren verwenden
  • AlloyDB-KI-Operatoren in einem RAG-Workflow verwenden

Voraussetzungen

  • Ein Google Cloud-Konto und ein Google Cloud-Projekt
  • Ein Webbrowser wie Chrome, der die Google Cloud Console und Cloud Shell unterstützt

2. Einrichtung und Anforderungen

Einrichtung der Umgebung im eigenen Tempo

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie ein Konto erstellen.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es ist ein Zeichenstring, der von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und kann nach der Festlegung nicht mehr geändert werden. In der Cloud Console wird automatisch ein eindeutiger String generiert. In der Regel spielt es keine Rolle, wie er lautet. In den meisten Codelabs müssen Sie auf Ihre Projekt-ID verweisen (normalerweise als PROJECT_ID gekennzeichnet). Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige generieren. Alternativ können Sie Ihr eigenes Konto ausprobieren und prüfen, ob es verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information: Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs verwenden zu können. Die Durchführung dieses Codelabs ist kostenlos oder kostet nur sehr wenig. Wenn Sie die Ressourcen deaktivieren möchten, um weitere Kosten nach Abschluss dieser Anleitung zu vermeiden, können Sie die von Ihnen erstellten Ressourcen oder das Projekt löschen. Neuen Google Cloud-Nutzern steht das kostenlose Testprogramm mit einem Guthaben von 300$ zur Verfügung.

Cloud Shell starten

Sie können Google Cloud zwar per Fernzugriff von Ihrem Laptop aus nutzen, in diesem Codelab verwenden Sie jedoch Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Klicken Sie in der Google Cloud Console oben rechts in der Symbolleiste auf das Cloud Shell-Symbol:

55efc1aaa7a4d3ad.png

Die Bereitstellung und Verbindung mit der Umgebung sollte nur wenige Minuten dauern. Wenn der Vorgang abgeschlossen ist, sollte in etwa Folgendes angezeigt werden:

7ffe5cbb04455448.png

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft auf Google Cloud. Dadurch werden Netzwerkleistung und Authentifizierung erheblich verbessert. Alle Aufgaben in diesem Codelab können in einem Browser ausgeführt werden. Sie müssen nichts installieren.

3. Hinweis

API aktivieren

Prüfen Sie in Cloud Shell, ob Ihre Projekt-ID eingerichtet ist:

gcloud config set project [YOUR-PROJECT-ID]

Legen Sie die Umgebungsvariable PROJECT_ID fest:

PROJECT_ID=$(gcloud config get-value project)

Aktivieren Sie alle erforderlichen Dienste:

gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com \
                       discoveryengine.googleapis.com \
                       secretmanager.googleapis.com

Erwartete Ausgabe

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

4. AlloyDB bereitstellen

Erstellen Sie einen AlloyDB-Cluster und eine primäre Instanz. Im Folgenden wird beschrieben, wie Sie mit dem Google Cloud SDK einen AlloyDB-Cluster und eine AlloyDB-Instanz erstellen. Wenn Sie die Konsole bevorzugen, folgen Sie dieser Anleitung.

Bevor wir einen AlloyDB-Cluster erstellen, benötigen wir einen verfügbaren privaten IP-Bereich in unserer VPC, der von der zukünftigen AlloyDB-Instanz verwendet werden soll. Wenn wir sie nicht haben, müssen wir sie erstellen und für die Verwendung durch interne Google-Dienste zuweisen. Danach können wir den Cluster und die Instanz erstellen.

Privaten IP-Bereich erstellen

Wir müssen die Konfiguration für den Zugriff auf private Dienste in unserer VPC für AlloyDB konfigurieren. Wir gehen davon aus, dass wir das Standard-VPC-Netzwerk im Projekt haben und es für alle Aktionen verwendet wird.

Erstellen Sie den privaten IP-Bereich:

gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default

So erstellen Sie eine private Verbindung mit dem zugewiesenen IP-Bereich:

gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default

Erwartete Console-Ausgabe:

student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range].

student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default
Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully.

student@cloudshell:~ (test-project-402417)$

AlloyDB-Cluster erstellen

In diesem Abschnitt erstellen wir einen AlloyDB-Cluster in der Region „us-central1“.

Legen Sie ein Passwort für den Nutzer „postgres“ fest. Sie können ein eigenes Passwort definieren oder eine Zufallsfunktion verwenden, um eins zu generieren.

export PGPASSWORD=`openssl rand -hex 12`

Erwartete Console-Ausgabe:

student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`

Notieren Sie sich das PostgreSQL-Passwort für später:

echo $PGPASSWORD

Erwartete Console-Ausgabe:

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723

Cluster im kostenlosen Testzeitraum erstellen

Wenn Sie AlloyDB noch nicht verwendet haben, können Sie einen kostenlosen Testcluster erstellen:

Geben Sie die Region und den Namen des AlloyDB-Clusters an. Wir verwenden die Region „us-central1“ und „alloydb-aip-01“ als Clusternamen:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

Führen Sie den Befehl zum Erstellen des Clusters aus:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION \
    --subscription-type=TRIAL

Erwartete Console-Ausgabe:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION \
    --subscription-type=TRIAL
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

Erstellen Sie in derselben Cloud Shell-Sitzung eine primäre AlloyDB-Instanz für unseren Cluster. Wenn die Verbindung getrennt ist, müssen Sie die Umgebungsvariablen für die Region und den Clusternamen noch einmal definieren.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=8 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Erwartete Console-Ausgabe:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=8 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

AlloyDB-Standardcluster erstellen

Wenn dies nicht Ihr erster AlloyDB-Cluster im Projekt ist, fahren Sie mit dem Erstellen eines Standardclusters fort.

Geben Sie die Region und den Namen des AlloyDB-Clusters an. Wir verwenden die Region „us-central1“ und „alloydb-aip-01“ als Clusternamen:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

Führen Sie den Befehl zum Erstellen des Clusters aus:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION

Erwartete Console-Ausgabe:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION 
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

Erstellen Sie in derselben Cloud Shell-Sitzung eine primäre AlloyDB-Instanz für unseren Cluster. Wenn die Verbindung getrennt ist, müssen Sie die Umgebungsvariablen für die Region und den Clusternamen noch einmal definieren.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Erwartete Console-Ausgabe:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

5. Datenbank vorbereiten

Wir müssen eine Datenbank erstellen, die Vertex AI-Integration aktivieren, Datenbankobjekte erstellen und die Daten importieren.

AlloyDB die erforderlichen Berechtigungen erteilen

Fügen Sie dem AlloyDB-Dienst-Agent Vertex AI-Berechtigungen hinzu.

Öffnen Sie einen weiteren Cloud Shell-Tab über das Pluszeichen oben.

4ca978f5142bb6ce.png

Führen Sie auf dem neuen Cloud Shell-Tab Folgendes aus:

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"

Erwartete Console-Ausgabe:

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-11039]
student@cloudshell:~ (test-project-001-402417)$ gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"
Updated IAM policy for project [test-project-001-402417].
bindings:
- members:
  - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com
  role: roles/aiplatform.user
- members:
...
etag: BwYIEbe_Z3U=
version: 1
 

Schließen Sie den Tab entweder über den Befehl „exit“:

exit

Verbindung zu AlloyDB Studio herstellen

In den folgenden Kapiteln können alle SQL-Befehle, für die eine Verbindung zur Datenbank erforderlich ist, alternativ in AlloyDB Studio ausgeführt werden. Um den Befehl auszuführen, müssen Sie die Webkonsole für Ihren AlloyDB-Cluster öffnen. Klicken Sie dazu auf die primäre Instanz.

ef4bfbcf0ed2ef3a.png

Klicken Sie dann links auf „AlloyDB Studio“:

5c155cbcd7d43a1.png

Wählen Sie die Datenbank „postgres“ und den Nutzer „postgres“ aus und geben Sie das Passwort ein, das Sie beim Erstellen des Clusters notiert haben. Klicken Sie dann auf die Schaltfläche „Authentifizieren“.

432613065cac864f.png

Die AlloyDB Studio-Benutzeroberfläche wird geöffnet. Wenn Sie die Befehle in der Datenbank ausführen möchten, klicken Sie rechts auf den Tab „Editor 1“.

b36c28f8165119ca.png

Es wird eine Benutzeroberfläche geöffnet, in der Sie SQL-Befehle ausführen können.

cf43aa20f292797e.png

Datenbank erstellen

Datenbank erstellen – Kurzanleitung

Führen Sie im AlloyDB Studio-Editor den folgenden Befehl aus.

Datenbank erstellen:

CREATE DATABASE quickstart_db

Erwartete Ausgabe:

Statement executed successfully

Verbindung zu quickstart_db herstellen

Stellen Sie über die Schaltfläche zum Wechseln des Nutzers/der Datenbank eine Verbindung zu Data Studio her.

e826ad973eb23a74.png

Wählen Sie in der Drop-down-Liste die neue Datenbank „quickstart_db“ aus und verwenden Sie denselben Nutzer und dasselbe Passwort wie zuvor.

1ca70c59b5aea8c1.png

Dadurch wird eine neue Verbindung geöffnet, über die Sie mit Objekten aus der Datenbank „quickstart_db“ arbeiten können.

google_ml-Erweiterung prüfen

Prüfen Sie, ob die Version der google_ml-Erweiterung 1.4.4 oder höher ist, damit Sie die KI-Abfrage-Engine verwenden können.

Führen Sie in AlloyDB Studio bei einer Verbindung mit der Datenbank „quickstart_db“ Folgendes aus:

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';

Erwartete Ausgabe:

1.4.4

Wenn die Version niedriger als die erforderliche ist, aktualisieren Sie die Erweiterung.

Führen Sie in AlloyDB Studio bei einer Verbindung mit der Datenbank „quickstart_db“ Folgendes aus:

CALL google_ml.upgrade_to_preview_version();

Erwartete Ausgabe:

Statement executed successfully

Prüfen Sie nach der erfolgreichen Ausführung die Version noch einmal.

Führen Sie in AlloyDB Studio bei einer Verbindung mit der Datenbank „quickstart_db“ Folgendes aus:

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';

Erwartete Ausgabe:

1.4.4

6. Beispieldaten

Jetzt müssen wir Objekte in der Datenbank erstellen und Daten laden. Wir verwenden einen fiktiven Filmdatensatz mit wenigen Zeilen.

Kopieren Sie die folgenden Anweisungen in den AlloyDB Studio-Editor und klicken Sie auf die Schaltfläche „Ausführen“.

-- Drop tables if they exist to prevent errors on re-running the script
DROP TABLE IF EXISTS movie_reviews;
DROP TABLE IF EXISTS movies;

-- Create the 'movies' table
-- This table stores information about each movie.
CREATE TABLE movies (
    id BIGINT PRIMARY KEY,              -- Unique identifier for the movie
    title TEXT NOT NULL,               -- Title of the movie
    description TEXT,                  -- A brief description or synopsis of the movie
    genres TEXT,                       -- Comma-separated list of genres (e.g., "Action, Adventure, Sci-Fi")
    actors TEXT                        -- Comma-separated list of main actors
);

-- Create the 'movie_reviews' table
-- This table stores reviews for the movies.
CREATE TABLE movie_reviews (
    review_id BIGINT PRIMARY KEY,      -- Unique identifier for the review
    movie_id BIGINT NOT NULL,          -- Foreign key referencing the movie being reviewed
    reviewer_name TEXT,                -- Name of the person who wrote the review
    rating INT CHECK (rating >= 1 AND rating <= 5), -- Rating from 1 to 5 stars
    review_text TEXT,                  -- The content of the review
    review_date DATE DEFAULT CURRENT_DATE, -- Date when the review was submitted
    FOREIGN KEY (movie_id) REFERENCES movies(id) ON DELETE CASCADE -- Ensures referential integrity; if a movie is deleted, its reviews are also deleted.
);

-- Insert sample data into the 'movies' table (20 rows)
INSERT INTO movies (id, title, description, genres, actors) VALUES
(1, 'Inception', 'A thief who steals information by entering people''s dreams.', 'Sci-Fi, Thriller, Action', 'Leonardo DiCaprio, Joseph Gordon-Levitt, Elliot Page'),
(2, 'The Matrix', 'A computer hacker learns about the true nature of his reality.', 'Sci-Fi, Action', 'Keanu Reeves, Laurence Fishburne, Carrie-Anne Moss'),
(3, 'Interstellar', 'A team of explorers journey through a cosmic passage beyond our world in an attempt to ensure humanity''s survival.', 'Sci-Fi, Drama, Adventure', 'Matthew McConaughey, Anne Hathaway, Jessica Chastain'), -- Updated description
(4, 'The Dark Knight', 'When the menace known as the Joker wreaks havoc and chaos on the people of Gotham, Batman must accept one of the greatest psychological and physical tests of his ability to fight injustice.', 'Action, Crime, Drama', 'Christian Bale, Heath Ledger, Aaron Eckhart'),
(5, 'Pulp Fiction', 'The lives of two mob hitmen, a boxer, a gangster and his wife, and a pair of diner bandits intertwine in four tales of violence and redemption.', 'Crime, Drama', 'John Travolta, Uma Thurman, Samuel L. Jackson'),
(6, 'Forrest Gump', 'The presidencies of Kennedy and Johnson, the Vietnam War, the Watergate scandal and other historical events unfold from the perspective of an Alabama man with an IQ of 75.', 'Drama, Romance', 'Tom Hanks, Robin Wright, Gary Sinise'),
(7, 'The Shawshank Redemption', 'Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency.', 'Drama', 'Tim Robbins, Morgan Freeman, Bob Gunton'),
(8, 'Gladiator', 'A former Roman General sets out to exact vengeance against the corrupt emperor who murdered his family and sent him into slavery.', 'Action, Adventure, Drama', 'Russell Crowe, Joaquin Phoenix, Connie Nielsen'),
(9, 'Fight Club', 'An insomniac office worker looking for a way to change his life crosses paths with a devil-may-care soap maker and they form an underground fight club that evolves into something much, much more.', 'Drama', 'Brad Pitt, Edward Norton, Meat Loaf'),
(10, 'The Lord of the Rings: The Return of the King', 'Gandalf and Aragorn lead the World of Men against Sauron''s army to draw his gaze from Frodo and Sam as they approach Mount Doom with the One Ring.', 'Action, Adventure, Drama', 'Elijah Wood, Viggo Mortensen, Ian McKellen'),
(11, 'Spirited Away', 'During her family''s move to the suburbs, a sullen 10-year-old girl wanders into a world ruled by gods, witches, and spirits, and where humans are changed into beasts.', 'Animation, Adventure, Family', 'Daveigh Chase, Suzanne Pleshette, Miyu Irino'),
(12, 'Parasite', 'Greed and class discrimination threaten the newly formed symbiotic relationship between the wealthy Park family and the destitute Kim clan.', 'Comedy, Drama, Thriller', 'Song Kang-ho, Lee Sun-kyun, Cho Yeo-jeong'),
(13, 'The Godfather', 'The aging patriarch of an organized crime dynasty transfers control of his clandestine empire to his reluctant son.', 'Crime, Drama', 'Marlon Brando, Al Pacino, James Caan'),
(14, 'Avengers: Endgame', 'After the devastating events of Avengers: Infinity War, the universe is in ruins. With the help of remaining allies, the Avengers assemble once more in order to reverse Thanos'' actions and restore balance to the universe.', 'Action, Adventure, Drama', 'Robert Downey Jr., Chris Evans, Mark Ruffalo'),
(15, 'Joker', 'In Gotham City, mentally troubled comedian Arthur Fleck is disregarded and mistreated by society. He then embarks on a downward spiral of revolution and bloody crime.', 'Crime, Drama, Thriller', 'Joaquin Phoenix, Robert De Niro, Zazie Beetz'),
(16, 'Mad Max: Fury Road', 'In a post-apocalyptic wasteland, a woman rebels against a tyrannical ruler in search for her homeland with the help of a group of female prisoners, a psychotic worshiper, and a drifter named Max.', 'Action, Adventure, Sci-Fi', 'Tom Hardy, Charlize Theron, Nicholas Hoult'),
(17, 'Coco', 'Aspiring musician Miguel, confronted with his family''s ancestral ban on music, enters the Land of the Dead to find his great-great-grandfather, a legendary singer.', 'Animation, Adventure, Family', 'Anthony Gonzalez, Gael García Bernal, Benjamin Bratt'),
(18, 'Whiplash', 'A promising young drummer enrolls at a cut-throat music conservatory where his dreams of greatness are mentored by an instructor who will stop at nothing to realize a student''s potential.', 'Drama, Music', 'Miles Teller, J.K. Simmons, Paul Reiser'),
(19, 'The Grand Budapest Hotel', 'The adventures of Gustave H, a legendary concierge at a famous hotel from the fictional Republic of Zubrowka between the first and second World Wars, and Zero Moustafa, the lobby boy who becomes his most trusted friend.', 'Adventure, Comedy, Drama', 'Ralph Fiennes, F. Murray Abraham, Mathieu Amalric'),
(20, 'Blade Runner 2049', 'Young Blade Runner K''s discovery of a long-buried secret leads him to track down former Blade Runner Rick Deckard, who''s been missing for thirty years.', 'Action, Drama, Mystery', 'Ryan Gosling, Harrison Ford, Ana de Armas');

-- Insert sample data into the 'movie_reviews' table (30 rows)
-- Reviews are linked to movies via movie_id. Includes a mix of positive and negative reviews.
-- Movie title is prepended to the review text.
INSERT INTO movie_reviews (review_id, movie_id, reviewer_name, rating, review_text) VALUES
(1, 1, 'Alice Wonderland', 5, 'Inception: Absolutely mind-bending! A masterpiece of sci-fi.'),
(2, 1, 'Bob The Critic', 2, 'Inception: Too confusing and pretentious. Didn''t enjoy it.'),
(3, 2, 'Charlie Reviewer', 5, 'The Matrix: Revolutionary visuals and a compelling story.'),
(4, 3, 'Diana Prince', 5, 'Interstellar: Visually stunning and emotionally powerful. A must-see.'),
(5, 3, 'Edward Nigma', 4, 'Interstellar: Long, but worth it for the spectacle and ideas.'),
(6, 4, 'Fiona Glenanne', 5, 'The Dark Knight: Heath Ledger''s Joker is iconic. Dark and thrilling.'),
(7, 5, 'George Costanza', 5, 'Pulp Fiction: Quirky, violent, and endlessly quotable.'),
(8, 5, 'Hannah Montana', 1, 'Pulp Fiction: Way too violent and the timeline was confusing. Hated it.'),
(9, 6, 'Ian Malcolm', 4, 'Forrest Gump: A heartwarming story with a great performance by Hanks.'),
(10, 7, 'Jane Doe', 5, 'The Shawshank Redemption: An uplifting story of hope and friendship. Perfect.'),
(11, 7, 'John Smith', 5, 'The Shawshank Redemption: Morgan Freeman is amazing. Truly a classic.'),
(12, 8, 'Kyle Broflovski', 2, 'Gladiator: Generic plot and boring action scenes. Overrated.'),
(13, 9, 'Laura Palmer', 5, 'Fight Club: Provocative and thought-provoking. Norton and Pitt are fantastic.'),
(14, 10, 'Michael Scott', 5, 'The Lord of the Rings: The Return of the King: A fitting and epic conclusion to a legendary trilogy.'),
(15, 11, 'Nancy Drew', 5, 'Spirited Away: Beautiful animation and a magical story for all ages.'),
(16, 12, 'Oscar Martinez', 5, 'Parasite: A brilliant satire with unexpected twists. Loved it!'),
(17, 12, 'Pam Beesly', 4, 'Parasite: Very intense, but incredibly well-directed and acted.'),
(18, 13, 'Quentin Coldwater', 5, 'The Godfather: A cinematic masterpiece. Brando is unforgettable.'),
(19, 14, 'Rachel Green', 3, 'Avengers: Endgame: It was okay, but felt bloated and had too many characters.'),
(20, 14, 'Steve Rogers', 5, 'Avengers: Endgame: The culmination of a decade of storytelling. Perfect ending.'),
(21, 15, 'Tony Stark', 4, 'Joker: A dark and disturbing character study. Phoenix is mesmerizing.'),
(22, 16, 'Uma Thurman', 5, 'Mad Max: Fury Road: Non-stop action and incredible practical effects. What a ride!'),
(23, 17, 'Victor Frankenstein', 5, 'Coco: A heartwarming and visually stunning celebration of family and culture.'),
(24, 18, 'Walter White', 5, 'Whiplash: Intense and gripping. J.K. Simmons is terrifyingly good.'),
(25, 19, 'Xena Warrior', 2, 'The Grand Budapest Hotel: Too quirky for its own good. Style over substance.'),
(26, 20, 'Ygritte Snow', 5, 'Blade Runner 2049: A worthy sequel that expands on the original in meaningful ways. Visually breathtaking.'),
(27, 1, 'Zack Morris', 4, 'Inception: Kept me on the edge of my seat. Very clever.'),
(28, 4, 'Buffy Summers', 5, 'The Dark Knight: The best superhero movie ever made. Ledger is a legend.'),
(29, 8, 'Clark Kent', 3, 'Gladiator: Decent action, but the story felt predictable and dragged a bit.'),
(30, 15, 'Diana Troy', 3, 'Joker: Hard to watch at times, but a powerful performance. Felt it was a bit one-note though.');

Wenn Sie eigene Beispieldaten haben und Ihre CSV-Dateien mit dem Cloud SQL-Importtool in der Cloud Console kompatibel sind, können Sie es anstelle des hier beschriebenen Ansatzes verwenden.

7. IF-Operator verwenden

Versuchen wir zuerst die klassische Suche mit standardmäßigen PostgreSQL-Ansätzen.

Wenn wir nach einem Film über Weltraumabenteuer suchen möchten, können wir die folgende Suchanfrage verwenden:

SELECT title,description AS movies_about_space
    FROM movies
    WHERE description like '%space%' OR title like '%space%';

Es wurden keine Ergebnisse zurückgegeben. Aber ich bin sicher, dass wir mindestens einen Film haben, der in diese Kategorie fällt. Wir können versuchen, eine Volltextsuche zu verwenden.

SELECT title,description
FROM movies
WHERE to_tsvector('english', description) @@ to_tsquery('english', 'space');

Und es kann sein, dass wir gar keine Ergebnisse erhalten. Daher müssen wir einige Keywords oder Wortgruppen kennen, um die „klassischen“ Techniken der PostgreSQL-Suche nutzen zu können.

Jetzt können wir versuchen, die KI-gestützte semantische Filterung mit der Funktion „google_ml.if“ zu verwenden. Im Hintergrund wird KI verwendet, um eine semantische Filterung basierend auf unserer Anfrage in natürlicher Sprache durchzuführen.

SELECT title,description AS movies_about_space
    FROM movies
    WHERE
      google_ml.if(
        prompt => 'Here are descriptions of movies, can you return the ones about space adventures:  '||description);

Der Film „Interstellar“ wird aufgrund der semantischen Bedeutung der Anfrage angezeigt, auch wenn der Begriff „Weltraum“ weder im Titel noch in der Beschreibung vorkommt. Wie Sie vielleicht bemerkt haben, haben wir auch nichts im Voraus erstellt und uns ausschließlich auf automatisierte integrierte Funktionen verlassen.

8. JOIN mit IF-Operator verwenden

Was ist, wenn wir zwei Tabellen mithilfe von KI-gestützter semantischer Filterung zusammenführen möchten? So können wir beispielsweise versuchen, Nutzerrezensionen anhand der Rezensionen mit den Filmen abzugleichen, wenn der Film in der Rezension erwähnt wurde.

In einem neuen Tab des AlloyDB Studio-Editors ausführen:

SELECT title, rating, movie_reviews 
    FROM movies
    JOIN
    movie_reviews ON 
      google_ml.if(
        prompt => 'Does the following reviews talk about a movie mentioned? The review: ' || review_text||' and the movie title is: '||title)
    AND
    title='Interstellar';

Wir erhalten zwei Rezensionen, die unserer Anfrage entsprechen, da sie den im Titel genannten Filmtitel enthalten. Wir können die Anfrage noch weiter vereinfachen:

SELECT title, rating, movie_reviews 
    FROM movies
    JOIN
    movie_reviews ON 
      google_ml.if(
        prompt => 'Do we have the movie in the review?: ' || review_text||' and the movie title is: '||title)
    AND
    title='Interstellar';

9. Ergebnisse basierend auf Inhalten bewerten

Die Tabelle „movie_reviews“ enthält Bewertungen für die Filme. Wenn wir jedoch eine eigene Bewertung implementieren möchten, können wir dazu die Funktion „google_ml.rank“ verwenden. Wir können unsere Rezensionen anhand von Bedingungen bewerten, die in natürlicher Sprache definiert sind, und beispielsweise die Top 5-Rezensionen für die Filme abrufen und die ursprüngliche Bewertung zum Vergleich anzeigen.

SELECT rating,review_text AS top_five
    FROM movie_reviews
    ORDER BY google_ml.rank('Score of 7 to 10 if the review says the movie was really good, 3 to 6 if the review says it''s alright is and 1 to 2 if the review says it was not worth of time. Review: ' || review_text) DESC
    LIMIT 5;

Wenn wir die neue Bewertung neben der ursprünglichen Bewertung anzeigen möchten, können wir sie der Liste der Spalten hinzufügen.

SELECT rating,
    google_ml.rank('Score of 7 to 10 if the review says the movie was really good, 3 to 6 if the review says it''s alright is and 1 to 2 if the review says it was not worth of time. Review: ' || review_text) AS ml_rank,
    review_text AS top_five
    FROM movie_reviews
    ORDER BY ml_rank DESC
    LIMIT 5;

Und hier sind die Top 5-Rezensionen.

 rating | ml_rank |                               top_five
--------+---------+-----------------------------------------------------------------------
      5 |       9 | The Dark Knight: Heath Ledger's Joker is iconic. Dark and thrilling.
      5 |       9 | The Matrix: Revolutionary visuals and a compelling story.
      5 |       9 | Interstellar: Visually stunning and emotionally powerful. A must-see.
      5 |       9 | Inception: Absolutely mind-bending! A masterpiece of sci-fi.
      5 |       9 | Pulp Fiction: Quirky, violent, and endlessly quotable.
(5 rows)
5 rows in set (0.13 sec)

Die ausgewählte Bewertung für die Top-Rezensionen war 9 von 10.

10. Semantische Suche mithilfe des Rankings verbessern

Wir können unsere semantische Suche mit dem Ranking kombinieren, um genauere Ergebnisse zu erhalten.

Modell für die Neubewertung registrieren

Öffnen Sie einen weiteren Cloud Shell-Tab über das Pluszeichen oben.

4ca978f5142bb6ce.png

Führen Sie auf dem neuen Cloud Shell-Tab Folgendes aus:

export PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create aip-reranking
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:aip-reranking@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/discoveryengine.viewer"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:aip-reranking@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"
gcloud iam service-accounts add-iam-policy-binding aip-reranking@$PROJECT_ID.iam.gserviceaccount.com \
    --member="user:$(gcloud auth list --filter=status:ACTIVE --format="value(account)")" --role="roles/iam.serviceAccountTokenCreator"
gcloud iam service-accounts add-iam-policy-binding aip-reranking@$PROJECT_ID.iam.gserviceaccount.com \
    --member="user:$(gcloud auth list --filter=status:ACTIVE --format="value(account)")" --role="roles/iam.serviceAccountUser"

Generieren Sie ein Zugriffstoken und fügen Sie es als Secret mit dem Namen „rerank-secret“ hinzu:

echo -n $(gcloud auth print-access-token \
  --impersonate-service-account="aip-reranking@$PROJECT_ID.iam.gserviceaccount.com" \
  --lifetime=3600) | gcloud secrets create rerank-secret \
    --replication-policy="automatic" \
    --data-file=-
gcloud secrets add-iam-policy-binding 'rerank-secret' \
      --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
      --role="roles/secretmanager.secretAccessor"

Im Beispiel ist das Secret eine Stunde lang gültig und sollte danach durch Erstellen einer neuen Version aktualisiert werden. Beispiel:

echo -n $(gcloud auth print-access-token \
--impersonate-service-account="aip-reranking@$PROJECT_ID.iam.gserviceaccount.com" \
  --lifetime=3600) | gcloud secrets versions add rerank-secret \
    --data-file=-

Jetzt müssen wir zu AlloyDB Studio wechseln und ein Secret erstellen, um auf unser Modell für die Neubewertung zuzugreifen.

Führen Sie in der AlloyDB Studio-Konsole nach dem Ersetzen von $PROJECT_ID durch Ihr Projekt Folgendes aus:

CALL
  google_ml.create_sm_secret(
    secret_id => 'rerank-secret',
    secret_path => 'projects/PROJECT_ID/secrets/rerank-secret/versions/latest');

Registrieren Sie das Modell in derselben Studio-Sitzung, nachdem Sie PROJECT_ID durch Ihr Projekt ersetzt haben:

CALL
google_ml.create_model(
  model_id => 'semantic-ranker-512-002',
  model_type => 'reranking',
  model_provider => 'custom',
  model_request_url =>
    'https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/rankingConfigs/default_ranking_config:rank',
  model_qualified_name => 'semantic-ranker-512@002',
  model_auth_type => 'secret_manager',
  model_auth_id => 'rerank-secret',
  model_in_transform_fn => 'google_ml.vertexai_reranking_input_transform',
  model_out_transform_fn => 'google_ml.vertexai_reranking_output_transform');

Modell für die Neubewertung verwenden

Jetzt können wir unser Modell für die Neubewertung in den Abfragen verwenden, um die semantischen Suchergebnisse zu verbessern, sie spezifischer zu gestalten und die besten Optionen auszuwählen.

Suchen wir nach Actionfilmen und sortieren sie dann anhand der Bedingungen „Computer und Zukunft“.

WITH
  action_movies AS (
    SELECT
      title,
      description,
      ROW_NUMBER() OVER (ORDER BY title, description) AS ref_number
    FROM
      movies
    WHERE
      google_ml.if(
        prompt => 'The following movies are action movies. The movie title: ' || title || ' and the description is: ' || description
      ) 
  ),
  ranked_documents_array AS (
    SELECT
      ARRAY_AGG(description ORDER BY ref_number) AS docs
    FROM
      action_movies
  ),
  reranked_results AS (
    SELECT
      r.index,
      r.score
    FROM
      ranked_documents_array,
      ai.rank(
        model_id => 'semantic-ranker-512-002',
        search_string => 'Computers and future',
        documents => ranked_documents_array.docs
      ) AS r 
  )
SELECT
  am.title,
  left(am.description,80) as description,
  rr.score
FROM
  action_movies am
JOIN
  reranked_results rr ON am.ref_number = rr.index 
ORDER BY
  rr.score DESC;

Die Ergebnisse enthalten Actionfilme, wobei Filme über die Zukunft und Computer hoffentlich ganz oben stehen.

title                     |                                   description                                    | score
-----------------------------------------------+----------------------------------------------------------------------------------+--------
 The Matrix                                    | A computer hacker learns about the true nature of his reality.                   | 0.0145
 Mad Max: Fury Road                            | In a post-apocalyptic wasteland, a woman rebels against a tyrannical ruler in se |  0.002
 Avengers: Endgame                             | After the devastating events of Avengers: Infinity War, the universe is in ruins | 0.0018
 Blade Runner 2049                             | Young Blade Runner K's discovery of a long-buried secret leads him to track down | 0.0004
 The Lord of the Rings: The Return of the King | Gandalf and Aragorn lead the World of Men against Sauron's army to draw his gaze |  1e-05
 The Dark Knight                               | When the menace known as the Joker wreaks havoc and chaos on the people of Gotha |  1e-05
 Inception                                     | A thief who steals information by entering people's dreams.                      |  1e-05
 Gladiator                                     | A former Roman General sets out to exact vengeance against the corrupt emperor w |  1e-05
(8 rows)

Probieren Sie es mit verschiedenen Bedingungen aus und sehen Sie, wie sich das Ranking auf die Ausgabereihenfolge auswirkt.

11. Umgebung bereinigen

AlloyDB-Instanzen und ‑Cluster nach Abschluss des Labs löschen

AlloyDB-Cluster und alle Instanzen löschen

Der Cluster wird mit der Option „force“ gelöscht, wodurch auch alle zugehörigen Instanzen gelöscht werden.

Definieren Sie in Cloud Shell die Projekt- und Umgebungsvariablen, wenn die Verbindung getrennt wurde und alle vorherigen Einstellungen verloren gegangen sind:

gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)

Löschen Sie den Cluster:

gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force

Erwartete Console-Ausgabe:

student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
All of the cluster data will be lost when the cluster is deleted.

Do you want to continue (Y/n)?  Y

Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f
Deleting cluster...done.   

AlloyDB-Sicherungen löschen

Löschen Sie alle AlloyDB-Sicherungen für den Cluster:

for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done

Erwartete Console-Ausgabe:

student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f
Deleting backup...done.                                                                                                                                                                                                                                                            

12. Glückwunsch

Herzlichen Glückwunsch zum Abschluss des Codelabs.

Behandelte Themen

  • AlloyDB for Postgres bereitstellen
  • AlloyDB AI-Operatoren aktivieren
  • Unterschiedliche AlloyDB AI-Operatoren verwenden
  • AlloyDB-KI-Operatoren in einem RAG-Workflow verwenden

13. Umfrage

Ausgabe:

Wie möchten Sie diese Anleitung verwenden?

Nur durchlesen Lesen und die Übungen absolvieren