Echtzeit-Überschuss-Engine mit Gemini 3 Flash und AlloyDB erstellen

1. Übersicht

In diesem Codelab entwickeln Sie Neighbor Loop, eine nachhaltige App zum Teilen von Überschüssen, in der Intelligenz als wichtiger Bestandteil der Datenschicht behandelt wird.

Durch die Integration von Gemini 3.0 Flash und AlloyDB AI gehen Sie über die einfache Speicherung hinaus und erreichen In-Database Intelligence. Sie erfahren, wie Sie multimodale Artikelanalysen und semantische Ermittlungen direkt in SQL durchführen können, wodurch die „KI-Steuer“ in Form von Latenz und Architektur-Bloat vermieden wird.

1da27e0c4d9a33e0.jpeg

Aufgaben

Eine leistungsstarke Webanwendung mit „Wischen zum Matchen“ für das Teilen von Community-Überschüssen.

Lerninhalte

  • Bereitstellung mit einem Klick: So richten Sie einen AlloyDB-Cluster und eine Instanz für KI-Arbeitslasten ein.
  • In-Database Embeddings: Generieren von text-embedding-005-Vektoren direkt in INSERT-Anweisungen.
  • Multimodales Reasoning: Gemini 3.0 Flash kann Elemente „sehen“ und automatisch witzige, für Dating-Apps geeignete Biografien erstellen.
  • Semantische Ermittlung: Logikbasierte „Vibe-Checks“ in SQL-Abfragen mit der Funktion „ai.if()“ durchführen, um Ergebnisse basierend auf dem Kontext und nicht nur auf mathematischen Berechnungen zu filtern.

Die Architektur

Neighbor Loop umgeht herkömmliche Engpässe auf Anwendungsebene. Anstatt Daten zur Verarbeitung zu extrahieren, verwenden wir:

  1. AlloyDB AI:Zum Generieren und Speichern von Vektoren in Echtzeit.
  2. Google Cloud Storage:zum Speichern von Bildern
  3. Gemini 3.0 Flash:Damit können Sie in weniger als einer Sekunde Schlussfolgerungen aus Bild- und Textdaten direkt über SQL ziehen.
  4. Cloud Run:Zum Hosten eines einfachen Flask-Back-Ends mit einer einzigen Datei.

Voraussetzungen

  • Ein Browser, z. B. Chrome oder Firefox.
  • Google Cloud-Projekt mit aktivierter Abrechnungsfunktion.
  • Grundkenntnisse in SQL und Python.

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.
  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. Wenn Sie mit Cloud Shell verbunden sind, können Sie mit dem folgenden Befehl prüfen, ob Sie bereits authentifiziert sind und das Projekt auf Ihre Projekt-ID festgelegt 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.

Wichtige Hinweise und Fehlerbehebung

Das „Ghost Project“-Syndrom

Sie haben gcloud config set project ausgeführt, sehen sich aber in der Console-UI ein anderes Projekt an. Prüfen Sie die Projekt-ID im Drop-down-Menü oben links.

Die Abrechnungsbarrikade

Sie haben das Projekt aktiviert, aber das Rechnungskonto vergessen. AlloyDB ist eine leistungsstarke Engine, die nicht startet, wenn der „Benzintank“ (Abrechnung) leer ist.

Verzögerung bei der API-Weitergabe

Sie haben auf „APIs aktivieren“ geklickt, aber in der Befehlszeile wird weiterhin Service Not Enabled angezeigt. Warte 60 Sekunden. Es dauert einen Moment, bis die Cloud ihre Neuronen aktiviert hat.

Kontingent  – Quags

Wenn Sie ein brandneues Testkonto verwenden, erreichen Sie möglicherweise ein regionales Kontingent für AlloyDB-Instanzen. Wenn us-central1 fehlschlägt, versuchen Sie es mit us-east1.

„Verborgener“ Kundenservicemitarbeiter

Manchmal wird dem AlloyDB-Dienst-Agenten die Rolle aiplatform.user nicht automatisch zugewiesen. Wenn Ihre SQL-Abfragen später nicht mit Gemini kommunizieren können, liegt das in der Regel daran.

3. Datenbank einrichten

