Build a Smart Shopping Assistant with AlloyDB und Vertex AI Agent Builder – Part 1

1. Übersicht

In der heutigen schnelllebigen Einzelhandelsbranche ist es von entscheidender Bedeutung, einen hervorragenden Kundenservice zu bieten und gleichzeitig personalisierte Einkaufserlebnisse zu ermöglichen. Wir führen Sie durch die technische Erstellung einer KI-gestützten Chat-Anwendung, die Kundenfragen beantworten, die Produktsuche unterstützen und Suchergebnisse anpassen soll. Diese innovative Lösung kombiniert die Leistungsfähigkeit von AlloyDB für die Datenspeicherung, eine interne Analyse-Engine für den Kontext, Gemini (Large Language Model) für die Relevanzprüfung und den Agent Builder von Google für die schnelle Einrichtung eines intelligenten Konversationsassistenten.

Die Herausforderung: Heutige Einzelhändler erwarten sofortige Antworten und Produktvorschläge, die ihren individuellen Vorlieben entsprechen. Traditionelle Suchmethoden bieten diese Personalisierungsebene oft nicht.

Die Lösung: Unsere KI-gestützte Chat-Anwendung löst diese Herausforderung. Sie nutzt eine umfangreiche Wissensdatenbank, die aus Ihren Einzelhandelsdaten abgeleitet wurde, um die Absicht der Kunden zu verstehen, intelligent darauf zu reagieren und hoch relevante Ergebnisse zu liefern.

Aufgaben

In diesem Lab (Teil 1) lernen Sie Folgendes:

  1. AlloyDB-Instanz erstellen und E-Commerce-Dataset laden
  2. pgvector- und generative AI-Modellerweiterungen in AlloyDB aktivieren
  3. Einbettungen aus der Produktbeschreibung generieren
  4. Kosinus-Ähnlichkeitssuche in Echtzeit für den Suchtext von Nutzern durchführen
  5. Lösung in serverlosen Cloud Run-Funktionen bereitstellen

Im zweiten Teil des Labs werden die Schritte in Agent Builder behandelt.

Voraussetzungen

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

2. Architektur

Datenfluss: Sehen wir uns genauer an, wie Daten durch unser System fließen:

Datenaufnahme:

Als Erstes werden die Einzelhandelsdaten (Inventar, Produktbeschreibungen, Kundeninteraktionen) in AlloyDB aufgenommen.

Analytics-Engine:

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

  1. Kontextextraktion: Die Engine analysiert die in AlloyDB gespeicherten Daten, um Beziehungen zwischen Produkten, Kategorien, Kundenverhalten usw. zu ermitteln.
  2. Erstellung 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.
  3. 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-Validierung:

Diese potenziellen Antworten werden zur Bewertung an Gemini gesendet. Gemini prüft, ob sie wirklich relevant und sicher für die Freigabe an den Nutzer sind.

Antwortgenerierung:

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.

Konversationelle Interaktion:

Agent Builder präsentiert die Antworten in natürlicher Sprache, um einen Dialog zwischen Nutzer und Bot zu ermöglichen. Dieser Teil wird in einem Folge-Lab behandelt.

3. Hinweis

Projekt erstellen

  1. Wählen Sie in der Google Cloud Console auf der Seite der 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 bq bereits vorinstalliert hat. Klicken Sie oben in der Google Cloud Console auf „Cloud Shell aktivieren“.

Bild der Schaltfläche „Cloud Shell aktivieren“

  1. Nachdem Sie eine Verbindung zu Cloud Shell hergestellt haben, prüfen Sie mit dem folgenden Befehl, ob Sie bereits authentifiziert sind und das Projekt auf Ihre Projekt-ID festgelegt ist:
gcloud auth list
  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt.
gcloud config list project
  1. Wenn Ihr Projekt nicht festgelegt ist, verwenden Sie den folgenden Befehl, um es festzulegen:
gcloud config set project <YOUR_PROJECT_ID>
  1. Aktivieren Sie die erforderlichen APIs.
gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudfunctions.googleapis.com \
                       aiplatform.googleapis.com

Alternativ können Sie in der Console nach den einzelnen Produkten suchen oder diesen Link verwenden.

Wenn eine API fehlt, können Sie sie jederzeit während der Implementierung aktivieren.

Weitere Informationen zu gcloud-Befehlen und deren Verwendung finden Sie in der Dokumentation.

4. Datenbank einrichten

