KI-gestützte Outfit-Empfehlungs-App mit AlloyDB und serverlosen Laufzeiten erstellen

1. Übersicht

Stellen Sie sich eine Mode-App vor, die Ihnen nicht nur hilft, das perfekte Outfit zu finden, sondern auch Styling-Tipps in Echtzeit gibt – alles dank der leistungsstarken Integration von KI-Modellen. In diesem Vortrag erfahren Sie, wie wir eine solche App mit den Vektorsuchfunktionen von AlloyDB in Kombination mit dem ScaNN-Index von Google entwickelt haben, um blitzschnelle Suchen nach passenden Outfits zu ermöglichen und sofortige Modeempfehlungen zu liefern.

Außerdem erfahren Sie, wie der ScaNN-Index von AlloyDB komplexe Anfragen optimiert, um personalisierte Stilvorschläge zu generieren. Wir verwenden außerdem Gemini und Imagen, leistungsstarke generative KI-Modelle, um kreative Styling-Inspirationen zu liefern und Ihre personalisierten Looks zu visualisieren. Die gesamte Anwendung basiert auf einer serverlosen Architektur, die für Nutzer eine nahtlose und skalierbare Nutzung ermöglicht.

Die Herausforderung:Die App bietet personalisierte Outfitvorschläge, um Menschen zu helfen, die sich schwer mit Modeentscheidungen tun. Außerdem wird so die Entscheidungsmüdigkeit bei der Outfitplanung vermieden.

Die Lösung:Die App für Outfit-Empfehlungen bietet Nutzern ein intelligentes, personalisiertes und ansprechendes Modeerlebnis und demonstriert gleichzeitig die Leistungsfähigkeit von AlloyDB, generativer KI und serverlosen Technologien.

Aufgaben

In diesem Lab haben Sie folgende Aufgaben:

  1. AlloyDB-Instanz erstellen und E-Commerce-Dataset laden
  2. pgvector- und generative KI-Modellerweiterungen in AlloyDB aktivieren
  3. Einbettungen aus der Produktbeschreibung generieren
  4. Lösung in serverlosen Cloud Run Functions bereitstellen
  5. Laden Sie ein Bild in Gemini hoch und generieren Sie einen Prompt für eine Bildbeschreibung.
  6. Suchergebnisse basierend auf Prompts in Kombination mit E‑Commerce-Dataset-Einbettungen generieren
  7. Fügen Sie zusätzliche Prompts hinzu, um den Prompt anzupassen und Stilempfehlungen zu generieren.
  8. Lösung in serverlosen Cloud Run Functions bereitstellen

Voraussetzungen

  • Ein Browser, z. B. Chrome oder Firefox
  • Google Cloud-Projekt mit aktivierter Abrechnungsfunktion.

2. Architektur

Die allgemeine Architektur der App ist wie folgt:

ce32f865dfe59142.png

In den folgenden Abschnitten wird der Kontext der Anleitung erläutert:

Aufnahme:

Im ersten Schritt werden die Einzelhandelsdaten (Inventar, Produktbeschreibungen, Kundeninteraktionen) in AlloyDB aufgenommen.

Analytics Engine:

Wir verwenden AlloyDB als Analyse-Engine, um Folgendes auszuführen:

  1. Kontext extrahieren:Die Engine analysiert die in AlloyDB gespeicherten Daten, um Beziehungen zwischen Produkten, Kategorien, Kundenverhalten usw. zu erkennen.
  2. Erstellung von Einbettungen:Für die Nutzeranfrage und die in AlloyDB gespeicherten Informationen werden Einbettungen (mathematische Darstellungen von Text) generiert.
  3. Vektorsuche:Die Engine führt eine Ähnlichkeitssuche durch und vergleicht die Einbettung der Anfrage mit den Einbettungen von Produktbeschreibungen, Rezensionen und anderen relevanten Daten. Dadurch werden die 25 relevantesten „nächsten Nachbarn“ ermittelt.

Gemini-Empfehlung:

Das Bild-Byte-Array wird über die Vertex AI API an das Gemini-Modell übergeben, zusammen mit dem Prompt, in dem eine Textbeschreibung des Oberteils sowie Empfehlungen für das Unterteil angefordert werden.

