Créer une application de recommandation de tenues optimisée par l'IA avec AlloyDB et des environnements d'exécution sans serveur

Créer une application de recommandation de tenues optimisée par l'IA avec AlloyDB et des environnements d'exécution sans serveur

À propos de cet atelier de programmation

subjectDernière mise à jour : mars 28, 2025
account_circleRédigé par Abirami Sukumaran, Shweta Shetye

1. Présentation

Imaginez une application de mode qui non seulement vous aide à trouver la tenue parfaite, mais qui vous fournit également des conseils de style en temps réel, grâce à l'intégration de l'IA générative de pointe. Dans cet article, nous allons voir comment nous avons créé une telle application à l'aide des fonctionnalités de recherche vectorielle d'AlloyDB, associées à l'index ScaNN de Google, qui permettent d'effectuer des recherches ultra-rapides de tenues assorties et de proposer des recommandations de mode instantanées.

Nous verrons également comment l'index ScaNN d'AlloyDB optimise les requêtes complexes pour générer des suggestions de style personnalisées. Nous utiliserons également Gemini et Imagen, de puissants modèles d'IA générative, pour vous inspirer et même visualiser vos looks personnalisés. L'ensemble de cette application est basé sur une architecture sans serveur, ce qui garantit une expérience fluide et évolutive pour les utilisateurs.

Défi:en proposant des suggestions de tenues personnalisées, l'application vise à aider les personnes qui ont du mal à choisir leurs tenues. Cela permet également d'éviter la fatigue décisionnelle liée à la planification de la tenue.

Solution:L'application de recommandation de tenues résout le problème de la fourniture d'une expérience de mode intelligente, personnalisée et attrayante aux utilisateurs, tout en mettant en avant les capacités d'AlloyDB, de l'IA générative et des technologies sans serveur.

Ce que vous allez faire

Au cours de cet atelier, vous allez:

  1. Créer une instance AlloyDB et charger l'ensemble de données sur l'e-commerce
  2. Activer les extensions pgvector et de modèle d'IA générative dans AlloyDB
  3. Générer des embeddings à partir de la description du produit
  4. Déployer la solution dans des fonctions Cloud Run sans serveur
  5. Importez une image dans Gemini et générez une requête de description d'image.
  6. Générez des résultats de recherche en fonction d'invites associées aux embeddings de l'ensemble de données d'e-commerce.
  7. Ajoutez des requêtes supplémentaires pour personnaliser la requête et générer des recommandations de style.
  8. Déployer la solution dans des fonctions Cloud Run sans serveur

Conditions requises

  • Un navigateur tel que Chrome ou Firefox
  • Un projet Google Cloud avec facturation activée.

2. Architecture

L'architecture de haut niveau de l'application est la suivante:

ce32f865dfe59142.png

Les sections suivantes mettent en évidence le flux contextuel du tutoriel:

Ingestion:

La première étape consiste à ingérer les données de vente au détail (inventaire, descriptions des produits, interactions avec les clients) dans AlloyDB.

Moteur Analytics :

Nous utiliserons AlloyDB comme moteur d'analyse pour effectuer les opérations suivantes:

  1. Extraction de contexte:le moteur analyse les données stockées dans AlloyDB pour comprendre les relations entre les produits, les catégories, le comportement des clients, etc., le cas échéant.
  2. Création d'embeddings:des embeddings (représentations mathématiques du texte) sont générés à la fois pour la requête de l'utilisateur et pour les informations stockées dans AlloyDB.
  3. Recherche vectorielle:le moteur effectue une recherche de similarité en comparant l'encapsulation vectorielle de la requête aux encapsulations des descriptions de produits, des avis et d'autres données pertinentes. Cela permet d'identifier les 25 "voisins les plus proches" les plus pertinents.

Recommandation Gemini:

La matrice d'octets de l'image est transmise au modèle Gemini via l'API Vertex AI, ainsi que la requête demandant une description textuelle de la partie supérieure de la tenue et les suggestions de recommandations de bas.

RAG et recherche vectorielle AlloyDB :

La description du haut est utilisée pour interroger la base de données. La requête convertit le texte de recherche (recommandation du modèle Gemini pour les vêtements bas assortis) en embeddings et effectue une recherche vectorielle sur les embeddings stockés dans la base de données pour trouver les voisins les plus proches (résultats correspondants). Les embeddings vectoriels de la base de données AlloyDB sont indexés à l'aide de l'index ScaNN pour un meilleur rappel.

