Aracılığıyla paylaş


Öğretici: PostgreSQL için Azure Veritabanı ve Azure OpenAI ile öneri sistemi oluşturma

Bu uygulamalı öğreticide, PostgreSQL için Azure Veritabanı ve Azure OpenAI kullanarak nasıl bir öneri uygulaması oluşturabileceğiniz gösterilmektedir. Önerilerin farklı etki alanlarında uygulamaları vardır. Hizmet sağlayıcıları, müşteriden ve ortamdan toplanan geçmişe ve bağlamsal bilgilere dayanarak sundukları ürün ve hizmetler için öneriler sağlama eğilimindedir.

Öneri sistemlerini modellemenin çeşitli yolları vardır. Bu öğreticide en basit form inceleniyor: önceki bir satın alma işlemine karşılık gelen bir ürüne dayalı öneri. Bu öğreticide, anlamsal arama öğreticisinde kullanılan tarif veri kümesi kullanılır. Öneri, bir müşterinin geçmişte sevdiği veya arama yaptığı bir tarifi temel alan tarifler içindir.

Önkoşullar

  1. Bir OpenAI hesabı oluşturun ve Azure OpenAI'ye erişim isteyin.
  2. İstenen abonelikte Azure OpenAI'ye erişim izni verin.
  3. Azure OpenAI kaynakları oluşturma ve modelleri dağıtma izinleri verin.
  4. Azure OpenAI kaynağı ve modeli oluşturma ve dağıtma. Embeddings modelini text-embedding-ada-002 dağıtın. Eklemeler oluşturmak için ihtiyacınız olduğundan dağıtım adını kopyalayın.

azure_ai ve pgvector uzantılarını etkinleştirme

PostgreSQL için Azure Veritabanı esnek sunucu örneğinizi etkinleştirebilmeniz azure_aipgvector için önce bunları izin verilenler listenize eklemeniz gerekir. komutunu çalıştırarak SHOW azure.extensions;bunların doğru şekilde eklendiğinden emin olun.

Ardından hedef veritabanınıza bağlanıp CREATE EXTENSION komutunu çalıştırarak uzantıyı yükleyebilirsiniz. Uzantının kullanılabilir olmasını istediğiniz her veritabanı için komutu ayrı ayrı yineleyin.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

OpenAI uç noktasını ve anahtarını yapılandırma

Azure AI hizmetlerinde , Kaynak Yönetimi>Anahtarları ve Uç Noktaları altında Azure AI kaynağınızın uç noktasını ve anahtarlarını bulabilirsiniz. Uzantının model dağıtımını çağırmasını sağlamak azure_ai için uç noktayı ve anahtarlardan birini kullanın:

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

Verileri indirme

Kaggle'dan verileri indirin.

Tabloyu oluşturma

Sunucunuza bağlanın ve bir test veritabanı oluşturun. Bu veritabanında, verileri içeri aktaracağınız bir tablo oluşturmak için aşağıdaki komutu kullanın:

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

Verileri içeri aktarma

kodlamayı UTF-8 olarak ayarlamak için istemci penceresinde aşağıdaki ortam değişkenini ayarlayın. Bu veri kümesi Windows-1252 kodlaması kullandığından bu adım gereklidir.

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

Verileri oluşturduğunuz tabloya aktarın. Bu veri kümesinin üst bilgi satırı içerdiğini unutmayın.

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

Eklemeleri depolamak için sütun ekleme

Tabloya ekleme sütunu ekleyin:

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Eklemeler oluşturma

Uzantıyı azure_ai kullanarak verileriniz için eklemeler oluşturun. Aşağıdaki örnek birkaç alanı vektörleştirir ve birleştirilir.

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;

İşlenmek üzere başka satır kalmayıncaya kadar komutu yineleyin.

İpucu

Değeriyle LIMIT oynayın. Yüksek bir değer kullanıldığında, Azure OpenAI'nin uyguladığı kısıtlamalar nedeniyle ifade süreç sırasında başarısız olabilir. Deyimi başarısız olursa, en az bir dakika bekleyin ve komutu yeniden çalıştırın.

Kolaylık sağlamak için veritabanınızda bir arama işlevi oluşturun:

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;

Şimdi öneriyi aramak için işlevini çağırın:

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

Ve sonuçları keşfedin:

            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)