In diesem Lab verwenden wir AlloyDB als Datenbank für die Testdaten. 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 Instanz und eine Tabelle, in die das Test-Dataset geladen wird.

  1. Klicken Sie auf die Schaltfläche oder kopieren Sie den Link unten in den Browser, in dem Sie mit dem Google Cloud Console-Nutzer angemeldet sind.

  1. Sobald dieser Schritt abgeschlossen ist, wird das Repository in Ihren lokalen Cloud Shell-Editor geklont und Sie können den folgenden Befehl über den Projektordner ausführen. Achten Sie darauf, dass Sie sich im Projektverzeichnis befinden:
sh run.sh
  1. Verwenden Sie jetzt die Benutzeroberfläche (klicken Sie auf den Link im Terminal oder auf den Link „Vorschau im Web“ im Terminal).
  2. Geben Sie die Details für Projekt-ID, Cluster- und Instanznamen ein, um zu beginnen.
  3. Holen Sie sich einen Kaffee, während die Logs durchlaufen. Hier können Sie nachlesen, wie das im Hintergrund funktioniert.

Wichtige Hinweise und Fehlerbehebung

Das Problem mit der Geduld

Datenbankcluster sind eine schwere Infrastruktur. Wenn Sie die Seite aktualisieren oder die Cloud Shell-Sitzung beenden, weil sie „hängt“, kann es passieren, dass eine „Geisterinstanz“ entsteht, die teilweise bereitgestellt wurde und ohne manuellen Eingriff nicht gelöscht werden kann.

Region stimmt nicht überein

Wenn Sie Ihre APIs in us-central1 aktiviert haben, aber versuchen, den Cluster in asia-south1 bereitzustellen, kann es zu Kontingentproblemen oder Verzögerungen bei den Berechtigungen für Dienstkonten kommen. Bleiben Sie für das gesamte Lab bei einer Region.

Zombie-Cluster

Wenn Sie zuvor denselben Namen für einen Cluster verwendet und ihn nicht gelöscht haben, wird im Skript möglicherweise angezeigt, dass der Clustername bereits vorhanden ist. Clusternamen müssen innerhalb eines Projekts eindeutig sein.

Cloud Shell-Zeitüberschreitung

Wenn Ihre Kaffeepause 30 Minuten dauert, wechselt Cloud Shell möglicherweise in den Ruhemodus und trennt die Verbindung zum sh run.sh-Prozess. Lassen Sie den Tab aktiv!

4. Schemabereitstellung

Sobald Ihr AlloyDB-Cluster und Ihre Instanz ausgeführt werden, können Sie im SQL-Editor von AlloyDB Studio die KI-Erweiterungen aktivieren und das Schema bereitstellen.

1e3ac974b18a8113.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“ (oder das Passwort, das Sie bei der Erstellung festgelegt haben)

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.

28cb9a8b6aa0789f.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;

Tabelle erstellen

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

-- Items Table (The "Profile" you swipe on)
CREATE TABLE items (
   item_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
   owner_id UUID,
   provider_name TEXT,
   provider_phone TEXT,
   title TEXT,
   bio TEXT,
   category TEXT,
   image_url TEXT,
   item_vector VECTOR(768),
   status TEXT DEFAULT 'available',
   created_at TIMESTAMP DEFAULT NOW()
);

-- Swipes Table (The Interaction)
CREATE TABLE swipes (
   swipe_id SERIAL PRIMARY KEY,
   swiper_id UUID,
   item_id UUID REFERENCES items(item_id),
   direction TEXT CHECK (direction IN ('left', 'right')),
   is_match BOOLEAN DEFAULT FALSE,
   created_at TIMESTAMP DEFAULT NOW()
);

In der Spalte item_vector 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"

Gemini 3 Flash-Modell in AlloyDB registrieren

Führen Sie die folgende SQL-Anweisung im AlloyDB-Abfrageeditor aus.

CALL google_ml.create_model(
   model_id => 'gemini-3-flash-preview',
   model_request_url => 'https://aiplatform.googleapis.com/v1/projects/<<YOUR_PROJECT_ID>>/locations/global/publishers/google/models/gemini-3-flash-preview:generateContent',
   model_qualified_name => 'gemini-3-flash-preview',
   model_provider => 'google',
   model_type => 'llm',
   model_auth_type => 'alloydb_service_agent_iam'
);
--replace <<YOUR_PROJECT_ID>> with your project id.

Wichtige Hinweise und Fehlerbehebung

Die „Passwort vergessen“-Schleife

Wenn Sie die Einrichtung mit nur einem Klick verwendet haben und sich nicht mehr an Ihr Passwort erinnern, rufen Sie in der Konsole die Seite mit den grundlegenden Informationen zur Instanz auf und klicken Sie auf „Bearbeiten“, um das postgres-Passwort zurückzusetzen.