AlloyDB – RAG und Vektorsuche:

Die Beschreibung des Oberteils wird verwendet, um die Datenbank abzufragen. Bei der Abfrage wird der Suchtext (Empfehlung des Gemini-Modells für passende Unterteile) in Einbettungen umgewandelt und eine Vektorsuche für die in der Datenbank gespeicherten Einbettungen durchgeführt, um die nächsten Nachbarn (passende Ergebnisse) zu finden. Die Vektoreinbettungen in der AlloyDB-Datenbank werden mit dem ScaNN-Index indexiert, um einen besseren Recall zu erzielen.

Generierung von Antwortbildern:

Die validierten Antworten werden in einem JSON-Array strukturiert und die gesamte Engine wird in einer serverlosen Cloud Run-Funktion verpackt, die über den Agent Builder aufgerufen wird.

Imagen-Bildgenerierung:

Der Styling-Prompt des Nutzers, eine vom Nutzer ausgewählte Empfehlung und alle Personalisierungsanfragen werden kombiniert, um Imagen 3 mit einem vorhandenen Bild zu prompten. Das Styling-Bild wird anhand dieses Prompts mit der Vertex AI API generiert.

3. Hinweis

Projekt erstellen

  1. Wählen Sie in der Google Cloud Console auf der Seite zur Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
  2. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist .
  3. Sie verwenden Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird und in der bq vorinstalliert ist. Klicken Sie oben in der Google Cloud Console auf Cloud Shell aktivieren ( f2ae85166a716c5c.png).
  4. Sobald die Verbindung mit der Cloud Shell hergestellt ist, prüfen Sie mit dem folgenden Befehl, ob Sie bereits authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist:
gcloud auth list
  1. Führen Sie den folgenden Befehl aus, um zu bestätigen, dass Ihr Projekt in zukünftigen gcloud-Befehlen richtig identifiziert wird.
gcloud config list project
  1. Wenn Ihr Projekt nicht festgelegt ist, verwenden Sie den folgenden Befehl, um es explizit festzulegen:
gcloud config set project <YOUR_PROJECT_ID>
  1. Aktivieren Sie die erforderlichen APIs.

Folgen Sie dem Link, um APIs zu aktivieren.

Wenn Sie eine API nicht aktivieren, können Sie das jederzeit während 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 zum Speichern des E-Commerce-Datasets für den Einzelhandel. Darin werden Cluster zum Speichern aller Ressourcen wie Datenbanken und Logs verwendet. Jeder Cluster hat eine primäre Instanz, die einen Zugriffspunkt auf die Daten bietet. Tabellen sind die eigentliche Ressource, in der Daten gespeichert werden.

Erstellen wir einen AlloyDB-Cluster, eine AlloyDB-Instanz und eine AlloyDB-Tabelle, in die das E-Commerce-Dataset geladen wird.

Cluster und Instanz erstellen

  1. 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.
  2. Klicken Sie auf CLUSTER ERSTELLEN.

f76ff480c8c889aa.png

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

538dba58908162fb.png

  1. Wenn Sie unter „Netzwerk“ das Standardnetzwerk auswählen, wird die folgende Option angezeigt. Klicken Sie auf VERBINDUNG EINRICHTEN, um ein Standardnetzwerk einzurichten.
    7939bbb6802a91bf.png
  2. Wählen Sie Automatisch zugewiesenen IP-Bereich verwenden aus und klicken Sie auf Weiter. Klicken Sie nach dem Überprüfen der Informationen auf VERBINDUNG ERSTELLEN. 768ff5210e79676f.png

Warten Sie, bis das Standardnetzwerk erstellt wurde.

  1. Geben Sie unter „Primäre Instanz konfigurieren“ als Instanz-ID shopping-instance" an.

2bddecf6b7c7407b.png

  1. Klicken Sie auf CLUSTER ERSTELLEN, um die Einrichtung des Clusters abzuschließen:

24eec29fa5cfdb3e.png

5. Datenaufnahme

Jetzt ist es an der Zeit, eine Tabelle mit den Daten zum Geschäft hinzuzufügen. Warten Sie, bis die Instanz erstellt wurde. Nachdem Sie den Cluster erstellt haben, können Sie sich mit den Anmeldedaten, die Sie beim Erstellen des Clusters festgelegt haben, in AlloyDB anmelden.