In diesem Lab verwenden wir AlloyDB als Datenbank für die Einzelhandelsdaten. Alle Ressourcen wie Datenbanken und Protokolle werden in Clustern gespeichert. Jeder Cluster hat eine primäre Instanz, die einen Zugriffspunkt auf die Daten bietet. Die tatsächlichen Daten werden in Tabellen gespeichert.

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

Cluster und Instanz erstellen

  1. Rufen Sie in der Cloud Console die Seite „AlloyDB“ auf. Die meisten Seiten in der Cloud Console lassen sich ganz einfach über die Suchleiste der Console finden.
  2. Wählen Sie auf dieser Seite CLUSTER ERSTELLEN aus:

f76ff480c8c889aa.png

  1. Daraufhin wird ein Bildschirm wie der unten gezeigte angezeigt. 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 das Standardnetzwerk auswählen, wird ein Bildschirm wie der unten angezeigt. Wählen Sie VERKNÜPFUNG EINSTELLEN aus.
    7939bbb6802a91bf.png
  2. Wählen Sie dort „Automatisch zugewiesenen IP-Bereich verwenden“ aus und klicken Sie auf „Weiter“. Nachdem Sie sich die Informationen angesehen haben, wählen Sie VERBINDUNG ERSTELLEN aus. 768ff5210e79676f.png
  3. Sobald Ihr Netzwerk eingerichtet ist, können Sie mit dem Erstellen des Clusters fortfahren. Klicken Sie auf „CLUSTER ERSTEMMEN“, um die Clustereinrichtung abzuschließen (siehe unten):

e06623e55195e16e.png

Ändern Sie die Instanz-ID in „shopping-instance"“.

Die Clustererstellung dauert etwa 10 Minuten. Wenn der Vorgang erfolgreich war, sollte ein Bildschirm ähnlich diesem angezeigt werden:

24eec29fa5cfdb3e.png

5. Datenaufnahme

Jetzt fügen Sie eine Tabelle mit den Daten zum Geschäft hinzu. Rufen Sie AlloyDB auf, wählen Sie den primären Cluster und dann AlloyDB Studio aus:

847e35f1bf8a8bd8.png

Möglicherweise müssen Sie warten, bis die Instanz erstellt wurde. Melden Sie sich dann mit den Anmeldedaten an, die Sie beim Erstellen des Clusters erstellt haben. Verwenden Sie die folgenden Daten für die Authentifizierung bei PostgreSQL:

  • Nutzername: „postgres
  • Datenbank: „postgres
  • Passwort: „alloydb

Nachdem Sie sich erfolgreich in AlloyDB Studio authentifiziert haben, werden SQL-Befehle in den Editor eingegeben. Über das Pluszeichen rechts neben dem letzten Fenster können Sie weitere Editorfenster hinzufügen.

91a86d9469d499c4.png

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 die Erstellung dieser App verwenden wir die Erweiterungen pgvector und google_ml_integration. Mit der pgvector-Erweiterung können Sie Vektoreinbettungen speichern und darin suchen. 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;

Wenn Sie die in Ihrer Datenbank aktivierten Erweiterungen prüfen möchten, führen Sie den folgenden SQL-Befehl aus:

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 erfolgreich ausgeführt wurde, sollte die Tabelle in der Datenbank angezeigt werden. Unten sehen Sie einen Beispiel-Screenshot:

908e33bbff58a6d.png

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 von dort, fügen Sie sie in einen leeren Editortab ein und wählen Sie „AUSFÜHREN“ aus.

Maximieren Sie den Bereich „Explorer“, bis Sie die Tabelle „apparels“ sehen, um den Tabelleninhalt aufzurufen. Klicken Sie auf das Dreipunkt-Menü ⋮, um die Option „Tabelle abfragen“ zu sehen. Eine SELECT-Anweisung wird in einem neuen Editor-Tab geöffnet.

b31ece70e670ab89.png

Berechtigung gewähren

Führen Sie 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

Rufen Sie das Cloud Shell-Terminal auf und geben Sie den folgenden Befehl ein:

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

Kehren Sie zur Seite „AlloyDB-Instanz“ zurück.

Zum Erstellen eines Symbols benötigen wir ein context, also alle Informationen, die wir in ein einzelnes Feld aufnehmen möchten. Dazu erstellen wir eine Produktbeschreibung (pdt_desc). 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 die folgende Anweisung in AlloyDB Studio Ihrer neu erstellten Instanz aus. Dadurch wird das Feld „pdt_desc“ mit Kontextdaten aktualisiert:

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 erstellt, die die Informationen aus allen in der Tabelle verfügbaren Feldern und anderen Abhängigkeiten (falls vorhanden) enthält. 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 Formulierung, Sprache usw. darstellen sollen.