Fehler „Erweiterung nicht gefunden“

Wenn CREATE EXTENSION fehlschlägt, liegt das oft daran, dass sich die Instanz nach der ersten Bereitstellung noch im Status „Wartung“ oder „Wird aktualisiert“ befindet. Prüfen Sie, ob der Schritt zur Instanzerstellung abgeschlossen ist, und warten Sie bei Bedarf einige Sekunden.

IAM-Weitergabeverzögerung

Sie haben den IAM-Befehl gcloud ausgeführt, aber der SQL-Befehl CALL schlägt weiterhin mit einem Berechtigungsfehler fehl. Es kann einige Zeit dauern, bis IAM-Änderungen über das Google-Backbone übertragen werden. Atme tief durch.

Falsche Vektordimension

Die Tabelle items ist auf VECTOR(768) festgelegt. Wenn Sie später versuchen, ein anderes Modell zu verwenden, z. B. ein Modell mit 1.536 Dimensionen, werden Ihre Einfügungen explodieren. Halte dich an text-embedding-005.

Tippfehler in der Projekt-ID

Wenn Sie im create_model-Aufruf die Klammern « » weglassen oder Ihre Projekt-ID falsch eingeben, wird die Modellregistrierung zwar als erfolgreich angezeigt, schlägt aber bei der ersten tatsächlichen Anfrage fehl. Überprüfen Sie den String noch einmal.

5. Bildspeicher (Google Cloud Storage)

Zum Speichern der Fotos unserer Überschussartikel verwenden wir einen GCS-Bucket. Für diese Demo-App sollen die Bilder öffentlich zugänglich sein, damit sie sofort auf unseren Wischkarten gerendert werden.

  1. Bucket erstellen: Erstellen Sie einen neuen Bucket in Ihrem GCP-Projekt (z.B. neighborloop-images), vorzugsweise in derselben Region wie Ihre Datenbank und Anwendung.
  2. Öffentlichen Zugriff konfigurieren: * Rufen Sie den Tab Berechtigungen des Buckets auf.
  3. Fügen Sie das Hauptkonto allUsers hinzu.
  4. Weisen Sie die Rolle Storage-Objekt-Betrachter (damit jeder die Fotos sehen kann) und die Rolle Storage-Objekt-Ersteller (für Demo-Uploads) zu.

Alternative (Dienstkonto): Wenn Sie keinen öffentlichen Zugriff verwenden möchten, müssen Sie dem Dienstkonto Ihrer Anwendung vollen Zugriff auf AlloyDB und die erforderlichen Storage-Rollen gewähren, um Objekte sicher zu verwalten.

Wichtige Hinweise und Fehlerbehebung

Der Region Drag

Wenn sich Ihre Datenbank in us-central1 und Ihr Bucket in europe-west1 befindet, verlangsamen Sie Ihre KI. Der „Vibe Check“ erfolgt schnell, das Abrufen des Bildes für die Benutzeroberfläche dauert jedoch länger. Behalten Sie sie in derselben Region bei.

Eindeutigkeit von Bucket-Namen

Bucket-Namen sind ein globaler Namespace. Wenn Sie versuchen, Ihren Bucket neighborloop-images zu nennen, hat wahrscheinlich schon jemand anderes diesen Namen. Wenn die Erstellung fehlschlägt, fügen Sie ein zufälliges Suffix hinzu.

Verwechslung von „Creator“ und „Zuschauer“

Verwechslung von „Creator“ und „Viewer“:Wenn Sie nur „Viewer“ hinzufügen, stürzt Ihre App ab, wenn ein Nutzer versucht, einen neuen Artikel aufzulisten, da sie keine Berechtigung zum Schreiben der Datei hat. Für diese spezielle Demo-Einrichtung benötigen Sie beide.

6. Anwendung erstellen

Klonen Sie dieses Repository in Ihr Projekt und sehen wir uns das Ganze an.

  1. Führen Sie zum Klonen dieses Repositorys im Cloud Shell-Terminal (im Stammverzeichnis oder an einem beliebigen anderen Ort, an dem Sie dieses Projekt erstellen möchten) den folgenden Befehl aus:
git clone https://github.com/AbiramiSukumaran/neighbor-loop

Dadurch sollte das Projekt erstellt werden. Sie können dies im Cloud Shell Editor überprüfen.