Bei der AlloyDB-Datenbank authentifizieren

  1. 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:

847e35f1bf8a8bd8.png

  1. Geben Sie die folgenden Details ein, um sich bei der AlloyDB-Datenbank zu authentifizieren:
  • Nutzername: „postgres
  • Datenbank: „postgres
  • Passwort: „alloydb

Nachdem Sie sich erfolgreich in AlloyDB Studio authentifiziert haben, werden SQL-Befehle auf den Tabs Editor eingegeben. Sie können mehrere Editorfenster hinzufügen, indem Sie auf das Pluszeichen rechts neben dem ersten Editor-Tab klicken.

91a86d9469d499c4.png

Sie geben Befehle für AlloyDB in Editorfenstern ein und verwenden die Optionen „Ausführen“, „Formatieren“ und „Löschen“ nach Bedarf.

Erweiterungen aktivieren

Für die Entwicklung dieser App verwenden wir die Erweiterungen „pgvector"“ und „google_ml_integration"“.

  • Mit der pgvector-Erweiterung können Sie Vektoreinbettungen speichern und durchsuchen.
  • Die Erweiterung google_ml_integration bietet Funktionen, mit denen Sie auf Vertex AI-Vorhersageendpunkte zugreifen können, um Vorhersagen in SQL zu erhalten.
  1. 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;
  1. Prüfen Sie mit dem folgenden SQL-Befehl, ob die Erweiterungen installiert sind:
select extname, extversion from pg_extension;

Tabelle erstellen

  1. 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) );

Nach erfolgreicher Ausführung des obigen Befehls sollte die Tabelle in

in der Datenbank. Das folgende Bild zeigt ein Beispiel:

908e33bbff58a6d.png

Daten aufnehmen

Für dieses Lab haben wir Testdaten mit etwa 200 Datensätzen in dieser SQL-Datei. Sie enthält die id, category, sub_category, uri, image und die content. Die anderen Felder werden später im Lab ausgefüllt.

  1. Kopieren Sie die 20 Zeilen/Einfügeanweisungen aus der SQL-Datei in einen neuen Editor-Tab in AlloyDB Studio und klicken Sie auf RUN.
  1. Maximieren Sie den Abschnitt „Explorer“, bis Sie die Tabelle mit dem Namen apparels sehen.
  2. Klicken Sie auf das Menüsymbol [] und dann auf Abfrage. Eine SELECT-Anweisung wird in einem neuen Editor-Tab geöffnet.

b31ece70e670ab89.png

  1. Klicken Sie auf Ausführen, um zu prüfen, ob die Zeilen eingefügt wurden.

Nutzerberechtigung erteilen

Wir erteilen dem Nutzer postgres die Berechtigung, Einbettungen 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 erteilen:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

AlloyDB-Dienstkonto die Rolle „Vertex AI User“ gewähren

Wir verwenden die Modelle für Texteinbettungen aus Vertex AI, um Einbettungen zu generieren. Dazu müssen wir dem AlloyDB-Dienstkonto die Rolle „Vertex AI User“ zuweisen.

Klicken Sie in der Google Cloud Console auf das Symbol Cloud Shell-Terminal [f2ae85166a716c5c.png] 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

Um ein Embedding zu erstellen, benötigen wir ein context, d.h. alle Informationen, die in einem einzelnen Feld enthalten sein sollen. 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 jedoch beliebig aufbereiten, um für Ihr Unternehmen relevante Informationen zu erhalten.

Führen Sie auf dem Tab „Editor“ von 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 diesem DML wird eine einfache Kontextzusammenfassung mit den Informationen aus allen in der Tabelle verfügbaren Feldern und anderen Abhängigkeiten (falls in Ihrem Anwendungsfall vorhanden) erstellt. Für eine genauere Zusammenstellung von Informationen und die Erstellung von Kontext können Sie die Daten auf jede Weise bearbeiten, die für Ihr Unternehmen sinnvoll ist.

7. Einbettungen für den Kontext erstellen