Beschreiben Sie einen Ort am Meer. Die Bezeichnung kann „am Wasser“, „Strand“, „Fußweg vom Zimmer zum Meer“, „sur la mer“ oder „на берегу океана“ lauten. Diese Begriffe sehen alle unterschiedlich aus, aber ihre semantische Bedeutung oder in der Terminologie des Machine Learning 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 Produktbeschreibung hinzuzufügen. Es gibt verschiedene Einbettungsmodelle, die Sie verwenden können. Wir verwenden text-embedding-004 von Vertex AI. Achten Sie darauf, im gesamten Projekt dasselbe Einbettungsmodell zu verwenden.

Hinweis: Wenn Sie ein Google Cloud-Projekt verwenden, das vor einiger Zeit erstellt wurde, müssen Sie möglicherweise weiterhin ältere Versionen des Text-Embedding-Modells wie „textembedding-gecko“ verwenden.

UPDATE
 apparels
SET
 embedding = embedding( 'text-embedding-004',
   pdt_desc)
WHERE
 TRUE;

Sehen Sie sich noch einmal die Tabelle apparels an, um einige Einbettungen zu sehen. Führen Sie die SELECT-Anweisung noch einmal aus, um die Änderungen zu sehen.

SELECT
 id,
 category,
 sub_category,
 content,
 embedding
FROM
 apparels;

Dadurch sollte der Einbettungsvektor, der wie ein Array von Gleitkommazahlen aussieht, für den Beispieltext in der Abfrage zurückgegeben werden, wie unten dargestellt:

c69c08d085389f74.png

Hinweis:Bei neu erstellten Google Cloud-Projekten im Rahmen des kostenlosen Tarifs kann es zu Kontingentproblemen bei der Anzahl der zulässigen Einbettungsanfragen pro Sekunde an die Einbettungsmodelle kommen. Wir empfehlen, eine Filterabfrage für die ID zu verwenden und dann beim Generieren des Embeds selektiv 1–5 Einträge auszuwählen.

8. Vektorsuche ausführen

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

Angenommen, der Nutzer stellt folgende Frage:

„Ich möchte rosafarbene Damentops, nur aus reiner Baumwolle.“

Mit der folgenden Abfrage können Sie entsprechende Übereinstimmungen finden:

SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
  'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;

Sehen wir uns diese Abfrage genauer an:

In dieser Abfrage

  1. Der Suchtext des Nutzers lautet: „Ich suche Damenoberteile, rosa, lässig, nur reine Baumwolle.“
  2. Wir konvertieren sie in der Methode embedding() mit dem Modell text-embedding-004 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.
  3. <=>“ steht für die Verwendung der Distanzmethode KOSINISCHE ÄHNLICHKEIT. Alle verfügbaren Ähnlichkeitsmaße finden Sie in der Dokumentation von pgvector.
  4. Wir konvertieren das Ergebnis der Einbettungsmethode in den Vektortyp, damit es mit den in der Datenbank gespeicherten Vektoren kompatibel ist.
  5. Mit LIMIT 5 wird angegeben, dass wir 5 nächste Nachbarn für den Suchtext extrahieren möchten.

Das Ergebnis sieht so aus:

4193a68737400535.png

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.

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 zuerst, ob die Google ML-Integration für Ihren Cluster und Ihre Instanz bereits aktiviert ist. Geben Sie in AlloyDB Studio den folgenden Befehl ein:

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 der AlloyDB- und Vertex AI-Modellintegration fortfahren.

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

456ffdf292d3c0e0.png

  1. Gehen Sie in den erweiterten Konfigurationsoptionen zum Abschnitt „Flags“. und prüfen Sie, ob google_ml_integration.enable_model_support flag auf on gesetzt ist, wie unten dargestellt:

6a59351fcd2a9d35.png

Wenn die Option nicht aktiviert ist, klicken Sie auf „An“ und dann auf die Schaltfläche INSTANZ AKTUALISIEREN. Dieser Schritt dauert einige Minuten.

Integration 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 Gemini-Modellzugriff über AlloyDB einzurichten. Geben Sie dabei an der entsprechenden Stelle Ihre Projekt-ID ein. Möglicherweise werden Sie vor der Ausführung des Befehls auf einen Syntaxfehler hingewiesen. Er sollte aber trotzdem ausgeführt werden.

