مشاركة عبر


البرنامج التعليمي: إنشاء نظام توصية باستخدام قاعدة بيانات Azure ل PostgreSQL وAzure OpenAI

يوضح لك هذا البرنامج التعليمي العملي كيفية إنشاء تطبيق التوصية باستخدام قاعدة بيانات Azure ل PostgreSQL وAzure OpenAI. التوصيات لها تطبيقات في مجالات مختلفة. يميل مقدمو الخدمات إلى تقديم توصيات للمنتجات والخدمات التي يقدمونها استنادا إلى التاريخ السابق والمعلومات السياقية التي يتم جمعها من العميل والبيئة.

هناك طرق مختلفة لنمذجة أنظمة التوصية. يستكشف هذا البرنامج التعليمي أبسط نموذج: توصية تستند إلى منتج يتوافق مع (على سبيل المثال) عملية شراء سابقة. يستخدم هذا البرنامج التعليمي مجموعة بيانات الوصفة التي يستخدمها البرنامج التعليمي للبحث الدلالي . التوصية هي للوصفات بناء على وصفة أعجب بها العميل أو بحث فيها في الماضي.

المتطلبات الأساسية

  1. إنشاء حساب OpenAI وطلب الوصول إلى Azure OpenAI.
  2. منح حق الوصول إلى Azure OpenAI في الاشتراك المطلوب.
  3. منح أذونات لإنشاء موارد Azure OpenAI ونشر النماذج.
  4. إنشاء ونشر مورد Azure OpenAI ونموذج. نشر نموذج التضمينات text-embedding-ada-002. انسخ اسم النشر، لأنك تحتاج إليه لإنشاء عمليات تضمين.

تمكين ملحقات azure_ai وpgvector

قبل أن تتمكن من تمكين azure_aipgvector وعلى قاعدة بيانات Azure لمثيل الخادم المرن PostgreSQL، تحتاج إلى إضافتها إلى القائمة المسموح بها. تأكد من إضافتها بشكل صحيح عن طريق تشغيل SHOW azure.extensions;.

ثم يمكنك تثبيت الملحق عن طريق الاتصال بقاعدة البيانات الهدف وتشغيل الأمر CREATE EXTENSION . كرر الأمر بشكل منفصل لكل قاعدة بيانات حيث تريد أن يكون الملحق متوفرا.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

تكوين نقطة نهاية ومفتاح OpenAI

في خدمات Azure الذكاء الاصطناعي، ضمن Resource Management>Keys and Endpoints، يمكنك العثور على نقطة النهاية والمفاتيح لمورد Azure الذكاء الاصطناعي. استخدم نقطة النهاية وأحد المفاتيح لتمكين الملحق azure_ai لاستدعاء نشر النموذج:

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

تنزيل البيانات

قم بتنزيل البيانات من Kaggle.

إنشاء الجدول

اتصل بالخادم الخاص بك وأنشئ test قاعدة بيانات. في قاعدة البيانات هذه، استخدم الأمر التالي لإنشاء جدول ستقوم فيه باستيراد البيانات:

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

استيراد البيانات

قم بتعيين متغير البيئة التالي على نافذة العميل لتعيين الترميز إلى UTF-8. هذه الخطوة ضرورية لأن مجموعة البيانات المحددة هذه تستخدم ترميز Windows-1252.

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

استيراد البيانات إلى الجدول الذي قمت بإنشائه. لاحظ أن مجموعة البيانات هذه تحتوي على صف رأس.

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

إضافة عمود لتخزين عمليات التضمين

إضافة عمود تضمين إلى الجدول:

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

إنشاء عمليات تضمين

إنشاء تضمينات لبياناتك باستخدام الملحق azure_ai . يوضح المثال التالي بعض الحقول ويتم تسلسلها.

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;

كرر الأمر حتى لا توجد صفوف أخرى لمعالجتها.

تلميح

اللعب حولها مع LIMIT القيمة. مع قيمة عالية، قد تفشل العبارة في منتصف الطريق بسبب التقييد الذي يفرضه Azure OpenAI. إذا فشلت العبارة، فانتظر لمدة دقيقة واحدة على الأقل وقم بتشغيل الأمر مرة أخرى.

إنشاء دالة بحث في قاعدة البيانات الخاصة بك للراحة:

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;

الآن ما عليك سوى استدعاء الدالة للبحث عن التوصية:

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

واستكشف النتائج:

            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)