Für Computer ist es viel einfacher, Zahlen als Text zu verarbeiten. Ein Einbettungssystem wandelt Text in eine Reihe von Fließkommazahlen um, die den Text repräsentieren sollen, unabhängig davon, wie er formuliert ist, in welcher Sprache er verfasst ist usw.

Beschreiben Sie einen Ort am Meer. Sie können als "on the water, beachfront, walk from your room to the ocean, sur la mer, на берегу океана usw. bezeichnet werden. Diese Begriffe sehen alle unterschiedlich aus, aber ihre semantische Bedeutung oder in der Terminologie des maschinellen Lernens ihre Einbettungen sollten sehr ähnlich sein.

Nachdem die Daten und der Kontext bereit sind, führen wir den SQL-Befehl aus, um die Einbettungen der Spalte „Produktbeschreibung“(pdt_desc der Tabelle im Feld embedding hinzuzufügen. Es gibt verschiedene Einbettungsmodelle, die Sie verwenden können. Wir verwenden text-embedding-005 von Vertex AI.

  1. Führen Sie in AlloyDB Studio den folgenden Befehl aus, um Einbettungen zu generieren und die Spalte pdt_desc mit Einbettungen für die darin gespeicherten Daten zu aktualisieren:
UPDATE
 apparels
SET
 embedding = embedding( 'text-embedding-005',
   pdt_desc)
WHERE
 TRUE;
  1. Prüfen Sie mit dem folgenden Befehl, ob die Einbettungen generiert wurden:
SELECT
 id,
 category,
 sub_category,
 content,
 embedding
FROM
 Apparels
LIMIT 5;

Das Folgende ist ein Beispiel für einen Einbettungsvektor, der wie ein Array von Gleitkommazahlen aussieht, für den Beispieltext in der Anfrage:

c69c08d085389f74.png

8. Vektorsuche durchführen

Nachdem die Tabelle, die Daten und die Einbettungen bereit sind, führen wir die Echtzeit-Vektorsuche für den Suchtext des Nutzers durch.

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 Anfrage genauer an:

In dieser Abfrage

  1. Der Suchtext des Nutzers lautet: „I want womens tops, pink casual only pure cotton.
  2. Wir wandeln diesen Suchtext mit der Methode embedding() und dem Modell text-embedding-005 in Einbettungen um. Dieser Schritt sollte Ihnen nach dem letzten Schritt, in dem wir die Einbettungsfunktion auf alle Elemente in der Tabelle angewendet haben, bekannt vorkommen.
  3. <=>“ steht für die Verwendung der Distanzmethode KOSINUS-ÄHNLICHKEIT. Alle verfügbaren Ähnlichkeitsmessungen finden Sie in der Dokumentation von pgvector.
  4. Wir konvertieren das Ergebnis der Einbettungsmethode in den Datentyp vector, damit es mit den in der Datenbank gespeicherten Vektoren kompatibel ist.
  5. LIMIT 5 bedeutet, dass wir 5 nächste Nachbarn für den Suchtext extrahieren möchten.

Im Folgenden sehen Sie ein Beispiel für die Antwort auf diese SQL-Abfrage:

4193a68737400535.png

Wie Sie in den Ergebnissen sehen können, sind die Übereinstimmungen sehr nah am Suchtext. Ändern Sie die Farbe, um zu sehen, wie sich die Ergebnisse ändern.

AlloyDB-ScaNN-Index für Abfrageleistung

Angenommen, wir möchten die Leistung (Abfragezeit), Effizienz und den Recall dieses Vektorsuchergebnisses mit dem ScaNN-Index verbessern.

Wenn Sie einen ScaNN-Index verwenden möchten, gehen Sie so vor:

  1. Da wir den Cluster, die Instanz, den Kontext und die Einbettungen bereits erstellt haben, müssen wir nur noch die ScaNN-Erweiterung mit der folgenden Anweisung installieren:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. ScaNN-Index erstellen:
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);

In der obigen DDL gilt:

  • 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 Distanzmethode, die Sie für den Index verwenden möchten.
  • 54 ist die Anzahl der Partitionen, die auf diesen Index angewendet werden sollen. Kann auf einen beliebigen Wert zwischen 1 und 1.048.576 festgelegt werden. Weitere Informationen dazu, wie Sie diesen Wert festlegen, finden Sie unter ScaNN-Index abstimmen.

