Condividi tramite


Esercitazione: Creare una ricerca semantica con Database di Azure per PostgreSQL e Azure OpenAI

Questa esercitazione pratica illustra come creare un'applicazione di ricerca semantica usando Database di Azure per PostgreSQL e Azure OpenAI.

La ricerca semantica esegue ricerche basate sulla semantica. La ricerca lessicale standard esegue ricerche basate su parole chiave fornite in una query. Ad esempio, il set di dati delle ricette potrebbe non contenere etichette come senza glutine, vegano, senza latte, senza frutta o dessert, ma queste caratteristiche possono essere dedotti dagli ingredienti. L'idea è quella di emettere query semantiche e ottenere risultati di ricerca pertinenti.

In questa esercitazione, farai:

  • Identificare gli scenari di ricerca e i campi dati che verranno coinvolti in una ricerca.
  • Per ogni campo dati coinvolto in una ricerca, creare un campo vettore corrispondente per archiviare gli incorporamenti del valore archiviato nel campo dati.
  • Generare incorporamenti per i dati nei campi dati selezionati e archiviare gli incorporamenti nei relativi campi vettoriali corrispondenti.
  • Generare l'incorporamento per qualsiasi query di ricerca di input.
  • Cercare il campo dei dati vettoriali ed elencare i vicini più vicini.
  • Eseguire i risultati tramite modelli di pertinenza, classificazione e personalizzazione appropriati per produrre la classificazione finale. In assenza di tali modelli, classificare i risultati in diminuzione dell'ordine di punti-prodotto.
  • Monitorare il modello, la qualità dei risultati e le metriche aziendali, ad esempio la frequenza click-through e il tempo di attesa. Incorporare meccanismi di feedback per eseguire il debug e migliorare lo stack di ricerca, dalla qualità dei dati, dall'aggiornamento dei dati e dalla personalizzazione all'esperienza utente.

Prerequisiti

  1. Creare un account OpenAI e richiedere l'accesso ad Azure OpenAI.
  2. Concedere l'accesso ad Azure OpenAI nella sottoscrizione desiderata.
  3. Concedere le autorizzazioni di accesso per creare risorse Azure OpenAI e distribuire modelli.
  4. Creare e distribuire una risorsa OpenAI di Azure e un modello. Distribuire il modello di incorporamento text-embedding-ada-002. ** Copia il nome della distribuzione, poiché è necessario per creare embedding.

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 aggiungerli all'elenco elementi consentiti. Assicurarsi che siano stati aggiunti correttamente eseguendo SHOW azure.extensions;.

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

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

Configurare un endpoint e una chiave OpenAI

Nei servizi AI di Azure, sotto Gestione Risorse>Chiavi ed Endpoint, è possibile trovare l'endpoint e le chiavi per la risorsa di Intelligenza Artificiale di Azure. 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>');

Scarica dati

Scaricare i dati da Kaggle.

Creare la tabella

Connettersi al server e creare un test database. In tale database usare il comando seguente per creare una tabella in cui verranno importati i dati:

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 Windows-1252.

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

Aggiungere una colonna di incorporamento alla tabella:

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Generare incorporamenti

Generare embedding per i tuoi dati usando l'estensione azure_ai. L'esempio seguente vettorizza alcuni campi ed è concatenato.

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

Provare a usare il LIMIT valore . Se il valore è elevato, l'istruzione potrebbe interrompersi a metà a causa della limitazione imposta da Azure OpenAI. Se l'istruzione ha esito negativo, attendere almeno un minuto ed eseguire di nuovo il comando.

Creare una funzione di ricerca nel database per praticità:

create function
    recipe_search(searchQuery text, numResults int)
returns table(
            recipeId int,
            recipe_name text,
            nutrition text,
            score real)
as $$
declare
    query_embedding vector(1536);
begin
    query_embedding := (azure_openai.create_embeddings('text-embedding-ada-002', searchQuery));
    return query
    select
        r.rid,
        r.recipe_name,
        r.nutrition,
        (r.embedding <=> query_embedding)::real as score
    from
        recipes r
    order by score asc limit numResults; -- cosine distance
end $$
language plpgsql;

Ora è sufficiente richiamare la funzione per eseguire la ricerca:

select recipeid, recipe_name, score from recipe_search('vegan recipes', 10);

Esplorare quindi i risultati:

 recipeid |                         recipe_name                          |   score
----------+--------------------------------------------------------------+------------
      829 | Avocado Toast (Vegan)                                        | 0.15672222
      836 | Vegetarian Tortilla Soup                                     | 0.17583494
      922 | Vegan Overnight Oats with Chia Seeds and Fruit               | 0.17668104
      600 | Spinach and Banana Power Smoothie                            |  0.1773768
      519 | Smokey Butternut Squash Soup                                 | 0.18031077
      604 | Vegan Banana Muffins                                         | 0.18287598
      832 | Kale, Quinoa, and Avocado Salad with Lemon Dijon Vinaigrette | 0.18368931
      617 | Hearty Breakfast Muffins                                     | 0.18737361
      946 | Chia Coconut Pudding with Coconut Milk                       |  0.1884186
      468 | Spicy Oven-Roasted Plums                                     | 0.18994217
(10 rows)