53a398aff6ba7d5b.png

  1. Gemini API-Schlüssel abrufen
  2. Rufen Sie Google AI Studio auf: Gehen Sie zu aistudio.google.com.
  3. Anmelden: Verwenden Sie dasselbe Google-Konto, das Sie für Ihr Google Cloud-Projekt verwenden.
  4. API-Schlüssel erstellen:
  5. Klicken Sie in der linken Seitenleiste auf „API-Schlüssel abrufen“.
  6. Klicken Sie auf die Schaltfläche „API-Schlüssel in neuem Projekt erstellen“.
  7. Schlüssel kopieren: Klicken Sie nach dem Generieren des Schlüssels auf das Symbol zum Kopieren.
  8. Legen Sie nun die Umgebungsvariablen in der Datei „.env“ fest.
GEMINI_API_KEY=<<YOUR_GEMINI_API_KEY>>
DATABASE_URL=postgresql+pg8000://postgres:<<YOUR_PASSWORD>>@<<HOST_IP>>:<<PORT>>/postgres
GCS_BUCKET_NAME=<<YOUR_GCS_BUCKET>>

Ersetzen Sie die Werte für die Platzhalter <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<HOST_IP>>, <<PORT>> and <<YOUR_GCS_BUCKET>>..

Wichtige Hinweise und Fehlerbehebung

Verwirrung durch mehrere Konten

Wenn Sie in mehreren Google-Konten (privat und geschäftlich) angemeldet sind, wird in AI Studio möglicherweise das falsche Konto verwendet. Prüfen Sie den Avatar rechts oben, um sicherzugehen, dass er mit dem Konto Ihres GCP-Projekts übereinstimmt.

Kontingentüberschreitung für das kostenlose Kontingent

Wenn Sie die kostenlose Stufe verwenden, gelten Ratenbegrenzungen (RPM – Anfragen pro Minute). Wenn Sie in der Nachbarschaftsschleife zu schnell wischen, erhalten Sie möglicherweise den Fehler 429 Too Many Requests. Langsam!

Sicherheit von offengelegten Schlüsseln

Wenn Sie Ihre .env-Datei mit dem Schlüssel versehentlich git commit haben. Fügen Sie Ihrem .gitignore immer .env hinzu.

Die Nichtigerklärung „Zeitüberschreitung bei der Verbindung“

Sie haben die private IP-Adresse in Ihrer .env-Datei verwendet, versuchen aber, eine Verbindung von außerhalb der VPC herzustellen (z. B. von Ihrem lokalen Computer). Private IP-Adressen sind nur innerhalb desselben Google Cloud-Netzwerks erreichbar. Zur öffentlichen IP-Adresse wechseln

Annahme zum Port 5432

5432 ist zwar der Standard-PostgreSQL-Port, aber für AlloyDB sind manchmal bestimmte Portkonfigurationen erforderlich, wenn Sie einen Auth-Proxy verwenden. Achten Sie in diesem Lab darauf, dass Sie am Ende Ihres Hoststrings :5432 verwenden.

Gatekeeper „Autorisierte Netzwerke“

Auch wenn Sie die öffentliche IP-Adresse haben, lehnt AlloyDB die Verbindung ab, sofern Sie die IP-Adresse des Computers, auf dem der Code ausgeführt wird, nicht auf die Zulassungsliste gesetzt haben.Lösung: Fügen Sie in den AlloyDB-Instanzeinstellungen 0.0.0.0/0 (nur für temporäre Tests) oder Ihre spezifische IP-Adresse zu den autorisierten Netzwerken hinzu.

Fehler beim SSL/TLS-Handshake

AlloyDB bevorzugt sichere Verbindungen. Wenn in Ihrer DATABASE_URL der Treiber nicht richtig angegeben ist (z. B. pg8000), kann der Handshake ohne Fehlermeldung fehlschlagen. Sie erhalten dann eine allgemeine Fehlermeldung wie „Datenbank nicht erreichbar“.

Tausch von „Primär“ und „Lesepool“

Wenn Sie versehentlich die IP-Adresse des Read Pool anstelle der primären Instanz kopieren, funktioniert Ihre App für die Suche nach Artikeln, stürzt jedoch mit einem „Nur lesen“-Fehler ab, wenn Sie versuchen, einen neuen Artikel aufzulisten. Verwenden Sie für Schreibvorgänge immer die IP-Adresse der primären Instanz.