Gemäß der Empfehlung im ScaNN-Repository haben wir die QUADRATWURZEL der Anzahl der Datenpunkte verwendet. Beim Partitionieren sollte num_leaves ungefähr der Quadratwurzel der Anzahl der Datenpunkte entsprechen.

  1. Prüfen Sie mit der folgenden Abfrage, ob der Index erstellt wurde:
SELECT * FROM pg_stat_ann_indexes;
  1. Führen Sie die Vektorsuche mit derselben Anfrage aus, die Sie 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. Das Feld ist jetzt jedoch mit dem ScaNN-Index indexiert.

  1. Testen Sie mit einer einfachen Suchanfrage mit und ohne Index. Wenn Sie ohne Index testen möchten, müssen Sie den Index löschen:

white tops for girls without any print

Der oben genannte Suchtext in der Vektorsuche für die INDEXIERTEN Einbettungsdaten führt zu hochwertigen Suchergebnissen und Effizienz. Die Effizienz wird mit dem 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. Abstimmung der Validierung mit dem LLM

Bevor wir fortfahren und einen Dienst erstellen, der die besten Übereinstimmungen für eine Anwendung zurückgibt, verwenden wir ein generatives KI-Modell, um zu prüfen, 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

  1. Prüfen Sie, ob 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 als „Ein“ angezeigt wird, können Sie die nächsten beiden Schritte überspringen und direkt mit der Einrichtung fortfahren.

die Integration von AlloyDB und Vertex AI-Modellen.

  1. Rufen Sie die primäre Instanz Ihres AlloyDB-Clusters auf und klicken Sie auf PRIMÄRE INSTANZ BEARBEITEN.

456ffdf292d3c0e0.png

  1. Maximieren Sie unter Erweiterte Konfigurationsoptionen den Abschnitt Neues Datenbank-Flag und prüfen Sie, ob google_ml_integration.enable_model_support flag wie folgt auf „on“ festgelegt ist:

6a59351fcd2a9d35.png 3. Wenn sie nicht auf „on“ festgelegt ist, legen Sie sie auf „on“ fest und klicken Sie dann auf INSTANZ AKTUALISIEREN.

Dieser Schritt dauert einige Minuten.

Einbindung von AlloyDB und Vertex AI-Modellen

Sie können jetzt eine Verbindung zu AlloyDB Studio herstellen und die folgende DML-Anweisung ausführen, um den Zugriff auf Gemini-Modelle über AlloyDB einzurichten. Verwenden Sie dazu Ihre Projekt-ID, wo angegeben. Möglicherweise werden Sie vor der Ausführung des Befehls vor einem Syntaxfehler gewarnt, aber der Befehl sollte trotzdem ausgeführt werden.

  1. 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.
  2. Wir verwenden die gemini-1.5-pro:generateContent, die standardmäßig mit der Erweiterung google_ml_integration verfügbar ist. cdb5af753a625777.png
  3. Mit dem folgenden Befehl in AlloyDB Studio können Sie prüfen, welche Modelle für den Zugriff konfiguriert sind:
select model_id,model_type from google_ml.model_info_view;        
  1. Erteilen Sie Datenbanknutzern die Berechtigung, die Funktion ml_predict_row auszuführen, um Vorhersagen mit den Google Vertex AI-Modellen zu treffen. Führen Sie dazu den folgenden Befehl aus:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;

Antworten bewerten

Im nächsten Abschnitt, in dem wir die Anwendung in Cloud Run bereitstellen, verwenden wir eine große Abfrage. Damit die Antworten der Abfrage sinnvoll sind, kann die Abfrage jedoch schwer zu verstehen sein.

Wir sehen uns die einzelnen Abschnitte an, aus denen die endgültige Abfrage besteht.

  1. Zuerst senden wir eine Anfrage an die Datenbank, um die fünf besten Übereinstimmungen für eine Nutzeranfrage zu erhalten. Wir codieren die Abfrage fest, um es einfach zu halten. Aber keine Sorge, wir werden sie später in die Abfrage einfügen.

