مشاركة عبر


البرنامج التعليمي: إنشاء بحث دلالي باستخدام قاعدة بيانات 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
    recipe_search(searchQuery text, numResults int)
returns table(
            recipeId int,
            recipe_name text,
            nutrition text,
            score real)
as $$
declare
    query_embedding vector(1536);
begin
    query_embedding := (azure_openai.create_embeddings('text-embedding-ada-002', searchQuery));
    return query
    select
        r.rid,
        r.recipe_name,
        r.nutrition,
        (r.embedding <=> query_embedding)::real as score
    from
        recipes r
    order by score asc limit numResults; -- cosine distance
end $$
language plpgsql;

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

select recipeid, recipe_name, score from recipe_search('vegan recipes', 10);

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

 recipeid |                         recipe_name                          |   score
----------+--------------------------------------------------------------+------------
      829 | Avocado Toast (Vegan)                                        | 0.15672222
      836 | Vegetarian Tortilla Soup                                     | 0.17583494
      922 | Vegan Overnight Oats with Chia Seeds and Fruit               | 0.17668104
      600 | Spinach and Banana Power Smoothie                            |  0.1773768
      519 | Smokey Butternut Squash Soup                                 | 0.18031077
      604 | Vegan Banana Muffins                                         | 0.18287598
      832 | Kale, Quinoa, and Avocado Salad with Lemon Dijon Vinaigrette | 0.18368931
      617 | Hearty Breakfast Muffins                                     | 0.18737361
      946 | Chia Coconut Pudding with Coconut Milk                       |  0.1884186
      468 | Spicy Oven-Roasted Plums                                     | 0.18994217
(10 rows)