Condividi tramite


Sistema di raccomandazioni con Database di Azure per PostgreSQL - Server flessibile e OpenAI di Azure

SI APPLICA A: Database di Azure per PostgreSQL - Server flessibile

Questa esercitazione pratica illustra come creare un'applicazione consigliata usando Database di Azure per PostgreSQL server flessibile e il servizio Azure OpenAI. Le raccomandazioni includono applicazioni in domini diversi: i provider di servizi tendono spesso a fornire raccomandazioni per i prodotti e i servizi offerti in base alla cronologia precedente e alle informazioni contestuali raccolte dal cliente e dall'ambiente.

Esistono diversi modi per modellare i sistemi di raccomandazione. Questo articolo illustra il formato più semplice, ovvero un prodotto basato su un prodotto corrispondente, ad esempio un acquisto precedente. Questa esercitazione usa il set di dati delle ricette usato nell'articolo Ricerca semantica e la raccomandazione è per le ricette basate su una che un cliente ha apprezzato o cercato in precedenza.

Prerequisiti

  1. Creare un account OpenAI e richiedere l'accesso al Servizio OpenAI di Azure.
  2. Concedere l'accesso ad Azure OpenAI nella sottoscrizione desiderata.
  3. Concedere le autorizzazioni di accesso per creare risorse Azure OpenAI e distribuire modelli.

Creare e distribuire una risorsa del servizio OpenAI di Azure e un modello, distribuire il modello di incorporamento di testo-embedding-ada-002. Copiare il nome della distribuzione in base alle esigenze per creare incorporamenti.

Abilitare le estensioni azure_ai e pgvector

Prima di poter abilitare azure_ai e pgvector nell'istanza del server flessibile di Database di Azure per PostgreSQL, è necessario aggiungerla all'elenco di elementi consentiti come descritto in Come usare le estensioni PostgreSQL e verificare se sono state aggiunte correttamente eseguendo SHOW azure.extensions;.

È quindi possibile installare l'estensione connettendosi al database di destinazione ed eseguendo il comando CREA ESTENSIONE. È necessario ripetere il comando separatamente per ogni database in cui si desidera che l'estensione sia disponibile.

CREATE EXTENSION azure_ai;
CREATE EXTENSION pgvector;

Configurare l'endpoint e la chiave OpenAI

Nei Servizi di Azure AI, in Gestione risorse>Chiavi ed endpoint è possibile trovare l'endpoint e le chiavi per la risorsa Azure per intelligenza artificiale. Usare l'endpoint e una delle chiavi per abilitare l'estensione azure_ai per richiamare la distribuzione del modello.

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

Scaricare e importare i dati

  1. Scaricare i dati da Kaggle.
  2. Connettersi al server, creare un database test e creare una tabella in cui verranno importati i dati.
  3. Importare i dati.
  4. Aggiungere una colonna di incorporamento alla tabella.
  5. Generare gli incorporamenti.
  6. Ricerca.

Creare la tabella

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) 
);

Importare i dati

Impostare la variabile di ambiente seguente nella finestra client per impostare la codifica su utf-8. Questo passaggio è necessario perché questo particolare set di dati usa la codifica WIN1252.

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

Importare i dati nella tabella creata; Si noti che questo set di dati contiene una riga di intestazione:

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

Aggiungere una colonna per archiviare gli incorporamenti

ALTER TABLE recipes ADD COLUMN embedding vector(1536); 

Generare incorporamenti

Generare incorporamenti per i dati usando l'estensione azure_ai. Nell'esempio seguente vengono vettorizzati alcuni campi diversi, concatenati:

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;

Ripetere il comando fino a quando non sono presenti altre righe da elaborare.

Suggerimento

Effettuare qualche prova con LIMIT. Con un valore elevato, l'istruzione potrebbe non riuscire a metà strada a causa della limitazione imposta da Azure OpenAI. Se ha esito negativo, attendere almeno un minuto ed eseguire di nuovo il comando.

Creare una funzione di ricerca nel database per praticità:

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; 

Ora è sufficiente richiamare la funzione per cercare la raccomandazione:

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

Esplorare quindi i risultati:

            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)

Passaggi successivi

Si è appreso come eseguire la ricerca semantica con il server flessibile di Database di Azure per PostgreSQL e Azure OpenAI.