Wir fügen die Produktbeschreibung aus der Tabelle apparels ein und fügen zwei neue Felder hinzu: eines, in dem die Beschreibung mit dem Index kombiniert wird, und ein weiteres mit der ursprünglichen Anfrage. Diese Daten werden in einer Tabelle mit dem Namen xyz gespeichert. Das ist ein temporärer Tabellenname.

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 in Bezug auf die Nutzeranfrage. Die

Die neue Tabelle xyz enthält fünf Zeilen mit den folgenden Spalten:

  • literature
  • content
  • user_text
  1. Um die Gültigkeit von Antworten zu ermitteln, verwenden wir eine komplexe Anfrage, in der wir erklären, wie die Antworten bewertet werden sollen. Dabei werden user_text und content in der Tabelle xyz 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."
  1. Mithilfe dieser Abfrage bewerten wir dann die Qualität 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;
  1. Die predict_row gibt ihr Ergebnis im JSON-Format zurück. Mit dem Code -> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'" wird der tatsächliche Text aus diesem JSON extrahiert. Wenn Sie das zurückgegebene JSON sehen möchten, können Sie diesen Code entfernen.
  2. Um das LLM-Feld zu erhalten, müssen Sie es nur aus der x-Tabelle extrahieren:
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. Das lässt sich so in einer einzigen Abfrage kombinieren:

Warnung: Wenn Sie die oben genannten Abfragen ausgeführt haben, um die Zwischenergebnisse zu prüfen,

Achten Sie darauf, dass Sie die Tabellen xyz und x aus der AlloyDB-Datenbank löschen/entfernen, 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 aus allen Abfragen, die wir in den vorherigen Schritten ausführen. Die Ergebnisse geben an, ob es eine Übereinstimmung gibt, wie hoch der Prozentsatz der Übereinstimmung ist und enthalten eine Erklärung der Bewertung.

Beachten Sie, dass das Gemini-Modell standardmäßig Streaming aktiviert hat. Die tatsächliche Antwort wird also auf mehrere Zeilen verteilt: 14e74d71293b7b9.png

10. Anwendung ins Web bringen

Wir hosten diese Anwendung jetzt, damit über das Internet darauf zugegriffen werden kann.

Cloud Run-Funktion erstellen

  1. Rufen Sie in der Google Cloud Console Cloud Run-Funktionen über den folgenden Link auf:

https://console.cloud.google.com/run/create?deploymentType=function

  1. Legen Sie unter „Konfigurieren“ den Funktionsnamen auf retail-engine fest und wählen Sie die Region us-central1 aus.
  2. Wählen Sie unter „Endpunkt-URL“ die Laufzeit Java 17 aus.
  3. Wählen Sie unter „Authentifizierung“ die Option Nicht authentifizierte Aufrufe zulassen aus.
  4. Maximieren Sie Container, Volumes, Netzwerk, Sicherheit und klicken Sie auf den Tab Netzwerk.
  5. Wählen Sie Mit einer VPC für ausgehenden Traffic verbinden aus und klicken Sie dann auf Connectors für serverlosen VPC-Zugriff verwenden.
  6. Klicken Sie unter „Netzwerk“ auf Neuen VPC-Connector hinzufügen. Aktivieren Sie die Serverless VPC Access API, falls sie noch nicht aktiviert ist.
  7. Legen Sie beim Erstellen des Connectors den Namen auf alloydb-test-conn fest.
  8. Legen Sie als Region us-central fest.
  9. Lassen Sie den Wert für „Netzwerk“ auf default und legen Sie für Subnetz den Wert Benutzerdefinierter IP-Bereich mit dem IP-Bereich 10.8.0.0 oder einem ähnlichen verfügbaren Bereich fest.
  10. 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.
  11. Wählen Sie als Instanztyp f1-micro aus. Die folgenden Optionen sind verfügbar, wenn Sie einen Connector erstellen:

bed4b2af6795a8ba.png

  1. Klicken Sie auf „Erstellen“, um den Connector zu erstellen.
  2. Wählen Sie unter „Traffic-Routing“ die Option Gesamten Traffic an die VPC weiterleiten aus.
  3. Klicken Sie auf Erstellen, um die Funktion zu erstellen.

Anwendung bereitstellen

