Système de recommandation avec le serveur flexible Azure Database pour PostgreSQL et Azure OpenAI
S’APPLIQUE À : Azure Database pour PostgreSQL : serveur flexible
Ce tutoriel pratique vous montre comment créer une application de recommandation à l’aide du serveur flexible Azure Database pour PostgreSQL et d’Azure OpenAI Service. 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. Cet article explore la recommandation la plus simple basée sur un produit correspondant, par exemple, à un achat antérieur. Ce tutoriel utilise le jeu de données de recettes utilisé dans l’article sur la Recherche sémantique et la recommandation cible des recettes en fonction d’une recette que le client a aimée ou recherchée auparavant.
Prérequis
- Créez un compte OpenAI et demandez l’accès à Azure OpenAI Service.
- Permettez d’accéder à Azure OpenAI dans l’abonnement souhaité.
- Octroyez des autorisations pour créer des ressources Azure OpenAI et déployer des modèles.
Créez et déployez une ressource Azure OpenAI Service et un modèle, déployez le modèle d’incorporations text-embedding-ada-002. Copiez le nom du déploiement, car il est nécessaire pour créer des incorporations.
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 comme décrit dans comment utiliser les extensions PostgreSQL, puis vérifier s’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. Vous devez répéter 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 le point de terminaison OpenAI et la clé
Dans les services Azure AI, sous Gestion des ressources>Clés et points de terminaison, vous trouverez les points de terminaison et clés de votre ressource Azure AI. Utilisez le point de terminaison et l’une des clés pour activer l’extension azure_ai
afin d’appeler le modèle de déploiement.
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, puis importer les données
- Téléchargez les données à partir de Kaggle.
- Connectez-vous à votre serveur, créez une base de données
test
, puis créez dedans un tableau dans lequel vous importerez les données. - Importer les données.
- Ajoutez une colonne d’incorporation au tableau.
- Générez les incorporations.
- Rechercher.
Créer la table
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 WIN1252.
Rem on Windows
Set PGCLIENTENCODING=utf-8;
# on Unix based operating systems
export PGCLIENTENCODING=utf-8
Importez les données dans la table créée et 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
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. Dans ce qui suit, nous vectorisons plusieurs champs, concaténés :
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
Expérimentez avec le LIMIT
. Avec une valeur élevée, l’instruction risque d’échouer à mi-chemin en raison de la limitation imposée par Azure OpenAI. En cas d’échec, attendez au moins une minute, puis 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)