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

1. Übersicht

In der schnelllebigen Einzelhandelsbranche von heute ist es von entscheidender Bedeutung, einen hervorragenden Kundenservice zu bieten und gleichzeitig personalisierte Einkaufserlebnisse zu ermöglichen. Wir zeigen Ihnen, wie Sie eine wissensbasierte Chatanwendung erstellen, die Kundenfragen beantwortet, die Produktfindung unterstützt und Suchergebnisse anpasst. Diese innovative Lösung kombiniert die Leistungsfähigkeit von AlloyDB für die Datenspeicherung, eine interne Analyse-Engine für das kontextbezogene Verständnis, Gemini (Large Language Model) für die Relevanzvalidierung und den Agent Builder von Google für das schnelle Bootstrapping eines intelligenten konversationellen Assistenten.

Die Herausforderung:Kunden im Einzelhandel erwarten sofortige Antworten und Produktempfehlungen, die ihren individuellen Vorlieben entsprechen. Mit herkömmlichen Suchmethoden lässt sich dieses Maß an Personalisierung oft nicht erreichen.

Die Lösung:Unsere wissensbasierte Chatanwendung geht diese Herausforderung direkt an. Dabei wird eine umfangreiche Wissensdatenbank genutzt, die aus Ihren Einzelhandelsdaten abgeleitet wird, um die Kundenabsicht zu verstehen, intelligent zu reagieren und hochrelevante Ergebnisse zu liefern.

Aufgaben

In diesem Lab (Teil 1) werden Sie:

  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. Echtzeit-Suche nach Kosinusähnlichkeit für den Suchtext des Nutzers durchführen
  5. Lösung in serverlosen Cloud Run Functions bereitstellen

Im zweiten Teil des Labs werden die Schritte für 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:

Aufnahme:

Als Erstes 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 Abfrageeinbettung mit den Einbettungen von Produktbeschreibungen, Rezensionen und anderen relevanten Daten. Dadurch werden die 25 relevantesten „nächsten Nachbarn“ ermittelt.

Gemini-Validierung:

Diese potenziellen Antworten werden zur Bewertung an Gemini gesendet. Gemini prüft, ob sie wirklich relevant und sicher genug sind, um sie mit dem Nutzer zu teilen.

Antwortgenerierung:

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.

Dialogorientierte Interaktion:

Agent Builder präsentiert die Antworten in einem Format in natürlicher Sprache, was einen Dialog ermöglicht. Dieser Teil wird in einem Folge-Lab behandelt.

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

Bild der Schaltfläche „Cloud Shell aktivieren“

  1. Sobald die Verbindung mit der Cloud Shell hergestellt ist, können Sie mit dem folgenden Befehl prüfen, 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 in Cloud Shell aus, um zu bestätigen, dass 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 zum gcloud-Befehl können Sie in der Konsole nach den einzelnen Produkten suchen oder diesen Link verwenden.

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

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. Dabei werden Cluster verwendet, um alle Ressourcen wie Datenbanken und Logs zu speichern. Jeder Cluster hat eine primäre Instanz, die einen Zugriffspunkt auf die Daten bietet. Tabellen enthalten die tatsächlichen Daten.

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

Einen Cluster und eine Instanz erstellen

  1. Rufen Sie in der Cloud Console die AlloyDB-Seite 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 die Option CLUSTER ERSTELLEN aus:

f76ff480c8c889aa.png

  1. Sie sehen einen Bildschirm wie den unten. 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 VERBINDUNG EINRICHTEN aus.
    7939bbb6802a91bf.png
  2. Wählen Sie dort „Automatisch zugewiesenen IP-Bereich verwenden“ aus und klicken Sie auf „Weiter“. Nachdem Sie die Informationen geprüft haben, wählen Sie „VERBINDUNG ERSTELLEN“ aus. 768ff5210e79676f.png
  3. Nachdem Sie Ihr Netzwerk eingerichtet haben, können Sie mit der Clustererstellung fortfahren. Klicken Sie auf CREATE CLUSTER (Cluster erstellen), um die Einrichtung des Clusters 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 angezeigt werden, der so aussieht:

24eec29fa5cfdb3e.png

5. Datenaufnahme