Nachdem die Funktion erstellt wurde, aktualisieren Sie die Quelle und stellen Sie die Anwendung noch einmal bereit.

  1. Klicken Sie in Cloud Run auf den Tab Dienste und dann auf die Funktion retail-engine.
  2. Klicken Sie auf den Tab „Quelle“. Lassen Sie den Standard-Funktionseinstiegspunkt auf „gcfv2.HelloHttpFunction“ eingestellt.
  3. Ersetzen Sie den Inhalt der Datei HelloHttpFunction.java durch den Inhalt dieser Java-Datei.
  4. Aktualisieren Sie die Details von 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.

a89dc5af3580fbcf.png

  1. Ersetzen Sie den Inhalt der Datei pom.xml durch den Inhalt dieser XML-Datei.
  2. Klicken Sie auf Speichern und wieder bereitstellen, um die Funktion bereitzustellen.

11. Retail-Engine-Anwendung testen

Nachdem die aktualisierte Cloud Functions-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 testen, indem Sie den folgenden Befehl ausführen:

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:

88bc1ddfb5644a28.png

Nachdem wir die Ähnlichkeitsvektorsuche mit dem Einbettungsmodell für AlloyDB-Daten ausgeführt haben, können wir mit der Erstellung der Anwendung fortfahren, die diese Einbettungen zusammen mit Ihrem Bild und Prompts verwendet, um Stylingvorschläge zu generieren.

12. Ablauf von Outfit-Empfehlungen

Die App für Outfit-Empfehlungen ist eine Spring Boot-Anwendung, die für die Verwendung mit den Einbettungen konfiguriert ist, die wir in der AlloyDB-Anwendung für den Einzelhandel erstellt haben. Außerdem wird sie mit Gemini und Imagen verwendet, um visuelle Outfit-Styling-Optionen zu generieren. Sie können auch benutzerdefinierte Prompts hinzufügen und die Empfehlung improvisieren.

Stellen Sie sich vor, Sie laden ein Bild eines pinken Oberteils aus Ihrem Kleiderschrank in diese App hoch. Wenn Sie auf „Anzeigen“ klicken, generiert die Anwendung basierend auf dem im Anwendungscode festgelegten Prompt und den Einbettungen in der AlloyDB-Datenbank mehrere Optionen, die dem Originalbild entsprechen. Sie fragen sich, wie die vorgeschlagenen Optionen mit einer blauen Halskette aussehen könnten. Also fügen Sie einen entsprechenden Prompt hinzu und klicken auf „Stil“. Das endgültige Bild wird generiert und kombiniert das Originalbild mit den Empfehlungen, um ein passendes Outfit zu erstellen.

So erstellen Sie die App zur Empfehlung von Outfits:

  1. Öffnen Sie in Cloud Run die App retail-engine und notieren Sie sich die URL Ihrer Anwendung. Dies ist das Einbettungs-Repository, das wir zum Generieren ähnlicher Vorschläge verwenden.
  2. Klonen Sie in Ihrer IDE das Repository https://github.com/AbiramiSukumaran/outfit-recommender/. Die in dieser Übung gezeigten Schritte werden 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 befinden:
  • HelloWorldApplication.java: Haupteinstiegspunkt für die Spring Boot-Anwendung.
  • HelloWorldController.java: Spring Boot-REST-Controller, der HTTP-Anfragen im Zusammenhang mit einer Anwendung zur Empfehlung von Outfits verarbeitet. Diese Datei verarbeitet GET- und POST-Anfragen, verarbeitet Nutzerprompts, analysiert Bilder, interagiert mit AlloyDB-Einbettungen 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 Nutzer-Prompt formatiert, API-Aufrufe an das Imagen-Modell ausführt 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: Definiert die Projektabhängigkeiten und -konfigurationen.
  1. Öffnen Sie in Visual Studio Code die Datei HelloWorldController.java und aktualisieren Sie die Instanzen der Projekt-ID und des Standorts entsprechend dem Ort, an dem Ihre AlloyDB-Instanz erstellt wird.

9fff8f5cbb62567.png

  1. Aktualisieren Sie endpoint mit der URL der Retail Engine-App, die Sie zuvor gehostet haben.

ae6227e88eec5485.png

  1. Öffnen Sie die Datei GenerateImageSample.java und aktualisieren Sie die Projekt-ID und den Standort entsprechend dem Ort, an dem Ihre AlloyDB-Instanz erstellt wurde.

