إنشاء ونشر بحث ديناميكي مختلط في مجال البيع بالتجزئة باستخدام AlloyDB وGemini وCloud Run

1. نظرة عامة

في سوق البيع بالتجزئة التنافسي اليوم، من الضروري تمكين العملاء من العثور على ما يبحثون عنه بالضبط، وبسرعة وسهولة. غالبًا ما يعجز البحث التقليدي المستند إلى الكلمات الرئيسية عن تحقيق ذلك، إذ يواجه صعوبة في التعامل مع طلبات البحث الدقيقة وكتالوجات المنتجات الواسعة. يكشف هذا الدرس التطبيقي حول الترميز عن تطبيق بحث متطوّر في مجال البيع بالتجزئة تم إنشاؤه على AlloyDB وAlloyDB AI، ويستفيد من أحدث التقنيات، مثل "البحث المتّجه" وفهرسة scaNN والفلاتر المتعدّدة الأوجه والفلاتر الذكية التكيّفية وإعادة الترتيب لتقديم تجربة بحث ديناميكية ومختلطة على مستوى المؤسسة.

لدينا الآن فهم أساسي لثلاثة أمور:

  1. مفهوم البحث السياقي بالنسبة إلى وكيلك وكيفية تنفيذه باستخدام "البحث المتّجه"
  2. تحدّثنا أيضًا بالتفصيل عن إمكانية استخدام Vector Search ضمن نطاق بياناتك، أي داخل قاعدة البيانات نفسها (تتيح جميع قواعد بيانات Google Cloud هذه الإمكانية، إذا لم تكن على علم بذلك).
  3. لقد ذهبنا إلى أبعد من ذلك في إطلاعك على كيفية تحقيق إمكانية البحث الدلالي الخفيف الوزن هذه باستخدام أداء وجودة عاليَين من خلال إمكانية "البحث الدلالي" في AlloyDB المستندة إلى فهرس ScaNN.

إذا لم تكن قد اطّلعت على تجارب RAG الأساسية والمتوسطة والمتقدّمة قليلاً، أنصحك بقراءة هذه التجارب الثلاث هنا وهنا وهنا بالترتيب المذكور.

التحدّي

تجاوز الفلاتر والكلمات الرئيسية والمطابقة السياقية: قد يؤدي البحث البسيط عن كلمة رئيسية إلى عرض آلاف النتائج، العديد منها غير ذي صلة. يجب أن يدرك الحلّ المثالي الغرض من طلب البحث، وأن يجمعه مع معايير فلترة دقيقة (مثل العلامة التجارية أو المادة أو السعر)، وأن يعرض المنتجات الأكثر صلة في غضون أجزاء من الثانية. يتطلّب ذلك بنية أساسية قوية ومرنة وقابلة للتوسّع للبحث. بالتأكيد، لقد قطعنا شوطًا طويلاً من البحث عن الكلمات الرئيسية إلى المطابقات السياقية وعمليات البحث عن التشابه. تخيّل أنّ أحد العملاء يبحث عن "سترة مريحة وأنيقة ومقاومة للماء ومناسبة للتنزه في الربيع"، وفي الوقت نفسه يطبّق فلاتر، ولا يقتصر تطبيقك على عرض نتائج عالية الجودة، بل يتميّز أيضًا بأداء عالٍ، ويتم اختيار تسلسل كل ذلك بشكل ديناميكي من خلال قاعدة البيانات.

الهدف

لحلّ هذه المشكلة من خلال دمج

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

لنستعرض بالتفصيل رحلة البنية والتنفيذ.

ما ستنشئه

تطبيق بحث للبيع بالتجزئة

في إطار ذلك، ستتمكّن من:

  1. إنشاء مثيل وجدول AlloyDB لمجموعة بيانات التجارة الإلكترونية
  2. إعداد عمليات التضمين وVector Search
  3. إنشاء فهرس البيانات الوصفية وفهرس ScaNN
  4. تنفيذ ميزة "البحث المتّجه" المتقدّمة في AlloyDB باستخدام طريقة الفلترة المضمّنة في ScaNN
  5. إعداد "الفلاتر المتعدّدة الأوجه" و"البحث المختلط" في طلب بحث واحد
  6. تحسين مدى صلة طلب البحث بالنتائج من خلال إعادة الترتيب والاسترجاع (اختياري)
  7. تقييم الردّ على طلب البحث باستخدام Gemini (اختياري)
  8. مجموعة أدوات MCP لقواعد البيانات وطبقة التطبيق
  9. تطوير التطبيقات (Java) باستخدام ميزة "البحث المتعدّد الأوجه"

المتطلبات

  • متصفّح، مثل Chrome أو Firefox
  • مشروع على Google Cloud تم تفعيل الفوترة فيه

2. قبل البدء

إنشاء مشروع

  1. في Google Cloud Console، في صفحة اختيار المشروع، اختَر أو أنشِئ مشروعًا على Google Cloud.
  2. تأكَّد من تفعيل الفوترة لمشروعك على Cloud. تعرَّف على كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في مشروع .

للحصول على أرصدة Google Cloud: إذا كنت تريد الحصول على أرصدة Google Cloud لمساعدتك في البدء، استخدِم هذا الرابط لتحصيل الأرصدة. يمكنك اتّباع التعليمات هنا لتحصيل قيمتها.

  1. ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud. انقر على "تفعيل Cloud Shell" في أعلى "وحدة تحكّم Google Cloud".

صورة زر تفعيل Cloud Shell

  1. بعد الاتصال بـ Cloud Shell، يمكنك التأكّد من أنّك قد أثبتّ هويتك وأنّ المشروع مضبوط على معرّف مشروعك باستخدام الأمر التالي:
gcloud auth list
  1. نفِّذ الأمر التالي في Cloud Shell للتأكّد من أنّ أمر gcloud يعرف مشروعك.
gcloud config list project
  1. إذا لم يتم ضبط مشروعك، استخدِم الأمر التالي لضبطه:
gcloud config set project <YOUR_PROJECT_ID>
  1. فعِّل واجهات برمجة التطبيقات المطلوبة: اتّبِع الرابط وفعِّل واجهات برمجة التطبيقات.

يمكنك بدلاً من ذلك استخدام أمر gcloud لهذا الغرض. راجِع المستندات لمعرفة أوامر gcloud وطريقة استخدامها.

3- إعداد قاعدة البيانات

في هذا التمرين العملي، سنستخدم AlloyDB كقاعدة بيانات لبيانات التجارة الإلكترونية. يستخدم المجموعات للاحتفاظ بجميع الموارد، مثل قواعد البيانات والسجلات. تحتوي كل مجموعة على مثيل أساسي يوفّر نقطة وصول إلى البيانات. ستحتوي الجداول على البيانات الفعلية.

لننشئ مجموعة AlloyDB ومثيلًا وجدولاً سيتم تحميل مجموعة بيانات التجارة الإلكترونية فيها.