Jetzt ist es an der Zeit, eine Tabelle mit den Daten zum Geschäft hinzuzufügen. 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 in AlloyDB 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 im Editor eingegeben. Sie können mehrere Editorfenster hinzufügen, indem Sie auf das Pluszeichen rechts neben dem letzten Fenster 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. 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 prüfen möchten, welche Erweiterungen in Ihrer Datenbank aktiviert wurden, führen Sie diesen 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) );

Nach erfolgreicher Ausführung des oben genannten Befehls sollte die Tabelle in der Datenbank zu sehen sein. Hier ein Beispiel-Screenshot:

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.

Kopieren Sie die 20 Zeilen/Einfügeanweisungen und fügen Sie sie in einen leeren Editor-Tab ein. Wählen Sie dann „AUSFÜHREN“ aus.

Wenn Sie den Tabelleninhalt sehen möchten, maximieren Sie den Explorer-Bereich, bis Sie die Tabelle „apparels“ sehen. Wählen Sie das Dreipunkt-Menü (⋮) aus, um die Option zum Abfragen der Tabelle aufzurufen. 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;

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.

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 pdt_desc nennen). 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 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 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 beispielsweise „am Wasser“, „direkt am Strand“, „vom Zimmer zum Meer“, „sur la mer“ oder „на берегу океана“ lauten. Diese Begriffe sehen alle unterschiedlich aus, ihre semantische Bedeutung oder, in der Terminologie des maschinellen Lernens, ihre Einbettungen sollten jedoch sehr ähnlich sein.

Nachdem die Daten und der Kontext bereit sind, führen wir den SQL-Code aus, um die Einbettungen der Produktbeschreibung in der Tabelle im Feld embedding 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 vorhandenes 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 zurückgegeben werden, der wie ein Array von Gleitkommazahlen aussieht, für den Beispieltext in der Abfrage, wie unten dargestellt:

c69c08d085389f74.png

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

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 Nutzer fragt:

„Ich möchte Damen-Tops, nur rosa, lässig und aus reiner Baumwolle.“

Mit der folgenden Abfrage können Sie Übereinstimmungen dafür 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 Anfrage genauer an:

In dieser Abfrage

  1. Der Suchtext des Nutzers lautet: „Ich möchte Damenoberteile, nur rosa, nur für Freizeit, nur aus reiner Baumwolle.“
  2. Wir wandeln sie in der Methode embedding() mit dem Modell text-embedding-004 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 sein.
  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 Vektortyp, 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.

Das Ergebnis sieht so aus:

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.

Wichtiger Hinweis:

Angenommen, wir möchten die Leistung (Abfragezeit), Effizienz und den Recall dieses Vektorsuchergebnisses mit dem ScaNN-Index verbessern. In diesem Blog finden Sie eine Anleitung, wie Sie die Ergebnisse mit und ohne Index vergleichen können. Hier sind die Schritte zum Erstellen des Index noch einmal aufgeführt:

  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. Als Nächstes erstellen wir den Index (ScaNN):

CREATE INDEX apparel_index ON apparels

USING scann (embedding cosine)

WITH (num_leaves=54);

In der obigen DDL ist „apparel_index“ der Name des Index.

„apparels“ ist meine Tabelle.

„scann“ ist die Indexmethode.

„embedding“ ist die Spalte in der Tabelle, die ich indexieren möchte.

„cosine“ ist die Distanzmethode, die ich für den Index verwenden möchte.

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