Génération d'images de réponse:

Les réponses validées sont structurées dans un tableau JSON, et l'ensemble du moteur est empaqueté dans une fonction Cloud Run sans serveur qui est appelée à partir de l'outil de création d'agents.

Génération d'images Imagen :

L'invite de style de l'utilisateur, une recommandation sélectionnée par l'utilisateur et toutes les demandes de personnalisation sont combinées pour inviter Imagen 3 à utiliser une image existante. L'image de stylisation est générée en fonction de cette requête, à l'aide de l'API Vertex AI.

3. Avant de commencer

Créer un projet

  1. Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud.
  2. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet .
  3. Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud et fourni avec bq. Cliquez sur Activer Cloud Shell f2ae85166a716c5c.png en haut de la console Google Cloud.
  4. Une fois connecté à Cloud Shell, vérifiez que vous êtes déjà authentifié et que le projet est défini sur votre ID de projet à l'aide de la commande suivante:
gcloud auth list
  1. Exécutez la commande suivante pour vérifier que les futures commandes gcloud identifieront correctement votre projet.
gcloud config list project
  1. Si votre projet n'est pas défini, utilisez la commande suivante pour le définir explicitement:
gcloud config set project <YOUR_PROJECT_ID>
  1. Activer les API requises.

Suivez le lien pour activer les API.

Si vous oubliez d'activer une API, vous pouvez toujours l'activer au cours de l'implémentation.

Pour en savoir plus sur les commandes gcloud et leur utilisation, consultez la documentation.

4. Configuration de la base de données

Dans cet atelier, nous allons utiliser AlloyDB comme base de données pour stocker l'ensemble de données sur l'e-commerce du commerce de détail. Il utilise des clusters pour stocker toutes les ressources, telles que les bases de données et les journaux. Chaque cluster dispose d'une instance principale qui fournit un point d'accès aux données. Les tables sont la ressource réelle qui stocke les données.

Créons un cluster, une instance et une table AlloyDB dans lesquels l'ensemble de données sur l'e-commerce sera chargé.

Créer un cluster et une instance

  1. Dans Google Cloud Console, recherchez AlloyDB. Pour trouver facilement la plupart des pages de la console Cloud, recherchez-les à l'aide de la barre de recherche de la console.
  2. Cliquez sur CRÉER UN CLUSTER.

f76ff480c8c889aa.png

  1. Créez un cluster et une instance avec les valeurs suivantes:
  • cluster id: "shopping-cluster"
  • mot de passe: "alloydb"
  • Compatible avec PostgreSQL 15
  • Région: "us-central1"
  • Mise en réseau: "default"

538dba58908162fb.png

  1. Dans "Réseau", lorsque vous sélectionnez le réseau par défaut, l'option suivante s'affiche. Cliquez sur CONFIGURER LA CONNEXION pour configurer un réseau par défaut.
    7939bbb6802a91bf.png
  2. Sélectionnez Utiliser une plage d'adresses IP automatiquement allouée, puis cliquez sur Continuer. Après avoir consulté les informations, cliquez sur CRÉER UNE CONNEXION. 768ff5210e79676f.png

Attendez la fin de la création du réseau par défaut.

  1. Dans "Configurer votre instance principale", définissez l'ID d'instance sur "shopping-instance"".

2bddecf6b7c7407b.png

  1. Cliquez sur CREATE CLUSTER (CRÉER UN CLUSTER) pour terminer la configuration du cluster comme suit:

24eec29fa5cfdb3e.png

5. Ingestion de données

Il est maintenant temps d'ajouter un tableau contenant les données sur le magasin. Attendez que la création de votre instance soit terminée. Une fois le cluster créé, vous pouvez vous connecter à AlloyDB à l'aide des identifiants que vous avez définis lors de sa création.

S'authentifier auprès de la base de données AlloyDB

  1. Dans Google Cloud Console, accédez à AlloyDB. Sélectionnez le cluster principal, puis cliquez sur AlloyDB Studio dans le panneau de navigation de gauche:

847e35f1bf8a8bd8.png

  1. Saisissez les informations suivantes pour vous authentifier auprès de la base de données AlloyDB:
  • Nom d'utilisateur : "postgres"
  • Base de données : "postgres"
  • Mot de passe : "alloydb"