إنشاء مجموعة ومثيل

  1. انتقِل إلى صفحة AlloyDB في Cloud Console. تتمثّل إحدى الطرق السهلة للعثور على معظم الصفحات في Cloud Console في البحث عنها باستخدام شريط البحث في وحدة التحكّم.
  2. اختَر إنشاء مجموعة من تلك الصفحة:

f76ff480c8c889aa.png

  1. ستظهر لك شاشة مشابهة للشاشة أدناه. أنشئ مجموعة ومثيل بالقيم التالية (تأكَّد من تطابق القيم في حال استنساخ رمز التطبيق من المستودع):
  • معرّف المجموعة: "vector-cluster"
  • كلمة المرور: "alloydb"
  • ‫PostgreSQL 15 / أحدث إصدار يُنصح به
  • المنطقة: "us-central1"
  • الشبكات: "default"

538dba58908162fb.png

  1. عند اختيار الشبكة التلقائية، ستظهر لك شاشة مثل الشاشة أدناه.

انقر على إعداد الاتصال.

7939bbb6802a91bf.png

  1. بعد ذلك، اختَر "استخدام نطاق عناوين IP مخصّص تلقائيًا" وانقر على "متابعة". بعد مراجعة المعلومات، انقر على CREATE CONNECTION (إنشاء اتصال). 768ff5210e79676f.png
  2. بعد إعداد شبكتك، يمكنك مواصلة إنشاء مجموعتك. انقر على إنشاء مجموعة لإكمال إعداد المجموعة كما هو موضّح أدناه:

e06623e55195e16e.png

ملاحظة مهمة:

  1. احرص على تغيير معرّف المثيل (الذي يمكنك العثور عليه عند إعداد المجموعة أو المثيل) إلى **vector-instance**. وإذا لم تتمكّن من تغييره، تذكَّر **استخدام معرّف المثيل** في جميع المراجع القادمة.
  2. يُرجى العِلم أنّ عملية إنشاء المجموعة ستستغرق حوالي 10 دقائق. بعد اكتمال العملية بنجاح، من المفترض أن تظهر لك شاشة تعرض نظرة عامة على المجموعة التي أنشأتها للتو.

4. نقل البيانات

حان الوقت الآن لإضافة جدول يتضمّن بيانات حول المتجر. انتقِل إلى AlloyDB، واختَر المجموعة الأساسية، ثم AlloyDB Studio:

847e35f1bf8a8bd8.png

قد تحتاج إلى الانتظار إلى أن يكتمل إنشاء الجهاز الظاهري. بعد ذلك، سجِّل الدخول إلى AlloyDB باستخدام بيانات الاعتماد التي أنشأتها عند إنشاء المجموعة. استخدِم البيانات التالية للمصادقة على PostgreSQL:

  • اسم المستخدم : "postgres"
  • قاعدة البيانات : "postgres"
  • كلمة المرور : "alloydb"

بعد إكمال عملية المصادقة بنجاح في AlloyDB Studio، يتم إدخال أوامر SQL في "المحرّر". يمكنك إضافة نوافذ "المحرّر" متعددة باستخدام علامة الجمع على يسار النافذة الأخيرة.

91a86d9469d499c4.png

ستُدخل أوامر AlloyDB في نوافذ المحرّر، باستخدام الخيارات "تشغيل" و"تنسيق" و"محو" حسب الحاجة.

تفعيل الإضافات

لإنشاء هذا التطبيق، سنستخدم الإضافتين pgvector وgoogle_ml_integration. تتيح لك إضافة pgvector تخزين عمليات التضمين المتجهة والبحث عنها. توفّر إضافة google_ml_integration دوال يمكنك استخدامها للوصول إلى نقاط نهاية التوقّع في Vertex AI من أجل الحصول على توقّعات في SQL. فعِّل هذه الإضافات من خلال تنفيذ تعريفات البيانات التالية:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;

إذا أردت التحقّق من الإضافات التي تم تفعيلها في قاعدة البيانات، نفِّذ أمر SQL التالي:

select extname, extversion from pg_extension;

إنشاء جدول

يمكنك إنشاء جدول باستخدام عبارة DDL أدناه في AlloyDB Studio:

CREATE TABLE apparels ( 
  id BIGINT, 
  category VARCHAR(100), 
  sub_category VARCHAR(50), 
  uri VARCHAR(200), 
  gsutil_uri VARCHAR(200),
  image VARCHAR(100), 
  content VARCHAR(2000), 
  pdt_desc VARCHAR(5000), 
  color VARCHAR(2000),
  gender VARCHAR(200),
  embedding vector(768),
  img_embeddings vector(1408),
  additional_specification VARCHAR(100000));

سيسمح عمود التضمين بتخزين قيم المتجهات للنص.

منح الإذن

نفِّذ العبارة أدناه لمنح إذن التنفيذ على الدالة "embedding":

GRANT EXECUTE ON FUNCTION embedding TO postgres;

منح دور "مستخدم Vertex AI" لحساب خدمة AlloyDB

من وحدة تحكّم Google Cloud IAM، امنح حساب خدمة AlloyDB (الذي يبدو على النحو التالي: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) إذن الوصول إلى الدور "مستخدم Vertex AI". سيحتوي PROJECT_NUMBER على رقم مشروعك.

بدلاً من ذلك، يمكنك تنفيذ الأمر أدناه من "وحدة 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"

تحميل البيانات إلى قاعدة البيانات

  1. انسخ عبارات طلب البحث insert من insert scripts sql في ورقة البيانات إلى المحرّر كما هو موضّح أعلاه. يمكنك نسخ 10 إلى 50 عبارة إدراج للحصول على عرض توضيحي سريع لحالة الاستخدام هذه. تتضمّن علامة التبويب "الإعلانات المدرَجة المحدّدة 25-30 صفًا" قائمة محدّدة بالإعلانات المدرَجة.

يمكن العثور على رابط البيانات في ملف مستودع github هذا.

  1. انقر على تشغيل. تظهر نتائج طلب البحث في جدول النتائج.

ملاحظة مهمة:

احرص على نسخ 25 إلى 50 سجلاً فقط لإدراجها، وتأكَّد من أنّها من نطاق الفئة والفئة الفرعية واللون وأنواع الجنس.

5- إنشاء تضمينات للبيانات

يكمن الابتكار الحقيقي في البحث الحديث في فهم المعنى، وليس الكلمات الرئيسية فقط. وهنا يأتي دور التضمينات والبحث المتّجه.

حوّلنا أوصاف المنتجات وطلبات بحث المستخدمين إلى تمثيلات رقمية عالية الأبعاد تُعرف باسم "التضمينات" باستخدام نماذج لغوية مُدرَّبة مسبقًا. تتضمّن عمليات التضمين هذه المعنى الدلالي، ما يسمح لنا بالعثور على منتجات "متشابهة في المعنى" بدلاً من المنتجات التي تحتوي على كلمات متطابقة فقط. في البداية، جرّبنا البحث المباشر عن التشابه بين المتجهات في عمليات التضمين هذه لتحديد خط أساس، ما يوضّح قوة الفهم الدلالي حتى قبل تحسين الأداء.