Zuerst erstellen wir die Gemini 1.5-Modellverbindung, wie unten dargestellt. Ersetzen Sie im folgenden Befehl $PROJECT_ID durch Ihre Google Cloud-Projekt-ID.

CALL
 google_ml.create_model( model_id => 'gemini-1.5',
   model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
   model_provider => 'google',
   model_auth_type => 'alloydb_service_agent_iam');

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;        

Schließlich müssen wir Datenbanknutzern die Berechtigung erteilen, die Funktion ml_predict_row auszuführen, um Vorhersagen über Google Vertex AI-Modelle auszuführen. Führen Sie dazu diesen Befehl aus:

GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;

Hinweis: Wenn Sie ein vorhandenes Google Cloud-Projekt und einen vorhandenen Cluster/eine vorhandene Instanz von AlloyDB verwenden, die vor einiger Zeit erstellt wurden, müssen Sie möglicherweise die alten Verweise auf das gemini-1.5-Modell löschen und mit der obigen CALL-Anweisung neu erstellen. Führen Sie dann noch einmal „grant execute on function ml_predict_row“ aus, falls bei den nächsten Aufrufen von gemini-1.5 Probleme auftreten.

Antworten auswerten

Im nächsten Abschnitt verwenden wir zwar eine große Abfrage, um sicherzustellen, dass die Antworten auf die Abfrage angemessen sind, aber die Abfrage kann schwer verständlich sein. Wir sehen uns jetzt die einzelnen Teile an und wie sie in wenigen Minuten zusammengesetzt werden.

  1. Zuerst senden wir eine Anfrage an die Datenbank, um die fünf besten Übereinstimmungen mit einer 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. Das wird alles in einer Tabelle namens xyz gespeichert (nur 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-004',
   'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
 5;

Die Ausgabe dieser Abfrage sind die fünf Zeilen, die der Nutzerabfrage am ähnlichsten sind. Die neue Tabelle „xyz“ enthält fünf Zeilen mit den folgenden Spalten:

  • literature
  • content
  • user_text
  1. 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 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. Mit dieser Abfrage prüfen wir dann die Güte der Antworten in der Tabelle xyz.
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 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.
  2. Um das LLM-Feld zu erhalten, müssen Sie es einfach aus der Tabelle „x“ extrahieren:
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. Das kann so in eine einzelne nächste Abfrage kombiniert werden:

Wenn Sie die obigen Abfragen ausgeführt haben, um die Zwischenergebnisse zu prüfen, müssen Sie 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-004',
             'I want womens tops, pink casual only pure cotton.')::vector
         LIMIT
           5 ) AS xyz ) AS X;

Das mag zwar immer noch einschüchternd wirken, aber hoffentlich können Sie es jetzt etwas besser nachvollziehen. Die Ergebnisse geben an, ob eine Übereinstimmung vorliegt, wie hoch der Prozentsatz der Übereinstimmung ist und wie die Altersfreigabe begründet wird.

Beachten Sie, dass das Streaming für das Gemini-Modell standardmäßig aktiviert ist. Daher ist die tatsächliche Antwort auf mehrere Zeilen verteilt: 14e74d71293b7b9.png

10. Anwendung im Web bereitstellen

Sind Sie bereit, diese App im Web zu veröffentlichen? Führen Sie die folgenden Schritte aus, um diese Knowledge Engine mit Cloud Run-Funktionen serverlos zu machen:

  1. Rufen Sie in der Google Cloud Console die Seite „Cloud Run-Funktionen“ auf, um eine neue Cloud Run-Funktion zu ERSTELLEN, oder verwenden Sie den Link https://console.cloud.google.com/functions/add.
  2. Wählen Sie als Umgebung Cloud Run-Funktion aus. Geben Sie den Funktionsnamen „retail-engine“ ein und wählen Sie „us-central1“ als Region aus. Wählen Sie für die Authentifizierung die Option „Nicht authentifizierte Aufrufe zulassen“ aus und klicken Sie auf WEITER. Wählen Sie als Laufzeit Java 17 und als Quellcode Inline-Editor aus.
  3. Standardmäßig wird der Einstiegspunkt auf „gcfv2.HelloHttpFunction“ festgelegt. Ersetzen Sie den Platzhaltercode in HelloHttpFunction.java und pom.xml Ihrer Cloud Run-Funktion durch den Code aus der Java-Datei bzw. der XML.
  4. Denken Sie daran, den Platzhalter $PROJECT_ID und die AlloyDB-Anmeldedaten in der Java-Datei durch Ihre Werte zu ersetzen. Die AlloyDB-Anmeldedaten sind dieselben, die wir zu Beginn dieses Codelabs verwendet haben. Wenn Sie andere Werte verwendet haben, ändern Sie diese bitte in der Java-Datei.
  5. Klicken Sie auf Bereitstellen.

