Partager via


Tutoriel : Créer un système de recommandation avec Azure Database pour PostgreSQL et Azure OpenAI

Ce tutoriel pratique vous montre comment créer une application de recommandation à l’aide d’Azure Database pour PostgreSQL et d’Azure OpenAI. Les recommandations ont des applications dans différents domaines. Les fournisseurs de services ont tendance à fournir des recommandations pour les produits et services qu’ils offrent en fonction de l’historique antérieur et des informations contextuelles collectées auprès du client et de l’environnement.

Il existe différentes façons de modéliser les systèmes de recommandation. Ce tutoriel explore la forme la plus simple : une recommandation basée sur un produit correspondant (par exemple) à un achat antérieur. Ce tutoriel utilise le jeu de données de recette que le didacticiel pour la recherche sémantique utilise. La recommandation est d’obtenir des recettes basées sur une recette que le client a aimé ou recherché dans le passé.

Prérequis

  1. Créez un compte OpenAI et demandez l’accès à Azure OpenAI.
  2. Permettez d’accéder à Azure OpenAI dans l’abonnement souhaité.
  3. Octroyez des autorisations pour créer des ressources Azure OpenAI et déployer des modèles.
  4. Créez et déployez une ressource Azure OpenAI et un modèle. Déployez le modèle d’intégration text-embedding-ada-002. Copiez le nom du déploiement, dont vous aurez besoin pour créer des embeddings.

Activer les extensions azure_ai et pgvector

Avant de pouvoir activer azure_ai et pgvector sur votre instance de serveur flexible Azure Database pour PostgreSQL, vous devez les ajouter à votre liste d'autorisation. Assurez-vous qu’ils sont correctement ajoutés en exécutant SHOW azure.extensions;.

Vous pouvez ensuite installer l’extension en vous connectant à votre base de données cible et en exécutant la commande CREATE EXTENSION . Répétez la commande séparément pour chaque base de données dans laquelle vous souhaitez que l’extension soit disponible.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

Configurer un point de terminaison et une clé OpenAI

Dans les services Azure AI, sous gestion des ressources>Clés et points de terminaison, vous pouvez trouver le point de terminaison et les clés de votre ressource Azure AI. Utilisez le point de terminaison et l’une des clés pour permettre à l’extension azure_ai d’appeler le déploiement du modèle :

select azure_ai.set_setting('azure_openai.endpoint','https://<endpoint>.openai.azure.com');
select azure_ai.set_setting('azure_openai.subscription_key', '<API Key>');

Télécharger les données

Téléchargez les données à partir de Kaggle.

Créer la table

Connectez-vous à votre serveur et créez une test base de données. Dans cette base de données, utilisez la commande suivante pour créer une table dans laquelle vous allez importer des données :

CREATE TABLE public.recipes(
    rid integer NOT NULL,
    recipe_name text,
    prep_time text,
    cook_time text,
    total_time text,
    servings integer,
    yield text,
    ingredients text,
    directions text,
    rating real,
    url text,
    cuisine_path text,
    nutrition text,
    timing text,
    img_src text,
    PRIMARY KEY (rid)
);

Importer les données

Définissez la variable d’environnement suivante dans la fenêtre cliente pour définir l’encodage sur UTF-8. Cette étape est nécessaire, car ce jeu de données particulier utilise l’encodage Windows-1252.

Rem on Windows
Set PGCLIENTENCODING=utf-8;
# on Unix based operating systems
export PGCLIENTENCODING=utf-8

Importez les données dans la table que vous avez créée. Notez que ce jeu de données contient une ligne d’en-tête.

psql -d <database> -h <host> -U <user> -c "\copy recipes FROM <local recipe data file> DELIMITER ',' CSV HEADER"

Ajouter une colonne pour stocker les incorporations

Ajoutez une colonne d'intégration au tableau :

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Générer des incorporations

Générez des incorporations pour vos données à l’aide de l’extension azure_ai . L’exemple suivant vectorise quelques champs et est concaténé.

WITH ro AS (
    SELECT ro.rid
    FROM
        recipes ro
    WHERE
        ro.embedding is null
        LIMIT 500
)
UPDATE
    recipes r
SET
    embedding = azure_openai.create_embeddings('text-embedding-ada-002', r.recipe_name||' '||r.cuisine_path||' '||r.ingredients||' '||r.nutrition||' '||r.directions)
FROM
    ro
WHERE
    r.rid = ro.rid;

Répétez la commande jusqu’à ce qu’il n’y ait plus de lignes à traiter.

Conseil

Jouez avec la valeur LIMIT. Avec une valeur élevée, l’instruction peut échouer à mi-chemin en raison de la limitation imposée par Azure OpenAI. Si l’instruction échoue, attendez au moins une minute et réexécutez la commande.

Créez une fonction de recherche dans votre base de données pour des raisons pratiques :

create function
    recommend_recipe(sampleRecipeId int, numResults int)
returns table(
            out_recipeName text,
            out_nutrition text,
            out_similarityScore real)
as $$
declare
    queryEmbedding vector(1536);
    sampleRecipeText text;
begin
    sampleRecipeText := (select
                            recipe_name||' '||cuisine_path||' '||ingredients||' '||nutrition||' '||directions
                        from
                            recipes where rid = sampleRecipeId);

    queryEmbedding := (azure_openai.create_embeddings('text-embedding-ada-002',sampleRecipeText));

    return query
    select
        distinct r.recipe_name,
        r.nutrition,
        (r.embedding <=> queryEmbedding)::real as score
    from
        recipes r
    order by score asc limit numResults; -- cosine distance
end $$
language plpgsql;

Maintenant, appelez tout simplement la fonction pour rechercher la recommandation :

select out_recipename, out_similarityscore from recommend_recipe(1, 20); -- search for 20 recipe recommendations that closest to recipeId 1

Puis explorez les résultats :

            out_recipename             | out_similarityscore
---------------------------------------+---------------------
 Apple Pie by Grandma Ople             |                   0
 Easy Apple Pie                        |          0.05137232
 Grandma's Iron Skillet Apple Pie      |         0.054287136
 Old Fashioned Apple Pie               |         0.058492836
 Apple Hand Pies                       |          0.06449003
 Apple Crumb Pie                       |          0.07290977
 Old-Fashioned Apple Dumplings         |         0.078374185
 Fried Apple Pies                      |          0.07918481
 Apple Pie Filling                     |         0.084320426
 Apple Turnovers                       |          0.08576391
 Dutch Apple Pie with Oatmeal Streusel |          0.08779895
 Apple Crisp - Perfect and Easy        |          0.09170883
 Delicious Cinnamon Baked Apples       |          0.09384012
 Easy Apple Crisp with Pie Filling     |          0.09477234
 Jump Rope Pie                         |          0.09503954
 Easy Apple Strudel                    |         0.095167875
 Apricot Pie                           |          0.09634114
 Easy Apple Crisp with Oat Topping     |          0.09708358
 Baked Apples                          |          0.09826993
 Pear Pie                              |         0.099974394
(20 rows)