سيتيح عمود التضمين تخزين قيم المتجهات لنص وصف المنتج. سيسمح عمود img_embeddings بتخزين تضمينات الصور (متعددة الوسائط). بهذه الطريقة، يمكنك أيضًا استخدام البحث المستند إلى المسافة بين النص والصورة. لكنّنا سنستخدم تضمينات النصوص فقط في هذا الدرس التطبيقي.

SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');

من المفترض أن يعرض هذا الطلب متجه التضمينات، الذي يبدو كصفيف من الأرقام العشرية، للنص النموذجي في الطلب. يبدو على النحو التالي:

25a1d7ef0e49e91e.png

تعديل حقل "المتجهات" abstract_embeddings

نفِّذ أمر لغة معالجة البيانات (DML) أدناه لتعديل وصف المحتوى في الجدول باستخدام عمليات التضمين المقابلة:

UPDATE apparels SET embedding = embedding('text-embedding-005',pdt_desc)::vector 
WHERE pdt_desc IS NOT NULL;

قد تواجه مشكلة في إنشاء أكثر من عدد قليل من التضمينات (20 إلى 25 كحد أقصى) إذا كنت تستخدم حساب فوترة برصيد تجريبي على Google Cloud. لذا، يجب الحدّ من عدد الصفوف في نص الإدراج.

إذا أردت إنشاء تضمينات صور (لإجراء بحث سياقي متعدّد الوسائط)، نفِّذ التعديل أدناه أيضًا:

update apparels set img_embeddings = ai.image_embedding(
  model_id => 'multimodalembedding@001',
  image => gsutil_uri,
  mimetype => 'image/jpg')       
where gsutil_uri is not null

6. تنفيذ عملية استرجاع وتوليد متقدّمة باستخدام ميزات AlloyDB الجديدة

بعد أن أصبح الجدول والبيانات والتضمينات جاهزة، لننفّذ الآن عملية "البحث المتّجه" في الوقت الفعلي عن نص بحث المستخدم. يمكنك اختبار ذلك من خلال تنفيذ طلب البحث أدناه:

SELECT id, content, uri, category, sub_category,color,gender 
FROM apparels 
ORDER BY embedding <=> embedding('text-embedding-005','T-shirt with round neck')::vector limit 10 ;

في طلب البحث هذا، نقارن بين تضمين النص الخاص بعبارة البحث التي أدخلها المستخدم "تي شيرت بياقة دائرية" وبين عمليات تضمين النص لجميع أوصاف المنتجات في جدول الملابس (المخزّنة في العمود المسمّى "تضمين") باستخدام دالة مسافة التشابه الجيب التمام (الممثّلة بالرمز "<=>"). ونحوّل نتيجة طريقة التضمين إلى نوع متّجه لجعلها متوافقة مع المتّجهات المخزّنة في قاعدة البيانات. يشير LIMIT 10 إلى أنّنا نختار 10 نتائج مطابقة الأقرب إلى نص البحث.

تتيح AlloyDB إمكانات جديدة في ميزة "البحث المتّجه" باستخدام RAG:

بالنسبة إلى حلّ على مستوى المؤسسة، لا يكفي البحث عن المتجهات الأولية. الأداء مهم جدًا.

فهرس ScaNN (الجيران الأقرب القابل للتوسيع)

لتحقيق بحث سريع جدًا عن أقرب الجيران التقريبيين (ANN)، فعّلنا فهرس scaNN في AlloyDB. تم تصميم ScaNN، وهي خوارزمية بحث متطوّرة عن الجيران الأقرب تقريبًا، طوّرها فريق Google Research، لإجراء عمليات بحث فعّالة عن التشابه بين المتجهات على نطاق واسع. يؤدي ذلك إلى تسريع الاستعلامات بشكل كبير من خلال تقليل مساحة البحث بكفاءة واستخدام تقنيات التكميم، ما يتيح تنفيذ استعلامات المتجهات أسرع بما يصل إلى 4 مرات مقارنةً بطرق الفهرسة الأخرى، بالإضافة إلى تقليل مساحة الذاكرة المستخدَمة. يمكنك الاطّلاع على مزيد من المعلومات حول هذا الموضوع هنا وهنا.

لنفعّل الإضافة وننشئ الفهارس:

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

إنشاء فهارس لكل من حقول تضمين النصوص وتضمين الصور (في حال أردت استخدام تضمين الصور في البحث):

CREATE INDEX apparels_index ON apparels 
USING scann (embedding cosine)
WITH (num_leaves=32);

CREATE INDEX apparels_img_index ON apparels 
USING scann (img_embeddings cosine)
WITH (num_leaves=32);

فهارس البيانات الوصفية

في حين أنّ scaNN يتعامل مع فهرسة المتجهات، تم إعداد فهارس B-tree أو GIN التقليدية بدقة على السمات المنظَّمة (مثل الفئة والفئة الفرعية والتصميم واللون وما إلى ذلك). تُعدّ هذه الفهارس ضرورية لفعالية البحث المتعدّد الأوجه. نفِّذ العبارات أدناه لإعداد فهارس البيانات الوصفية:

CREATE INDEX idx_category ON apparels (category);

CREATE INDEX idx_sub_category ON apparels (sub_category);

CREATE INDEX idx_color ON apparels (color);

CREATE INDEX idx_gender ON apparels (gender);

ملاحظة مهمة:

بما أنّه قد تم إدراج 25 إلى 50 سجلاً فقط، لن تكون الفهارس (ScaNN أو أي فهرس آخر) فعّالة.

التصفية المضمّنة

