1. نظرة عامة
في ظلّ التطوّر السريع لقطاع البيع بالتجزئة اليوم، من المهم تقديم خدمة عملاء استثنائية مع توفير تجارب تسوّق مخصّصة. سنأخذك في رحلة فنية من خلال إنشاء تطبيق محادثة مستند إلى المعرفة مصمّم للإجابة عن أسئلة العملاء وإرشادهم إلى اكتشاف المنتجات وتخصيص نتائج البحث. يجمع هذا الحلّ المبتكر بين فعالية AlloyDB لتخزين البيانات، ومحرك تحليلات داخلي للفهم السياقي، وGemini (نموذج لغوي كبير) للتحقّق من مدى الصلة بالموضوع، و"أداة إنشاء موظّفي الدعم" من Google لبدء استخدام مساعد محادثاتي ذكي بسرعة.
التحدّي: يتوقّع عملاء البيع بالتجزئة في الوقت الحالي الحصول على إجابات فورية واقتراحات منتجات تتوافق مع تفضيلاتهم الفريدة. وغالبًا ما تعجز طرق البحث التقليدية عن توفير هذا المستوى من التخصيص.
الحلّ: يعالج تطبيق المحادثة المستنِد إلى المعرفة هذا التحدي بشكل مباشر. وتستفيد هذه الميزة من قاعدة معلومات غنية مستمَدة من بيانات البيع بالتجزئة لفهم نية العملاء والردّ عليهم بذكاء وتقديم نتائج ملائمة للغاية.
ما ستُنشئه
كجزء من هذا الدرس التطبيقي (الجزء 1)، عليك تنفيذ ما يلي:
- إنشاء مثيل AlloyDB وتحميل مجموعة بيانات التجارة الإلكترونية
- تفعيل إضافات pgvector ونماذج الذكاء الاصطناعي التوليدي في AlloyDB
- إنشاء نماذج إدراج من وصف المنتج
- إجراء بحث في الوقت الفعلي عن تشابه جيب التمام لنص بحث المستخدِم
- نشر الحلّ في وظائف Cloud Run بدون خادم
سيتناول الجزء الثاني من الدرس التطبيقي خطوات "أداة إنشاء موظّفي الدعم".
المتطلبات
2. البنية
تدفّق البيانات: لنلقِ نظرة عن كثب على كيفية نقل البيانات عبر نظامنا:
الاستيراد:
الخطوة الأولى هي نقل بيانات البيع بالتجزئة (المستودع ووصف المنتجات وتفاعلات العملاء) إلى AlloyDB.
محرك "إحصاءات Google":
سنستخدم AlloyDB كمحرّك إحصاءات لتنفيذ ما يلي:
- استخراج السياق: يحلّل المحرّك البيانات المخزّنة في AlloyDB لفهم العلاقات بين المنتجات والفئات وسلوك العملاء وما إلى ذلك حسب الاقتضاء.
- إنشاء عمليات التضمين: يتم إنشاء عمليات التضمين (التمثيلات الرياضية للنص) لكلّ من طلب بحث المستخدم والمعلومات المخزّنة في AlloyDB.
- البحث باستخدام المتجهات: يُجري المحرّك بحثًا عن التشابه، ويقارن بين عملية تضمين طلب البحث وعملية تضمين أوصاف المنتجات والمراجعات والبيانات الأخرى ذات الصلة. ويحدِّد ذلك "أقرب 25 جارًا" الأكثر صلةً.
التحقّق من Gemini:
يتم إرسال هذه الردود المحتملة إلى Gemini لتقييمها. ويحدِّد Gemini ما إذا كانت هذه المراجع ملائمة وآمنة للمشاركة مع المستخدم.
إنشاء الردود:
يتم تنظيم الردود التي تم التحقّق منها في صفيف JSON ويتم تجميع المحرّك بالكامل في دالة Cloud Run بدون خادم يتمّ استدعاؤها من "أداة إنشاء موظّفي الدعم".
التفاعل الحواري:
يعرض Agent Builder الردود للمستخدم بتنسيق لغة طبيعية، ما يسهّل إجراء حوار متبادل. سيتم تناول هذا الجزء في درس تطبيقي لاحق.
3- قبل البدء
إنشاء مشروع
- في Google Cloud Console، في صفحة أداة اختيار المشاريع، اختَر مشروعًا على Google Cloud أو أنشِئه.
- تأكَّد من تفعيل الفوترة لمشروعك على Cloud. تعرَّف على كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في مشروع .
- ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud ومزوّدة مسبقًا بـ bq. انقر على "تفعيل Cloud Shell" في أعلى "وحدة تحكّم Google Cloud".
- بعد الاتصال بخدمة Cloud Shell، تأكَّد من أنّك سبق أن تم مصادقة حسابك وأنّه تم ضبط المشروع على معرّف مشروعك باستخدام الأمر التالي:
gcloud auth list
- شغِّل الأمر التالي في Cloud Shell للتأكّد من أنّ الأمر gcloud يعرف مشروعك.
gcloud config list project
- إذا لم يتم ضبط مشروعك، استخدِم الأمر التالي لضبطه:
gcloud config set project <YOUR_PROJECT_ID>
- فعِّل واجهات برمجة التطبيقات المطلوبة.
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com
يمكنك استخدام وحدة التحكّم للبحث عن كل منتج أو استخدام هذا الرابط كبديل لأمر gcloud.
في حال عدم تفعيل أي واجهة برمجة تطبيقات، يمكنك تفعيلها في أي وقت أثناء عملية التنفيذ.
راجِع المستندات لمعرفة أوامر gcloud وكيفية استخدامها.
4. إعداد قاعدة البيانات
في هذا الدرس العملي، سنستخدم AlloyDB كقاعدة بيانات لتخزين بيانات البيع بالتجزئة. ويستخدم المجموعات لتخزين جميع الموارد، مثل قواعد البيانات والسجلات. تحتوي كل مجموعة على مثيل أساسي يقدّم نقطة وصول إلى البيانات. ستحتوي الجداول على البيانات الفعلية.
لننشئ مجموعة ومثيلًا وجدولًا في AlloyDB حيث سيتم تحميل مجموعة بيانات التجارة الإلكترونية.
إنشاء مجموعة ومثيل
- انتقِل إلى صفحة AlloyDB في Cloud Console. إنّ البحث عن معظم الصفحات في Cloud Console باستخدام شريط البحث في وحدة التحكّم هو طريقة سهلة للعثور عليها.
- اختَر CREATE CLUSTER (إنشاء مجموعة) من تلك الصفحة:
- ستظهر لك شاشة مثل الشاشة أدناه. أنشئ مجموعة ومثيلًا باستخدام القيم التالية:
- معرّف المجموعة: "
shopping-cluster
" - كلمة المرور: "
alloydb
" - متوافقة مع PostgreSQL 15
- المنطقة: "
us-central1
" - التواصل: "
default
"
- عند اختيار الشبكة التلقائية، ستظهر لك شاشة مثل الشاشة أدناه. انقر على "إعداد الاتصال" (SET UP CONNECTION).
- من هناك، اختَر "استخدام نطاق IP مخصّص تلقائيًا" ثم "متابعة". بعد مراجعة المعلومات، انقر على "إنشاء اتصال".
- بعد إعداد شبكتك، يمكنك مواصلة إنشاء مجموعتك. انقر على CREATE CLUSTER (إنشاء مجموعة) لإكمال عملية إعداد المجموعة كما هو موضّح أدناه:
احرص على تغيير رقم تعريف المثيل إلى "shopping-instance"
".
يُرجى العِلم أنّ إنشاء المجموعة سيستغرق 10 دقائق تقريبًا. بعد اكتمال العملية بنجاح، من المفترض أن تظهر لك شاشة مشابهة للشاشة التالية:
5- نقل البيانات
حان الوقت الآن لإضافة جدول يحتوي على بيانات المتجر. انتقِل إلى AlloyDB، واختَر المجموعة الأساسية ثم AlloyDB Studio:
قد تحتاج إلى الانتظار حتى تكتمل عملية إنشاء المثيل. بعد ذلك، سجِّل الدخول إلى AlloyDB باستخدام بيانات الاعتماد التي أنشأتها عند إنشاء المجموعة. استخدِم البيانات التالية لمصادقة PostgreSQL:
- اسم المستخدم : "
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
. سيتم ملء الحقول الأخرى لاحقًا في هذا الدرس التطبيقي.
انسخ الأسطر العشرين أو عبارات الإدراج من هناك، ثم الصق هذه الأسطر في علامة تبويب فارغة للمحرِّر واختَر "تشغيل".
للاطّلاع على محتوى الجدول، وسِّع قسم "المستكشف" إلى أن يظهر لك الجدول المُسمّى apparels. انقر على النقاط الثلاث (⋮) لعرض خيار "الاستعلام عن الجدول". سيتم فتح عبارة SELECT في علامة تبويب جديدة في "المحرِّر".
منح الإذن
شغِّل العبارة أدناه لمنح المستخدم postgres
حقوق تنفيذ الدالة embedding
:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
منح دور مستخدم Vertex AI لحساب خدمة AlloyDB
انتقِل إلى وحدة 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- السياق
ارجع إلى صفحة "نسخة AlloyDB الافتراضية".
لإنشاء عملية تضمين، سنحتاج إلى context
، أي كل المعلومات التي نريد تضمينها في حقل واحد. سنفعل ذلك من خلال إنشاء وصف للمنتج (سنسميه pdt_desc
). في هذه الحالة، سنستخدم كل المعلومات عن كل منتج، ولكن عند إجراء ذلك باستخدام بياناتك الخاصة، يُرجى عدم التردد في هندسة البيانات بأي طريقة تجدها مفيدة لنشاطك التجاري.
شغِّل العبارة التالية من 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;
ينشئ أسلوب "لغة الاستعلامات البنيوية" هذا ملخّصًا بسيطًا للسياق باستخدام المعلومات من جميع الحقول المتاحة في الجدول والتبعيات الأخرى (إن وُجدت في حالة الاستخدام). للحصول على مجموعة أكثر دقة من المعلومات وإنشاء سياق، يمكنك هندسة البيانات بأي طريقة تجدها مفيدة لنشاطك التجاري.
7- إنشاء عمليات تضمين للسياق
من الأسهل على أجهزة الكمبيوتر معالجة الأرقام أكثر من معالجة النصوص. يحوّل نظام التضمين النص إلى سلسلة من الأرقام ذات النقطة العائمة التي من المفترض أن تمثّل النص، بغض النظر عن صياغته أو لغته أو غير ذلك.
يمكنك مثلاً وصف موقع على شاطئ البحر. قد يُطلق عليه اسم "على الماء" أو "على شاطئ البحر" أو "المشي من غرفتك إلى المحيط" أو "sur la mer" أو "на берегу океана" وما إلى ذلك. تبدو هذه العبارات مختلفة، ولكن من حيث المعنى الدلالي أو في مصطلحات تعلُّم الآلة، يجب أن تكون عمليات التضمين قريبة جدًا من بعضها.
بعد أن أصبحت البيانات والسياق جاهزين، سننفّذ طلب SQL لإضافة النصوص المضمّنة لوصف المنتج إلى الجدول في الحقل embedding
. هناك مجموعة متنوعة من نماذج التضمين التي يمكنك استخدامها. نحن نستخدم text-embedding-004
من Vertex AI. احرص على استخدام نموذج التضمين نفسه في جميع أنحاء المشروع.
ملاحظة: إذا كنت تستخدم مشروعًا حاليًا على Google Cloud تم إنشاؤه منذ فترة، قد تحتاج إلى مواصلة استخدام الإصدارات القديمة من نموذج تضمين النصوص، مثل textembedding-gecko.
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-004',
pdt_desc)
WHERE
TRUE;
اطّلِع على جدول apparels
مرة أخرى للاطّلاع على بعض عمليات التضمين. احرص على إعادة تشغيل عبارة SELECT للاطّلاع على التغييرات.
SELECT
id,
category,
sub_category,
content,
embedding
FROM
apparels;
من المفترض أن يعرض هذا الطلب متجه العناصر المضمّنة الذي يبدو مثل صفيف من الأعداد العشرية لمعاينة النص في الطلب كما هو موضّح أدناه:
ملاحظة: قد تواجه مشاريع Google Cloud المنشأة حديثًا ضمن الفئة المجانية مشاكل في الحصة عندما يتعلق الأمر بعدد طلبات التضمين المسموح بها في الثانية إلى نماذج التضمين. ننصحك باستخدام طلب بحث فلتر للمعرّف، ثم اختيار 1 إلى 5 سجلّات بشكل انتقائي وما إلى ذلك، أثناء إنشاء عملية التضمين.
8. إجراء بحث في Vector
بعد أن أصبح الجدول والبيانات والعناصر المضمّنة جاهزة، لننفِّذ البحث بالاستناد إلى المتجهات في الوقت الفعلي عن نص بحث المستخدم.
لنفترض أنّ المستخدم يسأل:
"أريد قمصان نسائية، ويجب أن تكون من القطن الخالص فقط وذات طابع كاجوال وردي".
يمكنك العثور على مطابقات لهذا الطلب عن طريق تنفيذ الطلب أدناه:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
لنلقِ نظرة على هذا الطلب بالتفصيل:
في هذا الطلب،
- نص بحث المستخدم هو: "أريد قمصان نسائية، وردي غير رسمي فقط من القطن الخالص".
- نحن بصدد تحويلها إلى عناصر مضمّنة في طريقة
embedding()
باستخدام النموذج:text-embedding-004
. من المفترض أن تكون هذه الخطوة مألوفة بعد الخطوة الأخيرة، حيث طبّقنا دالة التضمين على جميع العناصر في الجدول. - يمثّل "
<=>
" استخدام طريقة المسافة تشابه الجيبّ cosine. يمكنك العثور على جميع مقاييس التشابه المتاحة في مستندات pgvector. - نحن بصدد تحويل نتيجة طريقة التضمين إلى نوع متجه لجعلها متوافقة مع المتجهات المخزّنة في قاعدة البيانات.
- يشير LIMIT 5 إلى أنّنا نريد استخراج 5 جيران أقرب لنص البحث.
تظهر النتيجة على النحو التالي:
كما يمكنك ملاحظة ذلك في نتائجك، فإنّ المطابقات قريبة جدًا من نص البحث. جرِّب تغيير اللون لمعرفة كيف تتغيّر النتائج.
9. التحقّق من المطابقة باستخدام نموذج اللغة الكبيرة
قبل الانتقال إلى إنشاء خدمة لعرض أفضل المطابقات لطلب معيّن، لنستخدم نموذجًا من الذكاء الاصطناعي التوليدي للتحقّق مما إذا كانت هذه الردود المحتملة ملائمة وآمنة لمشاركتها مع المستخدم.
التأكّد من إعداد المثيل لخدمة Gemini
تأكَّد أولاً ممّا إذا كان قد سبق أن تم تفعيل ميزة "دمج تكنولوجيات الذكاء الاصطناعي من Google" للمجموعة والوحدة. في AlloyDB Studio، أدخِل الأمر التالي:
show google_ml_integration.enable_model_support;
إذا كانت القيمة معروضة على أنّها "تفعيل"، يمكنك تخطّي الخطوتَين التاليتَين والانتقال مباشرةً إلى إعداد عملية دمج AlloyDB ونموذج Vertex AI.
- انتقِل إلى المثيل الأساسي لكتلة AlloyDB وانقر على "تعديل المثيل الأساسي".
- انتقِل إلى قسم "الإشارات" في "خيارات الإعداد المتقدّمة". تأكَّد من ضبط
google_ml_integration.enable_model_support flag
على "on
" كما هو موضّح أدناه:
إذا لم يكن الخيار مفعّلاً، فعِّله ثم انقر على الزر تعديل النسخة. ستستغرق هذه الخطوة بضع دقائق.
دمج AlloyDB ونموذج Vertex AI
يمكنك الآن الاتصال بـ AlloyDB Studio وتنفيذ عبارة DML التالية لإعداد إمكانية الوصول إلى نموذج Gemini من AlloyDB، باستخدام رقم تعريف مشروعك حيث هو موضَّح. قد يتم تحذيرك من خطأ في البنية قبل تنفيذ الأمر، ولكن من المفترض أن يتم تنفيذه بشكلٍ سليم.
أولاً، ننشئ اتصالاً بنموذج Gemini 1.5 كما هو موضّح أدناه. تذكَّر استبدال $PROJECT_ID
في الأمر أدناه بمعرّف مشروعك على Google Cloud.
CALL
google_ml.create_model( model_id => 'gemini-1.5',
model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_service_agent_iam');
يمكنك التحقّق من النماذج التي تم ضبطها للوصول إليها من خلال الأمر التالي في 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;
ملاحظة: إذا كنت تستخدم مشروعًا حاليًا على Google Cloud ومجموعة/مثيل حاليَين من AlloyDB تم إنشاؤهما منذ فترة، قد تحتاج إلى حذف الإشارات القديمة إلى نموذج gemini-1.5 وإنشاءه مرة أخرى باستخدام عبارة CALL أعلاه وتنفيذ grant execute on function ml_predict_row مرة أخرى في حال مواجهة مشاكل في عمليات الاستدعاء القادمة لـ gemini-1.5.
تقييم الردود
على الرغم من أنّنا سنستخدم طلب بحث واحدًا كبيرًا في القسم التالي لضمان أن تكون الردود الواردة من طلب البحث معقولة، قد يكون من الصعب فهم طلب البحث. سنلقي نظرة على القطع الآن وسنرى كيف يتم تجميعها في بضع دقائق.
- أولاً، سنرسل طلبًا إلى قاعدة البيانات للحصول على أقرب 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-004',
'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-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
على الرغم من أنّ ذلك قد يبدو أمرًا شاقًا، نأمل أن يكون بإمكانك فهمه بشكل أفضل. توضّح النتائج ما إذا كانت هناك مطابقة أم لا، ونسبتها المئوية، وبعض التفسيرات حول التقييم.
يُرجى العِلم أنّ نموذج Gemini مفعَّل البث تلقائيًا، لذا يتم توزيع الردّ الفعلي على أسطر متعددة:
10. نقل التطبيق إلى الويب
هل أنت مستعد لنشر هذا التطبيق على الويب؟ اتّبِع الخطوات التالية لإنشاء محرك معرفة غير مستنِد إلى خادم باستخدام وظائف Cloud Run:
- انتقِل إلى "وظائف Cloud Run" في Google Cloud Console من أجل إنشاء "وظيفة Cloud Run" جديدة أو استخدِم الرابط: https://console.cloud.google.com/functions/add.
- اختَر "دالة Cloud Run" للبيئة. أدخِل اسم الدالة "retail-engine" واختَر المنطقة "us-central1". اضبط المصادقة على "السماح بطلبات البيانات غير المعتمَدة" وانقر على التالي. اختَر Java 17 كوقت تشغيل وInline Editor (المحرِّر المضمّن) للرمز المصدر.
- سيتم ضبط نقطة الدخول تلقائيًا على "
gcfv2.HelloHttpFunction
". استبدِل الرمز النائب فيHelloHttpFunction.java
وpom.xml
لدالة Cloud Run بالرمز من ملف Java وXML على التوالي. - تذكَّر تغيير العنصر النائب $PROJECT_ID وبيانات اعتماد اتصال AlloyDB باستخدام قيمك في ملف Java. بيانات اعتماد AlloyDB هي البيانات التي استخدمناها في بداية هذا البرنامج التعليمي. إذا كنت قد استخدمت قيمًا مختلفة، يُرجى تعديلها في ملف Java.
- انقر على نشر.
بعد نشر الوظائف، سننشئ موصِّل شبكة VPC للسماح لوظائف Cloud بالوصول إلى مثيل قاعدة بيانات AlloyDB.
خطوة مهمة:
بعد تحديد موعد النشر، من المفترض أن تتمكّن من الاطّلاع على الدوال في وحدة تحكّم Cloud Run Functions في Google. ابحث عن الدالة التي تم إنشاؤها حديثًا (retail-engine
)، وانقر عليها، ثم انقر على تعديل وغيِّر ما يلي:
- الانتقال إلى "وقت التشغيل" و"الإصدار" و"عمليات الربط" وإعدادات الأمان
- زيادة مهلة الانتظار إلى 180 ثانية
- انتقِل إلى علامة التبويب "عمليات الربط":
- ضمن إعدادات Ingress (الدخول)، تأكَّد من اختيار "Allow all traffic" (السماح بكل الزيارات).
- ضمن إعدادات "الخروج"، انقر على القائمة المنسدلة "الشبكة" واختَر "إضافة موصل VPC جديد" واتّبِع التعليمات التي تظهر في مربّع الحوار المنبثق:
- أدخِل اسمًا لموصِّل VPC وتأكَّد من أنّ المنطقة هي نفسها التي تعمل فيها المثيل. اترك قيمة "الشبكة" على الإعداد التلقائي واضبط "الشبكة الفرعية" على "نطاق IP مخصّص" باستخدام نطاق IP 10.8.0.0 أو أي نطاق مشابه متاح.
- وسِّع SETTINGS FOR SHOWING SCALED SCREENS وتأكَّد من ضبط الإعدادات على النحو التالي بالضبط:
- انقر على "إنشاء"، ومن المفترض أن يظهر هذا الموصّل في إعدادات الخروج الآن.
- اختَر الموصّل الذي تم إنشاؤه حديثًا.
- اختَر توجيه جميع الزيارات من خلال موصِّل VPC هذا.
- انقر على التالي ثم على نشر.
11. اختبار التطبيق
بعد نشر دالة Cloud Functions المعدَّلة، من المفترض أن تظهر لك نقطة النهاية بالتنسيق التالي:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine
يمكنك اختباره من وحدة 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://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
والنتيجة هي:
هذا كل شيء! بهذه البساطة، يمكنك إجراء "بحث متّجه التشابه" باستخدام نموذج "عمليات التضمين" في بيانات AlloyDB.
إنشاء برنامج وكيل المحادثة
يتم إنشاء الوكيل في الجزء 2 من هذا الدرس العملي.
12. تَنظيم
إذا كنت تخطّط لإكمال الجزء 2 من هذا الدرس، يمكنك تخطّي هذه الخطوة لأنّ ذلك سيؤدي إلى حذف المشروع الحالي.
لتجنُّب تحصيل رسوم من حسابك على Google Cloud مقابل الموارد المستخدَمة في هذه المشاركة، اتّبِع الخطوات التالية:
- في وحدة تحكّم Google Cloud، انتقِل إلى صفحة إدارة الموارد.
- في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على حذف.
- في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.
13. تهانينا
تهانينا! لقد أجريت بنجاح عملية بحث عن التشابه باستخدام AlloyDB وpgvector وVector search. من خلال الجمع بين إمكانات AlloyDB وVertex AI والبحث عن المتّجهات، حققنا قفزة كبيرة إلى الأمام في تسهيل الوصول إلى عمليات البحث السياقي والبحث عن المتّجهات وجعلها أكثر فعالية وأكثر تركيزًا على المعنى. يتناول الجزء التالي من هذا الدرس التطبيقي خطوات إنشاء موظّف الدعم.