Udostępnij za pośrednictwem


Samouczek: tworzenie systemu rekomendacji przy użyciu usług Azure Database for PostgreSQL i Azure OpenAI

DOTYCZY: Azure Database for PostgreSQL — serwer elastyczny

W tym samouczku praktycznym pokazano, jak utworzyć aplikację polecaną przy użyciu usług Azure Database for PostgreSQL i Azure OpenAI. Zalecenia znajdują zastosowanie w różnych obszarach. Dostawcy usług mają tendencję do dostarczania rekomendacji dotyczących produktów i usług oferowanych na podstawie wcześniejszej historii i kontekstowych informacji zebranych od klienta i środowiska.

Istnieją różne sposoby modelowania systemów rekomendacji. W tym samouczku przedstawiono najprostszą formę rekomendacji: opartą na produkcie zgodnym z (na przykład) poprzednim zakupem. Ten samouczek wykorzystuje zestaw danych przepisów, który jest także wykorzystywany w samouczku do wyszukiwania semantycznego. Zalecenie dotyczy przepisów na podstawie przepisu, który klient lubił lub szukał w przeszłości.

Wymagania wstępne

  1. Utwórz konto openAI i zażądaj dostępu do usługi Azure OpenAI.
  2. Udziel dostępu do usługi Azure OpenAI w żądanej subskrypcji.
  3. Udzielanie uprawnień do tworzenia zasobów usługi Azure OpenAI i wdrażania modeli.
  4. Tworzenie i wdrażanie zasobu usługi Azure OpenAI i modelu. Uruchom model osadzania text-embedding-ada-002. Skopiuj nazwę wdrożenia, ponieważ jest ona potrzebna do utworzenia embeddingów.

Włączanie rozszerzeń azure_ai i pgvector

Aby włączyć azure_ai i pgvector na elastycznym serwerze Azure Database for PostgreSQL, należy dodać je do listy dozwolonych adresów. Upewnij się, że zostały one poprawnie dodane, uruchamiając polecenie SHOW azure.extensions;.

Następnie możesz zainstalować rozszerzenie, łącząc się z docelową bazą danych i uruchamiając polecenie CREATE EXTENSION . Powtórz polecenie oddzielnie dla każdej bazy danych, w której ma być dostępne rozszerzenie.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

Skonfiguruj punkt końcowy i klucz OpenAI

W usługach azure AI w obszarze Klucze zarządzania>zasobami i punkty końcowe można znaleźć punkt końcowy i klucze dla zasobu usługi Azure AI. Użyj punktu końcowego i jednego z kluczy, aby umożliwić azure_ai rozszerzeniu wywoływanie wdrożenia modelu:

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

Pobieranie danych

Pobierz dane z narzędzia Kaggle.

Tworzenie tabeli

Połącz się z serwerem test i utwórz bazę danych. W tej bazie danych użyj następującego polecenia, aby utworzyć tabelę, w której zaimportujesz dane:

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

Importowanie danych

Ustaw następującą zmienną środowiskową w oknie klienta, aby ustawić kodowanie na UTF-8. Ten krok jest niezbędny, ponieważ ten konkretny zestaw danych używa kodowania Windows-1252.

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

Zaimportuj dane do utworzonej tabeli. Należy pamiętać, że ten zestaw danych zawiera wiersz nagłówka.

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

Dodawanie kolumny do przechowywania osadzania

Dodaj kolumnę osadzania do tabeli:

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Generowanie osadzania

Generuj wektory osadzające dla swoich danych, używając rozszerzenia azure_ai. Poniższy przykład wektoryzuje kilka pól, które są następnie połączone.

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;

Powtórz to polecenie, dopóki nie będzie więcej wierszy do przetworzenia.

Napiwek

Pobaw się wartością LIMIT. Przy wysokiej wartości, zapytanie może zakończyć się niepowodzeniem w połowie z powodu ograniczeń przepustowości nałożonych przez usługę Azure OpenAI. Jeśli instrukcja zakończy się niepowodzeniem, zaczekaj co najmniej minutę i ponownie uruchom polecenie.

Utwórz funkcję wyszukiwania w bazie danych dla wygody:

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;

Teraz po prostu wywołaj funkcję, aby wyszukać zalecenie:

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

Zapoznaj się z wynikami:

            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)