Ich habe die QUADRATWURZEL der Anzahl der Datenpunkte verwendet, wie im ScaNN-Repository empfohlen (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 indexiert.

  1. Testen Sie mit einer einfachen Suchanfrage mit und ohne Index (indem 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. Abgleich 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

Prüfen Sie zuerst, ob die Google ML-Integration bereits für Ihren Cluster und Ihre Instanz aktiviert ist. Geben Sie in AlloyDB Studio den folgenden Befehl ein:

show google_ml_integration.enable_model_support;

Wenn der Wert als on angezeigt wird, können Sie die nächsten beiden Schritte überspringen und direkt mit dem Einrichten der Integration von AlloyDB und Vertex AI-Modell fortfahren.

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

456ffdf292d3c0e0.png

  1. Rufen Sie im Bereich „Erweiterte Konfigurationsoptionen“ den Abschnitt „Flags“ auf. Achten Sie darauf, dass google_ml_integration.enable_model_support flag auf „on“ gesetzt ist, wie unten dargestellt:

6a59351fcd2a9d35.png

Wenn sie nicht auf „on“ gesetzt ist, setzen Sie sie auf „on“ und klicken Sie dann auf die Schaltfläche UPDATE INSTANCE (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.

Zuerst erstellen wir die Verbindung zum Gemini 1.5-Modell, 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 prüfen, welche Modelle für den Zugriff konfiguriert sind:

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 zu treffen. 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 Modell „gemini-1.5“ löschen und mit der oben genannten CALL-Anweisung neu erstellen. Führen Sie „grant execute on function ml_predict_row“ noch einmal aus, falls bei den anstehenden Aufrufen von „gemini-1.5“ Probleme auftreten.

Antworten bewerten

Im nächsten Abschnitt verwenden wir eine große Abfrage, um sicherzustellen, dass die Antworten der Abfrage angemessen sind. Die Abfrage kann jedoch schwer zu verstehen sein. Wir sehen uns die einzelnen Teile jetzt an und schauen uns in wenigen Minuten an, wie sie zusammenpassen.

  1. Zuerst senden wir eine Anfrage an die Datenbank, um die fünf besten Übereinstimmungen mit einer 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. Alle Daten werden in einer Tabelle mit dem Namen 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 besteht aus den fünf ähnlichsten Zeilen in Bezug auf die Nutzeranfrage. Die neue Tabelle „xyz“ enthält fünf Zeilen, wobei jede Zeile die folgenden Spalten hat:

  • literature
  • content
  • user_text
  1. Um zu ermitteln, wie gültig die Antworten sind, 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.
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 wie folgt in einer einzigen nächsten Anfrage kombinieren.

Wenn Sie die oben genannten 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 diesen Befehl 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;

Auch wenn das immer noch kompliziert aussieht, können Sie hoffentlich etwas mehr damit anfangen. 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 verwendet. Die tatsächliche Antwort wird also auf mehrere Zeilen verteilt: 14e74d71293b7b9.png

10. Anwendung ins Web bringen

Sind Sie bereit, diese App im Web zu nutzen? Führen Sie die folgenden Schritte aus, um Knowledge Engine Serverless mit Cloud Run-Funktionen zu erstellen:

  1. Rufen Sie in der Google Cloud Console „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 als Funktionsname „retail-engine“ ein und wählen Sie als Region „us-central1“ aus. Legen Sie die Authentifizierung auf „Nicht authentifizierte Aufrufe zulassen“ fest und klicken Sie auf WEITER. Wählen Sie Java 17 als Laufzeit und Inline-Editor für den Quellcode 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. dem XML.
  4. Denken Sie daran, den Platzhalter $PROJECT_ID und die AlloyDB-Verbindungsanmeldedaten in der Java-Datei durch Ihre Werte zu ersetzen. Die AlloyDB-Anmeldedaten sind die, die wir zu Beginn dieses Codelabs verwendet haben. Wenn Sie andere Werte verwendet haben, ändern Sie diese 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.

WICHTIGER SCHRITT:

Sobald Sie die Bereitstellung gestartet haben, sollten Sie die Funktionen in der Cloud Run Functions-Konsole sehen können. Suchen Sie nach der neu erstellten Funktion (retail-engine), klicken Sie darauf und dann auf BEARBEITEN. Nehmen Sie die folgenden Änderungen vor:

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

4e83ec8a339cda08.png

  1. Achten Sie darauf, dass unter den 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“, wählen Sie die Option „Neuen VPC-Connector hinzufügen“ aus und folgen Sie der Anleitung im Pop-up-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 Netzwerk-Wert auf dem Standardwert und legen Sie das Subnetz als benutzerdefinierten IP-Bereich mit dem IP-Bereich 10.8.0.0 oder einem ähnlichen verfügbaren Bereich fest.
  2. Klicken Sie auf „SHOW SCALING SETTINGS“ (Skalierungseinstellungen anzeigen) und prüfen Sie, ob die Konfiguration genau wie unten angegeben ist:

7baf980463a86a5c.png

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

11. Anwendung testen

Nachdem die aktualisierte Cloud Functions-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 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://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

Geschafft! So einfach ist es, mit dem Embeddings-Modell für AlloyDB-Daten eine Suche nach ähnlichen Vektoren durchzuführen.

Konversations-Agenten erstellen

Der Agent wird in Teil 2 dieses Labs erstellt.

12. Bereinigen

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

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.

13. Glückwunsch

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