Une fois que vous vous êtes authentifié dans AlloyDB Studio, vous pouvez saisir des commandes SQL dans les onglets Éditeur. Vous pouvez ajouter plusieurs fenêtres de l'éditeur à l'aide du signe plus à droite du premier onglet de l'éditeur.

91a86d9469d499c4.png

Vous allez saisir des commandes pour AlloyDB dans les fenêtres de l'éditeur, en utilisant les options "Run" (Exécuter), "Format" (Mettre en forme) et "Clear" (Effacer) si nécessaire.

Activer les extensions

Pour créer cette application, nous utiliserons les extensions pgvector" et google_ml_integration".

  • L'extension pgvector vous permet de stocker et de rechercher des embeddings vectoriels.
  • L'extension google_ml_integration fournit des fonctions que vous pouvez utiliser pour accéder aux points de terminaison de prédiction Vertex AI afin d'obtenir des prédictions en SQL.
  1. Activez ces extensions en exécutant les LDD suivantes:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector
;
  1. Vérifiez si les extensions sont installées en exécutant cette commande SQL:
select extname, extversion from pg_extension;

Créer une table

  1. Créez une table à l'aide de l'instruction LDD suivante:
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) );

Une fois la commande ci-dessus exécutée, vous devriez pouvoir afficher le tableau dans

pour un pâté de maisons. L'image suivante en est un exemple:

908e33bbff58a6d.png

Ingérer des données

Pour cet atelier, nous disposons de données de test d'environ 200 enregistrements dans ce fichier SQL. Il contient id, category, sub_category, uri, image et content. Les autres champs seront remplis plus tard dans l'atelier.

  1. Copiez les 20 lignes/instructions d'insertion du fichier SQL dans un nouvel onglet de l'éditeur d'AlloyDB Studio, puis cliquez sur RUN (EXÉCUTER).
  1. Développez la section "Explorer" jusqu'à ce que la table nommée apparels s'affiche.
  2. Cliquez sur l'icône du menu [], puis sur Requête. Une instruction SELECT s'ouvre dans un nouvel onglet de l'éditeur.

b31ece70e670ab89.png

  1. Cliquez sur Run (Exécuter) pour vérifier que les lignes sont insérées.

Accorder une autorisation à l'utilisateur

Nous allons autoriser l'utilisateur postgres à générer des représentations vectorielles continues à partir d'AlloyDB.. Dans AlloyDB Studio, exécutez l'instruction suivante pour accorder à l'utilisateur postgres des droits d'exécution sur la fonction embedding:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Attribuer le rôle Utilisateur Vertex AI au compte de service AlloyDB

Nous utiliserons les modèles d'embeddings de texte de Vertex AI pour générer des embeddings pour le rôle utilisateur Vertex AI du compte de service AlloyDB.

Dans la console Google Cloud, cliquez sur l'icône Terminal Cloud Shell [f2ae85166a716c5c.png] et exécutez la commande suivante:

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. Contexte de compilation

Pour créer une imbrication, nous devons disposer d'un context, c'est-à-dire de toutes les informations que nous souhaitons inclure dans un seul champ. Pour ce faire, nous allons créer une description de produit que nous stockerons dans la colonne pdt_desc de la table apparels.

Dans notre cas, nous utiliserons toutes les informations sur chaque produit. Toutefois, lorsque vous effectuez cette opération avec vos propres données, n'hésitez pas à les ingénier de la manière qui vous semble la plus pertinente pour votre entreprise.

Dans l'onglet "Éditeur" d'AlloyDB Studio, exécutez la commande suivante, qui met à jour le champ pdt_desc avec des données de contexte:

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;

