Dynamische hybride Einzelhandelssuche mit AlloyDB, Gemini und Cloud Run erstellen und bereitstellen

1. Übersicht

Im heutigen wettbewerbsorientierten Einzelhandel ist es von entscheidender Bedeutung, dass Kunden schnell und intuitiv genau das finden, wonach sie suchen. Die herkömmliche Suche mit Suchbegriffen stößt oft an ihre Grenzen, da sie mit differenzierten Anfragen und umfangreichen Produktkatalogen nicht zurechtkommt. In diesem Codelab wird eine ausgefeilte Retail Search-Anwendung vorgestellt, die auf AlloyDB und AlloyDB AI basiert und modernste Vektorsuche, scaNN-Indexierung, Facettenfilter und intelligentes adaptives Filtern und Neusortieren nutzt, um eine dynamische, hybride Suche auf Unternehmensniveau zu ermöglichen.

Wir haben jetzt bereits ein grundlegendes Verständnis von drei Dingen:

  1. Was die kontextbezogene Suche für Ihren Agenten bedeutet und wie Sie sie mithilfe der Vektorsuche umsetzen können.
  2. Wir haben uns auch intensiv mit der Vektorsuche im Rahmen Ihrer Daten beschäftigt, also in Ihrer Datenbank selbst. Alle Google Cloud-Datenbanken unterstützen das, falls Sie es noch nicht wussten.
  3. Wir sind einen Schritt weiter gegangen als der Rest der Welt und haben Ihnen gezeigt, wie Sie eine solche schlanke RAG-Funktion für die Vektorsuche mit hoher Leistung und Qualität mit der AlloyDB-Vektorsuche auf Basis des ScaNN-Index erreichen können.

Wenn Sie diese grundlegenden, fortgeschrittenen und etwas komplexeren RAG-Tests noch nicht durchgeführt haben, empfehlen wir Ihnen, die entsprechenden Artikel hier, hier und hier in der angegebenen Reihenfolge zu lesen.

Die Herausforderung

Über Filter, Keywords und kontextbezogene Übereinstimmung hinaus: Eine einfache Keyword-Suche kann Tausende von Ergebnissen liefern, von denen viele irrelevant sind. Die ideale Lösung muss die Intention hinter der Anfrage verstehen, sie mit präzisen Filterkriterien (z. B. Marke, Material oder Preis) kombinieren und die relevantesten Artikel in Millisekunden präsentieren. Dafür ist eine leistungsstarke, flexible und skalierbare Suchinfrastruktur erforderlich. Wir haben uns von der Keyword-Suche über kontextbezogene Übereinstimmungen bis hin zur Ähnlichkeitssuche entwickelt. Stellen Sie sich aber vor, ein Kunde sucht nach „einer bequemen, stilvollen, wasserdichten Jacke zum Wandern im Frühling“ und wendet gleichzeitig Filter an. Ihre Anwendung liefert nicht nur hochwertige Antworten, sondern ist auch leistungsstark und die Reihenfolge all dessen wird dynamisch von Ihrer Datenbank ausgewählt.

Ziel

Um dieses Problem zu beheben,

  • Kontextbezogene Suche (Vektorsuche): Semantische Bedeutung von Anfragen und Produktbeschreibungen verstehen
  • Facettenfilter: Nutzer können Ergebnisse mit bestimmten Attributen eingrenzen.
  • Hybridansatz: Kontextbezogene Suche und strukturierte Filterung nahtlos kombinieren
  • Erweiterte Optimierung: Nutzung von spezialisierter Indexierung, adaptiver Filterung und Neuberechnung des Rangs für Geschwindigkeit und Relevanz
  • Generative KI-basierte Qualitätskontrolle: LLM-Validierung für eine höhere Ergebnisqualität.

Sehen wir uns die Architektur und die Implementierung an.

Aufgaben

Eine Retail Search-Anwendung

Dabei gehen Sie so vor:

  1. AlloyDB-Instanz und -Tabelle für E-Commerce-Dataset erstellen
  2. Einbettungen und Vektorsuche einrichten
  3. Metadatenindex und ScaNN-Index erstellen
  4. Erweiterte Vektorsuche in AlloyDB mit der Inline-Filterungsmethode von ScaNN implementieren
  5. Facettenfilter und Hybridsuche in einer einzigen Anfrage einrichten
  6. Relevanz von Anfragen mit Reranking und Recall optimieren (optional)
  7. Antwort auf Anfrage mit Gemini bewerten (optional)
  8. MCP Toolbox for Databases und Anwendungsebene
  9. Anwendungsentwicklung (Java) mit Faceted Search

Voraussetzungen

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

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

Google Cloud-Guthaben: Wenn Sie Google Cloud-Guthaben für den Einstieg erhalten möchten, verwenden Sie diesen Link, um Guthaben einzulösen. Hier findest du eine Anleitung zum Einlösen.

  1. Sie verwenden Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird. 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, 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 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: Folgen Sie dem Link und aktivieren Sie die APIs.

Alternativ können Sie dazu den gcloud-Befehl verwenden. Informationen zu gcloud-Befehlen und deren Verwendung finden Sie in der Dokumentation.

3. Datenbank einrichten

In diesem Lab verwenden wir AlloyDB als Datenbank für die E-Commerce-Daten. Darin 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.

Cluster und 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 CLUSTER ERSTELLEN aus:

f76ff480c8c889aa.png

  1. Sie sehen einen Bildschirm wie den unten. Erstellen Sie einen Cluster und eine Instanz mit den folgenden Werten. Achten Sie darauf, dass die Werte übereinstimmen, wenn Sie den Anwendungscode aus dem Repository klonen:
  • Cluster-ID: „vector-cluster
  • password: "alloydb"
  • PostgreSQL 15 / neueste empfohlene Version
  • 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

  1. 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
  2. Nachdem Sie Ihr Netzwerk eingerichtet haben, können Sie mit der Clustererstellung fortfahren. Klicken Sie auf CLUSTER ERSTELLEN, um die Einrichtung des Clusters abzuschließen (siehe unten):

e06623e55195e16e.png

WICHTIGER HINWEIS:

  1. Achten Sie darauf, die Instanz-ID zu ändern (die Sie bei der Konfiguration des Clusters / der Instanz finden) in**vector-instance**. Wenn Sie sie nicht ändern können, denken Sie daran, **Ihre Instanz-ID** in allen nachfolgenden Referenzen zu verwenden.
  2. Die Clustererstellung dauert etwa 10 Minuten. Wenn die Einrichtung erfolgreich war, wird ein Bildschirm mit der Übersicht des gerade erstellten Clusters angezeigt.