7. Sehen wir uns den Code an

Das „Dating-Profil“ für deine Sachen

c2c543562cc9b353.png

Wenn ein Nutzer ein Foto eines Artikels hochlädt, sollte er keine lange Beschreibung schreiben müssen. Ich verwende Gemini 3 Flash, um den Artikel zu „sehen“ und das Angebot zu schreiben.

Im Backend gibt der Nutzer nur einen Titel und ein Foto an. Gemini erledigt den Rest:

prompt = """
You are a witty community manager for NeighborLoop.
Analyze this surplus item and return JSON:
{
   "bio": "First-person witty dating-style profile bio for the product, not longer than 2 lines",
   "category": "One-word category",
   "tags": ["tag1", "tag2"]
}
"""
response = genai_client.models.generate_content(
   model="gemini-3-flash-preview",
   contents=[types.Part.from_bytes(data=image_bytes, mime_type="image/jpeg"), prompt],
   config=types.GenerateContentConfig(response_mime_type="application/json")
)

21f871a1b549efcf.png

Echtzeit-In-Database-Embeddings

aa783a459f1b02da.png

Eines der besten Features von AlloyDB ist die Möglichkeit, Einbettungen zu generieren, ohne den SQL-Kontext zu verlassen. Anstatt ein Einbettungsmodell in Python aufzurufen und den Vektor zurück an die Datenbank zu senden, erledige ich alles in einer INSERT-Anweisung mit der Funktion „embedding()“:

INSERT INTO items (owner_id, provider_name, provider_phone, title, bio, category, image_url, status, item_vector)
VALUES (
   :owner, :name, :phone, :title, :bio, :cat, :url, 'available',
   embedding('text-embedding-005', :title || ' ' || :bio)::vector
)

So wird sichergestellt, dass jeder Artikel sofort nach dem Posten nach seiner Bedeutung „durchsuchbar“ ist. Dieser Teil deckt die Funktion „Produkt auflisten“ der Neighbor Loop App ab.

Screenshot für die Funktion „Produkteintrag“ hinzufügen

Erweiterte Vektorsuche und intelligentes Filtern mit Gemini 3.0

Die Standardsuche nach Keywords ist eingeschränkt. Wenn Sie nach „etwas, um meinen Stuhl zu reparieren“ suchen, gibt eine herkömmliche Datenbank möglicherweise nichts zurück, wenn das Wort „Stuhl“ nicht in einem Titel enthalten ist. Neighbor Loop löst dieses Problem mit der erweiterten Vektorsuche von AlloyDB AI.

Durch die Verwendung der pgvector-Erweiterung und des für AlloyDB optimierten Speichers können wir extrem schnelle Ähnlichkeitssuchen durchführen. Das volle Potenzial entfaltet sich aber erst, wenn wir die Vektornähe mit LLM-basierter Logik kombinieren.

Mit AlloyDB AI können wir Modelle wie Gemini direkt in unseren SQL-Abfragen aufrufen. Das bedeutet, dass wir eine semantische Ermittlung durchführen können, die einen logikbasierten „Plausibilitätscheck“ mit der Funktion ai.if() umfasst:

SELECT item_id, title, bio, category, image_url,
      1 - (item_vector <=> embedding('text-embedding-005', :query)::vector) as score
FROM items
WHERE status = 'available'
 AND item_vector IS NOT NULL
 AND ai.if(
       prompt => 'Does this text: "' || bio ||'" match the user request: "' ||  :query || '", at least 60%? "',
       model_id => 'gemini-3-flash-preview'
     ) 
ORDER BY score DESC
LIMIT 5

Diese Abfrage stellt eine wichtige architektonische Änderung dar: Wir verlagern die Logik zu den Daten. Anstatt Tausende von Ergebnissen in den Anwendungscode zu ziehen, um sie zu filtern, führt Gemini 3 Flash einen „Vibe-Check“ in der Datenbank-Engine durch. Dadurch werden die Latenz und die Kosten für ausgehenden Traffic gesenkt und die Ergebnisse sind nicht nur mathematisch ähnlich, sondern auch kontextbezogen relevant.

Screenshot der Funktion „Semantische Suche“

Der „Swipe to Match“-Loop

Die Benutzeroberfläche ist ein klassisches Kartenspiel.

Nach links wischen: Verwerfen.

Nach rechts wischen: Es ist ein Match!

Screenshot der Funktion „Wischen zum Abgleichen“

