Bagikan melalui


Tutorial: Membuat sistem rekomendasi dengan Azure Database for PostgreSQL dan Azure OpenAI

Tutorial langsung ini menunjukkan kepada Anda cara membuat aplikasi pemberi rekomendasi dengan menggunakan Azure Database for PostgreSQL dan Azure OpenAI. Rekomendasi dapat diterapkan di berbagai domain. Penyedia layanan cenderung memberikan rekomendasi untuk produk dan layanan yang mereka tawarkan berdasarkan riwayat sebelumnya dan informasi kontekstual yang dikumpulkan dari pelanggan dan lingkungan.

Ada berbagai cara untuk memodelkan sistem rekomendasi. Tutorial ini mengeksplorasi bentuk paling sederhana: rekomendasi berdasarkan produk yang sesuai dengan (misalnya) pembelian sebelumnya. Tutorial ini menggunakan himpunan data resep yang digunakan tutorial untuk pencarian semantik . Rekomendasi diberikan untuk resep yang didasarkan pada resep yang disukai atau dicari oleh pelanggan di masa lalu.

Prasyarat

  1. Buat akun OpenAI dan minta akses ke Azure OpenAI.
  2. Berikan akses ke Azure OpenAI dalam langganan yang diinginkan.
  3. Berikan izin untuk membuat sumber daya Azure OpenAI dan untuk menyebarkan model.
  4. Membuat dan menyebarkan sumber daya Azure OpenAI dan model. Terapkan model embedding text-embedding-ada-002. Salin nama deploisinya, karena Anda memerlukannya untuk membuat embedding.

Mengaktifkan ekstensi azure_ai dan pgvector

Sebelum dapat mengaktifkan azure_ai dan pgvector pada instans server fleksibel Azure Database for PostgreSQL, Anda perlu menambahkannya ke daftar yang diizinkan. Pastikan bahwa mereka ditambahkan dengan benar dengan menjalankan SHOW azure.extensions;.

Kemudian Anda dapat menginstal ekstensi dengan menyambungkan ke database target Anda dan menjalankan perintah CREATE EXTENSION . Ulangi perintah secara terpisah untuk setiap database tempat Anda ingin ekstensi tersedia.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

Mengonfigurasi titik akhir dan kunci OpenAI

Di layanan Azure AI, di bawah Kunci Manajemen >dan Titik Akhir, Anda dapat menemukan titik akhir dan kunci untuk sumber daya Azure AI Anda. Gunakan titik akhir dan salah satu kunci untuk mengaktifkan azure_ai ekstensi untuk memanggil penyebaran model:

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

Mengunduh data

Unduh data dari Kaggle.

Membuat tabel

Sambungkan ke server Anda dan buat test database. Dalam database tersebut, gunakan perintah berikut untuk membuat tabel tempat Anda akan mengimpor data:

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

Impor data

Atur variabel lingkungan berikut pada jendela klien untuk mengatur pengodean ke UTF-8. Langkah ini diperlukan karena himpunan data khusus ini menggunakan pengodean Windows-1252.

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

Impor data ke dalam tabel yang Anda buat. Perhatikan bahwa himpunan data ini berisi baris header.

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

Menambahkan kolom untuk menyimpan penyematan

Tambahkan kolom penyematan ke tabel:

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Hasilkan penyematan

Buat embedding untuk data Anda dengan menggunakan ekstensi azure_ai. Contoh berikut mem-vektorisasi beberapa bidang dan digabungkan.

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;

Ulangi perintah hingga tidak ada lagi baris yang akan diproses.

Petunjuk / Saran

Bermain-main dengan nilainya LIMIT . Dengan nilai yang tinggi, pernyataan mungkin gagal di pertengahan proses karena pembatasan yang diberlakukan oleh Azure OpenAI. Jika pernyataan gagal, tunggu setidaknya satu menit dan jalankan perintah lagi.

Buat fungsi pencarian di database Anda untuk kenyamanan:

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;

Sekarang cukup panggil fungsi untuk mencari rekomendasi:

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

Dan jelajahi hasilnya:

            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)