db1f81a6f51d80de.png

  1. Speichern Sie alle Dateien.

Wir stellen diese Anwendung jetzt in der serverlosen Laufzeit von Cloud Run bereit.

13. Anwendung ins Web bringen

Nachdem wir der Spring Boot-Anwendung für die Outfit-Empfehlung das relevante Projekt, den relevanten Standort und die App-Details für Retail Engine hinzugefügt haben, können wir die Anwendung in Cloud Run bereitstellen.

Wir verwenden den Befehl gcloud run deploy im Visual Studio Code-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:

  1. Öffnen Sie in Ihrer IDE das geklonte Verzeichnis und starten Sie das Terminal. Klicken Sie in Visual Studio Code auf Terminal > Neues Terminal.
  2. Folgen Sie der Anleitung in diesem Dokument, um die gcloud CLI zu installieren.
  3. Wenn Sie Visual Studio Code verwenden, klicken Sie auf Erweiterungen, suchen Sie nach Google Cloud Code und installieren Sie die Erweiterung.
  4. Authentifizieren Sie Ihr Google-Konto im IDE-Terminal, indem Sie den folgenden Befehl ausführen:
gcloud auth application-default login
  1. Legen Sie Ihre Projekt-ID auf dasselbe Projekt fest, in dem sich Ihre AlloyDB-Instanz befindet.
gcloud config set project PROJECT_ID
  1. Starten Sie den Bereitstellungsprozess.
gcloud run deploy
  1. Drücken Sie in Source code location die Eingabetaste, um das geklonte GitHub-Verzeichnis auszuwählen.
  2. Geben Sie unter Service name einen Namen für den Dienst ein, z. B. outfit-recommender, und drücken Sie die Eingabetaste.
  3. Geben Sie in 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.

12c0de4248660d4d.png

  1. Geben Sie in Allow unauthenticated invocations to [..] Y ein und drücken Sie die Eingabetaste.

Das folgende Bild zeigt den Bereitstellungsfortschritt Ihrer Anwendung:

1babbb82faa31fce.png

14. Anwendung zum Empfehlen von Outfits testen

Nachdem die Anwendung erfolgreich in Cloud Run bereitgestellt wurde, können Sie den Dienst in der Google Cloud Console so aufrufen:

  1. Rufen Sie in der Google Cloud Console Cloud Run auf.
  2. Klicken Sie unter „Services“ auf den bereitgestellten Dienst outfit recommender. Sie sollten sowohl den Dienst retail-engine als auch den Dienst outfit-recommender so sehen:

24dd0aebe224059e.png

  1. Klicken Sie auf die Anwendungs-URL, um die Benutzeroberfläche der Empfehlungs-App zu öffnen.

cdc9c1625b1648d2.png

    The following is a sample URL that you will use:

https://outfit-recommender-22905290964.us-central1.run.app/style

Die bereitgestellte Anwendung ist so zu sehen:

76245d1a6152d313.png

Anwendung verwenden

So verwenden Sie die Anwendung:

  1. Klicken Sie auf Hochladen und laden Sie ein Bild eines Kleidungsstücks hoch.
  2. Klicken Sie nach dem Hochladen des Bildes auf Stil. Die Anwendung verwendet das Bild als Prompt und generiert auf Grundlage des Prompts aus der Retail Engine-App, die Einbettungen für den Einzelhandelsdatensatz enthält, Optionen für das Unterteil.

Die App generiert Bildvorschläge zusammen mit einem Prompt auf Grundlage des Bildes mit Styling-Empfehlungen. Beispiel: A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.

  1. 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.
  2. Klicken Sie auf Anzeigen, um das endgültige Design zu sehen.

38d6d08e9a0a44c0.png

15. Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud-Konto die in diesem Beitrag verwendeten Ressourcen in Rechnung gestellt werden:

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.
  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen.
  3. 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 erfolgreich eine Ähnlichkeitssuche mit AlloyDB, pgvector und der Vektorsuche durchgeführt und das Suchergebnis mit dem leistungsstarken Imagen-Modell verwendet, um Styling-Empfehlungen zu generieren.