Nach der Bereitstellung erstellen wir den VPC-Connector, damit die Cloud-Funktion auf unsere AlloyDB-Datenbankinstanz zugreifen kann.

WICHTIG:

Sobald Sie mit der Bereitstellung begonnen haben, sollten Sie die Funktionen in der Cloud Run Functions Console sehen können. Suchen Sie nach der neu erstellten Funktion (retail-engine), klicken Sie darauf und dann auf BEARBEITEN. Ändern Sie Folgendes:

  1. Rufen Sie „Laufzeit, Build, Verbindungen und Sicherheitseinstellungen“ auf.
  2. Zeitlimit auf 180 Sekunden erhöhen
  3. Rufen Sie den Tab „VERBINDUNGEN“ auf:

4e83ec8a339cda08.png

  1. Achten Sie darauf, dass unter „Ingress-Einstellungen“ die Option „Gesamten Traffic zulassen“ ausgewählt ist.
  2. Klicken Sie unter „Einstellungen für ausgehenden Traffic“ auf das Drop-down-Menü „Netzwerk“ und wählen Sie die Option „Neuen VPC-Connector hinzufügen“ aus. Folgen Sie dann der Anleitung im angezeigten Dialogfeld:

8126ec78c343f199.png

  1. Geben Sie einen Namen für den VPC-Connector an und achten Sie darauf, dass die Region mit der Ihrer Instanz übereinstimmt. Lassen Sie den Wert für „Netzwerk“ als Standard bei und legen Sie „Subnetz“ als benutzerdefinierten IP-Bereich mit dem IP-Bereich 10.8.0.0 oder einem ähnlichen verfügbaren Bereich fest.
  2. Maximieren Sie die Konfiguration „ANZEIGEN-SKALIERUNGS-EINSTELLUNGEN“ und prüfen Sie, ob die folgenden Einstellungen festgelegt sind:

7baf980463a86a5c.png

  1. Klicken Sie auf „ERSTELLEN“. Dieser Connector sollte jetzt in den Einstellungen für ausgehenden Traffic aufgeführt sein.
  2. Wählen Sie den neu erstellten Connector aus.
  3. Legen Sie fest, dass der gesamte Traffic über diesen VPC-Connector weitergeleitet werden soll.
  4. Klicken Sie auf WEITER und dann auf Bereitstellen.

11. Anwendung testen

Sobald die aktualisierte Cloud-Funktion bereitgestellt wurde, sollte der Endpunkt im folgenden Format angezeigt werden:

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine

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://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
  -H 'Content-Type: application/json' \
  -d '{"search":"I want some kids clothes themed on Disney"}' \
  | jq .

Das Ergebnis:

88bc1ddfb5644a28.png

Fertig! So einfach ist es, mit dem Embeddings-Modell eine Ähnlichkeitsvektorsuche in AlloyDB-Daten durchzuführen.

Konversationsagent erstellen

Der Agent wird in Teil 2 dieses Labs erstellt.

12. Bereinigen

Wenn Sie Teil 2 dieses Labs abschließen möchten, überspringen Sie diesen Schritt, da das aktuelle Projekt dadurch gelöscht wird.

Mit den folgenden Schritten vermeiden Sie, dass Ihrem Google Cloud-Konto die in diesem Beitrag verwendeten Ressourcen in Rechnung gestellt werden:

  1. Rufen Sie in der Google Cloud Console die Seite Ressourcen verwalten auf.
  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.

13. Glückwunsch

Glückwunsch! Sie haben eine Ähnlichkeitssuche mit AlloyDB, pgvector und der Vektorsuche durchgeführt. Durch die Kombination der Funktionen von AlloyDB, Vertex AI und Vektorsuche haben wir einen großen Schritt nach vorn gemacht, um kontextbezogene und Vektorsuchen zugänglich, effizient und wirklich aussagekräftig zu machen. Im nächsten Teil dieses Labs werden die Schritte zum Erstellen von Kundenservicemitarbeitern behandelt.