Informationen zu diesem Codelab
1. Übersicht
Stellen Sie sich eine Mode-App vor, die Ihnen nicht nur dabei hilft, das perfekte Outfit zu finden, sondern auch Echtzeit-Styling-Tipps bietet – und das alles dank der neuesten genAI-Integration! In diesem Vortrag erfahren Sie, wie wir eine solche App mithilfe der Vektorsuchfunktionen von AlloyDB und dem ScaNN-Index von Google entwickelt haben, um blitzschnell nach passenden Outfits zu suchen und sofortige Modeempfehlungen zu erhalten.
Außerdem erfahren Sie, wie der ScaNN-Index von AlloyDB komplexe Abfragen optimiert, um personalisierte Stilvorschläge zu generieren. Außerdem nutzen wir Gemini und Imagen, leistungsstarke generative KI-Modelle, um kreative Styling-Inspirationen zu liefern und sogar Ihre personalisierten Looks zu visualisieren. Die gesamte Anwendung basiert auf einer serverlosen Architektur, die für eine nahtlose und skalierbare Nutzung sorgt.
Die Herausforderung: Mit personalisierten Outfitvorschlägen soll die App Menschen helfen, die sich bei der Auswahl ihrer Kleidung schwertun. Außerdem wird die Entscheidungsmüdigkeit bei der Outfitplanung vermieden.
Die Lösung: Die Outfit-Empfehlungs-App löst das Problem, Nutzern eine intelligente, personalisierte und ansprechende Mode-Erfahrung zu bieten, und zeigt gleichzeitig die Möglichkeiten von AlloyDB, generativer KI und serverlosen Technologien.
Aufgaben
In diesem Lab lernen Sie Folgendes:
- AlloyDB-Instanz erstellen und E-Commerce-Dataset laden
- pgvector- und generative AI-Modellerweiterungen in AlloyDB aktivieren
- Einbettungen aus der Produktbeschreibung generieren
- Lösung in serverlosen Cloud Run-Funktionen bereitstellen
- Laden Sie ein Bild in Gemini hoch und generieren Sie einen Prompt für eine Bildbeschreibung.
- Suchergebnisse basierend auf Prompts in Kombination mit E-Commerce-Dataset-Embeddings generieren.
- Fügen Sie zusätzliche Prompts hinzu, um den Prompt anzupassen und Stilvorschläge zu generieren.
- Lösung in serverlosen Cloud Run-Funktionen bereitstellen
Voraussetzungen
2. Architektur
Die allgemeine Architektur der App sieht so aus:
In den folgenden Abschnitten wird der Kontext der Anleitung verdeutlicht:
Datenaufnahme:
Als Erstes werden die Einzelhandelsdaten (Inventar, Produktbeschreibungen, Kundeninteraktionen) in AlloyDB aufgenommen.
Analytics-Engine:
Wir verwenden AlloyDB als Analyse-Engine, um Folgendes auszuführen:
- Kontextextraktion:Die Engine analysiert die in AlloyDB gespeicherten Daten, um Beziehungen zwischen Produkten, Kategorien, Kundenverhalten usw. zu ermitteln.
- Erstellen von Einbettungen: Einbettungen (mathematische Darstellungen von Text) werden sowohl für die Abfrage des Nutzers als auch für die in AlloyDB gespeicherten Informationen generiert.
- Vektorsuche:Die Engine führt eine Ähnlichkeitssuche durch und vergleicht die Einbettung der Suchanfrage mit den Einbettungen von Produktbeschreibungen, Rezensionen und anderen relevanten Daten. So werden die 25 wichtigsten „Nähesten Nachbarn“ ermittelt.
Gemini-Empfehlung:
Das Bildbyte-Array wird über die Vertex AI API an das Gemini-Modell übergeben, zusammen mit dem Prompt, in dem um eine textbasierte Beschreibung der Oberbekleidung und um Vorschläge für Unterbekleidung gebeten wird.
AlloyDB RAG und Vektorsuche:
Anhand der Beschreibung des Oberteils wird die Datenbank abgefragt. Die Abfrage wandelt den Suchtext (Empfehlung des Gemini-Modells für passende Unterwäsche) in Einbettungen um und führt eine Vektorsuche in den in der Datenbank gespeicherten Einbettungen durch, um die nächsten Nachbarn (übereinstimmende Ergebnisse) zu finden. Die Vektoreinbettungen in der AlloyDB-Datenbank werden mit dem ScaNN-Index indexiert, um die Abrufleistung zu verbessern.
Bilderstellung für Antworten
Die validierten Antworten werden in einem JSON-Array strukturiert und die gesamte Engine wird in einer serverlosen Cloud Run-Funktion verpackt, die vom Agent Builder aufgerufen wird.
Imagen-Bilderstellung:
Der Styling-Prompt des Nutzers, eine vom Nutzer ausgewählte Empfehlung und alle Personalisierungsanfragen werden kombiniert, um Imagen 3 mit einem vorhandenen Bild zu starten. Das Stylingbild wird anhand dieses Prompts mit der Vertex AI API generiert.
3. Hinweis
Projekt erstellen
- Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
- Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist.
- Sie verwenden Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird und bq bereits vorinstalliert hat. Klicken Sie oben in der Google Cloud Console auf Cloud Shell aktivieren (
).
- Sobald Sie mit Cloud Shell verbunden sind, prüfen Sie mit dem folgenden Befehl, ob Sie bereits authentifiziert sind und das Projekt auf Ihre Projekt-ID festgelegt ist:
gcloud auth list
- Führen Sie den folgenden Befehl aus, um zu prüfen, ob Ihr Projekt in zukünftigen gcloud-Befehlen korrekt erkannt wird.
gcloud config list project
- Wenn Ihr Projekt nicht festgelegt ist, verwenden Sie den folgenden Befehl, um es explizit festzulegen:
gcloud config set project <YOUR_PROJECT_ID>
- Aktivieren Sie die erforderlichen APIs.
Folgen Sie diesem Link, um APIs zu aktivieren.
Wenn Sie eine API nicht aktivieren, können Sie dies jederzeit im Laufe der Implementierung nachholen.
Weitere Informationen zu gcloud-Befehlen und ihrer Verwendung finden Sie in der Dokumentation.
4. Datenbank einrichten
In diesem Lab verwenden wir AlloyDB als Datenbank, um den E-Commerce-Datensatz für den Einzelhandel zu speichern. Alle Ressourcen wie Datenbanken und Protokolle werden in Clustern gespeichert. Jeder Cluster hat eine primäre Instanz, die einen Zugriffspunkt auf die Daten bietet. Tabellen sind die tatsächliche Ressource, in der Daten gespeichert werden.
Erstellen Sie einen AlloyDB-Cluster, eine Instanz und eine Tabelle, in die das E-Commerce-Dataset geladen wird.
Cluster und Instanz erstellen
- Suchen Sie in der Google Cloud Console nach AlloyDB. Die meisten Seiten in der Cloud Console lassen sich ganz einfach über die Suchleiste der Console finden.
- Klicken Sie auf CLUSTER ERSTELLEN.
- Erstellen Sie einen Cluster und eine Instanz mit den folgenden Werten:
- cluster id: "
shopping-cluster
" - Passwort: „
alloydb
“ - Mit PostgreSQL 15 kompatibel
- Region: „
us-central1
“ - Netzwerk: „
default
“
- Wenn Sie unter „Netzwerk“ das Standardnetzwerk auswählen, wird die folgende Option angezeigt. Klicken Sie auf VERKNÜPFUNG EINRICHTEN, um ein Standardnetzwerk einzurichten.
- Wählen Sie Automatisch zugewiesenen IP-Bereich verwenden aus und klicken Sie auf Weiter. Klicken Sie nach dem Überprüfen der Informationen auf VERKNÜPFUNG ERSTELLEN.
Warten Sie, bis die Erstellung des Standardnetzwerks abgeschlossen ist.
- Legen Sie unter „Primäre Instanz konfigurieren“ die Instanz-ID auf „
shopping-instance"
“ fest.
- Klicken Sie auf CLUSTER ERSTEHEN, um die Einrichtung des Clusters abzuschließen. Gehen Sie dazu so vor:
5. Datenaufnahme
Jetzt fügen Sie eine Tabelle mit den Daten zum Geschäft hinzu. Warten Sie, bis die Instanz erstellt wurde. Anschließend können Sie sich mit den Anmeldedaten, die Sie beim Erstellen des Clusters festgelegt haben, in AlloyDB anmelden.
Bei der AlloyDB-Datenbank authentifizieren
- Rufen Sie in der Google Cloud Console AlloyDB auf. Wählen Sie den primären Cluster aus und klicken Sie dann im Navigationsmenü links auf AlloyDB Studio:
- Geben Sie die folgenden Details ein, um sich bei der AlloyDB-Datenbank zu authentifizieren:
- Nutzername: „
postgres
“ - Datenbank: „
postgres
“ - Passwort: „
alloydb
“
Nachdem Sie sich in AlloyDB Studio authentifiziert haben, werden SQL-Befehle auf den Tabs Editor eingegeben. Sie können über das Pluszeichen rechts neben dem ersten Editor-Tab mehrere Editorfenster hinzufügen.
Sie geben Befehle für AlloyDB in Editorfenstern ein und verwenden nach Bedarf die Optionen „Ausführen“, „Formatieren“ und „Löschen“.
Erweiterungen aktivieren
Für diese App verwenden wir die Erweiterungen „pgvector"
“ und „google_ml_integration"
“.
- Mit der pgvector-Erweiterung können Sie Vektoreinbettungen speichern und abfragen.
- Die Erweiterung google_ml_integration bietet Funktionen, mit denen Sie auf Vertex AI-Vorhersageendpunkte zugreifen und Vorhersagen in SQL abrufen können.
- Aktivieren Sie diese Erweiterungen, indem Sie die folgenden DDLs ausführen:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
- Prüfen Sie mit dem folgenden SQL-Befehl, ob die Erweiterungen installiert sind:
select extname, extversion from pg_extension;
Tabelle erstellen
- Erstellen Sie eine Tabelle mit der folgenden DDL-Anweisung:
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
Wenn der Befehl oben erfolgreich ausgeführt wurde, sollte die Tabelle in
in der Datenbank. Das folgende Bild zeigt ein Beispiel:
Daten aufnehmen
Für dieses Lab haben wir Testdaten mit etwa 200 Einträgen in dieser SQL-Datei. Er enthält die id, category, sub_category, uri, image
und die content
. Die anderen Felder werden später im Lab ausgefüllt.
- Kopieren Sie die 20 Zeilen/INSERT-Anweisungen aus der SQL-Datei in einen neuen Editor-Tab in AlloyDB Studio und klicken Sie auf AUSFÜHREN.
- Maximieren Sie den Bereich „Explorer“, bis Sie die Tabelle mit dem Namen
apparels
sehen. - Klicken Sie auf das Dreipunkt-Menü [⋮] und dann auf Abfrage. Eine SELECT-Anweisung wird in einem neuen Editor-Tab geöffnet.
- Klicken Sie auf Ausführen, um zu prüfen, ob die Zeilen eingefügt wurden.
Nutzer Berechtigung gewähren
Wir gewähren dem Nutzer postgres
die Berechtigung, Embeds in AlloyDB zu generieren..
Führen Sie in AlloyDB Studio die folgende Anweisung aus, um dem Nutzer postgres
Ausführungsrechte für die Funktion embedding
zu gewähren:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
Dem AlloyDB-Dienstkonto die Rolle „Vertex AI User“ gewähren
Wir verwenden die Modelle für die Texteinbettung von Vertex AI, um Einbettungen zu generieren, für die die Rolle „Vertex AI User“ dem AlloyDB-Dienstkonto zugewiesen ist.
Klicken Sie in der Google Cloud Console auf das Symbol Cloud Shell-Terminal [] und führen Sie den folgenden Befehl 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"
6. Build-Kontext
Zum Erstellen eines Symbols benötigen wir ein context
, also alle Informationen, die wir in einem einzigen Feld aufnehmen möchten. Dazu erstellen wir eine Produktbeschreibung, die wir in der Spalte pdt_desc
in der Tabelle apparels
speichern.
In unserem Fall verwenden wir alle Informationen zu den einzelnen Produkten. Wenn Sie dies mit Ihren eigenen Daten tun, können Sie die Daten so gestalten, wie es für Ihr Unternehmen sinnvoll ist.
Führen Sie auf dem Tab „Editor“ in AlloyDB Studio den folgenden Befehl aus, um das Feld pdt_desc
mit Kontextdaten zu aktualisieren:
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
Mit dieser DML wird eine einfache Kontextzusammenfassung mit den Informationen aus allen in der Tabelle verfügbaren Feldern und anderen Abhängigkeiten (falls vorhanden) erstellt. Für eine präzisere Auswahl von Informationen und die Erstellung von Kontext können Sie die Daten so gestalten, wie es für Ihr Unternehmen sinnvoll ist.
7. Einbettungen für den Kontext erstellen
Für Computer ist es viel einfacher, Zahlen zu verarbeiten als Text. Ein Einbettungssystem wandelt Text in eine Reihe von Fließkommazahlen um, die den Text unabhängig von der Formulierung, der Sprache usw. darstellen sollen.
Beschreiben Sie einen Ort am Meer. Sie kann "on the water
, beachfront
, walk from your room to the ocean
, sur la mer
oder на берегу океана
heißen. Diese Begriffe sehen alle unterschiedlich aus, aber ihre semantische Bedeutung oder in der Terminologie des maschinellen Lernens ihre Einbettungen sollten sehr nah beieinander liegen.
Nachdem die Daten und der Kontext bereit sind, führen wir die SQL-Abfrage aus, um der Tabelle im Feld embedding
die Einbettungen der Spalte „Produktbeschreibung“(pdt_desc
hinzuzufügen. Es gibt verschiedene Einbettungsmodelle, die Sie verwenden können. Wir verwenden text-embedding-005
von Vertex AI.
- Führen Sie in AlloyDB Studio den folgenden Befehl aus, um Einbettungen zu generieren, und aktualisieren Sie die Spalte
pdt_desc
mit Einbettungen für die darin gespeicherten Daten:
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-005',
pdt_desc)
WHERE
TRUE;
- Prüfen Sie mit dem folgenden Befehl, ob Einbettungen generiert werden:
SELECT
id,
category,
sub_category,
content,
embedding
FROM
Apparels
LIMIT 5;
Im Folgenden sehen Sie ein Beispiel für einen Einbettungsvektor, der wie ein Array von Gleitkommazahlen aussieht, für den Beispieltext in der Abfrage:
8. Vektorsuche ausführen
Nachdem die Tabelle, die Daten und die Einbettungen bereit sind, führen wir die Echtzeit-Vektorsuche für den Suchtext des Nutzers aus.
Angenommen, der Suchtext des Nutzers lautet „pink color, casual, pure cotton tops for women
“.
Führen Sie die folgende SQL-Abfrage aus, um Übereinstimmungen für diese Abfrage zu finden:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;
Sehen wir uns diese Abfrage genauer an:
In dieser Abfrage:
- Der Suchbegriff des Nutzers lautet: „
I want womens tops, pink casual only pure cotton.
“ - Wir konvertieren diesen Suchtext mit der Methode
embedding()
und dem Modelltext-embedding-005
in Einbettungen. Dieser Schritt sollte Ihnen nach dem letzten Schritt bekannt vorkommen, in dem wir die Einbettungsfunktion auf alle Elemente in der Tabelle angewendet haben. - „
<=>
“ steht für die Verwendung der Distanzmethode KOSINISCHE ÄHNLICHKEIT. Alle verfügbaren Ähnlichkeitsmaße finden Sie in der Dokumentation von pgvector. - Wir konvertieren das Ergebnis der Einbettungsmethode in den Datentyp Vektor, damit es mit den in der Datenbank gespeicherten Vektoren kompatibel ist.
- Mit LIMIT 5 wird angegeben, dass wir 5 Nächste Nachbarn für den Suchtext extrahieren möchten.
Im Folgenden sehen Sie eine Beispielantwort für diese SQL-Abfrage:
Wie Sie in den Ergebnissen sehen, stimmen die Übereinstimmungen ziemlich genau mit dem Suchtext überein. Ändern Sie die Farbe, um zu sehen, wie sich die Ergebnisse ändern.
AlloyDB ScaNN-Index für die Abfrageleistung
Angenommen, wir möchten die Leistung (Abfragezeit), Effizienz und den Rückruf dieses Vektorsuchergebnisses mit dem ScaNN-Index verbessern.
Wenn Sie den ScaNN-Index verwenden möchten, gehen Sie so vor:
- Da wir bereits den Cluster, die Instanz, den Kontext und die Einbettungen erstellt haben, müssen wir nur noch die ScaNN-Erweiterung mit der folgenden Anweisung installieren:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- ScaNN-Index erstellen:
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
In der obigen DDL:
apparel_index
ist der Name des Index.apparels
ist der Tabellenname.scann
ist die Indexmethode.embedding
ist die Spalte in der Tabelle, die Sie indexieren möchten.cosine
ist die Entfernungsmethode, die Sie mit dem Index verwenden möchten.54
ist die Anzahl der Partitionen, die auf diesen Index angewendet werden sollen. Legen Sie einen Wert zwischen 1 und 1048576 fest. Weitere Informationen zur Auswahl dieses Werts finden Sie unter ScaNN-Index optimieren.
Gemäß der Empfehlung im ScaNN-Repository haben wir die QUADRATWURZL der Anzahl der Datenpunkte verwendet. Bei der Partitionierung sollte num_leaves
ungefähr der Quadratwurzel der Anzahl der Datenpunkte entsprechen.
- Prüfen Sie mit der folgenden Abfrage, ob der Index erstellt wurde:
SELECT * FROM pg_stat_ann_indexes;
- Führen Sie die Vektorsuche mit derselben Abfrage aus, die wir ohne Index verwendet haben:
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
Die obige Abfrage ist dieselbe, die wir im Lab in Schritt 8 verwendet haben. Jetzt ist das Feld jedoch mit dem ScaNN-Index indexiert.
- Führen Sie einen Test mit einer einfachen Suchanfrage mit und ohne Index durch. Wenn Sie ohne Index testen möchten, müssen Sie den Index löschen:
white tops for girls without any print
Der obige Suchtext in der Vektorsuchabfrage für die INDEXIERTEN Einbettungsdaten führt zu hochwertigen Suchergebnissen und Effizienz. Die Effizienz wird durch den Index erheblich verbessert (in Bezug auf die Ausführungszeit: 10,37 ms ohne ScaNN und 0,87 ms mit ScaNN). Weitere Informationen zu diesem Thema finden Sie in diesem Blog.
9. Abgleichsbestätigung mit dem LLM
Bevor wir fortfahren und einen Dienst erstellen, der die besten Übereinstimmungen für eine Anwendung zurückgibt, prüfen wir mit einem generativen KI-Modell, ob diese potenziellen Antworten wirklich relevant und sicher für die Weitergabe an den Nutzer sind.
Prüfen, ob die Instanz für Gemini eingerichtet ist
- Prüfen Sie, ob die
google_ml_integration
bereits für Ihren Cluster und Ihre Instanz aktiviert ist. Führen Sie in AlloyDB Studio den folgenden Befehl aus:
show google_ml_integration.enable_model_support;
Wenn der Wert „An“ lautet, können Sie die nächsten beiden Schritte überspringen und direkt mit der Einrichtung fortfahren.
die Integration von AlloyDB und Vertex AI-Modellen.
- Rufen Sie die primäre Instanz Ihres AlloyDB-Clusters auf und klicken Sie auf PRIMÄRE INSTANZ BEARBEITEN.
- Maximieren Sie unter Erweiterte Konfigurationsoptionen den Bereich Neues Datenbank-Flag und prüfen Sie, ob
google_ml_integration.enable_model_support flag
aufon
festgelegt ist. Gehen Sie dazu so vor:
3. Wenn der Wert nicht „
on
“ ist, ändern Sie ihn in „on
“ und klicken Sie dann auf INSTANZ AKTUALISIEREN.
Dieser Schritt dauert einige Minuten.
AlloyDB- und Vertex AI-Modellintegration
Sie können jetzt eine Verbindung zu AlloyDB Studio herstellen und die folgende DML-Anweisung ausführen, um den Zugriff auf das Gemini-Modell über AlloyDB einzurichten. Geben Sie dabei an der entsprechenden Stelle Ihre Projekt-ID an. Möglicherweise werden Sie vor der Ausführung des Befehls auf einen Syntaxfehler hingewiesen. Er sollte aber trotzdem ausgeführt werden.
- Rufen Sie in der Google Cloud Console AlloyDB auf. Wählen Sie den primären Cluster aus und klicken Sie dann im Navigationsmenü links auf AlloyDB Studio.
- Wir verwenden die
gemini-1.5-pro:generateContent
, die standardmäßig mit der Erweiterunggoogle_ml_integration
verfügbar ist. - Mit dem folgenden Befehl in AlloyDB Studio können Sie die für den Zugriff konfigurierten Modelle prüfen:
select model_id,model_type from google_ml.model_info_view;
- Erteilen Sie Datenbanknutzern die Berechtigung, die Funktion ml_predict_row auszuführen, um Vorhersagen mit den Google Vertex AI-Modellen auszuführen. Führen Sie dazu den folgenden Befehl aus:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
Antworten auswerten
Im nächsten Abschnitt, in dem wir die Anwendung in Cloud Run bereitstellen, verwenden wir zwar eine große Abfrage, aber damit die Antworten auf die Abfrage sinnvoll sind, kann sie schwer verständlich sein.
Wir sehen uns die einzelnen Abschnitte an, aus denen die größere Abfrage besteht, die wir schließlich verwenden.
- Zuerst senden wir eine Anfrage an die Datenbank, um die 5 besten Übereinstimmungen für eine Nutzerabfrage zu erhalten. Wir codieren die Abfrage hartcodiert, um es einfach zu halten. Keine Sorge, wir interpolieren sie später in die Abfrage.
Wir fügen die Produktbeschreibung aus der Tabelle apparels
hinzu und zwei neue Felder: eines, das die Beschreibung mit dem Index und eines mit der ursprünglichen Anfrage kombiniert. Diese Daten werden in einer Tabelle namens xyz
gespeichert, einem temporären Tabellennamen.
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
Die Ausgabe dieser Abfrage sind die fünf ähnlichsten Zeilen, die sich auf die Nutzerabfrage beziehen. Die
Die neue Tabelle xyz
enthält fünf Zeilen mit den folgenden Spalten:
literature
content
user_text
- Um zu ermitteln, wie gültig Antworten sind, verwenden wir eine komplizierte Abfrage, in der wir erklären, wie die Antworten bewertet werden. Dabei werden
user_text
undcontent
in der Tabellexyz
als Teil der Abfrage verwendet.
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- Mit dieser Abfrage prüfen wir dann die Güte der Antworten in der Tabelle
xyz
. Mit „Güte“ meinen wir, wie genau die generierten Antworten unseren Erwartungen entsprechen.
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
- Die
predict_row
gibt das Ergebnis im JSON-Format zurück. Mit dem Code „-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"
“ wird der tatsächliche Text aus dieser JSON-Datei extrahiert. Wenn Sie die tatsächlich zurückgegebene JSON-Datei sehen möchten, können Sie diesen Code entfernen. - Um das LLM-Feld zu erhalten, müssen Sie es einfach aus der Tabelle „x“ extrahieren:
SELECT
LLM_RESPONSE
FROM
x;
- So können Sie diese zu einer einzigen Abfrage kombinieren:
Warnung: Wenn Sie die obigen Abfragen ausgeführt haben, um die Zwischenergebnisse zu prüfen,
Sie müssen die Tabellen xyz
und x
aus der AlloyDB-Datenbank löschen, bevor Sie diese Abfrage ausführen.
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
Die größere Abfrage ist eine Kombination aller Abfragen, die wir in den vorherigen Schritten ausgeführt haben. Die Ergebnisse zeigen, ob eine Übereinstimmung vorliegt, wie hoch der Prozentsatz der Übereinstimmung ist und eine kurze Erläuterung der Altersfreigabe.
Beachten Sie, dass das Streaming für das Gemini-Modell standardmäßig aktiviert ist. Daher ist die tatsächliche Antwort auf mehrere Zeilen verteilt:
10. Anwendung im Web bereitstellen
Wir hosten diese Anwendung jetzt, damit über das Internet darauf zugegriffen werden kann.
Cloud Run-Funktion erstellen
- Rufen Sie in der Google Cloud Console über den folgenden Link die Cloud Run-Funktionen auf:
https://console.cloud.google.com/run/create?deploymentType=function
- Geben Sie unter „Konfigurieren“ den Funktionsnamen „retail-engine“ ein und wählen Sie die Region „us-central1“ aus.
- Wählen Sie unter „Endpunkt-URL“ als Laufzeit Java 17 aus.
- Wählen Sie unter „Authentifizierung“ die Option Nicht authentifizierte Aufrufe zulassen aus.
- Maximieren Sie Container, Volumes, Netzwerk, Sicherheit und klicken Sie auf den Tab Netzwerk.
- Wählen Sie Mit einer VPC für ausgehenden Traffic verbinden und dann Connectors für serverlosen VPC-Zugriff verwenden aus.
- Klicken Sie unter „Netzwerk“ auf Neuen VPC-Connector hinzufügen. Aktivieren Sie die Serverless VPC Access API, falls sie noch nicht aktiviert ist.
- Geben Sie unter „Connector erstellen“ den Namen
alloydb-test-conn
ein. - Legen Sie als Region
us-central
fest. - Lassen Sie den Wert für „Netzwerk“ bei standard und legen Sie Subnetz als Benutzerdefinierter IP-Bereich mit dem IP-Bereich 10.8.0.0 oder einem ähnlichen verfügbaren Bereich fest.
- Maximieren Sie die Einstellungen für Skalierung anzeigen und legen Sie für Mindestanzahl von Instanzen den Wert 2 und für Maximale Anzahl von Instanzen den Wert 3 fest.
- Wählen Sie als Instanztyp f1-micro aus. Im Folgenden sind die Optionen für das Erstellen eines Connectors aufgeführt:
- Klicken Sie auf „Erstellen“, um den Connector zu erstellen.
- Wählen Sie unter „Traffic-Routing“ die Option Gesamten Traffic an die VPC weiterleiten aus.
- Klicken Sie auf Erstellen, um die Funktion zu erstellen.
Anwendung bereitstellen
Aktualisieren Sie nach dem Erstellen der Funktion die Quelle und stellen Sie die Anwendung neu bereit.
- Klicken Sie unter Cloud Run auf den Tab Dienste und dann auf die Funktion retail-engine.
- Klicken Sie auf den Tab „Quelle“. Lassen Sie den Standard-Funktionseinstiegspunkt auf „
gcfv2.HelloHttpFunction
“ gesetzt. - Ersetzen Sie den Inhalt der Datei HelloHttpFunction.java durch den Inhalt dieser Java-Datei.
- Aktualisieren Sie die Details für AlloyDbJdbcConnector in der Datei entsprechend den Details Ihrer AlloyDB-Instanz und Ihres Clusters. Ersetzen Sie
$PROJECT_ID
durch die Projekt-ID Ihres AlloyDB-Clusters und Ihrer AlloyDB-Instanz.
- Ersetzen Sie den Inhalt der Datei pom.xml durch den Inhalt dieser XML-Datei.
- Klicken Sie auf Speichern und wieder bereitstellen, um die Funktion bereitzustellen.
11. Retail-Engine-Anwendung testen
Sobald die aktualisierte Cloud-Funktion bereitgestellt wurde, sollte der Endpunkt im folgenden Format angezeigt werden:
https://retail-engine-PROJECT_NUMBER.us-central1.run.app
Sie können es über das Cloud Shell-Terminal mit dem folgenden Befehl testen:
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
Alternativ können Sie die Cloud Run-Funktion so testen:
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
Das Ergebnis:
Nachdem wir die Ähnlichkeitsvektorsuche mit dem Einbettungsmodell auf AlloyDB-Daten ausgeführt haben, können wir mit der Erstellung der Anwendung beginnen, in der diese Einbettungen zusammen mit Ihrem Bild verwendet werden, und Prompts für die Generierung von Stilvorschlägen.
12. Ablauf der Outfit-Empfehlung
Die Outfit-Empfehlungs-App ist eine Sprint-Boot-Anwendung, die für die Verwendung mit den Einbettungen konfiguriert ist, die wir in der AlloyDB-Einzelhandels-Engine-Anwendung zusammen mit Gemini und Imagen erstellt haben, um visuelle Optionen für das Outfit-Styling zu generieren. Außerdem kannst du benutzerdefinierte Prompts hinzufügen und die Empfehlung improvisieren.
Stellen Sie sich Folgendes vor: Sie laden ein Bild eines knallrosa Oberteils aus Ihrem Kleiderschrank in diese App hoch. Wenn Sie auf „Anzeigen“ klicken, generiert die Anwendung basierend auf dem Prompt im Anwendungscode und den Einbettungen in der AlloyDB-Datenbank mehrere Optionen, die dem Originalbild entsprechen. Jetzt möchten Sie wissen, wie die vorgeschlagenen Optionen mit einem blauen Halsband aussehen könnten. Sie fügen also in diesen Zeilen einen Prompt hinzu und klicken auf „Stil“. Das endgültige Bild wird generiert, das die Kombination aus dem Originalbild und den Empfehlungen kombiniert, um ein passendes Outfit zu erstellen.
So erstellen Sie die App für Outfit-Empfehlungen:
- Öffnen Sie in Cloud Run die Anwendung retail-engine und notieren Sie sich die URL Ihrer Anwendung. Das ist das Repository für Einbettungen, mit dem wir ähnliche Vorschläge generieren.
- Klonen Sie in Ihrer IDE das Repository https://github.com/AbiramiSukumaran/outfit-recommender/. In dieser Übung werden die gezeigten Schritte in der Visual Studio Code-IDE ausgeführt.
git clone https://github.com/AbiramiSukumaran/outfit-recommender/
Im Folgenden finden Sie einige der wichtigen Dateien im Verzeichnis der App:
src/main
: Quellverzeichnis, in dem sich Anwendungsdateien und HTML-Dateien befinden:HelloWorldApplication.java
: Haupteinstiegspunkt für die Spring-Boot-Anwendung.HelloWorldController.java
: Spring Boot REST-Controller, der HTTP-Anfragen im Zusammenhang mit einer Outfit-Empfehlungsanwendung verarbeitet. Diese Datei verarbeitet GET- und POST-Anfragen, verarbeitet Nutzerprompts, analysiert Bilder, interagiert mit AlloyDB-Embeddings und gibt die endgültige Antwort an die Benutzeroberfläche zurück. Dieser Controller ruft die Klasse „GenerateImageSample“ auf.GenerateImageSample.java
: Enthält die Bildgenerierungsklasse, die eine Verbindung zu Vertex AI herstellt, den Nutzerprompt formatiert, API-Aufrufe an das Imagen-Modell sendet und das vorhergesagte Bild an die Controller-Klasse zurückgibt.Resources
: Dieses Verzeichnis enthält Bilder und HTML-Dateien, die zum Generieren der Benutzeroberfläche der Anwendung erforderlich sind.Pom.xml
: Hier werden die Projektabhängigkeiten und ‑konfigurationen definiert.
- Öffnen Sie in Visual Studio Code die
HelloWorldController.java
und aktualisieren Sie die Instanzen der Projekt-ID und des Speicherorts entsprechend dem Speicherort, an dem Ihre AlloyDB-Instanz erstellt wird.
- Aktualisieren Sie
endpoint
auf die URL der Retail-Engine-App, die Sie zuvor gehostet haben.
- Öffnen Sie die
GenerateImageSample.java
und aktualisieren Sie die Projekt-ID und den Speicherort entsprechend dem Speicherort, an dem Ihre AlloyDB-Instanz erstellt wird.
- Speichern Sie alle Dateien.
Wir stellen diese Anwendung jetzt in der serverlosen Laufzeit von Cloud Run bereit.
13. Anwendung im Web bereitstellen
Nachdem wir der Spring Boot-Anwendung für die Outfit-Empfehlung das relevante Projekt, den Standort und die Details zur Retail-Engine-App hinzugefügt haben, können wir die Anwendung in Cloud Run bereitstellen.
Wir verwenden den Befehl gcloud run deploy
im Visual Studio-Terminal, um die Anwendung bereitzustellen. Für Visual Studio Code können Sie die Google Cloud Code-Erweiterung installieren, um die gcloud CLI zu verwenden.
So stellen Sie die Anwendung bereit:
- Öffnen Sie in der IDE das geklonte Verzeichnis und starten Sie das Terminal. Klicken Sie in Visual Code Studio auf Terminal > Neues Terminal.
- Folgen Sie der Anleitung in diesem Dokument, um die gcloud CLI zu installieren.
- Wenn Sie Visual Studio Code verwenden, klicken Sie auf Erweiterungen, suchen Sie nach Google Cloud Code und installieren Sie die Erweiterung.
- Authentifizieren Sie Ihr Google-Konto im Terminal Ihrer IDE mit dem folgenden Befehl:
gcloud auth application-default login
- Legen Sie als Projekt-ID das Projekt fest, in dem sich Ihre AlloyDB-Instanz befindet.
gcloud config set project PROJECT_ID
- Starten Sie den Bereitstellungsprozess.
gcloud run deploy
- Drücken Sie in
Source code location
die Eingabetaste, um das geklonte GitHub-Verzeichnis auszuwählen. - Geben Sie unter
Service name
einen Namen für den Dienst ein, z. B. „outfit-recommender“, und drücken Sie die Eingabetaste. - Geben Sie unter
Please specify a region
den Speicherort ein, an dem Ihre AlloyDB-Instanz und die Retail-Engine-Anwendung gehostet werden, z. B. 32 für us-central1, und drücken Sie die Eingabetaste.
- Geben Sie in
Allow unauthenticated invocations to [..]
Y ein und drücken Sie die Eingabetaste.
Das folgende Bild zeigt den Bereitstellungsfortschritt Ihrer Anwendung:
14. Outfit-Empfehlungs-App testen
Nachdem die Anwendung erfolgreich in Cloud Run bereitgestellt wurde, sehen Sie den Dienst in der Google Cloud Console so:
- Rufen Sie in der Google Cloud Console Cloud Run auf.
- Klicken Sie unter „Dienste“ auf den von Ihnen bereitgestellten Dienst Outfit-Empfehlung. So sollten sowohl die retail-engine als auch der Dienst outfit-recommender angezeigt werden:
- Klicken Sie auf die Anwendungs-URL, um die Benutzeroberfläche der Empfehlungs-App zu öffnen.
The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
Die bereitgestellte Anwendung sieht so aus:
Anwendung verwenden
So verwenden Sie die Anwendung:
- Klicke auf Hochladen und lade ein Bild eines Kleidungsstücks hoch.
- Klicken Sie nach dem Hochladen des Bilds auf Stil. Die Anwendung verwendet das Bild als Prompt und generiert Optionen für die untere Zeile basierend auf dem Prompt aus der Retail-Engine-App, die Einbettungen für den Einzelhandelsdatensatz enthält.
Die App generiert Bildvorschläge sowie einen Prompt mit Styling-Empfehlungen, der auf dem Bild basiert. Beispiel: A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.
- Sie können dieser automatisch generierten Stilempfehlung zusätzliche Prompts übergeben. Beispiel:
STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
- Klicken Sie auf Anzeigen, um das endgültige Styling zu sehen.
15. Bereinigen
Mit den folgenden Schritten vermeiden Sie, dass Ihrem Google Cloud-Konto die in diesem Beitrag verwendeten Ressourcen in Rechnung gestellt werden:
- Rufen Sie in der Google Cloud Console die Seite Ressourcen verwalten auf.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.
16. Glückwunsch
Glückwunsch! Sie haben eine Ähnlichkeitssuche mit AlloyDB, pgvector und der Vektorsuche durchgeführt und das Suchergebnis mit dem leistungsstarken Imagen-Modell kombiniert, um Stilvorschläge zu generieren.