4. 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 bei Bedarf die Optionen „Ausführen“, „Formatieren“ und „Löschen“.

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 für Ihre Datenbank aktiviert wurden, führen Sie diesen SQL-Befehl aus:

select extname, extversion from pg_extension;

Tabelle erstellen

Sie können eine Tabelle mit der folgenden DDL-Anweisung in AlloyDB Studio erstellen:

CREATE TABLE apparels ( 
  id BIGINT, 
  category VARCHAR(100), 
  sub_category VARCHAR(50), 
  uri VARCHAR(200), 
  gsutil_uri VARCHAR(200),
  image VARCHAR(100), 
  content VARCHAR(2000), 
  pdt_desc VARCHAR(5000), 
  color VARCHAR(2000),
  gender VARCHAR(200),
  embedding vector(768),
  img_embeddings vector(1408),
  additional_specification VARCHAR(100000));

In der Einbettungsspalte können die Vektorwerte des Texts gespeichert werden.

Berechtigung gewähren

Führen Sie die folgende Anweisung aus, um die Ausführung der Funktion „embedding“ zu gewähren:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

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

Gewähren Sie in der Google Cloud IAM-Konsole dem AlloyDB-Dienstkonto (das so aussieht: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) Zugriff auf die Rolle „Vertex AI-Nutzer“. PROJECT_NUMBER enthält Ihre Projektnummer.

Alternativ können Sie den folgenden Befehl im Cloud Shell-Terminal ausführen:

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"

Daten in die Datenbank laden

  1. Kopieren Sie die insert-Abfrageanweisungen aus der insert scripts sql im Tabellenblatt in den Editor. Sie können 10 bis 50 INSERT-Anweisungen kopieren, um diesen Anwendungsfall schnell zu demonstrieren. Auf dem Tab Ausgewählte Einfügungen (25–30 Zeilen) finden Sie eine ausgewählte Liste mit Einfügungen.

Links zu den Daten finden Sie in dieser Datei im GitHub-Repository.

  1. Klicken Sie auf Ausführen. Die Ergebnisse Ihrer Abfrage werden in der Tabelle Ergebnisse angezeigt.

WICHTIGER HINWEIS:

Kopieren Sie nur 25 bis 50 Datensätze zum Einfügen und achten Sie darauf, dass sie aus einem Bereich von Kategorie-, Unterkategorie-, Farb- und Geschlechtstypen stammen.

5. Einbettungen für die Daten erstellen

Die eigentliche Innovation bei der modernen Suche liegt darin, die Bedeutung zu verstehen, nicht nur die Keywords. Hier kommen Einbettungen und die Vektorsuche ins Spiel.

Wir haben Produktbeschreibungen und Nutzeranfragen mithilfe vortrainierter Sprachmodelle in hochdimensionale numerische Darstellungen, sogenannte „Embeddings“, umgewandelt. Diese Einbettungen erfassen die semantische Bedeutung, sodass wir Produkte finden können, die „ähnlich in der Bedeutung“ sind, anstatt nur Produkte mit übereinstimmenden Wörtern. Zuerst haben wir mit der direkten Suche nach Vektorähnlichkeiten für diese Einbettungen experimentiert, um eine Baseline zu erstellen. So konnten wir die Leistungsfähigkeit des semantischen Verständnisses schon vor Leistungsoptimierungen demonstrieren.

In der Einbettungsspalte können die Vektorwerte des Produktbeschreibungstexts gespeichert werden. In der Spalte „img_embeddings“ können Bildeinbettungen (multimodal) gespeichert werden. So können Sie auch die Suche auf Grundlage der Distanz zwischen Text und Bild verwenden. In diesem Lab verwenden wir jedoch nur Texteinbettungen.

SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');

Dadurch sollte der Einbettungsvektor für den Beispieltext in der Anfrage zurückgegeben werden. Er sieht wie ein Array von Gleitkommazahlen aus. Sieht so aus:

25a1d7ef0e49e91e.png

Vektorfeld „abstract_embeddings“ aktualisieren

Führen Sie die folgende DML aus, um die Inhaltsbeschreibung in der Tabelle mit den entsprechenden Einbettungen zu aktualisieren:

UPDATE apparels SET embedding = embedding('text-embedding-005',pdt_desc)::vector 
WHERE pdt_desc IS NOT NULL;

Wenn Sie ein Abrechnungskonto mit Testguthaben für Google Cloud verwenden, kann es sein, dass Sie Probleme haben, mehr als einige wenige Einbettungen (maximal 20 bis 25) zu generieren. Begrenzen Sie daher die Anzahl der Zeilen im Einfügeskript.

Wenn Sie Bildeinbettungen generieren möchten (für die multimodale kontextbezogene Suche), führen Sie auch das folgende Update aus:

update apparels set img_embeddings = ai.image_embedding(
  model_id => 'multimodalembedding@001',
  image => gsutil_uri,
  mimetype => 'image/jpg')       
where gsutil_uri is not null

6. Erweitertes RAG mit den neuen Funktionen von AlloyDB ausführen

Nachdem die Tabelle, die Daten und die Einbettungen bereit sind, führen wir die Echtzeit-Vektorsuche für den Suchtext des Nutzers durch. Sie können dies testen, indem Sie die folgende Abfrage ausführen:

SELECT id, content, uri, category, sub_category,color,gender 
FROM apparels 
ORDER BY embedding <=> embedding('text-embedding-005','T-shirt with round neck')::vector limit 10 ;

In dieser Abfrage vergleichen wir die Texteinbettung der vom Nutzer eingegebenen Suche „T-Shirt mit Rundhalsausschnitt“ mit den Texteinbettungen aller Produktbeschreibungen in der Tabelle „apparels“ (in der Spalte „embedding“ gespeichert) mithilfe der Kosinus-Ähnlichkeitsdistanzfunktion (dargestellt durch das Symbol „<=>“). Wir wandeln das Ergebnis der Einbettungsmethode in den Vektortyp um, damit es mit den in der Datenbank gespeicherten Vektoren kompatibel ist. LIMIT 10 bedeutet, dass die zehn am besten passenden Ergebnisse für den Suchtext ausgewählt werden.

AlloyDB bringt Vector Search RAG auf ein neues Niveau:

Für eine Lösung auf Unternehmensniveau reicht die reine Vektorsuche nicht aus. Die Leistung ist entscheidend.

ScaNN-Index (Scalable Nearest Neighbors)

Um eine ultraschnelle Suche nach dem ungefähren nächsten Nachbarn (Approximate Nearest Neighbor, ANN) zu ermöglichen, haben wir den ScaNN-Index in AlloyDB aktiviert. ScaNN ist ein hochmoderner ANN-Algorithmus (Approximate Nearest Neighbor, geschätzter nächster Nachbar), der von Google Research entwickelt wurde und für die effiziente Suche nach Vektorähnlichkeiten in großem Maßstab konzipiert ist. Er beschleunigt Abfragen erheblich, indem er den Suchraum effizient reduziert und Quantisierungstechniken verwendet. So sind Vektorabfragen bis zu viermal schneller als bei anderen Indexierungsmethoden und der Speicherbedarf ist geringer. Weitere Informationen und weitere Informationen

Aktivieren wir die Erweiterung und erstellen wir die Indexe:

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

Indexe für Text- und Bildeinbettungsfelder erstellen (falls Sie Bildeinbettungen in Ihrer Suche verwenden möchten):

CREATE INDEX apparels_index ON apparels 
USING scann (embedding cosine)
WITH (num_leaves=32);

CREATE INDEX apparels_img_index ON apparels 
USING scann (img_embeddings cosine)
WITH (num_leaves=32);

Metadatenindexe

Während scaNN die Vektorindexierung übernimmt, wurden herkömmliche B-Baum- oder GIN-Indizes sorgfältig für strukturierte Attribute wie Kategorie, Unterkategorie, Stil und Farbe eingerichtet. Diese Indexe sind entscheidend für die Effizienz der facettierten Filterung. Führen Sie die folgenden Anweisungen aus, um Metadatenindexe einzurichten:

CREATE INDEX idx_category ON apparels (category);

CREATE INDEX idx_sub_category ON apparels (sub_category);

CREATE INDEX idx_color ON apparels (color);

CREATE INDEX idx_gender ON apparels (gender);

WICHTIGER HINWEIS:

Da Sie möglicherweise nur 25 bis 50 Datensätze eingefügt haben, sind Indexe (ScaNN oder andere Indexe) nicht effektiv.

Inline-Filterung

Eine häufige Herausforderung bei der Vektorsuche ist die Kombination mit strukturierten Filtern (z.B. „rote Schuhe“). Die Inline-Filterung von AlloyDB optimiert dies. Anstatt Ergebnisse aus einer umfassenden Vektorsuche nachzufiltern, werden beim Inline-Filtern Filterbedingungen während der Vektorsuche angewendet. Dadurch werden Leistung und Genauigkeit gefilterter Vektorsuchen erheblich verbessert.

Weitere Informationen zur Notwendigkeit der Inline-Filterung finden Sie in dieser Dokumentation. Weitere Informationen zur gefilterten Vektorsuche zur Leistungsoptimierung der Vektorsuche Wenn Sie die Inline-Filterung für Ihre Anwendung aktivieren möchten, führen Sie die folgende Anweisung in Ihrem Editor aus:

SET scann.enable_inline_filtering = on;

Inline-Filter eignen sich am besten für Fälle mit mittlerer Selektivität. Wenn AlloyDB den Vektorindex durchsucht, werden Distanzen nur für Vektoren berechnet, die den Metadatenfilterbedingungen entsprechen (Ihre funktionalen Filter in einer Abfrage, die normalerweise in der WHERE-Klausel verarbeitet werden). Dadurch wird die Leistung dieser Abfragen erheblich verbessert, was die Vorteile von Post-Filter oder Pre-Filter ergänzt.

Adaptive Filterung

Um die Leistung weiter zu optimieren, wählt das adaptive Filtern von AlloyDB während der Abfrageausführung dynamisch die effizienteste Filterstrategie (Inline- oder Vorfilterung) aus. Es analysiert Abfragemuster und Datenverteilungen, um ohne manuellen Eingriff eine optimale Leistung zu erzielen. Das ist besonders für gefilterte Vektorsuchen von Vorteil, da es automatisch zwischen der Verwendung von Vektor- und Metadatenindex wechselt. Verwenden Sie das Flag scann.enable_preview_features, um die adaptive Filterung zu aktivieren.

Wenn durch adaptives Filtern während der Ausführung ein Wechsel von Inline-Filtern zu Vorfiltern ausgelöst wird, ändert sich der Abfrageplan dynamisch.

SET scann.enable_preview_features = on;

WICHTIGER HINWEIS: Möglicherweise können Sie die oben genannte Anweisung nicht ausführen, ohne die Instanz neu zu starten. Wenn ein Fehler auftritt, aktivieren Sie das Flag „enable_preview_features“ besser im Abschnitt „Datenbank-Flags“ Ihrer Instanz.

Faceted Filters using all the Indexes (Facettenfilter mit allen Indexen)

Mit der facettierten Suche können Nutzer die Ergebnisse eingrenzen, indem sie mehrere Filter basierend auf bestimmten Attributen oder „Facetten“ (z.B. Marke, Preis, Größe, Kundenbewertung) anwenden. In unserer Anwendung werden diese Facetten nahtlos in die Vektorsuche integriert. In einer einzelnen Anfrage können jetzt natürliche Sprache (kontextbezogene Suche) mit mehreren facettierten Auswahlmöglichkeiten kombiniert werden, wobei sowohl Vektor- als auch herkömmliche Indexe dynamisch genutzt werden. So können Nutzer die Ergebnisse präzise eingrenzen.

In unserer Anwendung haben wir bereits alle Metadatenindexe erstellt. Wir können also direkt mit SQL-Abfragen auf die Verwendung von Facettenfiltern im Web eingehen:

SELECT id, content, uri, category, sub_category,color,gender 
FROM apparels
WHERE category = ANY($1) and sub_Category = ANY($2) and color = ANY($3) and gender = ANY($4)
ORDER BY embedding <=> embedding('text-embedding-005',$5)::vector limit 10 ;

In dieser Anfrage führen wir eine hybride Suche durch, bei der sowohl

  1. Facettenfilterung in der WHERE-Klausel und
  2. Vektorsuche in der ORDER BY-Klausel mit der Kosinus-Ähnlichkeitsmethode.