Cette instruction DML crée un résumé contextuel simple à l'aide des informations de tous les champs disponibles dans la table et d'autres dépendances (le cas échéant dans votre cas d'utilisation). Pour obtenir un ensemble d'informations plus précis et créer un contexte, n'hésitez pas à élaborer les données de la manière qui vous semble la plus pertinente pour votre entreprise.

7. Créer des embeddings pour le contexte

Les ordinateurs traitent beaucoup plus facilement les nombres que le texte. Un système d'intégration convertit le texte en une série de nombres à virgule flottante qui doivent le représenter, quelle que soit la formulation, la langue utilisée, etc.

Imaginons que vous décriviez un lieu en bord de mer. Il peut s'appeler "on the water, beachfront, walk from your room to the ocean, sur la mer, на берегу океана, etc. Ces termes semblent tous différents, mais leur signification sémantique (ou, en termes de machine learning, leurs représentations vectorielles continues) doit être très proche.

Maintenant que les données et le contexte sont prêts, nous allons exécuter la requête SQL pour ajouter les représentations vectorielles continues de la colonne "description du produit" ((pdt_desc) au tableau dans le champ embedding. Vous pouvez utiliser différents modèles d'embedding. Nous utilisons text-embedding-005 de Vertex AI.

  1. Dans AlloyDB Studio, exécutez la commande suivante pour générer des représentations vectorielles continues et mettez à jour la colonne pdt_desc avec des représentations vectorielles continues pour les données qu'elle stocke:
UPDATE
 apparels
SET
 embedding
= embedding( 'text-embedding-005',
   pdt_desc
)
WHERE
 TRUE
;
  1. Vérifiez que des représentations vectorielles continues sont générées en exécutant la commande suivante:
SELECT
 id
,
 category
,
 sub_category
,
 content
,
 embedding
FROM
 
Apparels
LIMIT
5;

Voici un exemple de vecteur d'embeddings, qui ressemble à un tableau de nombres à virgule flottante, pour l'exemple de texte de la requête:

c69c08d085389f74.png

8. Effectuer une recherche vectorielle

Maintenant que la table, les données et les embeddings sont prêts, effectuons la recherche vectorielle en temps réel pour le texte de recherche de l'utilisateur.

Supposons que le texte de recherche de l'utilisateur soit "pink color, casual, pure cotton tops for women".

Pour trouver des correspondances pour cette requête, exécutez la requête SQL suivante:

SELECT
id
,
category
,
sub_category
,
content
,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding
<=> embedding('text-embedding-005',
 
'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;

Examinons cette requête en détail:

Dans cette requête,

  1. Le texte de recherche de l'utilisateur est: "I want womens tops, pink casual only pure cotton."
  2. Nous convertissons ce texte de recherche en embeddings à l'aide de la méthode embedding() et du modèle text-embedding-005. Cette étape devrait vous sembler familière après la dernière, où nous avons appliqué la fonction d'encapsulation à tous les éléments du tableau.
  3. "<=>" représente l'utilisation de la méthode de distance COSINE SIMILARITY. Vous trouverez toutes les mesures de similarité disponibles dans la documentation de pgvector.
  4. Nous convertissons le résultat de la méthode d'embedding en type de données vecteur pour le rendre compatible avec les vecteurs stockés dans la base de données.
  5. LIMIT 5 indique que nous souhaitons extraire cinq voisins les plus proches du texte de recherche.

Voici un exemple de réponse à cette requête SQL:

4193a68737400535.png

Comme vous pouvez le constater dans vos résultats, les correspondances sont assez proches du texte de recherche. Essayez de modifier la couleur pour voir comment les résultats changent.

Indice ScaNN AlloyDB pour les performances des requêtes

Supposons maintenant que nous souhaitions améliorer les performances (temps de requête), l'efficacité et la mémorisation de ce résultat de recherche vectorielle à l'aide de l'index ScaNN.

Si vous souhaitez utiliser l'index ScaNN, procédez comme suit:

  1. Étant donné que le cluster, l'instance, le contexte et les représentations vectorielles continues sont déjà créés, il nous suffit d'installer l'extension ScaNN à l'aide de l'instruction suivante:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. Créez l'index ScaNN:
CREATE INDEX apparel_index ON apparels
USING scann
(embedding cosine)
WITH
(num_leaves=54);

Dans le script DDL ci-dessus:

  • apparel_index est le nom de l'index.
  • apparels est le nom de la table.
  • scann est la méthode d'indexation.
  • embedding correspond à la colonne de la table que vous souhaitez indexer.
  • cosine correspond à la méthode de calcul de la distance que vous souhaitez utiliser avec l'index.
  • 54 est le nombre de partitions à appliquer à cet indice. Définissez cette valeur sur une valeur comprise entre 1 et 1048576. Pour savoir comment déterminer cette valeur, consultez Configurer un indice ScaNN.

Conformément à la recommandation du dépôt de code de SCANN, nous avons utilisé la RACINE CARREE du nombre de points de données. Lors du partitionnement, num_leaves doit correspondre à peu près à la racine carrée du nombre de points de données.

  1. Vérifiez si l'index est créé à l'aide de la requête:
SELECT * FROM pg_stat_ann_indexes;
  1. Effectuez une recherche vectorielle à l'aide de la même requête que celle utilisée sans l'index:
select * from apparels
   ORDER BY embedding
<=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
   LIMIT
20

La requête ci-dessus est la même que celle que nous avons utilisée à l'étape 8 de l'atelier. Toutefois, le champ est maintenant indexé à l'aide de l'index ScaNN.

  1. Testez avec une requête de recherche simple avec et sans l'index. Pour effectuer des tests sans index, vous devez supprimer l'index:

white tops for girls without any print

Le texte de recherche ci-dessus dans la requête Vector Search sur les données d'embedding INDEXÉES génère des résultats de recherche de qualité et une efficacité. L'efficacité est considérablement améliorée (en termes de temps d'exécution: 10,37 ms sans ScaNN et 0,87 ms avec ScaNN) avec l'index. Pour en savoir plus à ce sujet, consultez cet article de blog.

9. Validation des correspondances avec le LLM

Avant de passer à la création d'un service permettant de renvoyer les meilleures correspondances à une application, utilisons un modèle d'IA générative pour vérifier si ces réponses potentielles sont vraiment pertinentes et si elles peuvent être partagées avec l'utilisateur.

Vérifier que l'instance est configurée pour Gemini

  1. Vérifiez que google_ml_integration est déjà activé pour votre cluster et votre instance. Dans AlloyDB Studio, exécutez la commande suivante:
show google_ml_integration.enable_model_support;

Si la valeur affichée est "on" (Activé), vous pouvez ignorer les deux étapes suivantes et passer directement à la configuration.

l'intégration d'AlloyDB et du modèle Vertex AI.

  1. Accédez à l'instance principale de votre cluster AlloyDB, puis cliquez sur MODIFIER L'INSTANCE PRINCIPALE.

456ffdf292d3c0e0.png

  1. Dans Options de configuration avancées, développez la section Nouvel indicateur de base de données et assurez-vous que google_ml_integration.enable_model_support flag est défini sur "on" comme suit:

6a59351fcd2a9d35.png 3. Si la valeur n'est pas "on", définissez-la sur "on", puis cliquez sur UPDATE INSTANCE (METTRE À JOUR L'INSTANCE).

Cette étape prend quelques minutes.

Intégration d'AlloyDB et de Vertex AI Model

Vous pouvez maintenant vous connecter à AlloyDB Studio et exécuter l'instruction DML suivante pour configurer l'accès au modèle Gemini à partir d'AlloyDB, en utilisant votre ID de projet là où il est indiqué. Vous pouvez être averti d'une erreur de syntaxe avant d'exécuter la commande, mais celle-ci devrait s'exécuter correctement.

  1. Dans la console Google Cloud, accédez à AlloyDB. Sélectionnez le cluster principal, puis cliquez sur AlloyDB Studio dans le panneau de navigation de gauche.
  2. Nous allons utiliser la gemini-1.5-pro:generateContent disponible par défaut avec l'extension google_ml_integration. cdb5af753a625777.png
  3. Vous pouvez vérifier les modèles configurés pour l'accès à l'aide de la commande suivante dans AlloyDB Studio:
select model_id,model_type from google_ml.model_info_view;        
  1. Accordez aux utilisateurs de la base de données l'autorisation d'exécuter la fonction ml_predict_row pour exécuter des prédictions à l'aide des modèles Google Vertex AI en exécutant la commande suivante:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;

Évaluer les réponses

Nous allons utiliser une grande requête pour la section suivante, où nous allons transférer l'application vers Cloud Run. Pour nous assurer que les réponses de la requête sont raisonnables, la requête peut être difficile à comprendre.

Nous allons examiner les sections individuelles qui permettent de créer la requête plus large que nous utilisons finalement.

  1. Nous commençons par envoyer une requête à la base de données pour obtenir les cinq correspondances les plus proches d'une requête utilisateur. Nous codons en dur la requête pour simplifier les choses, mais ne vous inquiétez pas, nous l'interpolerons dans la requête plus tard.

Nous incluons la description du produit de la table apparels et ajoutons deux nouveaux champs : l'un combinant la description avec l'index et l'autre avec la requête d'origine. Ces données sont enregistrées dans une table appelée xyz, qui est un nom de table temporaire.

CREATE TABLE
 xyz AS
SELECT
 id || ' - ' || pdt_desc AS literature,
 pdt_desc AS content,
 'I want womens tops, pink casual only pure cotton.' AS  user_text
FROM
 apparels
ORDER BY
 embedding <=> embedding('text-embedding-005',
   'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
 5;

Le résultat de cette requête sera les cinq lignes les plus similaires à la requête de l'utilisateur. Le

La nouvelle table xyz contiendra cinq lignes, chacune contenant les colonnes suivantes:

  • literature
  • content
  • user_text
  1. Pour déterminer la validité des réponses, nous allons utiliser une requête complexe dans laquelle nous expliquons comment les évaluer. Elle utilise user_text et content dans la table xyz dans le cadre de la requête.
"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. À l'aide de cette requête, nous examinerons ensuite la "qualité" des réponses dans la table xyz. Par "bonté", nous entendons la justesse des réponses générées par rapport à ce que nous attendons d'elles.
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. predict_row renvoie son résultat au format JSON. Le code "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'" permet d'extraire le texte réel de ce fichier JSON. Pour afficher le code JSON réel renvoyé, vous pouvez supprimer ce code.
  2. Enfin, pour obtenir le champ LLM, il vous suffit de l'extraire du tableau x:
SELECT 
LLM_RESPONSE
FROM
        x
;
  1. Vous pouvez combiner ces requêtes en une seule comme suit:

Avertissement: Si vous avez exécuté les requêtes ci-dessus pour vérifier les résultats intermédiaires,

assurez-vous de supprimer les tables xyz et x de la base de données AlloyDB avant d'exécuter cette requête ;

SELECT
 LLM_RESPONSE
FROM (
 SELECT
 json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
     request_body => CONCAT('{
     "contents": [
       { "role": "user",
         "parts":
            [ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
            } ]
        }
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
   FROM (
         SELECT
           id || ' - ' || pdt_desc AS literature,
           pdt_desc AS content,
         'I want womens tops, pink casual only pure cotton.' user_text
         FROM
           apparels
         ORDER BY
             embedding <=> embedding('text-embedding-005',
             'I want womens tops, pink casual only pure cotton.')::vector
         LIMIT
           5 ) AS xyz ) AS X;

La requête plus longue est une combinaison de toutes les requêtes que nous avons exécutées dans les étapes précédentes. Les résultats indiquent s'il existe une correspondance ou non, le pourcentage de correspondance et une explication de la classification.

Notez que le streaming est activé par défaut pour le modèle Gemini. La réponse réelle est donc répartie sur plusieurs lignes: 14e74d71293b7b9.png

10. Déployer l&#39;application sur le Web

Nous allons maintenant héberger cette application afin qu'elle soit accessible depuis Internet.

Créer la fonction Cloud Run

  1. Dans la console Google Cloud, accédez à Cloud Run Functions à l'aide du lien suivant:

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

  1. Dans "Configurer", définissez le nom de la fonction sur retail-engine et sélectionnez la région us-central1.
  2. Dans "URL du point de terminaison", sélectionnez Java 17 comme environnement d'exécution.
  3. Dans "Authentification", cochez Autoriser les appels non authentifiés.
  4. Développez Conteneur(s), volumes, mise en réseau et sécurité, puis cliquez sur l'onglet Mise en réseau.
  5. Sélectionnez Se connecter à un VPC pour le trafic sortant, puis cliquez sur Utiliser des connecteurs d'accès VPC sans serveur.
  6. Dans "Réseau", cliquez sur Ajouter un connecteur VPC. Activez l'API Serverless VPC Access, si ce n'est pas déjà fait.
  7. Dans "Créer un connecteur", définissez le nom sur alloydb-test-conn.
  8. Définissez la région sur us-central.
  9. Laissez la valeur de Network (Réseau) sur default (par défaut) et définissez Subnet (Sous-réseau) sur Custom IP Range (Plage d'adresses IP personnalisée) avec la plage d'adresses IP 10.8.0.0 ou une autre plage disponible.
  10. Développez les paramètres Afficher la mise à l'échelle, puis définissez Instances minimales sur 2 et Instances maximales sur 3.
  11. Sélectionnez f1-micro comme type d'instance. Vous trouverez ci-dessous les options de création de connecteur:

bed4b2af6795a8ba.png

  1. Cliquez sur "Créer" pour créer le connecteur.
  2. Dans "Routage du trafic", sélectionnez Acheminer tout le trafic vers le VPC.
  3. Cliquez sur Créer pour créer la fonction.

Déployer l'application

Une fois la fonction créée, mettez à jour la source et redéployez l'application.

  1. Dans Cloud Run, cliquez sur l'onglet Services, puis sur la fonction retail-engine.
  2. Cliquez sur l'onglet "Source". Laissez le point d'entrée de la fonction par défaut défini sur "gcfv2.HelloHttpFunction".
  3. Remplacez le contenu du fichier HelloHttpFunction.java par le contenu de ce fichier Java.
  4. Modifiez les détails de AlloyDbJdbcConnector dans le fichier en fonction des détails de votre instance et de votre cluster AlloyDB. Remplacez $PROJECT_ID par l'ID de projet de votre cluster et de votre instance AlloyDB.

a89dc5af3580fbcf.png

  1. Remplacez le contenu du fichier pom.xml par le contenu de ce fichier XML.
  2. Cliquez sur Enregistrer et redéployer pour déployer la fonction.

11. Tester l&#39;application du moteur de vente au détail

Une fois la fonction Cloud mise à jour déployée, le point de terminaison doit s'afficher au format suivant:

https://retail-engine-PROJECT_NUMBER.us-central1.run.app

Vous pouvez le tester depuis le terminal Cloud Shell en exécutant la commande suivante:

gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'

Vous pouvez également tester la fonction Cloud Run comme suit:

PROJECT_ID=$(gcloud config get-value project)

curl
-X POST https://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
 
-H 'Content-Type: application/json' \
 
-d '{"search":"I want some kids clothes themed on Disney"}' \
 
| jq .

Et le résultat:

88bc1ddfb5644a28.png

Maintenant que nous avons effectué une recherche vectorielle de similarité à l'aide du modèle d'embeddings sur les données AlloyDB, nous pouvons passer à la création de l'application qui utilise ces embeddings avec votre image et qui vous invite à générer des suggestions de style.

12. Comprendre le parcours de recommandation de tenues

L'application de recommandation de tenues est une application de démarrage de sprint configurée pour fonctionner avec les représentations vectorielles continues que nous avons créées dans l'application du moteur de commerce AlloyDB, ainsi qu'avec Gemini et Imagen pour générer des options de style visuel pour les tenues. Vous pouvez également ajouter des invites personnalisées et improviser la recommandation.

Imaginons que vous importiez dans cette application une image d'un haut rose vif de votre garde-robe. Lorsque vous cliquez sur "Afficher", l'application génère plusieurs options correspondant à l'image d'origine en fonction de l'invite définie dans le code de l'application et des représentations vectorielles continues de la base de données AlloyDB. Vous vous demandez à quoi ressembleraient les options suggérées avec un collier bleu. Vous ajoutez donc une invite sur ces lignes et cliquez sur "Style". L'image finale est générée et combine la puissance de l'image d'origine et des recommandations pour créer une tenue assortie.

Pour commencer à créer l'application de recommandation de tenues, procédez comme suit:

  1. Dans Cloud Run, ouvrez l'application retail-engine et notez l'URL de votre application. Il s'agit du dépôt d'embeddings que nous utiliserons pour générer des suggestions similaires.
  2. Dans votre IDE, clonez le dépôt https://github.com/AbiramiSukumaran/outfit-recommender/. Pour cet exercice, les étapes présentées sont effectuées dans l'IDE Visual Studio Code.
git clone https://github.com/AbiramiSukumaran/outfit-recommender/

Voici quelques-uns des fichiers importants du répertoire de l'application:

  • src/main: répertoire source où se trouvent les fichiers d'application et le code HTML:
  • HelloWorldApplication.java: point d'entrée principal de l'application Spring Boot.
  • HelloWorldController.java: contrôleur REST Spring Boot qui gère les requêtes HTTP liées à une application de recommandation de tenues. Ce fichier gère les requêtes GET et POST, traite les requêtes de l'utilisateur, analyse les images, interagit avec les représentations vectorielles continues AlloyDB et renvoie la réponse finale à l'UI. Ce contrôleur appelle la classe GenerateImageSample.
  • GenerateImageSample.java: contient la classe de génération d'images qui se connecte à Vertex AI, met en forme l'invite utilisateur, effectue des appels d'API au modèle Imagen et renvoie l'image prédite à la classe de contrôleur.
  • Resources: ce répertoire contient les images et les fichiers HTML nécessaires à la génération de l'interface utilisateur de l'application.
  • Pom.xml: définit les dépendances et les configurations du projet.
  1. Dans le code Visual Studio, ouvrez HelloWorldController.java et mettez à jour les instances de l'ID de projet et de l'emplacement en fonction de l'emplacement de votre instance AlloyDB.

9fff8f5cbb62567.png

  1. Remplacez endpoint par l'URL de l'application du moteur de commerce que vous avez hébergée précédemment.

ae6227e88eec5485.png

  1. Ouvrez GenerateImageSample.java, puis modifiez l'ID du projet et l'emplacement en fonction de l'emplacement de votre instance AlloyDB.

db1f81a6f51d80de.png

  1. Enregistrez tous les fichiers.

Nous allons maintenant déployer cette application dans l'environnement d'exécution sans serveur Cloud Run.

13. Publier l&#39;application sur le Web

Maintenant que nous avons ajouté le projet, l'emplacement et les détails de l'application du moteur de vente au détail à l'application de recommandation de tenues Spring Boot, nous pouvons la déployer sur Cloud Run.

Nous allons utiliser la commande gcloud run deploy dans le terminal Visual Studio Code pour déployer l'application. Pour Visual Studio Code, vous pouvez installer l'extension Google Cloud Code pour commencer à utiliser la gcloud CLI.

Pour déployer l'application, procédez comme suit:

  1. Dans votre IDE, ouvrez le répertoire cloné et démarrez le terminal. Pour Visual Code Studio, cliquez sur Terminal > New Terminal (Terminal > Nouveau terminal).
  2. Suivez les instructions de ce document pour installer la CLI gcloud.
  3. Si vous utilisez Visual Studio Code, cliquez sur Extensions, recherchez Google Cloud Code, puis installez l'extension.
  4. Dans le terminal de votre IDE, authentifiez votre compte Google en exécutant la commande suivante:
gcloud auth application-default login
  1. Définissez votre ID de projet sur le même projet que votre instance AlloyDB.
gcloud config set project PROJECT_ID
  1. Démarrez le processus de déploiement.
gcloud run deploy
  1. Dans Source code location, appuyez sur Entrée pour sélectionner le répertoire GitHub cloné.
  2. Dans Service name, saisissez un nom pour le service, par exemple "recommandateur de tenues", puis appuyez sur Entrée.
  3. Dans Please specify a region, saisissez l'emplacement où sont hébergés votre instance AlloyDB et votre application retail-engine, par exemple 32 pour us-central1, puis appuyez sur Entrée.

12c0de4248660d4d.png

  1. Dans Allow unauthenticated invocations to [..], saisissez Y, puis appuyez sur Entrée.

L'image suivante montre la progression du déploiement de votre application:

1babbb82faa31fce.png

14. Tester l&#39;application de recommandation de tenues

Une fois l'application déployée sur Cloud Run, vous pouvez voir le service dans la console Google Cloud comme suit:

  1. Dans la console Google Cloud, accédez à Cloud Run.
  2. Dans "Services", cliquez sur le service recommandateur de tenues que vous avez déployé. Vous devriez voir le service retail-engine et le service outfit-recommender comme suit:

24dd0aebe224059e.png

  1. Cliquez sur l'URL de l'application pour ouvrir l'interface utilisateur de l'application de recommandation.

cdc9c1625b1648d2.png

    The following is a sample URL that you will use:

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

L'application déployée se présente comme suit:

76245d1a6152d313.png

Utiliser l'application

Pour commencer à utiliser l'application, procédez comme suit:

  1. Cliquez sur Importer, puis importez une photo d'un vêtement.
  2. Une fois l'image importée, cliquez sur Style. L'application utilise l'image comme invite et génère des options en bas de l'écran en fonction de l'invite de l'application de moteur de vente au détail qui inclut des représentations vectorielles continues pour l'ensemble de données de vente au détail.

L'application génère des suggestions d'images ainsi qu'une requête basée sur l'image avec des recommandations de style. Par exemple : A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.

  1. Vous pouvez transmettre des invites supplémentaires à cette recommandation de style générée automatiquement. Par exemple : STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
  2. Cliquez sur Afficher pour voir le style final.

38d6d08e9a0a44c0.png

15. Effectuer un nettoyage

Pour éviter que les ressources utilisées dans cet article soient facturées sur votre compte Google Cloud, procédez comme suit:

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.
  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

16. Félicitations

Félicitations ! Vous avez effectué une recherche de similarité à l'aide d'AlloyDB, de pgvector et de Vector Search, et utilisé le résultat de la recherche avec le puissant modèle Imagen pour générer des recommandations de style.