Wenn Sie nach rechts wischen, wird die Interaktion im Backend in unserer Tabelle für Wischvorgänge aufgezeichnet und das Element als „gematcht“ markiert. Im Frontend wird sofort ein Pop-up-Fenster mit den Kontaktdaten des Anbieters angezeigt, damit Sie die Abholung vereinbaren können.

8. In Cloud Run bereitstellen

  1. Stellen Sie die App in Cloud Run bereit, indem Sie den folgenden Befehl im Cloud Shell-Terminal ausführen, in dem das Projekt geklont wurde. Achten Sie darauf, dass Sie sich im Stammordner des Projekts befinden.

Führen Sie diesen Befehl in Ihrem Cloud Shell-Terminal aus:

gcloud beta run deploy neighbor-loop \
   --source . \
   --region=us-central1 \
   --network=<<YOUR_NETWORK_NAME>> \
   --subnet=<<YOUR_SUBNET_NAME>> \
   --allow-unauthenticated \
   --vpc-egress=all-traffic \
   --set-env-vars GEMINI_API_KEY=<<YOUR_GEMINI_API_KEY>>,DATABASE_URL=postgresql+pg8000://postgres:<<YOUR_PASSWORD>>@<<PRIVATE_IP_HOST>>:<<PORT>>/postgres,GCS_BUCKET_NAME=<<YOUR_GCS_BUCKET>>

Ersetzen Sie die Werte für die Platzhalter <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<PRIVATE_IP_HOST>>, <<PORT>> and <<YOUR_GCS_BUCKET>>.

Nach Abschluss des Befehls wird eine Dienst-URL ausgegeben. Kopieren.

  1. Weisen Sie dem Cloud Run-Dienstkonto die Rolle AlloyDB-Client zu.So kann Ihre serverlose Anwendung einen sicheren Tunnel zur Datenbank herstellen.

Führen Sie diesen Befehl in Ihrem Cloud Shell-Terminal aus:

# 1. Get your Project ID and Project Number
PROJECT_ID=$(gcloud config get-value project)
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

# 2. Grant the AlloyDB Client role
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/alloydb.client"

Verwenden Sie jetzt die Dienst-URL (den zuvor kopierten Cloud Run-Endpunkt) und testen Sie die App. Laden Sie ein Foto des alten Elektrowerkzeugs hoch und lassen Sie Gemini den Rest erledigen.

Wichtige Hinweise und Fehlerbehebung

Die Schleife „Überarbeitung fehlgeschlagen“

Wenn die Bereitstellung abgeschlossen ist, die URL aber 500 Internal Server Error zurückgibt, sehen Sie sich die Logs an. Das liegt in der Regel an einer fehlenden Umgebungsvariable (z. B. ein Tippfehler in Ihrem DATABASE_URL) oder daran, dass das Cloud Run-Dienstkonto nicht die Berechtigungen zum Lesen aus Ihrem GCS-Bucket hat.

Die IAM-Schattenrolle

Auch wenn Sie die Berechtigung zum Bereitstellen haben, benötigt das Cloud Run-Dienstkonto (in der Regel [project-number]-compute@developer.gserviceaccount.com) die Rolle AlloyDB Client, um tatsächlich eine Verbindung zur Datenbank herzustellen.

9. Allgemeine Fehlerbehebung

b6cdd3785d5461a9.jpeg

10. Demo

Sie sollten Ihren Endpunkt für Tests verwenden können.

Zu Demozwecken können Sie aber einige Tage lang Folgendes ausprobieren:

11. Bereinigen

Vergessen Sie nicht, den AlloyDB-Cluster und die ‑Instanz zu löschen, wenn Sie dieses Lab abgeschlossen haben.

Dadurch sollte der Cluster zusammen mit seinen Instanzen bereinigt werden.

12. Glückwunsch

Sie haben die Neighbor Loop-App für nachhaltige Gemeinschaften mit Google Cloud erfolgreich erstellt. Durch die Verlagerung der Einbettungs- und Gemini 3 Flash-KI-Logik in AlloyDB ist die App unglaublich schnell (abhängig von den Bereitstellungseinstellungen) und der Code ist bemerkenswert übersichtlich. Wir speichern nicht nur Daten, sondern auch Intentionen.

Die Kombination aus der Geschwindigkeit von Gemini 3 Flash und der optimierten Vektorverarbeitung von AlloyDB ist wirklich die nächste Stufe für Community-basierte Plattformen.