$1, $2, $3 und $4 stehen für die Werte der Facettenfilter in einem Array und $5 für den Suchtext des Nutzers. Ersetzen Sie $1 bis $4 durch die gewünschten facettierten Filterwerte, wie unten dargestellt:

category = ANY([‘Apparel', ‘Footwear'])

Ersetzen Sie „$5“ durch einen Suchtext Ihrer Wahl, z. B. „Poloshirts“.

WICHTIGER HINWEIS: Wenn Sie die Indexe aufgrund der begrenzten Anzahl der eingefügten Datensätze nicht haben, sehen Sie keine Auswirkungen auf die Leistung. Bei einem vollständigen Produktionsdatensatz wird die Ausführungszeit jedoch deutlich verkürzt. Das ist möglich, weil bei der Vektorsuche mit dem ScaNN-Index mit Inline-Filterung die Vektorsuche optimiert wird.

Als Nächstes sehen wir uns den Recall für diese ScaNN-basierte Vektorsuche an.

Reranking

Auch bei der erweiterten Suche müssen die ersten Ergebnisse möglicherweise noch überarbeitet werden. Dieser wichtige Schritt ordnet die ursprünglichen Suchergebnisse neu an, um die Relevanz zu verbessern. Nachdem die erste hybride Suche eine Reihe von infrage kommenden Produkten geliefert hat, wird ein anspruchsvolleres (und oft rechenintensiveres) Modell angewendet, um einen detaillierteren Relevanzwert zu ermitteln. So wird sichergestellt, dass die obersten Ergebnisse, die dem Nutzer präsentiert werden, die relevantesten sind, was die Suchqualität erheblich verbessert. Wir bewerten den Recall fortlaufend, um zu messen, wie gut das System alle relevanten Elemente für eine bestimmte Anfrage abruft. Außerdem optimieren wir unsere Modelle, um die Wahrscheinlichkeit zu maximieren, dass ein Kunde findet, was er sucht.

Bevor Sie diese Funktion in Ihrer Anwendung verwenden, müssen Sie alle Voraussetzungen erfüllen:

Anschließend können Sie die folgende Abfrage in unserer Anwendung verwenden, um die Ergebnisse der Hybridsuche neu zu ranken:

WITH initial_ranking AS (
SELECT id,content, pdt_desc, uri, category, sub_category,color,gender,
ROW_NUMBER() OVER () AS ref_number 
FROM apparels 
    order by embedding <=>embedding('text-embedding-005', 'Pink top')::vector),
reranked_results AS (
            SELECT index, score from 
            ai.rank(
              model_id => 'semantic-ranker-default-003',
              search_string => 'Pink top',
              documents => (SELECT ARRAY_AGG(pdt_desc ORDER BY ref_number) FROM initial_ranking)
            )
)
SELECT id,content, pdt_desc, uri, category, sub_category,color,gender, score
FROM initial_ranking, reranked_results 
WHERE initial_ranking.ref_number = reranked_results.index
ORDER BY reranked_results.score DESC
limit 25;

In dieser Abfrage führen wir ein NEUORDNEN der Produktgruppe mit Kontextsuche durch, das in der ORDER BY-Klausel mit der Methode der Kosinusähnlichkeit adressiert wird. „Pinkes Top“ ist der Text, nach dem der Nutzer sucht.

WICHTIGER HINWEIS: Einige von Ihnen haben möglicherweise noch keinen Zugriff auf das Neusortieren. Daher habe ich es aus dem Anwendungscode ausgeschlossen. Wenn Sie es einfügen möchten, können Sie dem oben beschriebenen Beispiel folgen.

Recall Evaluator

Der Recall bei der Ähnlichkeitssuche ist der Prozentsatz der relevanten Instanzen, die bei einer Suche abgerufen wurden, d.h. die Anzahl der korrekt positiven Ergebnisse. Dies ist der gängigste Messwert zur Messung der Suchqualität. Eine Quelle für den Verlust der Trefferquote ist der Unterschied zwischen der Suche nach dem ungefähren nächsten Nachbarn (Approximate Nearest Neighbor, aNN) und der Suche nach dem k (exakten) nächsten Nachbarn (k-Nearest Neighbor, kNN). Vektorindexe wie ScaNN von AlloyDB implementieren ANN-Algorithmen, mit denen Sie die Vektorsuche in großen Datasets beschleunigen können. Dies geht jedoch mit einem geringen Verlust an Recall einher. Mit AlloyDB können Sie diesen Kompromiss jetzt direkt in der Datenbank für einzelne Abfragen messen und dafür sorgen, dass er im Zeitverlauf stabil bleibt. Sie können Abfrage- und Indexparameter auf Grundlage dieser Informationen aktualisieren, um bessere Ergebnisse und eine bessere Leistung zu erzielen.

Welche Logik steckt hinter dem Abrufen von Suchergebnissen?

Im Kontext der Vektorsuche bezieht sich der Recall bzw. die Trefferquote auf den Prozentsatz der Vektoren, die vom Index zurückgegeben werden und die tatsächlichen nächsten Nachbarn sind. Wenn z. B. eine Abfrage nach 20 nächsten Nachbarn 19 der „grundlegend echten“ nächsten Nachbarn zurückgibt, beträgt der Recall 19/20 × 100 = 95%. Recall ist der Messwert für die Suchqualität und wird als Prozentsatz der zurückgegebenen Ergebnisse definiert, die den Anfragevektoren objektiv am nächsten sind.

Mit der Funktion evaluate_query_recall können Sie den Recall für eine Vektoranfrage für einen Vektorindex für eine bestimmte Konfiguration ermitteln. Mit dieser Funktion können Sie Ihre Parameter so anpassen, dass Sie die gewünschten Recall-Ergebnisse für Vektorabfragen erzielen.

WICHTIGER HINWEIS:

Wenn Sie in den folgenden Schritten einen Fehler vom Typ „Permission denied“ (Berechtigung verweigert) für den HNSW-Index erhalten, überspringen Sie diesen gesamten Abschnitt zur Recall-Bewertung vorerst. Das kann mit Zugriffsbeschränkungen zusammenhängen, da es zum Zeitpunkt der Dokumentation dieses Codelabs gerade erst veröffentlicht wurde.

  1. Legen Sie das Flag „Enable Index Scan“ für den ScaNN-Index und den HNSW-Index fest:
SET scann.enable_indexscan = on
SET hnsw.enable_index_scan = on
  1. Führen Sie die folgende Abfrage in AlloyDB Studio aus:
SELECT
  *
FROM
  evaluate_query_recall($$
SELECT id,content, pdt_desc, uri, category, sub_category,color,gender
FROM 
apparels 
    order by embedding <=> embedding('text-embedding-005', 'skirts for women')::vector 
  LIMIT 25 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

Die Funktion „evaluate_query_recall“ verwendet die Abfrage als Parameter und gibt den entsprechenden Recall zurück. Ich verwende dieselbe Abfrage, mit der ich die Leistung geprüft habe, als Funktionseingabeabfrage. Ich habe SCaNN als Indexmethode hinzugefügt. Weitere Parameteroptionen finden Sie in der Dokumentation.

Der Recall für diese Vektorsuche-Anfrage, die wir verwendet haben:

4918ec4780156527.png

Ich sehe, dass der RECALL-Wert 96 % beträgt. In diesem Fall ist die Trefferquote sehr gut. Wenn es sich jedoch um einen inakzeptablen Wert handelte, können Sie diese Informationen verwenden, um die Indexparameter, Methoden und Abfrageparameter zu ändern und die Erinnerung für diese Vektorsuche zu verbessern.

Mit geänderten Abfrage- und Indexparametern testen

Jetzt testen wir die Abfrage, indem wir die Abfrageparameter auf Grundlage des erhaltenen Rückrufs ändern.

  1. So ändern Sie die Indexparameter:

Für diesen Test verwende ich die Distanzfunktion L2-Distanz anstelle von Kosinus.

Sehr wichtiger Hinweis: „Woher wissen wir, dass in dieser Anfrage die KOSINUS-Ähnlichkeit verwendet wird?“, fragen Sie sich vielleicht. Die Distanzfunktion wird durch die Verwendung von „<=>“ für die Kosinusdistanz gekennzeichnet.

Docs-Link für Distanzfunktionen der Vektorsuche

In der vorherigen Abfrage wurde die Kosinus-Ähnlichkeitsdistanzfunktion verwendet. Jetzt versuchen wir es mit der L2-Distanz. Dazu müssen wir jedoch auch dafür sorgen, dass der zugrunde liegende ScaNN-Index die L2-Distanzfunktion verwendet. Erstellen wir nun einen Index mit einer anderen Distanzfunktionsabfrage: L2-Distanz: <->

drop index apparels_index;

CREATE INDEX apparels_index ON apparels 
USING scann (embedding L2)
WITH (num_leaves=32);

Die Anweisung „DROP INDEX“ dient nur dazu, sicherzustellen, dass kein unnötiger Index für die Tabelle vorhanden ist.

Jetzt kann ich die folgende Abfrage ausführen, um den RECALL nach dem Ändern der Distanzfunktion meiner Vektorsuchfunktion zu bewerten.

[AFTER] Abfrage, die die Funktion L2 Distance verwendet:

SELECT
  *
FROM
  evaluate_query_recall($$
SELECT id,content, pdt_desc, uri, category, sub_category,color,gender
FROM 
apparels 
    order by embedding <-> embedding('text-embedding-005', 'skirts for women')::vector 
  LIMIT 25 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

Die Differenz bzw. Transformation ist am Recall-Wert für den aktualisierten Index zu erkennen.

Es gibt weitere Parameter, die Sie im Index ändern können, z. B. „num_leaves“, basierend auf dem gewünschten Recall-Wert und dem Dataset, das von Ihrer Anwendung verwendet wird.

LLM-Validierung von Vektorsuchergebnissen

Um die höchste Qualität bei der kontrollierten Suche zu erreichen, haben wir eine optionale Ebene für die LLM-Validierung eingeführt. Large Language Models können verwendet werden, um die Relevanz und Kohärenz von Suchergebnissen zu bewerten, insbesondere bei komplexen oder mehrdeutigen Anfragen. Dazu kann Folgendes gehören:

Semantische Überprüfung:

Ein LLM, das Ergebnisse mit der Abfrageabsicht abgleicht.

Logische Filterung:

Ein LLM kann komplexe Geschäftslogik oder Regeln anwenden, die sich nur schwer in herkömmlichen Filtern codieren lassen. So lässt sich die Produktliste anhand differenzierter Kriterien weiter verfeinern.

Qualitätssicherung:

Weniger relevante Ergebnisse werden automatisch identifiziert und zur manuellen Überprüfung oder zur Optimierung des Modells gekennzeichnet.

So haben wir das in AlloyDB AI-Funktionen umgesetzt:

WITH 
          apparels_temp as (
                  SELECT id,content, pdt_desc, uri, category, sub_category,color,gender 
                  FROM apparels 
                 -- where category = ANY($1) and sub_category = ANY($2) and color = ANY($3) and gender = ANY($4)
                      order by embedding <=> embedding('text-embedding-005', $5)::vector
                  limit 25
          ),
          prompt AS (
          SELECT 'You are a friendly advisor helping to filter whether a product match' || pdt_desc || 'is reasonably (not necessarily 100% but contextually in agreement) related to the customer''s request: ' || $5 || '. Respond only in YES or NO. Do not add any other text.'
          AS prompt_text, *
          from apparels_temp
          )
          ,
          response AS (
          SELECT id,content,pdt_desc,uri,
                  json_array_elements(ml_predict_row('projects/abis-345004/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
                  json_build_object('contents',
                  json_build_object('role',
                  'user',
                  'parts',
                  json_build_object('text', prompt_text)))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
          FROM 
                  prompt)
          SELECT id, content,uri,replace(replace(resp::text,'\n',''),'"','') as result
          FROM
                  response where replace(replace(resp::text,'\n',''),'"','') in ('YES', 'NO')
                  limit 10;  

Die zugrunde liegende Abfrage ist dieselbe, die wir in den Abschnitten zur facettierten Suche, zur hybriden Suche und zum Reranking gesehen haben. In dieser Abfrage haben wir nun eine Ebene der GEMINI-Bewertung des neu gerankten Ergebnissatzes eingefügt, die durch das Konstrukt „ml_predict_row“ dargestellt wird. Ich habe die Facettenfilter auskommentiert. Sie können aber gerne Elemente Ihrer Wahl in ein Array für die Platzhalter $1 bis $4 einfügen. Ersetzen Sie „$5“ durch den gewünschten Suchtext, z. B. „Pinkes Top ohne Blumenmuster“.

7. MCP Toolbox for Databases und Anwendungsebene

Im Hintergrund sorgen robuste Tools und eine gut strukturierte Anwendung für einen reibungslosen Betrieb.

Die Toolbox für Datenbanken für das MCP (Model Context Protocol) vereinfacht die Integration von generativer KI und agentischen Tools in AlloyDB. Er fungiert als Open-Source-Server, der die Verbindungspooling, die Authentifizierung und die sichere Bereitstellung von Datenbankfunktionen für KI-Agents oder andere Anwendungen optimiert.

In unserer Anwendung haben wir die MCP Toolbox for Databases als Abstraktionsebene für alle unsere intelligenten Hybrid-Suchanfragen verwendet.

Gehen Sie so vor, um Toolbox für unseren Anwendungsfall einzurichten und bereitzustellen:

Eine der von der MCP Toolbox für Datenbanken unterstützten Datenbanken ist AlloyDB. Da wir diese bereits im vorherigen Abschnitt bereitgestellt haben, können wir jetzt mit der Einrichtung der Toolbox fortfahren.

  1. Rufen Sie Ihr Cloud Shell-Terminal auf und prüfen Sie, ob Ihr Projekt ausgewählt ist und im Prompt des Terminals angezeigt wird. Führen Sie den folgenden Befehl im Cloud Shell-Terminal aus, um das Projektverzeichnis zu öffnen:
mkdir toolbox-tools

cd toolbox-tools
  1. Führen Sie den folgenden Befehl aus, um die Toolbox in Ihren neuen Ordner herunterzuladen und zu installieren:
# see releases page for other versions
export VERSION=0.7.0
curl -O https://storage.googleapis.com/genai-toolbox/v$VERSION/linux/amd64/toolbox
chmod +x toolbox
  1. Rufen Sie den Cloud Shell-Editor (für den Codebearbeitungsmodus) auf und fügen Sie im Stammordner des Projekts eine Datei mit dem Namen „tools.yaml“ hinzu.
sources:
    alloydb:
        kind: "alloydb-postgres"
        project: "<<YOUR_PROJECT_ID>>"
        region: "us-central1"
        cluster: "vector-cluster"
        instance: "vector-instance"
        database: "postgres"
        user: "postgres"
        password: "alloydb"


tools:
        <<tools go here... Refer to the github repo file>>

Ersetzen Sie das Tools.yaml-Skript durch den Code aus dieser Repo-Datei.

Informationen zu „tools.yaml“:

Quellen stellen die verschiedenen Datenquellen dar, mit denen ein Tool interagieren kann. Eine Quelle ist eine Datenquelle, mit der ein Tool interagieren kann. Sie können Quellen als Map im Abschnitt „sources“ Ihrer tools.yaml-Datei definieren. Normalerweise enthält eine Quellkonfiguration alle Informationen, die für die Verbindung mit der Datenbank und die Interaktion mit ihr erforderlich sind.

Tools definieren Aktionen, die ein Agent ausführen kann, z. B. das Lesen und Schreiben in einer Quelle. Ein Tool stellt eine Aktion dar, die Ihr Agent ausführen kann, z. B. das Ausführen einer SQL-Anweisung. Sie können Tools als Map im Abschnitt „tools“ Ihrer Datei „tools.yaml“ definieren. Normalerweise benötigt ein Tool eine Quelle, auf die es sich beziehen kann.

Weitere Informationen zum Konfigurieren von „tools.yaml“ finden Sie in dieser Dokumentation.

  1. Führen Sie den folgenden Befehl aus dem Ordner „mcp-toolbox“ aus, um den Server zu starten:
./toolbox --tools-file "tools.yaml"

Wenn Sie den Server jetzt in einem Webvorschau-Modus in der Cloud öffnen, sollte der Toolbox-Server mit Ihrem neuen Tool „get-order-data“ ausgeführt werden.

Der MCP Toolbox-Server wird standardmäßig auf Port 5000 ausgeführt. Wir verwenden Cloud Shell, um dies zu testen.

Klicken Sie in Cloud Shell auf „Webvorschau“, wie unten dargestellt:

52f1a9646b55eeb2.png

Klicken Sie auf „Port ändern“, legen Sie den Port auf 5000 fest (siehe unten) und klicken Sie auf „Ändern und Vorschau“.

71c8c4659a947acd.png

Dies sollte die folgende Ausgabe liefern:

261efdaf0019a65.png

  1. Stellen wir unsere Toolbox in Cloud Run bereit:

Zuerst können wir den MCP Toolbox-Server in Cloud Run hosten. Dadurch erhalten wir einen öffentlichen Endpunkt, den wir in jede andere Anwendung und/oder die Agent-Anwendungen einbinden können. Eine Anleitung zum Hosten in Cloud Run finden Sie hier. Wir gehen nun die wichtigsten Schritte durch.

  1. Starten Sie ein neues Cloud Shell-Terminal oder verwenden Sie ein vorhandenes. Wechseln Sie zum Projektordner, in dem sich das Toolbox-Binärprogramm und die Datei „tools.yaml“ befinden. In diesem Fall ist das „toolbox-tools“, falls Sie sich noch nicht darin befinden:
cd toolbox-tools
  1. Legen Sie die Variable PROJECT_ID auf Ihre Google Cloud-Projekt-ID fest.
export PROJECT_ID="<<YOUR_GOOGLE_CLOUD_PROJECT_ID>>"
  1. Diese Google Cloud-Dienste aktivieren
gcloud services enable run.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       iam.googleapis.com \
                       secretmanager.googleapis.com
  1. Erstellen wir ein separates Dienstkonto, das als Identität für den Toolbox-Dienst dient, den wir in Google Cloud Run bereitstellen.
gcloud iam service-accounts create toolbox-identity
  1. Wir sorgen auch dafür, dass dieses Dienstkonto die richtigen Rollen hat, d. h. auf Secret Manager zugreifen und mit AlloyDB kommunizieren kann.
gcloud projects add-iam-policy-binding $PROJECT_ID \
   --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
   --role roles/secretmanager.secretAccessor

gcloud projects add-iam-policy-binding $PROJECT_ID \
   --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
   --role roles/alloydb.client

gcloud projects add-iam-policy-binding $PROJECT_ID \
   --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
   --role roles/serviceusage.serviceUsageConsumer
  1. Wir laden die Datei „tools.yaml“ als Secret hoch:
gcloud secrets create tools --data-file=tools.yaml

Wenn Sie bereits ein Secret haben und die Secret-Version aktualisieren möchten, führen Sie Folgendes aus:

gcloud secrets versions add tools --data-file=tools.yaml
  1. Legen Sie eine Umgebungsvariable für das Container-Image fest, das Sie für Cloud Run verwenden möchten:
export IMAGE=us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:latest
  1. Der letzte Schritt im bekannten Bereitstellungsbefehl für Cloud Run:
gcloud run deploy toolbox \
--image $IMAGE \
--service-account toolbox-identity \
--region us-central1 \
--set-secrets "/app/tools.yaml=tools:latest" \
--args="--tools-file=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
--allow-unauthenticated \
--labels dev-tutorial=codelab-alloydb-search-toolbox

Dadurch sollte der Prozess zum Bereitstellen des Toolbox-Servers mit unserer konfigurierten „tools.yaml“-Datei in Cloud Run gestartet werden. Bei erfolgreicher Bereitstellung wird eine Meldung ähnlich der folgenden angezeigt:

Deploying container to Cloud Run service [toolbox] in project [YOUR_PROJECT_ID] region [us-central1]
OK Deploying new service... Done.                                                                                                                                                                                     
  OK Creating Revision...                                                                                                                                                                                             
  OK Routing traffic...                                                                                                                                                                                               
  OK Setting IAM Policy...                                                                                                                                                                                            
Done.                                                                                                                                                                                                                 
Service [toolbox] revision [toolbox-00001-zsk] has been deployed and is serving 100 percent of traffic.
Service URL: https://toolbox-<SOME_ID>.us-central1.run.app

Sie können das neu bereitgestellte Tool jetzt in Ihrer Agent-Anwendung verwenden.

Auf die Tools im Toolbox-Server zugreifen

Sobald die Toolbox bereitgestellt ist, erstellen wir einen Python Cloud Run Functions-Shim für die Interaktion mit dem bereitgestellten Toolbox-Server. Das liegt daran, dass Toolbox derzeit kein Java SDK hat. Daher haben wir einen Python-Shim erstellt, um mit dem Server zu interagieren. Hier ist der Quellcode für diese Cloud Run-Funktion.

Sie müssen diese Cloud Run-Funktion erstellen und bereitstellen, um auf die Toolbox-Tools zugreifen zu können, die wir in den vorherigen Schritten erstellt und bereitgestellt haben:

  1. Wechseln Sie in der Google Cloud Console zur Seite „Cloud Run“.
  2. Klicken Sie auf „Funktion schreiben“.
  3. Geben Sie im Feld „Dienstname“ einen Namen ein, um Ihre Funktion zu beschreiben. Dienstnamen müssen mit einem Buchstaben beginnen und dürfen maximal 49 Zeichen enthalten, darunter Buchstaben, Zahlen oder Bindestriche. Dienstnamen dürfen nicht auf Bindestriche enden und müssen pro Region und Projekt eindeutig sein. Ein Dienstname kann später nicht mehr geändert werden und ist öffentlich sichtbar. (Enter retail-product-search-quality)
  4. Verwenden Sie in der Liste „Region“ den Standardwert oder wählen Sie die Region aus, in der Sie Ihre Funktion bereitstellen möchten. (Wählen Sie „us-central1“ aus.)
  5. Verwenden Sie in der Liste „Laufzeit“ den Standardwert oder wählen Sie eine Laufzeitversion aus. (Python 3.11 auswählen)
  6. Wählen Sie im Bereich „Authentifizierung“ die Option „Öffentlichen Zugriff zulassen“ aus.
  7. Klicken Sie auf die Schaltfläche „Erstellen“.
  8. Die Funktion wird erstellt und mit einer Vorlage für „main.py“ und „requirements.txt“ geladen.
  9. Ersetzen Sie die Dateien durch main.py und requirements.txt aus dem Repository dieses Projekts.
  10. Stellen Sie die Funktion bereit. Sie sollten dann einen Endpunkt für Ihre Cloud Run-Funktion erhalten.

Ihr Endpunkt sollte so oder ähnlich aussehen:

Cloud Run Functions-Endpunkt für den Zugriff auf die Toolbox: „https://retail-product-search-quality-<<YOUR_PROJECT_NUMBER>>.us-central1.run.app“

Damit Sie das Projekt innerhalb des Zeitrahmens (für die praxisorientierten, von Kursleitern geführten Sitzungen) leichter abschließen können, wird die Projektnummer für den Endpunkt zum Zeitpunkt der praxisorientierten Sitzung mit Ihnen geteilt.

WICHTIGER HINWEIS:

Alternativ können Sie den Datenbankteil auch direkt als Teil Ihres Anwendungscodes oder der Cloud Run-Funktion implementieren.

8. Anwendungsentwicklung (Java) mit Faceted Search

Schließlich werden alle diese leistungsstarken Backend-Komponenten durch die Anwendungsschicht zum Leben erweckt. Die in Java entwickelte Anwendung bietet die Benutzeroberfläche für die Interaktion mit dem Suchsystem. Es orchestriert die Abfragen an AlloyDB, verarbeitet die Anzeige von Facettenfiltern, verwaltet Nutzerauswahlen und präsentiert die neu gerankten, validierten Suchergebnisse nahtlos und intuitiv.

  1. Rufen Sie zuerst Ihr Cloud Shell-Terminal auf und klonen Sie das Repository:
git clone https://github.com/AbiramiSukumaran/faceted_searching_retail
  1. Rufen Sie den Cloud Shell-Editor auf. Dort sehen Sie den neu erstellten Ordner „faceted_searching_retail“.
  2. Löschen Sie die folgenden Schritte, da sie bereits in den vorherigen Abschnitten ausgeführt wurden:
  3. Löschen Sie den Ordner „Cloud_Run_Function“.
  4. Löschen Sie die Datei „db_script.sql“.
  5. Datei „tools.yaml“ löschen
  6. Navigieren Sie zum Projektordner „retail-faceted-search“. Dort sollte die Projektstruktur angezeigt werden:

1d736dfa45583f52.png

  1. In der Datei ProductRepository.java müssen Sie die Variable TOOLBOX_ENDPOINT mit dem Endpunkt Ihrer bereitgestellten Cloud Run-Funktion ändern oder den Endpunkt vom Referenten übernehmen.

Suchen Sie nach der folgenden Codezeile und ersetzen Sie sie durch Ihren Endpunkt:

public static final String TOOLBOX_ENDPOINT = "https://retail-product-search-quality-<<YOUR_PROJECT_NUMBER>>.us-central1.run.app";
  1. Achten Sie darauf, dass die Dockerfile- und pom.xml-Dateien Ihrer Projektkonfiguration entsprechen. Eine Änderung ist nur erforderlich, wenn Sie eine Version oder Konfiguration explizit geändert haben.
  2. Prüfen Sie im Cloud Shell-Terminal, ob Sie sich in Ihrem Hauptordner und im Projektordner (faceted_searching_retail / retail-faceted-search) befinden. Verwenden Sie die folgenden Befehle, um sicherzustellen, dass Sie sich im Terminal im richtigen Ordner befinden:
cd faceted_searching_retail

cd retail-faceted-search
  1. Verpacken, erstellen und testen Sie Ihre Anwendung lokal:
mvn package

mvn spring-boot:run

Sie sollten Ihre Anwendung aufrufen können, indem Sie im Cloud Shell-Terminal auf „Vorschau auf Port 8080“ klicken (siehe unten):

52f1a9646b55eeb2.png

9. In Cloud Run bereitstellen: ***WICHTIGER SCHRITT

Achten Sie im Cloud Shell-Terminal darauf, dass Sie sich in Ihrem Hauptordner und im Projektordner befinden (faceted_searching_retail / retail-faceted-search). Verwenden Sie die folgenden Befehle, um sicherzustellen, dass Sie sich im Terminal im richtigen Ordner befinden:

cd faceted_searching_retail

cd retail-faceted-search

Wenn Sie sich sicher sind, dass Sie sich im Projektordner befinden, führen Sie den folgenden Befehl aus:

gcloud run deploy retail-search --source . \
--region us-central1 \
--allow-unauthenticated \
--labels dev-tutorial=codelab-alloydb-hybrid-search

Nach der Bereitstellung sollten Sie einen bereitgestellten Cloud Run-Endpunkt erhalten, der so aussieht:

https://retail-search-**********-uc.a.run.app/

10. Demo

So sieht das Ganze in der Praxis aus:

80b59305a9a7b068.png

Das Bild oben zeigt die Landingpage für die dynamische Hybrid-Such-App.

264bc437cd5c3ae9.png

Das Bild oben zeigt die Suchergebnisse für „Tan colored without lace“ (Hellbraun ohne Schnürsenkel). Die ausgewählten Facettenfilter sind: Schuhe, Sandalen.

aff5849c73fe743c.png

Das Bild oben zeigt die Suchergebnisse für „T-Shirt ohne Kragen“. Faceted Filters: Apparel

Sie können jetzt mehr generative und agentische Funktionen einbinden, um diese Anwendung nutzbar zu machen.

Probier es aus und lass dich inspirieren, selbst etwas zu bauen.

11. 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 Ressourcenmanager.
  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.
  4. Alternativ können Sie einfach den AlloyDB-Cluster löschen, den wir gerade für dieses Projekt erstellt haben. Klicken Sie dazu auf die Schaltfläche „CLUSTER LÖSCHEN“. Wenn Sie bei der Konfiguration nicht „us-central1“ für den Cluster ausgewählt haben, ändern Sie den Speicherort in diesem Hyperlink.

12. Glückwunsch

Glückwunsch! Sie haben erfolgreich eine HYBRID SEARCH APP mit ALLOYDB in CLOUD RUN erstellt und bereitgestellt.

Warum das für Unternehmen wichtig ist:

Diese dynamische hybride Suchanwendung, die auf AlloyDB AI basiert, bietet erhebliche Vorteile für den Einzelhandel und andere Unternehmen:

Höhere Relevanz:Durch die Kombination von kontextbezogener (Vektor-)Suche mit präziser facettierter Filterung und intelligentem Neusortieren erhalten Kunden hochrelevante Ergebnisse, was zu einer höheren Zufriedenheit und mehr Conversions führt.

Skalierbarkeit:Die Architektur von AlloyDB und die scaNN-Indexierung sind für die Verarbeitung großer Produktkataloge und hoher Anfragevolumina ausgelegt, was für wachsende E-Commerce-Unternehmen entscheidend ist.

Leistung:Schnellere Antworten auf Anfragen, auch bei komplexen hybriden Suchanfragen, sorgen für eine reibungslose Nutzererfahrung und minimieren die Abbruchraten.

Zukunftssicherheit:Durch die Integration von KI-Funktionen (Einbettungen, LLM-Validierung) ist die Anwendung für zukünftige Fortschritte bei personalisierten Empfehlungen, konversationellem Handel und intelligenter Produktsuche gerüstet.

Vereinfachte Architektur:Durch die direkte Integration der Vektorsuche in AlloyDB sind keine separaten Vektordatenbanken oder eine komplexe Synchronisierung mehr erforderlich. Das vereinfacht die Entwicklung und Wartung.

Angenommen, ein Nutzer hat eine Anfrage in natürlicher Sprache eingegeben, z. B. „Umweltfreundliche Laufschuhe für Frauen mit hoher Unterstützung des Fußgewölbes“.

9e27fc58aea9a081.png

Gleichzeitig wendet der Nutzer Facettenfilter für „Kategorie: <<>>“, „Farbe: <<>>“ und „Preis: 100–150 $“ an:

  • Das System gibt sofort eine optimierte Liste von Produkten zurück, die semantisch auf die natürliche Sprache abgestimmt sind und genau den ausgewählten Filtern entsprechen.
  • Im Hintergrund beschleunigt der ScaNN-Index die Vektorsuche, Inline- und adaptive Filterung sorgen für Leistung bei kombinierten Kriterien und durch Reranking werden die optimalen Ergebnisse oben angezeigt.
  • Die Geschwindigkeit und Genauigkeit der Ergebnisse zeigen deutlich, wie leistungsstark die Kombination dieser Technologien für eine wirklich intelligente Suche im Einzelhandel ist.

Für die Entwicklung einer Einzelhandelssuchanwendung der nächsten Generation sind innovative Methoden erforderlich. Mit AlloyDB, Vertex AI, Vector Search mit scaNN-Indexierung, dynamischer facettierter Filterung, Reranking und LLM-Validierung können wir eine beispiellose Kundenerfahrung bieten, die das Engagement steigert und den Umsatz ankurbelt. Diese robuste, skalierbare und intelligente Lösung zeigt, wie moderne Datenbankfunktionen, die mit KI angereichert sind, die Zukunft des Einzelhandels verändern.

Jetzt starten!