من التحديات الشائعة في البحث المتّجه هو دمجه مع الفلاتر المنظَّمة (مثل أحذية حمراء"). تعمل ميزة الفلترة المضمّنة في AlloyDB على تحسين ذلك. بدلاً من فلترة النتائج بعد إجراء بحث واسع النطاق عن المتجهات، تطبِّق الفلترة المضمّنة شروط الفلترة أثناء عملية البحث عن المتجهات نفسها، ما يؤدي إلى تحسين الأداء والدقة بشكل كبير في عمليات البحث عن المتجهات التي تمّت فلترتها.

يمكنك الرجوع إلى هذه المستندات لمعرفة المزيد حول الحاجة إلى الفلترة المضمّنة. يمكنك أيضًا التعرّف على البحث المتّجه المفلتر لتحسين أداء البحث المتّجه هنا. الآن، إذا أردت تفعيل الفلترة المضمّنة لتطبيقك، نفِّذ العبارة التالية من المحرّر:

SET scann.enable_inline_filtering = on;

تكون الفلترة المضمّنة هي الأفضل في الحالات التي تتضمّن انتقائية متوسطة. أثناء بحث AlloyDB في فهرس المتجهات، لا يحتسب المسافات إلا للمتجهات التي تتطابق مع شروط فلترة البيانات الوصفية (الفلاتر الوظيفية في الاستعلام التي يتم التعامل معها عادةً في عبارة WHERE). يؤدي ذلك إلى تحسين الأداء بشكل كبير لهذه الطلبات، ما يكمّل مزايا الفلترة اللاحقة أو الفلترة المسبقة.

التصفية التكيّفية

لتحسين الأداء بشكل أكبر، تختار ميزة "الفلترة التكيّفية" في AlloyDB بشكلٍ ديناميكي استراتيجية الفلترة الأكثر فعالية (الفلترة المضمّنة أو المسبقة) أثناء تنفيذ طلب البحث. ويحلّل أنماط الطلبات وتوزيعات البيانات لضمان الأداء الأمثل بدون تدخل يدوي، وهو مفيد بشكل خاص لعمليات البحث المتجهة التي تمّت فلترتها، حيث يتم التبديل تلقائيًا بين استخدام الفهرس المتجه وفهرس البيانات الوصفية. لتفعيل الفلترة التكيّفية، استخدِم العلامة scann.enable_preview_features.

عندما تؤدي الفلترة التكيّفية إلى التبديل من الفلترة المضمّنة إلى الفلترة المسبقة أثناء التنفيذ، تتغير خطة طلب البحث ديناميكيًا.

SET scann.enable_preview_features = on;

ملاحظة مهمة: قد لا تتمكّن من تنفيذ العبارة أعلاه بدون إعادة تشغيل المثيل، وفي حال مواجهة خطأ، من الأفضل تفعيل العلامة enable_preview_features من قسم علامات قاعدة البيانات في المثيل.

فلاتر متعدّدة الأوجه تستخدم جميع الفهارس

يتيح البحث المتعدّد الأوجه للمستخدمين تحسين النتائج من خلال تطبيق فلاتر متعدّدة استنادًا إلى سمات أو "أوجه" محدّدة (مثل العلامة التجارية أو السعر أو الحجم أو تقييم العملاء). يدمج تطبيقنا هذه التصنيفات بسلاسة مع البحث المتّجه. يمكن لطلب بحث واحد الآن الجمع بين اللغة الطبيعية (البحث السياقي) وخيارات متعدّدة الأوجه، والاستفادة بشكل ديناميكي من كلّ من الفهرس المتّجه والفهرس التقليدي. يوفّر ذلك إمكانية بحث مختلط ديناميكي حقًا، ما يتيح للمستخدمين التوغّل في النتائج بدقة.

في تطبيقنا، بما أنّنا أنشأنا جميع فهارس البيانات الوصفية، أصبحنا جاهزين لاستخدام الفلتر المتعدّد الأوجه على الويب من خلال معالجة ذلك مباشرةً باستخدام طلبات بحث SQL:

SELECT id, content, uri, category, sub_category,color,gender 
FROM apparels
WHERE category = ANY($1) and sub_Category = ANY($2) and color = ANY($3) and gender = ANY($4)
ORDER BY embedding <=> embedding('text-embedding-005',$5)::vector limit 10 ;

في طلب البحث هذا، نجري بحثًا مختلطًا يتضمّن

  1. الفلترة المتعدّدة الأوجه في عبارة WHERE
  2. البحث المتّجه في عبارة ORDER BY باستخدام طريقة التشابه الجيب التمامي

تمثّل القيم 1 و2 و3 و4 دولار أمريكي قيم الفلتر المتعدّد الأوجه في مصفوفة، وتمثّل القيمة 5 دولار أمريكي نص بحث المستخدم. استبدِل $1 إلى $4 بقيم الفلتر المتعدّد الأوجه التي تختارها كما يلي:

category = ANY([‘Apparel', ‘Footwear'])

استبدِل 5 دولار أمريكي بنص بحث من اختيارك، مثلاً "قمصان بولو".

ملاحظة مهمة: إذا لم تكن لديك الفهارس بسبب المجموعة المحدودة من السجلات التي أدرجتها، لن يظهر لك تأثير الأداء. ولكن في مجموعة بيانات إنتاج كاملة، ستلاحظ أنّ وقت التنفيذ ينخفض بشكل كبير عند استخدام "البحث المتّجه" نفسه، وذلك بفضل استخدام فهرس ScaNN المضمّن في "البحث المتّجه"، ما أتاح تحقيق ذلك.

بعد ذلك، لنقيّم معدّل الاسترجاع لعملية البحث المتجهي هذه المفعَّلة باستخدام ScaNN.

إعادة الترتيب

حتى مع استخدام "البحث المتقدّم"، قد تحتاج النتائج الأولية إلى بعض التحسينات النهائية. وهي خطوة مهمة تعيد ترتيب نتائج البحث الأولية لتحسين مدى صلتها بطلب البحث. بعد أن يقدّم البحث المختلط الأولي مجموعة من المنتجات المرشّحة، يطبّق نموذج أكثر تطورًا (وغالبًا ما يكون أكثر تعقيدًا من الناحية الحسابية) درجة ملاءمة أكثر دقة. يضمن ذلك أنّ النتائج الأولى المعروضة للمستخدم هي الأنسب، ما يؤدي إلى تحسين جودة البحث بشكل كبير. نقيّم باستمرار معدّل الاسترجاع لقياس مدى جودة استرداد النظام لجميع العناصر ذات الصلة بطلب بحث معيّن، ونعمل على تحسين نماذجنا لزيادة احتمالية عثور العميل على ما يحتاج إليه.

قبل استخدام هذه الميزة في تطبيقك، تأكَّد من استيفاء جميع المتطلبات الأساسية:

بعد ذلك، يمكنك استخدام طلب البحث التالي في تطبيقنا لإعادة ترتيب مجموعة نتائج البحث المختلط:

WITH initial_ranking AS (
SELECT id,content, pdt_desc, uri, category, sub_category,color,gender,
ROW_NUMBER() OVER () AS ref_number 
FROM apparels 
    order by embedding <=>embedding('text-embedding-005', 'Pink top')::vector),
reranked_results AS (
            SELECT index, score from 
            ai.rank(
              model_id => 'semantic-ranker-default-003',
              search_string => 'Pink top',
              documents => (SELECT ARRAY_AGG(pdt_desc ORDER BY ref_number) FROM initial_ranking)
            )
)
SELECT id,content, pdt_desc, uri, category, sub_category,color,gender, score
FROM initial_ranking, reranked_results 
WHERE initial_ranking.ref_number = reranked_results.index
ORDER BY reranked_results.score DESC
limit 25;

في هذا الاستعلام، نعيد ترتيب مجموعة نتائج المنتجات الخاصة بالبحث السياقي التي يتم تناولها في عبارة ORDER BY باستخدام طريقة التشابه الجيب التمامي. "قميص وردي" هو النص الذي يبحث عنه المستخدم.

ملاحظة مهمة: قد لا يتوفّر خيار "إعادة الترتيب" لبعضكم بعد، لذا استبعدته من رمز التطبيق، ولكن إذا أردت تضمينه، يمكنك اتّباع النموذج الذي تناولناه أعلاه.

Recall Evaluator

في البحث المشابه، يشير التذكّر إلى النسبة المئوية للحالات ذات الصلة التي تم استرجاعها من عملية بحث، أي عدد النتائج الموجبة الصحيحة. هذا هو المقياس الأكثر شيوعًا المستخدَم لقياس جودة البحث. أحد أسباب فقدان الاسترجاع هو الفرق بين البحث عن الجيران الأقرب التقريبي، أو aNN، والبحث عن الجيران الأقرب k (التام)، أو kNN. تنفّذ فهارس المتجهات، مثل ScaNN في AlloyDB، خوارزميات aNN، ما يتيح لك تسريع البحث المتجه في مجموعات البيانات الكبيرة مقابل تنازل بسيط عن الاسترجاع. تتيح لك AlloyDB الآن إمكانية قياس هذا التوازن مباشرةً في قاعدة البيانات للاستعلامات الفردية والتأكّد من ثباته بمرور الوقت. يمكنك تعديل مَعلمات الطلب والفهرس استجابةً لهذه المعلومات لتحقيق نتائج وأداء أفضل.

ما هو المنطق الذي يستند إليه استرجاع نتائج البحث؟

في سياق البحث المتّجهي، يشير الاسترجاع إلى النسبة المئوية للمتّجهات التي يعرضها الفهرس والتي تمثّل أقرب جيران حقيقيين. على سبيل المثال، إذا كان طلب البحث عن الجيران الأقرب لـ 20 جارًا أقربًا يعرض 19 من الجيران الأقرب المطابقين للواقع، تكون نسبة الاسترجاع 19/20x100 = %95. طلب السحب من السوق هو المقياس المستخدَم لجودة البحث، ويتم تعريفه على أنّه النسبة المئوية للنتائج المعروضة التي تكون الأقرب موضوعيًا إلى متجهات طلب البحث.

يمكنك العثور على مقياس الاسترجاع لاستعلام متّجه في فهرس متّجه لإعدادات معيّنة باستخدام الدالة evaluate_query_recall. تتيح لك هذه الدالة ضبط المَعلمات لتحقيق نتائج استرجاع طلب البحث المتّجه التي تريدها.

ملاحظة مهمة:

إذا واجهت خطأ "تم رفض الإذن" في فهرس HNSW في الخطوات التالية، يمكنك تخطّي قسم تقييم الاسترجاع بالكامل في الوقت الحالي. قد يكون السبب مرتبطًا بقيود الوصول في هذه المرحلة لأنّ التطبيق تم إصداره للتوّ عند إنشاء مستندات هذا الدرس العملي.

  1. اضبط العلامة Enable Index Scan على فهرس ScaNN وفهرس HNSW:
SET scann.enable_indexscan = on
SET hnsw.enable_index_scan = on
  1. نفِّذ الاستعلام التالي في AlloyDB Studio:
SELECT
  *
FROM
  evaluate_query_recall($$
SELECT id,content, pdt_desc, uri, category, sub_category,color,gender
FROM 
apparels 
    order by embedding <=> embedding('text-embedding-005', 'skirts for women')::vector 
  LIMIT 25 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

تتلقّى الدالة evaluate_query_recall طلب البحث كمَعلمة وتعرض مدى استرجاعه. أستخدم طلب البحث نفسه الذي استخدمته للتحقّق من الأداء كطلب بحث إدخال للدالة. لقد أضفتُ SCaNN كطريقة فهرسة. لمزيد من خيارات المَعلمات، يُرجى الرجوع إلى المستندات.

معدّل الاسترجاع لطلب البحث هذا في Vector Search الذي كنا نستخدمه:

4918ec4780156527.png

أرى أنّ معدّل الاسترجاع هو %96. في هذه الحالة، يكون الاسترجاع جيدًا جدًا. ولكن إذا كانت القيمة غير مقبولة، يمكنك استخدام هذه المعلومات لتغيير مَعلمات الفهرس والطُرق ومَعلمات طلب البحث وتحسين استرجاع المعلومات في "البحث المتّجه".

اختبِرها باستخدام مَعلمات طلب البحث والفهرس المعدَّلة

لنختبر الآن طلب البحث من خلال تعديل مَعلمات طلب البحث استنادًا إلى الاستدعاء الذي تم تلقّيه.

  1. تعديل مَعلمات الفهرس:

في هذا الاختبار، سأستخدم "مسافة L2" بدلاً من دالة مسافة التشابه "جيب التمام".

ملاحظة مهمة جدًا: قد تسأل "كيف نعرف أنّ هذا الطلب يستخدم التشابه الجيب التمامي؟". يمكنك تحديد دالة المسافة باستخدام "<=>" لتمثيل مسافة جيب التمام.

رابط المستندات لوظائف المسافة في "البحث عن المتّجهات"

يستخدم الاستعلام السابق دالة مسافة "تشابه جيب التمام"، بينما سنحاول الآن استخدام "مسافة L2". ولكن يجب أيضًا التأكّد من أنّ فهرس ScaNN الأساسي يستخدم دالة مسافة L2. لننشئ الآن فهرسًا باستخدام طلب بحث مختلف لدالة المسافة: مسافة L2: <->

drop index apparels_index;

CREATE INDEX apparels_index ON apparels 
USING scann (embedding L2)
WITH (num_leaves=32);

عبارة حذف الفهرس هي فقط لضمان عدم وجود فهرس غير ضروري في الجدول.

يمكنني الآن تنفيذ الاستعلام التالي لتقييم RECALL بعد تغيير دالة المسافة في وظيفة "البحث المتّجه".

[بعد] طلب البحث الذي يستخدم دالة المسافة L2:

SELECT
  *
FROM
  evaluate_query_recall($$
SELECT id,content, pdt_desc, uri, category, sub_category,color,gender
FROM 
apparels 
    order by embedding <-> embedding('text-embedding-005', 'skirts for women')::vector 
  LIMIT 25 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

يمكنك الاطّلاع على الفرق أو التحويل في قيمة التذكّر للفهرس المعدَّل.

هناك مَعلمات أخرى يمكنك تغييرها في الفهرس، مثل num_leaves وما إلى ذلك، استنادًا إلى قيمة الاسترجاع المطلوبة ومجموعة البيانات التي يستخدمها تطبيقك.

التحقّق من صحة نتائج البحث عن المتّجهات باستخدام نماذج لغوية كبيرة

لتحقيق أعلى جودة في البحث الخاضع للرقابة، أضفنا طبقة اختيارية للتحقّق من صحة النتائج باستخدام نماذج اللغات الكبيرة. يمكن استخدام نماذج اللغات الكبيرة لتقييم مدى صلة نتائج البحث بطلبات البحث ومدى اتساقها، خاصةً في ما يتعلق بطلبات البحث المعقّدة أو الغامضة. يمكن أن يشمل ذلك:

التحقّق الدلالي:

نموذج لغوي كبير (LLM) يربط النتائج بنية طلب البحث

الفلترة المنطقية:

استخدام نموذج لغوي كبير لتطبيق قواعد أو منطق معقّد خاص بالنشاط التجاري يصعب ترميزه في الفلاتر التقليدية، ما يؤدي إلى تحسين قائمة المنتجات بشكل أكبر استنادًا إلى معايير دقيقة

ضمان الجودة:

تحديد النتائج الأقل صلة تلقائيًا والإبلاغ عنها ليراجعها فريقنا أو ليتم تحسين النموذج

إليك الطريقة التي حقّقنا بها ذلك في ميزات AlloyDB AI:

WITH 
          apparels_temp as (
                  SELECT id,content, pdt_desc, uri, category, sub_category,color,gender 
                  FROM apparels 
                 -- where category = ANY($1) and sub_category = ANY($2) and color = ANY($3) and gender = ANY($4)
                      order by embedding <=> embedding('text-embedding-005', $5)::vector
                  limit 25
          ),
          prompt AS (
          SELECT 'You are a friendly advisor helping to filter whether a product match' || pdt_desc || 'is reasonably (not necessarily 100% but contextually in agreement) related to the customer''s request: ' || $5 || '. Respond only in YES or NO. Do not add any other text.'
          AS prompt_text, *
          from apparels_temp
          )
          ,
          response AS (
          SELECT id,content,pdt_desc,uri,
                  json_array_elements(ml_predict_row('projects/abis-345004/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
                  json_build_object('contents',
                  json_build_object('role',
                  'user',
                  'parts',
                  json_build_object('text', prompt_text)))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
          FROM 
                  prompt)
          SELECT id, content,uri,replace(replace(resp::text,'\n',''),'"','') as result
          FROM
                  response where replace(replace(resp::text,'\n',''),'"','') in ('YES', 'NO')
                  limit 10;  

طلب البحث الأساسي هو طلب البحث نفسه الذي رأيناه في أقسام البحث المتعدّد الأوجه والبحث المختلط وإعادة الترتيب. في هذا الاستعلام، أضفنا مستوى تقييم من Gemini لمجموعة النتائج التي تمّت إعادة ترتيبها، ويتم تمثيلها من خلال بنية ml_predict_row. لقد علّقت على الفلاتر المتعدّدة الأوجه، ولكن يمكنك تضمين العناصر التي تختارها في مصفوفة للعناصر النائبة من $1 إلى $4. استبدِل 5 دولار أمريكي بأي نص تريد البحث عنه، مثلاً "قميص وردي بدون نقش زهور".

7. مجموعة أدوات MCP لقواعد البيانات وطبقة التطبيق

في الخلفية، تضمن الأدوات القوية والتطبيق المنظَّم جيدًا التشغيل السلس.

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

في تطبيقنا، استخدمنا MCP Toolbox for Databases كطبقة تجريدية لجميع طلبات البحث الذكية المختلطة.

اتّبِع الخطوات التالية لإعداد "أدوات المطوّرين" ونشرها لحالة الاستخدام:

يمكنك ملاحظة أنّ إحدى قواعد البيانات المتوافقة مع "أدوات MCP لقواعد البيانات" هي AlloyDB، وبما أنّنا قد وفّرناها في القسم السابق، لننتقل إلى إعداد "الأدوات".

  1. انتقِل إلى "وحدة Cloud Shell" وتأكَّد من اختيار مشروعك وعرضه في طلب الوحدة. نفِّذ الأمر التالي من "وحدة Cloud Shell الطرفية" للانتقال إلى دليل مشروعك:
mkdir toolbox-tools

cd toolbox-tools
  1. نفِّذ الأمر أدناه لتنزيل مجموعة الأدوات وتثبيتها في مجلدك الجديد:
# see releases page for other versions
export VERSION=0.7.0
curl -O https://storage.googleapis.com/genai-toolbox/v$VERSION/linux/amd64/toolbox
chmod +x toolbox
  1. انتقِل إلى "محرّر Cloud Shell" (لوضع تعديل الرمز) وأضِف ملفًا باسم "tools.yaml" في مجلد جذر المشروع.
sources:
    alloydb:
        kind: "alloydb-postgres"
        project: "<<YOUR_PROJECT_ID>>"
        region: "us-central1"
        cluster: "vector-cluster"
        instance: "vector-instance"
        database: "postgres"
        user: "postgres"
        password: "alloydb"


tools:
        <<tools go here... Refer to the github repo file>>

تأكَّد من استبدال النص البرمجي Tools.yaml بالرمز من ملف المستودع هذا.

لنتعرّف على ملف tools.yaml:

تمثّل المصادر مصادر البيانات المختلفة التي يمكن أن تتفاعل معها إحدى الأدوات. يمثّل المصدر مصدر بيانات يمكن للأداة التفاعل معه. يمكنك تعريف المصادر كخريطة في قسم المصادر ضمن ملف tools.yaml. عادةً، سيحتوي إعداد المصدر على أي معلومات مطلوبة للاتصال بقاعدة البيانات والتفاعل معها.

تحدِّد الأدوات الإجراءات التي يمكن أن يتّخذها الوكيل، مثل القراءة والكتابة إلى مصدر. تمثّل الأداة إجراءً يمكن أن يتّخذه الوكيل، مثل تنفيذ عبارة SQL. يمكنك تعريف "الأدوات" كخريطة في قسم الأدوات من ملف tools.yaml. عادةً، تتطلّب الأداة مصدرًا لتنفيذ إجراء.

لمزيد من التفاصيل حول إعداد ملف tools.yaml، يُرجى الرجوع إلى هذا المستند.

  1. نفِّذ الأمر التالي (من مجلد mcp-toolbox) لبدء الخادم:
./toolbox --tools-file "tools.yaml"

إذا فتحت الخادم الآن في وضع معاينة الويب على السحابة الإلكترونية، من المفترض أن تتمكّن من رؤية خادم "مجموعة الأدوات" يعمل مع أداتك الجديدة المسماة get-order-data.

يتم تشغيل خادم MCP Toolbox تلقائيًا على المنفذ 5000. لنستخدم Cloud Shell لاختبار ذلك.

انقر على "معاينة الويب" في Cloud Shell كما هو موضّح أدناه:

52f1a9646b55eeb2.png

انقر على "تغيير المنفذ" (Change port) واضبط المنفذ على 5000 كما هو موضّح أدناه، ثم انقر على "تغيير ومعاينة" (Change and Preview).

71c8c4659a947acd.png

من المفترض أن يؤدي ذلك إلى ظهور الناتج التالي:

261efdaf0019a65.png

  1. لننشُر Toolbox على Cloud Run:

أولاً، يمكننا البدء بخادم MCP Toolbox واستضافته على Cloud Run. سيمنحنا ذلك نقطة نهاية عامة يمكننا دمجها مع أي تطبيق آخر و/أو تطبيقات "الوكيل" أيضًا. تتوفر تعليمات استضافة هذا التطبيق على Cloud Run هنا. سنستعرض الآن الخطوات الرئيسية.

  1. ابدأ تشغيل "وحدة طرفية Cloud Shell" جديدة أو استخدِم "وحدة طرفية Cloud Shell" حالية. انتقِل إلى مجلد المشروع الذي يتضمّن ملف toolbox الثنائي وملف tools.yaml، وهو في هذه الحالة toolbox-tools، إذا لم تكن فيه:
cd toolbox-tools
  1. اضبط المتغيّر PROJECT_ID للإشارة إلى رقم تعريف مشروعك على Google Cloud.
export PROJECT_ID="<<YOUR_GOOGLE_CLOUD_PROJECT_ID>>"
  1. تفعيل خدمات Google Cloud التالية
gcloud services enable run.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       iam.googleapis.com \
                       secretmanager.googleapis.com
  1. لننشئ حساب خدمة منفصلاً يعمل كمعرّف لخدمة Toolbox التي سننشرها على Google Cloud Run.
gcloud iam service-accounts create toolbox-identity
  1. نحرص أيضًا على أن يكون لحساب الخدمة هذا الأدوار الصحيحة، أي القدرة على الوصول إلى Secret Manager والتواصل مع AlloyDB.
gcloud projects add-iam-policy-binding $PROJECT_ID \
   --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
   --role roles/secretmanager.secretAccessor

gcloud projects add-iam-policy-binding $PROJECT_ID \
   --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
   --role roles/alloydb.client

gcloud projects add-iam-policy-binding $PROJECT_ID \
   --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
   --role roles/serviceusage.serviceUsageConsumer
  1. سنحمّل ملف tools.yaml كبيانات سرية:
gcloud secrets create tools --data-file=tools.yaml

إذا كان لديك رمز سري حالي وأردت تعديل إصدار الرمز السري، نفِّذ ما يلي:

gcloud secrets versions add tools --data-file=tools.yaml
  1. اضبط متغيّر بيئة على صورة الحاوية التي تريد استخدامها في Cloud Run:
export IMAGE=us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:latest
  1. الخطوة الأخيرة في أمر النشر المألوف إلى Cloud Run:
gcloud run deploy toolbox \
--image $IMAGE \
--service-account toolbox-identity \
--region us-central1 \
--set-secrets "/app/tools.yaml=tools:latest" \
--args="--tools-file=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
--allow-unauthenticated \
--labels dev-tutorial=codelab-alloydb-search-toolbox

من المفترض أن تبدأ هذه الخطوة عملية نشر Toolbox Server باستخدام ملف tools.yaml الذي تم إعداده على Cloud Run. عند اكتمال عملية النشر بنجاح، من المفترض أن تظهر لك رسالة مشابهة لما يلي:

Deploying container to Cloud Run service [toolbox] in project [YOUR_PROJECT_ID] region [us-central1]
OK Deploying new service... Done.                                                                                                                                                                                     
  OK Creating Revision...                                                                                                                                                                                             
  OK Routing traffic...                                                                                                                                                                                               
  OK Setting IAM Policy...                                                                                                                                                                                            
Done.                                                                                                                                                                                                                 
Service [toolbox] revision [toolbox-00001-zsk] has been deployed and is serving 100 percent of traffic.
Service URL: https://toolbox-<SOME_ID>.us-central1.run.app

أصبحت الآن جاهزًا لاستخدام الأداة التي تم نشرها حديثًا في تطبيقك المستند إلى الذكاء الاصطناعي التوليدي.

الوصول إلى الأدوات في خادم Toolbox

بعد نشر "مجموعة الأدوات"، سننشئ برنامجًا وسيطًا لوظائف Python Cloud Run للتفاعل مع خادم "مجموعة الأدوات" الذي تم نشره. ويرجع ذلك إلى أنّ Toolbox لا تتضمّن حاليًا حزمة تطوير برامج (SDK) بلغة Java، لذا أنشأنا برنامجًا وسيطًا بلغة Python للتفاعل مع الخادم. في ما يلي رمز المصدر لوظيفة Cloud Run هذه.

عليك إنشاء وظيفة Cloud Run ونشرها لتتمكّن من الوصول إلى أدوات مجموعة الأدوات التي أنشأناها ونشرناها في الخطوات السابقة:

  1. في Google Cloud Console، انتقِل إلى صفحة Cloud Run.
  2. انقر على "كتابة دالة".
  3. في حقل "اسم الخدمة"، أدخِل اسمًا لوصف وظيفتك. يجب أن تبدأ أسماء الخدمات بحرف فقط، وأن تحتوي على 49 حرفًا أو أقل، بما في ذلك الأحرف أو الأرقام أو الواصلات. لا يمكن أن تنتهي أسماء الخدمات بشرطات، ويجب أن تكون فريدة لكل منطقة ومشروع. لا يمكن تغيير اسم الخدمة لاحقًا، وهو يظهر للجميع. (Enter retail-product-search-quality)
  4. في قائمة "المنطقة"، استخدِم القيمة التلقائية أو اختَر المنطقة التي تريد نشر الدالة فيها. (اختَر us-central1)
  5. في قائمة "وقت التشغيل"، استخدِم القيمة التلقائية أو اختَر إصدارًا من وقت التشغيل. (اختَر Python 3.11)
  6. في قسم "المصادقة"، اختَر "السماح بالوصول العام".
  7. انقر على الزر "إنشاء"
  8. يتم إنشاء الدالة وتحميلها باستخدام نموذج main.py وملف requirements.txt.
  9. استبدِل ذلك بالملفات: main.py و requirements.txt من مستودع هذا المشروع
  10. انشر الدالة، وسيظهر لك نقطة نهاية لدالة Cloud Run.

يجب أن تبدو نقطة النهاية على النحو التالي (أو شيء مشابه):

نقطة نهاية وظيفة Cloud Run للوصول إلى مجموعة الأدوات: "https://retail-product-search-quality-<<YOUR_PROJECT_NUMBER>>.us-central1.run.app"

لتسهيل إكمال المشروع خلال الجدول الزمني (لجلسات التدريب العملي بإشراف مدرّب)، سيتم مشاركة رقم المشروع لنقطة النهاية في وقت جلسة التدريب العملي.

ملاحظة مهمة:

بدلاً من ذلك، يمكنك أيضًا تنفيذ جزء قاعدة البيانات مباشرةً كجزء من رمز تطبيقك أو وظيفة Cloud Run.

8. تطوير التطبيقات (Java) باستخدام ميزة "البحث المتعدّد الأوجه"

وأخيرًا، يتم إتاحة جميع مكوّنات الخلفية الفعّالة هذه من خلال طبقة التطبيق. تم تطوير التطبيق بلغة Java، وهو يوفّر واجهة مستخدم للتفاعل مع نظام البحث. تنسّق هذه الخدمة طلبات البحث إلى AlloyDB، وتتعامل مع عرض الفلاتر المتعدّدة الأوجه، وتدير اختيارات المستخدمين، وتعرض نتائج البحث التي تم التحقّق من صحتها وإعادة ترتيبها بطريقة سلسة وبديهية.

  1. يمكنك البدء بالانتقال إلى "وحدة طرفية Cloud Shell" واستنساخ المستودع:
git clone https://github.com/AbiramiSukumaran/faceted_searching_retail
  1. انتقِل إلى "محرّر Cloud Shell"، حيث يمكنك الاطّلاع على المجلد الذي تم إنشاؤه حديثًا باسم faceted_searching_retail.
  2. احذف ما يلي لأنّ هذه الخطوات قد اكتملت في الأقسام السابقة:
  3. احذف المجلد Cloud_Run_Function.
  4. احذف الملف db_script.sql.
  5. احذف الملف tools.yaml.
  6. انتقِل إلى مجلد المشروع retail-faceted-search، وستظهر لك بنية المشروع:

1d736dfa45583f52.png

  1. في الملف ProductRepository.java، عليك تعديل المتغيّر TOOLBOX_ENDPOINT باستخدام نقطة النهاية من دالة Cloud Run (التي تم نشرها) أو الحصول على نقطة النهاية من المتحدث الذي يقدّم التدريب العملي.

ابحث عن سطر الرمز التالي واستبدِله بنقطة النهاية:

public static final String TOOLBOX_ENDPOINT = "https://retail-product-search-quality-<<YOUR_PROJECT_NUMBER>>.us-central1.run.app";
  1. تأكَّد من أنّ Dockerfile وpom.xml متوافقان مع إعدادات مشروعك (لا يلزم إجراء أي تغيير إلا إذا غيّرت أي إصدار أو إعدادات بشكل صريح).
  2. في "وحدة Cloud Shell الطرفية"، تأكَّد من أنّك داخل المجلد الرئيسي وضمن مجلد المشروع (faceted_searching_retail / retail-faceted-search). استخدِم الأوامر التالية للتأكّد من أنّك في المجلد الصحيح في الوحدة الطرفية:
cd faceted_searching_retail

cd retail-faceted-search
  1. حِزم تطبيقك وإنشاؤه واختباره على جهازك:
mvn package

mvn spring-boot:run

من المفترض أن تتمكّن من عرض تطبيقك من خلال النقر على "معاينة على المنفذ 8080" (Preview on port 8080) في "وحدة Cloud Shell الطرفية" (Cloud Shell Terminal) كما هو موضّح أدناه:

52f1a9646b55eeb2.png

9- النشر على Cloud Run: ***خطوة مهمة

في "وحدة طرفية Cloud Shell"، تأكَّد من أنّك داخل المجلد الرئيسي وضمن مجلد المشروع (faceted_searching_retail / retail-faceted-search). استخدِم الأوامر التالية للتأكّد من أنّك في المجلد الصحيح في الوحدة الطرفية:

cd faceted_searching_retail

cd retail-faceted-search

بعد التأكّد من أنّك في مجلد المشروع، نفِّذ الأمر التالي:

gcloud run deploy retail-search --source . \
--region us-central1 \
--allow-unauthenticated \
--labels dev-tutorial=codelab-alloydb-hybrid-search

بعد النشر، من المفترض أن تتلقّى نقطة نهاية Cloud Run تم نشرها على النحو التالي:

https://retail-search-**********-uc.a.run.app/

10. عرض توضيحي

لنطّلِع على مثال عملي على ذلك:

80b59305a9a7b068.png

تعرض الصورة أعلاه الصفحة المقصودة لتطبيق البحث المختلط الديناميكي.

264bc437cd5c3ae9.png

تعرض الصورة أعلاه نتائج البحث عن "حذاء بلون أسمر بدون رباط" . الفلاتر المتعدّدة الأوجه التي تم اختيارها هي: أحذية، صندل.

aff5849c73fe743c.png

تعرض الصورة أعلاه نتائج البحث عن "قميص بدون ياقة" . الفلاتر المتعدّدة الأوجه: الملابس

يمكنك الآن دمج المزيد من الميزات التوليدية والمستندة إلى الوكلاء لجعل هذا التطبيق قابلاً للتنفيذ.

جرِّب هذه الميزة لتستوحي أفكارًا جديدة!!!

11. تَنظيم

لتجنُّب تحمّل رسوم في حسابك على Google Cloud مقابل الموارد المستخدَمة في هذه المشاركة، اتّبِع الخطوات التالية:

  1. في Google Cloud Console، انتقِل إلى صفحة Resource Manager.
  2. في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على حذف.
  3. في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.
  4. بدلاً من ذلك، يمكنك حذف مجموعة AlloyDB (غيِّر الموقع الجغرافي في هذا الرابط التشعّبي إذا لم تختر us-central1 للمجموعة في وقت الإعداد) التي أنشأناها للتو لهذا المشروع من خلال النقر على الزر DELETE CLUSTER (حذف المجموعة).

12. تهانينا

تهانينا! لقد أنشأت ونشرت تطبيق بحث مختلط باستخدام AlloyDB على Cloud Run بنجاح.

أهمية هذه الميزة للأنشطة التجارية:

يقدّم تطبيق البحث الديناميكي المختلط هذا، المستنِد إلى AlloyDB AI، مزايا كبيرة لأنشطة البيع بالتجزئة وغيرها من الأنشطة التجارية:

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

قابلية التوسّع: تم تصميم بنية AlloyDB وفهرسة scaNN للتعامل مع فهارس المنتجات الضخمة وأحجام طلبات البحث الكبيرة، وهو أمر بالغ الأهمية لتطوير أنشطة التجارة الإلكترونية.

الأداء: تضمن الاستجابة الأسرع لطلبات البحث، حتى المعقّدة منها، تجربة مستخدم سلسة وتقليل معدلات التخلي عن البحث.

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

بنية مبسطة: يغنيك دمج البحث المتّجه مباشرةً في AlloyDB عن الحاجة إلى قواعد بيانات متّجهة منفصلة أو مزامنة معقّدة، ما يسهّل عملية التطوير والصيانة.

لنفترض أنّ أحد المستخدِمين كتب طلب بحث بلغة عادية، مثل "أحذية جري صديقة للبيئة للنساء مع دعامة قوس قدم عالية".

9e27fc58aea9a081.png

في الوقت نفسه، يطبّق المستخدم فلاتر متعددة الأوجه على "الفئة: <<>>" و"اللون: <<>>،" و "السعر: من 100 إلى 150 دولار أمريكي":

  • يعرض النظام على الفور قائمة منقّحة بالمنتجات، وتكون هذه المنتجات متوافقة دلاليًا مع اللغة الطبيعية وتتطابق بدقة مع الفلاتر المحدّدة.
  • في الخلفية، يسرّع فهرس scaNN البحث المتّجه، وتضمن الفلترة المضمّنة والتكيّفية الأداء مع المعايير المجمّعة، وتعرض عملية إعادة الترتيب النتائج المثالية في الأعلى.
  • توضّح سرعة النتائج ودقتها قوة الجمع بين هاتين التقنيتين للحصول على تجربة بحث ذكية حقًا في مجال البيع بالتجزئة.

يتطلّب إنشاء تطبيق بحث للبيع بالتجزئة من الجيل التالي تجاوز الطرق التقليدية، وباستخدام إمكانات AlloyDB وVertex AI وVector Search مع فهرسة scaNN والفلترة الديناميكية المتعدّدة الأوجه وإعادة الترتيب والتحقّق من صحة LLM، يمكننا تقديم تجربة عملاء لا مثيل لها تعزّز التفاعل وتزيد المبيعات. يوضّح هذا الحلّ القوي والقابل للتوسّع والذكي كيف أنّ إمكانات قواعد البيانات الحديثة، المزوّدة بالذكاء الاصطناعي، تعيد تشكيل مستقبل البيع بالتجزئة.

ابدأ اليوم!