Sdílet prostřednictvím


Systém doporučení s flexibilním serverem Azure Database for PostgreSQL a Azure OpenAI

PLATÍ PRO: Flexibilní server Azure Database for PostgreSQL

V tomto praktickém kurzu se dozvíte, jak vytvořit doporučovací aplikaci pomocí flexibilního serveru Azure Database for PostgreSQL a služby Azure OpenAI. Doporučení mají aplikace v různých doménách – poskytovatelé služeb často poskytují doporučení pro produkty a služby, které nabízejí, na základě předchozí historie a kontextových informací shromážděných ze zákazníka a prostředí.

Systémy doporučení můžete modelovat různými způsoby. Tento článek se zabývá nejjednodušším formulářem – doporučením založeným na jednom produktu odpovídajícím, například předchozímu nákupu. V tomto kurzu se používá datová sada receptu použitá v článku o sémantickém vyhledávání a doporučení je pro recepty založené na receptu, který si zákazník oblíbil nebo hledal dříve.

Požadavky

  1. Vytvořte účet OpenAI a požádejte o přístup ke službě Azure OpenAI.
  2. Udělte přístup k Azure OpenAI v požadovaném předplatném.
  3. Udělte oprávnění k vytváření prostředků Azure OpenAI a nasazení modelů.

Vytvořte a nasaďte prostředek služby Azure OpenAI a model a nasaďte model pro vložení textu-embedding-ada-002. Zkopírujte název nasazení, protože je potřeba k vytvoření vkládání.

Povolení a azure_ai pgvector rozšíření

Než budete moct povolit a používat azure_ai instanci flexibilního serveru Azure Database for PostgreSQL, musíte je přidat do seznamu povolených, jak je popsáno v tom, jak používat rozšíření PostgreSQL, a zkontrolovat, jestli je správně přidaný spuštěním SHOW azure.extensions;.pgvector

Rozšíření pak můžete nainstalovat tak, že se připojíte k cílové databázi a spustíte příkaz CREATE EXTENSION . Tento příkaz je potřeba opakovat zvlášť pro každou databázi, ve které má být rozšíření dostupné.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

Konfigurace koncového bodu OpenAI a klíče

Ve službách Azure AI v části Klíče správy>prostředků a koncové body najdete koncový bod a klíče pro prostředek Azure AI. Pomocí koncového bodu a jednoho z klíčů povolte azure_ai rozšíření k vyvolání nasazení 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>');

Stažení a import dat

  1. Stáhněte si data z Kaggle.
  2. Připojte se k serveru a vytvořte test databázi a v ní vytvořte tabulku, ve které importujete data.
  3. Import dat
  4. Přidejte do tabulky vložený sloupec.
  5. Vygenerujte vložené možnosti.
  6. Vyhledat

Vytvoření tabulky

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

Import dat

Nastavte v okně klienta následující proměnnou prostředí, která nastaví kódování na utf-8. Tento krok je nezbytný, protože tato konkrétní datová sada používá kódování WIN1252.

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

Importujte data do vytvořené tabulky; Všimněte si, že tato datová sada obsahuje řádek záhlaví:

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

Přidání sloupce pro uložení vložených objektů

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Generování vložených objektů

Generování vkládání dat pomocí rozšíření azure_ai V následujícím příkladu vektorizujeme několik různých polí, zřetězených:

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;

Opakujte příkaz, dokud nebudou k dispozici žádné další řádky ke zpracování.

Tip

Pohrajte si s .LIMIT S vysokou hodnotou může příkaz selhat v polovině kvůli omezování, které azure OpenAI vynucuje. Pokud selže, počkejte aspoň jednu minutu a spusťte příkaz znovu.

Vytvořte ve své databázi funkci vyhledávání, která vám vyhovuje:

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;

Teď stačí vyvolat funkci a vyhledat doporučení:

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

A prozkoumejte výsledky:

            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)