إنشاء تطبيق لاقتراح الملابس المستنِد إلى الذكاء الاصطناعي باستخدام AlloyDB وعمليات التشغيل بدون خادم
لمحة عن هذا الدرس التطبيقي حول الترميز
1. نظرة عامة
لنتخيّل تطبيق أزياء لا يساعدك فقط في العثور على الزي المثالي، بل يوفّر لك أيضًا نصائح حول كيفية تنسيقه في الوقت الفعلي، وكل ذلك بفضل إمكانات دمج الذكاء الاصطناعي التوليدي (genAI) المتطورة. في هذه المحادثة، سنستكشف كيفية إنشاء تطبيق كهذا باستخدام إمكانات البحث بالاستناد إلى المتجهات في AlloyDB، إلى جانب فهرس ScaNN من Google، ما يتيح إجراء عمليات بحث سريعة جدًا للعثور على ملابس مطابقة وتقديم اقتراحات فورية حول الأزياء.
سنوضّح أيضًا كيف يحسِّن فهرس ScaNN في AlloyDB طلبات البحث المعقدة لإنشاء اقتراحات أنماط مخصّصة. سنستخدم أيضًا Gemini وImagen، وهما نموذجان فعّالان للذكاء الاصطناعي التوليدي، لتوفير أفكار إبداعية حول الأنماط وعرض إطلالاتك المخصّصة. تم تصميم هذا التطبيق بالكامل على بنية لا تستخدِم الخوادم، ما يضمن تجربة سلسة وقابلة للتطوير للمستخدمين.
التحدّي: من خلال تقديم اقتراحات مخصّصة للأزياء، يهدف التطبيق إلى مساعدة الأشخاص الذين يجدون صعوبة في اختيار الملابس المناسبة. ويساعد ذلك أيضًا في تجنُّب الإرهاق الناتج عن التخطيط للزي.
الحلّ: يحلّ تطبيق اقتراح الملابس مشكلة توفير تجربة أزياء ذكية ومخصّصة وجذابة للمستخدمين، مع عرض إمكانات AlloyDB والذكاء الاصطناعي التوليدي وتقنيات "التطبيقات التي لا تستخدِم خادمًا".
ما ستُنشئه
كجزء من هذا الدرس التطبيقي، عليك تنفيذ ما يلي:
- إنشاء مثيل AlloyDB وتحميل مجموعة بيانات التجارة الإلكترونية
- تفعيل إضافات pgvector ونماذج الذكاء الاصطناعي التوليدي في AlloyDB
- إنشاء إدراجات من وصف المنتج
- نشر الحلّ في وظائف Cloud Run بدون خادم
- حمِّل صورة إلى Gemini وأنشئ طلبًا لوصف الصورة.
- إنشاء نتائج بحث استنادًا إلى طلبات البحث مع تضمين مجموعة بيانات التجارة الإلكترونية
- أضِف طلبات إضافية لتخصيص الطلب وإنشاء اقتراحات بشأن الأنماط.
- نشر الحلّ في وظائف Cloud Run بدون خادم
المتطلبات
2. الهندسة المعمارية
في ما يلي البنية العالية المستوى للتطبيق:
تُبرز الأقسام التالية المسار السياقي للدليل التعليمي:
الاستيراد:
الخطوة الأولى هي نقل بيانات البيع بالتجزئة (المستودع ووصف المنتجات وتفاعلات العملاء) إلى AlloyDB.
محرك "إحصاءات Google":
سنستخدم AlloyDB كمحرّك إحصاءات لتنفيذ ما يلي:
- استخراج السياق: يحلّل المحرّك البيانات المخزّنة في AlloyDB لفهم العلاقات بين المنتجات والفئات وسلوك العملاء وما إلى ذلك حسب الاقتضاء.
- إنشاء عمليات التضمين: يتم إنشاء عمليات التضمين (التمثيلات الرياضية للنص) لكلّ من طلب بحث المستخدم والمعلومات المخزّنة في AlloyDB.
- البحث باستخدام المتجهات: يُجري المحرّك بحثًا عن التشابه، ويقارن بين إدراج طلب البحث وإدراج أوصاف المنتجات والمراجعات والبيانات الأخرى ذات الصلة. ويحدِّد ذلك "أقرب 25 جارًا" الأكثر صلة.
اقتراح Gemini:
يتم تمرير صفيف وحدات البايت للصورة إلى نموذج Gemini من خلال واجهة برمجة التطبيقات Vertex AI API، بالإضافة إلى الطلب الذي يطلب وصفًا نصيًا للملابس العلوية مع اقتراحات الملابس السفلية.
AlloyDB RAG والبحث بالاستناد إلى المتجهات:
يُستخدَم وصف الملابس العلوية لاستعلام قاعدة البيانات. يحوّل الطلب نص البحث (اقتراح من نموذج Gemini لمطابقة الملابس السفلية) إلى عناصر مضمّنة ويُجري بحثًا بالاستناد إلى المتجهات على العناصر المضمّنة المخزّنة في قاعدة البيانات للعثور على أقرب العناصر المتشابهة (النتائج المطابقة). يتم فهرسة عمليات إدراج المتجهات في قاعدة بيانات AlloyDB باستخدام فهرس ScaNN لتحسين عملية الاسترجاع.
إنشاء صور الردود:
يتم تنظيم الردود التي تم التحقّق منها في صفيف JSON ويتم تجميع المحرّك بالكامل في دالة Cloud Run بدون خادم يتمّ استدعاؤها من "أداة إنشاء موظّفي الدعم".
إنشاء الصور باستخدام Imagen:
يتم دمج طلب المستخدم بشأن التصميم واقتراح يختارّه المستخدم وأي طلبات تخصيص لطلب Imagen 3 بتقديم صورة حالية. يتم إنشاء صورة التصميم استنادًا إلى هذا الطلب، باستخدام واجهة برمجة التطبيقات Vertex AI API.
3. قبل البدء
إنشاء مشروع
- في Google Cloud Console، في صفحة أداة اختيار المشاريع، اختَر مشروعًا على Google Cloud أو أنشِئه.
- تأكَّد من تفعيل الفوترة لمشروعك على Cloud. تعرَّف على كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في أحد المشاريع .
- ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud ومزوّدة مسبقًا بـ bq. انقر على تفعيل Cloud Shell (
) في أعلى وحدة تحكّم Google Cloud.
- بعد الاتصال بخدمة Cloud Shell، تأكَّد من أنّك سبق أن تم مصادقة حسابك وأنّه تم ضبط المشروع على معرّف مشروعك باستخدام الأمر التالي:
gcloud auth list
- شغِّل الأمر التالي للتأكّد من أنّ أوامر gcloud المستقبلية ستحدد مشروعك بشكل صحيح.
gcloud config list project
- إذا لم يتم ضبط مشروعك، استخدِم الأمر التالي لضبطه بشكل صريح:
gcloud config set project <YOUR_PROJECT_ID>
- فعِّل واجهات برمجة التطبيقات المطلوبة.
اتّبِع الرابط لتفعيل واجهات برمجة التطبيقات.
إذا فاتتك تفعيل أي واجهة برمجة تطبيقات، يمكنك تفعيلها في أي وقت أثناء عملية التنفيذ.
لمزيد من المعلومات عن أوامر gcloud وكيفية استخدامها، يُرجى الرجوع إلى المستندات.
4. إعداد قاعدة البيانات
في هذا الدرس العملي، سنستخدم AlloyDB كقاعدة بيانات لتخزين مجموعة بيانات التجارة الإلكترونية للبيع بالتجزئة. ويستخدم المجموعات لتخزين جميع الموارد، مثل قواعد البيانات والسجلات. تحتوي كل مجموعة على مثيل أساسي يقدّم نقطة وصول إلى البيانات. الجداول هي المرجع الفعلي الذي يخزِّن البيانات.
لننشئ مجموعة ومثيلًا وجدولًا في AlloyDB حيث سيتم تحميل مجموعة بيانات التجارة الإلكترونية.
إنشاء مجموعة ومثيل
- في Google Cloud Console، ابحث عن AlloyDB. إنّ البحث عن معظم الصفحات في Cloud Console باستخدام شريط البحث في وحدة التحكّم هو طريقة سهلة للعثور عليها.
- انقر على إنشاء مجموعة.
- أنشئ مجموعة ومثيلًا باستخدام القيم التالية:
- معرّف المجموعة: "
shopping-cluster
" - كلمة المرور: "
alloydb
" - متوافق مع PostgreSQL 15
- المنطقة: "
us-central1
" - التواصل: "
default
"
- في "الشبكة"، عند اختيار الشبكة التلقائية، يظهر الخيار التالي. انقر على إعداد الاتصال لإعداد شبكة تلقائية.
- اختَر استخدام نطاق عنوان IP المخصّص تلقائيًا وانقر على متابعة. بعد مراجعة المعلومات، انقر على إنشاء اتصال.
انتظِر حتى تكتمل عملية إنشاء الشبكة التلقائية.
- في قسم "ضبط المثيل الأساسي"، اضبط رقم تعريف المثيل على "
shopping-instance"
".
- انقر على إنشاء مجموعة لإكمال إعداد المجموعة على النحو التالي:
5. نقل البيانات
حان الوقت الآن لإضافة جدول يحتوي على بيانات المتجر. انتظِر حتى تكتمل عملية إنشاء المثيل. بعد إنشاء المجموعة، يمكنك تسجيل الدخول إلى AlloyDB باستخدام بيانات الاعتماد التي ضبطتها عند إنشاء المجموعة.
المصادقة على قاعدة بيانات AlloyDB
- في Google Cloud Console، انتقِل إلى AlloyDB. اختَر المجموعة الأساسية، ثم انقر على AlloyDB Studio في شريط التنقّل الأيمن:
- أدخِل التفاصيل التالية لمصادقة قاعدة بيانات AlloyDB:
- اسم المستخدم : "
postgres
" - قاعدة البيانات : "
postgres
" - كلمة المرور : "
alloydb
"
بعد المصادقة بنجاح في AlloyDB Studio، يتم إدخال أوامر SQL في علامات التبويب المحرِّر. يمكنك إضافة عدة نوافذ للمحرِّر باستخدام علامة الجمع على يسار علامة التبويب الأولى للمحرِّر.
عليك إدخال أوامر AlloyDB في نوافذ المحرِّر، باستخدام خيارات "التشغيل" و"التنسيق" و"المحو" حسب الحاجة.
تفعيل الإضافات
لإنشاء هذا التطبيق، سنستخدم الإضافتَين "pgvector"
" و"google_ml_integration"
".
- تتيح لك إضافة pgvector تخزين عمليات تضمين المتجهات والبحث عنها.
- توفّر إضافة google_ml_integration الدوالّ التي تستخدمها للوصول إلى نقاط نهاية التوقّعات في Vertex AI للحصول على توقّعات في SQL.
- فعِّل هذه الإضافات من خلال تنفيذ عبارات DDL التالية:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
- تأكَّد من تثبيت الإضافات من خلال تنفيذ أمر SQL التالي:
select extname, extversion from pg_extension;
إنشاء جدول
- أنشئ جدولاً باستخدام عبارة DDL التالية:
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
بعد تنفيذ الأمر أعلاه بنجاح، من المفترض أن تتمكّن من عرض الجدول في
قاعدة البيانات. تعرض الصورة التالية مثالاً:
نقل البيانات
في هذا الدرس، لدينا بيانات اختبارية تضمّ حوالي 200 سجلّ في ملف SQL هذا. يتضمّن id, category, sub_category, uri, image
وcontent
. سيتم ملء الحقول الأخرى لاحقًا في هذا الدرس التطبيقي.
- انسخ السطرَين العشرين أو عبارات الإدراج من ملف SQL في علامة تبويب "المحرِّر" الجديدة في AlloyDB Studio، ثم انقر على RUN (تشغيل).
- وسِّع قسم "المستكشف" إلى أن يظهر لك الجدول المُسمّى
apparels
. - انقر على رمز القائمة [⋮] ثمّ على طلب بحث. سيتم فتح عبارة SELECT في علامة تبويب جديدة في "المحرِّر".
- انقر على تشغيل للتحقّق من إدراج الصفوف.
منح الإذن للمستخدم
سنمنح المستخدم postgres
الإذن بإنشاء عمليات تضمين من داخل AlloyDB.
. في AlloyDB Studio، يمكنك تنفيذ العبارة التالية لمنح المستخدم postgres
حقوق التنفيذ على الدالة embedding
:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
منح دور مستخدم Vertex AI لحساب خدمة AlloyDB
سنستخدم نماذج إدراج النصوص من Vertex AI لإنشاء إدراجات لدور مستخدم Vertex AI في حساب خدمة AlloyDB.
في Google Cloud Console، انقر على رمز وحدة تحكّم Cloud Shell الطرفية [ ] ونفِّذ الأمر التالي:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
6. إنشاء سياق
لإنشاء عملية تضمين، سنحتاج إلى context
، أي كل المعلومات التي نريد تضمينها في حقل واحد. سنفعل ذلك من خلال إنشاء وصف منتج سنخزّنه في عمود pdt_desc
في جدول apparels
.
في هذه الحالة، سنستخدم كل المعلومات عن كل منتج، ولكن عند إجراء ذلك باستخدام بياناتك الخاصة، يُرجى عدم التردد في هندسة البيانات بأي طريقة تجدها مفيدة لنشاطك التجاري.
في علامة التبويب "محرر AlloyDB Studio"، نفِّذ الأمر التالي الذي يعدّل الحقل pdt_desc
باستخدام بيانات السياق:
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
ينشئ أسلوب DML هذا ملخّصًا بسيطًا للسياق باستخدام المعلومات الواردة من جميع الحقول المتاحة في الجدول والتبعيات الأخرى (إن وُجدت في حالة الاستخدام). للحصول على مجموعة أكثر دقة من المعلومات وإنشاء سياق، يُرجى عدم التردد في هندسة البيانات بأي طريقة تجدها مفيدة لنشاطك التجاري.
7. إنشاء عمليات تضمين للسياق
من الأسهل على أجهزة الكمبيوتر معالجة الأرقام أكثر من معالجة النصوص. يحوّل نظام التضمين النص إلى سلسلة من الأرقام ذات النقطة العائمة التي من المفترض أن تمثّل النص، بغض النظر عن صياغته أو لغته أو غير ذلك.
يمكنك مثلاً وصف موقع على شاطئ البحر. قد يُطلق عليه اسم "on the water
أو beachfront
أو walk from your room to the ocean
أو sur la mer
أو на берегу океана
وما إلى ذلك. تبدو هذه العبارات مختلفة، ولكن من حيث المعنى الدلالي أو في مصطلحات تعلُّم الآلة، يجب أن تكون عمليات التضمين قريبة جدًا من بعضها.
بعد أن أصبحت البيانات والسياق جاهزين، سننفّذ طلب SQL لإضافة عمليات التضمين لعمود وصف المنتج(pdt_desc
) إلى الجدول في الحقل embedding
. هناك مجموعة متنوعة من نماذج التضمين التي يمكنك استخدامها. نحن نستخدم text-embedding-005
من Vertex AI.
- في AlloyDB Studio، نفِّذ الأمر التالي لإنشاء embeddings، وعدِّل عمود
pdt_desc
باستخدام embeddings للبيانات التي يخزّنها:
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-005',
pdt_desc)
WHERE
TRUE;
- تأكَّد من إنشاء النماذج المضمّنة من خلال تنفيذ الأمر التالي:
SELECT
id,
category,
sub_category,
content,
embedding
FROM
Apparels
LIMIT 5;
في ما يلي مثال على مصفوفة العناصر المضمّنة التي تبدو مثل صفيف من الأعداد العشرية لمعاينة النص في طلب البحث على النحو التالي:
8. إجراء بحث في Vector
بعد أن أصبح الجدول والبيانات والعناصر المضمّنة جاهزة، لننفِّذ البحث بالاستناد إلى المتجهات في الوقت الفعلي عن نص بحث المستخدم.
لنفترض أنّ نص بحث المستخدم هو "pink color, casual, pure cotton tops for women
".
للعثور على مطابقات لهذا الطلب، نفِّذ طلب البحث SQL التالي:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;
لنلقِ نظرة على هذا الطلب بالتفصيل:
في هذا الطلب،
- نص بحث المستخدم هو: "
I want womens tops, pink casual only pure cotton.
" - نحن بصدد تحويل نص البحث هذا إلى عناصر مضمّنة باستخدام طريقة
embedding()
مع النموذج:text-embedding-005
. من المفترض أن تكون هذه الخطوة مألوفة بعد الخطوة الأخيرة، حيث طبّقنا دالة التضمين على جميع العناصر في الجدول. - يمثّل "
<=>
" استخدام طريقة المسافة تشابه الجيبّ cosine. يمكنك العثور على جميع مقاييس التشابه المتاحة في مستندات pgvector. - نحن بصدد تحويل نتيجة طريقة التضمين إلى نوع البيانات المتجه لجعلها متوافقة مع المتجهات المخزّنة في قاعدة البيانات.
- يشير LIMIT 5 إلى أنّنا نريد استخراج 5 جيران أقرب لنص البحث.
في ما يلي مثال على استجابة طلب البحث هذا في لغة الاستعلامات البنيوية (SQL):
كما يمكنك ملاحظة ذلك في نتائجك، فإنّ المطابقات قريبة جدًا من نص البحث. جرِّب تغيير اللون لمعرفة كيف تتغيّر النتائج.
فهرس AlloyDB ScaNN لأداء طلبات البحث
لنفترض الآن أنّنا نريد زيادة الأداء (وقت طلب البحث) والكفاءة ومستوى تذكُّر نتيجة البحث بالاستناد إلى المتجهات هذه باستخدام فهرس ScaNN.
إذا كنت تريد استخدام فهرس ScaNN، جرِّب الخطوات التالية:
- بما أنّنا سبق أن أنشأنا المجموعة والعنصر والسياق والعناصر المضمّنة، ما علينا سوى تثبيت إضافة ScaNN باستخدام العبارة التالية:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- أنشئ مؤشر ScaNN:
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
في لغة DDL أعلاه:
apparel_index
هو اسم الفهرس.apparels
هو اسم الجدول.scann
هي طريقة الفهرسة.embedding
هو العمود في الجدول الذي تريد فهرسته.cosine
هي طريقة المسافة التي تريد استخدامها مع الفهرس.54
هو عدد الأقسام المطلوب تطبيقها على هذا الفهرس. اضبطها على أي قيمة تتراوح بين 1 و1048576. لمزيد من المعلومات عن كيفية تحديد هذه القيمة، اطّلِع على مقالة ضبط فهرس ScaNN.
وفقًا للاقتراح الواردة في مستودع ScaNN، استخدمنا جذر عدد نقاط البيانات. عند التقسيم، يجب أن يكون num_leaves
تقريبًا الجذر التربيعي لعدد نقاط البيانات.
- تحقَّق مما إذا تم إنشاء الفهرس باستخدام الطلب:
SELECT * FROM pg_stat_ann_indexes;
- يمكنك إجراء "بحث متجه" باستخدام الطلب نفسه الذي استخدمناه بدون الفهرس:
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
طلب البحث أعلاه هو نفسه الطلب الذي استخدمناه في المختبر في الخطوة 8. ومع ذلك، تم الآن فهرسة الحقل باستخدام فهرس ScaNN.
- يمكنك إجراء الاختبار باستخدام طلب بحث بسيط مع الفهرس وبدونه. للاختبار بدون فهرس، عليك إسقاط الفهرس:
white tops for girls without any print
يؤدي نص البحث أعلاه في طلب البحث باستخدام نموذج "البحث بالاستناد إلى المتجهات" على بيانات "الترميزات المُدرَجة" إلى تحقيق نتائج بحث عالية الجودة وكفاءة عالية. تم تحسين الكفاءة بشكل كبير (من حيث وقت التنفيذ: 10.37 ملي ثانية بدون ScaNN و0.87 ملي ثانية مع ScaNN) باستخدام الفهرس. لمزيد من المعلومات حول هذا الموضوع، يُرجى الرجوع إلى مدوّنة.
9. التحقّق من المطابقة باستخدام نموذج اللغة الكبيرة
قبل الانتقال إلى إنشاء خدمة لعرض أفضل المطابقات لطلب معيّن، لنستخدم نموذجًا من الذكاء الاصطناعي التوليدي للتحقّق مما إذا كانت هذه الردود المحتملة ملائمة وآمنة لمشاركتها مع المستخدم.
التأكّد من إعداد المثيل لخدمة Gemini
- تأكَّد من أنّ
google_ml_integration
مفعّل في كل من "المنتدى" و"الوحدة". في AlloyDB Studio، نفِّذ الأمر التالي:
show google_ml_integration.enable_model_support;
إذا كانت القيمة معروضة على أنّها "تفعيل"، يمكنك تخطّي الخطوتَين التاليتَين والانتقال مباشرةً إلى الإعداد.
دمج AlloyDB ونموذج Vertex AI
- انتقِل إلى المثيل الأساسي لكتلة AlloyDB، وانقر على تعديل المثيل الأساسي.
- في خيارات الإعداد المتقدّمة، وسِّع قسم علامة قاعدة البيانات الجديدة، وتأكَّد من ضبط
google_ml_integration.enable_model_support flag
علىon
على النحو التالي:
3. إذا لم يتم ضبطه على "
on
"، اضبطه على "on
" ثم انقر على تعديل النسخة.
ستستغرق هذه الخطوة بضع دقائق.
دمج AlloyDB ونموذج Vertex AI
يمكنك الآن الاتصال بـ AlloyDB Studio وتنفيذ عبارة DML التالية لإعداد إمكانية الوصول إلى نموذج Gemini من AlloyDB، باستخدام رقم تعريف مشروعك حيث هو موضَّح. قد يتم تحذيرك من خطأ في البنية قبل تنفيذ الأمر، ولكن من المفترض أن يتم تنفيذه بشكلٍ سليم.
- في Google Cloud Console، انتقِل إلى AlloyDB. اختَر المجموعة الأساسية، ثم انقر على AlloyDB Studio في شريط التنقّل الأيمن.
- سنستخدم
gemini-1.5-pro:generateContent
المتوفّر تلقائيًا مع إضافةgoogle_ml_integration
. - يمكنك التحقّق من النماذج التي تم ضبطها للوصول إليها من خلال الأمر التالي في AlloyDB Studio:
select model_id,model_type from google_ml.model_info_view;
- امنح إذنًا لمستخدمي قاعدة البيانات بتنفيذ الدالة ml_predict_row لتشغيل التوقّعات باستخدام نماذج Google Vertex AI من خلال تنفيذ الأمر التالي:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
تقييم الردود
على الرغم من أنّنا سننتهي باستخدام طلب بحث واحد كبير في القسم التالي الذي ننقل فيه التطبيق إلى Cloud Run، قد يكون من الصعب فهم طلب البحث لضمان أن تكون الردود الواردة منه معقولة.
سنلقي نظرة على الأقسام الفردية التي تستمر في إنشاء طلب البحث الأكبر الذي نستخدمه أخيرًا.
- أولاً، سنرسل طلبًا إلى قاعدة البيانات للحصول على أقرب 5 مطابقات لطلب بحث المستخدم. نحن بصدد تضمين طلب البحث في الرمز البرمجي للحفاظ على البساطة، ولكن لا داعي للقلق، سنضيفه إلى طلب البحث لاحقًا.
سنُدرِج وصف المنتج من جدول apparels
ونضيف حقلَين جديدَين، أحدهما يجمع الوصف مع الفهرس والآخر مع الطلب الأصلي. يتم حفظ هذه البيانات في جدول يُسمى xyz
، وهو اسم جدول مؤقت.
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
ستكون نتيجة هذا الطلب هي 5 صفوف الأكثر تشابهًا ذات الصلة بطلب المستخدم.
سيحتوي الجدول الجديد xyz
على 5 صفوف يتضمّن كلّ صفّ الأعمدة التالية:
literature
content
user_text
- لتحديد مدى صلاحية الإجابات، سنستخدم طلب بحث معقّدًا نشرح فيه كيفية تقييم الإجابات. ويستخدم
user_text
وcontent
في جدولxyz
كجزء من طلب البحث.
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- باستخدام هذا الطلب، سنراجع بعد ذلك "جودة" الردود في جدول
xyz
. ونقصد بمدى الجودة مدى دقة الردود التي يتم إنشاؤها مقارنةً بما نتوقّعه.
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
- تعرض دالة
predict_row
النتيجة بتنسيق JSON. يتم استخدام الرمز "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"
" لاستخراج النص الفعلي من ملف JSON هذا. للاطّلاع على تنسيق JSON الفعلي الذي يتم إرجاعه، يمكنك إزالة هذا الرمز. - أخيرًا، للحصول على حقل LLM، ما عليك سوى استخراجه من جدول x:
SELECT
LLM_RESPONSE
FROM
x;
- يمكن دمج ذلك في طلب بحث واحد على النحو التالي:
تحذير: إذا كنت قد نفّذت طلبات البحث أعلاه للتحقّق من النتائج الوسيطة،
تأكَّد من حذف جدولَي xyz
وx
أو إزالتهما من قاعدة بيانات AlloyDB قبل تنفيذ طلب البحث هذا.
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
الاستعلام الأكبر هو عبارة عن مجموعة من جميع طلبات البحث التي نفّذناها في الخطوات السابقة. توضّح النتائج ما إذا كانت هناك مطابقة أم لا، ونسبتها المئوية، وبعض التفسيرات حول التقييم.
يُرجى العِلم أنّ نموذج Gemini مفعَّل تلقائيًا، لذلك يتم توزيع الردّ الفعلي على أسطر متعددة:
10. نقل التطبيق إلى الويب
سنستضيف هذا التطبيق الآن لكي يتمكّن المستخدمون من الوصول إليه من الإنترنت.
إنشاء دالة Cloud Run
- في Google Cloud Console، انتقِل إلى Cloud Run Functions باستخدام الرابط التالي:
https://console.cloud.google.com/run/create?deploymentType=function
- في قسم Configure (الضبط)، اضبط Function Name (اسم الدالة) على retail-engine واختَر المنطقة us-central1.
- في "عنوان URL لنقطة النهاية"، اختَر وقت التشغيل على أنّه Java 17.
- في "المصادقة"، اختَر السماح بطلبات البيانات غير المُعتمَدة.
- وسِّع الحاويات، ووحدات التخزين، والاتصال بالشبكات، والأمان، ثم انقر على علامة التبويب الاتصال بالشبكات.
- اختَر الاتصال بشبكة VPC للزيارات الصادرة، ثم انقر على استخدام موصّلات "إمكانية الوصول إلى VPC بدون خادم".
- في "الشبكة"، انقر على إضافة موصِّل جديد لشبكة VPC. فعِّل Serverless VPC Access API، إذا لم يسبق لك تفعيلها.
- في "إنشاء موصل"، اضبط الاسم على
alloydb-test-conn
. - اضبط المنطقة على
us-central
. - اترك قيمة "الشبكة" على تلقائية واضبط الشبكة الفرعية على نطاق IP مخصّص مع نطاق IP 10.8.0.0 أو أي نطاق مشابه متاح.
- وسِّع إعدادات عرض التوسيع، واضبط الحد الأدنى للوحدات على 2 والحد الأقصى للوحدات على 3.
- اختَر نوع النسخة على أنّه f1-micro. يوضّح ما يلي خيارات إنشاء الموصّل:
- انقر على "إنشاء" لإنشاء الموصّل.
- في "توجيه حركة المرور"، اختَر توجيه كلّ حركة المرور إلى شبكة VPC.
- انقر على إنشاء لإنشاء الدالة.
نشر التطبيق
بعد إنشاء الدالة، عدِّل المصدر وأعِد نشر التطبيق.
- في Cloud Run، انقر على علامة التبويب الخدمات، ثمّ انقر على الدالة retail-engine.
- انقر على علامة التبويب "المصدر". اترك نقطة دخول الدالة التلقائية مضبوطة على "
gcfv2.HelloHttpFunction
". - استبدِل محتوى ملف HelloHttpFunction.java بمحتوى ملف Java هذا.
- عدِّل تفاصيل AlloyDbJdbcConnector في الملف وفقًا لتفاصيل مثيل AlloyDB ومجموعة AlloyDB. استبدِل
$PROJECT_ID
بمعرّف مشروع مجموعة ومثيل AlloyDB.
- استبدِل محتوى ملف pom.xml بمحتوى ملف XML هذا.
- انقر على حفظ وإعادة نشر لنشر الدالة.
11. اختبار تطبيق محرّك البيع بالتجزئة
بعد نشر دالة Cloud Functions المعدَّلة، من المفترض أن تظهر لك نقطة النهاية بالتنسيق التالي:
https://retail-engine-PROJECT_NUMBER.us-central1.run.app
يمكنك اختباره من وحدة Cloud Shell الطرفية عن طريق تنفيذ الأمر التالي:
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
بدلاً من ذلك، يمكنك اختبار دالة Cloud Run على النحو التالي:
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
والنتيجة هي:
بعد أن أجرينا عملية بحث عن المتجهات المتشابهة باستخدام نموذج الحشو على بيانات AlloyDB، يمكننا الانتقال إلى إنشاء التطبيق الذي يستخدم هذه الحشوات مع صورتك، ويطلب إنشاء اقتراحات بشأن الأنماط.
12. فهم مسار اقتراح الملابس
تطبيق اقتراحات الأزياء هو تطبيق Sprint Boot تم ضبطه للعمل مع عمليات التضمين التي أنشأناها في تطبيق محرك البيع بالتجزئة AlloyDB مع Gemini وImagen لإنشاء خيارات تصميم الأزياء المرئية. ويتيح لك أيضًا إضافة طلبات مخصّصة وتحسين الاقتراح.
لنفترض أنّك حمّلت صورة قميص وردي فاتح من خزانة ملابسك إلى هذا التطبيق. عند النقر على "عرض"، ينشئ التطبيق خيارات متعدّدة تتطابق مع الصورة الأصلية استنادًا إلى الطلب الذي تم ضبطه في رمز التطبيق والعناصر المضمّنة في قاعدة بيانات AlloyDB. الآن، تريد معرفة كيف ستبدو الخيارات المقترَحة مع قلادة زرقاء، لذا تضيف طلبًا على هذه الأسطر، ثم تنقر على "النمط". يتم إنشاء الصورة النهائية التي تجمع بين الصورة الأصلية والاقتراحات لإنشاء زي ملائم.
لبدء إنشاء تطبيق اقتراحات الأزياء، اتّبِع الخطوات التالية:
- في Cloud Run، افتح تطبيق retail-engine، وسجِّل عنوان URL لتطبيقك. هذا هو مستودع البيانات المضمّنة الذي سنستخدمه لإنشاء اقتراحات مشابهة.
- في بيئة تطوير البرامج المتكاملة (IDE)، استنسِخ مستودع https://github.com/AbiramiSukumaran/outfit-recommender/. في هذا التمرين، يتم تنفيذ الخطوات المعروضة في بيئة تطوير البرامج Visual Studio Code.
git clone https://github.com/AbiramiSukumaran/outfit-recommender/
في ما يلي بعض الملفات المهمة في دليل التطبيق:
src/main
: دليل المصدر الذي تتوفّر فيه ملفات التطبيق وHTML:HelloWorldApplication.java
: نقطة الدخول الرئيسية لتطبيق Spring BootHelloWorldController.java
: وحدة تحكّم REST في Spring Boot تعالج طلبات HTTP ذات الصلة بتطبيق اقتراح الملابس. يعالج هذا الملف طلبات GET وPOST، ويعالج طلبات المستخدمين، ويحلّل الصور، ويتفاعل مع عمليات تضمين AlloyDB، ويعرض الردّ النهائي على واجهة المستخدم. يُطلِق هذا التحكّم فئة GenerateImageSample.GenerateImageSample.java
: يحتوي على فئة إنشاء الصور التي تتصل بخدمة Vertex AI، وتُعدّ طلب المستخدم، وتُجري طلبات إلى واجهة برمجة التطبيقات لنموذج Imagen، وتُعيد الصورة المتوقّعة إلى فئة وحدة التحكّم.Resources
: يحتوي هذا الدليل على الصور وملفات HTML المطلوبة لإنشاء واجهة مستخدم التطبيق.-
Pom.xml
: لتحديد الإعدادات والتبعيات للمشروع
- في Visual Studio Code، افتح
HelloWorldController.java
وعدِّل نُسخ رقم تعريف المشروع وموقعه الجغرافي وفقًا للمكان الذي تم فيه إنشاء مثيل AlloyDB.
- عدِّل
endpoint
إلى عنوان URL لتطبيق محرّك البيع بالتجزئة الذي استضفته سابقًا.
- افتح
GenerateImageSample.java
وعدِّل رقم تعريف المشروع والموقع الجغرافي وفقًا للمكان الذي تم فيه إنشاء مثيل AlloyDB.
- احفظ جميع الملفات.
سننشر الآن هذا التطبيق في بيئة التشغيل بدون خادم في Cloud Run.
13. نشر التطبيق على الويب
بعد أن أضفنا المشروع والموقع الجغرافي وتفاصيل تطبيق محرّك البيع بالتجزئة ذات الصلة إلى تطبيق "اقتراح الملابس" المستنِد إلى Spring Boot، يمكننا نشر التطبيق على Cloud Run.
سنستخدم الأمر gcloud run deploy
في وحدة تحكّم Visual Code Studio لنشر التطبيق. بالنسبة إلى Visual Studio Code، يمكنك تثبيت إضافة Google Cloud Code لبدء استخدام gcloud CLI.
لنشر التطبيق، اتّبِع الخطوات التالية:
- في بيئة تطوير البرامج المتكاملة، افتح الدليل الذي تم نسخه وابدأ تشغيل وحدة التحكّم الطرفية. في Visual Code Studio، انقر على Terminal > Terminal جديد.
- اتّبِع التعليمات الواردة في هذا المستند لتثبيت gcloud CLI.
- إذا كنت تستخدم Visual Code Studio، انقر على الإضافات (Extensions)، وابحث عن Google Cloud Code (رمز Google Cloud) وثبِّت الإضافة.
- في وحدة الطرفية في IDE، مصادقة حسابك على Google من خلال تنفيذ الأمر التالي:
gcloud auth application-default login
- اضبط معرّف المشروع على المشروع نفسه الذي يقع فيه مثيل AlloyDB.
gcloud config set project PROJECT_ID
- ابدأ عملية النشر.
gcloud run deploy
- في
Source code location
، اضغط على مفتاح Enter لاختيار دليل GitHub المُنشئ. - في
Service name
، أدخِل اسمًا للخدمة، مثل outfit-recommender، ثم اضغط على مفتاح Enter. - في
Please specify a region
، أدخِل الموقع الجغرافي الذي يتم فيه استضافة آلة AlloyDB الافتراضية وتطبيق Retail-Engine، مثل 32 لـ us-central1، ثم اضغط على مفتاح Enter.
- في
Allow unauthenticated invocations to [..]
، أدخِل Y، ثم اضغط على مفتاح Enter.
تعرض الصورة التالية مستوى تقدّم نشر تطبيقك:
14. اختبار تطبيق اقتراح الملابس
بعد نشر التطبيق بنجاح على Cloud Run، يمكنك الاطّلاع على الخدمة في Google Cloud Console على النحو التالي:
- في Google Cloud Console، انتقِل إلى Cloud Run.
- في "الخدمات"، انقر على خدمة اقتراح الملابس التي تم نشرها. من المفترض أن يظهر لك كلّ من محرك البيع بالتجزئة وخدمة اقتراح الملابس على النحو التالي:
- انقر على عنوان URL للتطبيق لفتح واجهة مستخدم تطبيق الاقتراحات.
The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
يمكن الاطّلاع على التطبيق المنشور على النحو التالي:
استخدام التطبيق
لبدء استخدام التطبيق، اتّبِع الخطوات التالية:
- انقر على تحميل وحمِّل صورة لقطعة ملابس.
- بعد تحميل الصورة، انقر على النمط. يستخدم التطبيق الصورة كطلب وينشئ خيارات في أسفل الصفحة استنادًا إلى الطلب من تطبيق محرّك البيع بالتجزئة الذي يتضمّن عمليات تضمين لبيانات البيع بالتجزئة.
ينشئ التطبيق اقتراحات صور مع طلب استنادًا إلى الصورة مع اقتراحات بشأن التصميم. على سبيل المثال، A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.
- يمكنك إرسال طلبات إضافية إلى اقتراح النمط هذا الذي يتم إنشاؤه تلقائيًا. على سبيل المثال،
STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
- انقر على عرض للاطّلاع على التصميم النهائي.
15. تَنظيم
لتجنُّب تحصيل رسوم من حسابك على Google Cloud مقابل الموارد المستخدَمة في هذه المشاركة، اتّبِع الخطوات التالية:
- في وحدة تحكّم Google Cloud، انتقِل إلى صفحة إدارة الموارد.
- في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على حذف.
- في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.
16. تهانينا
تهانينا! لقد أجريت بنجاح عملية بحث عن التشابه باستخدام AlloyDB وpgvector وVector search مع استخدام نتيجة البحث مع نموذج Imagen القوي لإنشاء اقتراحات بشأن الأنماط.