إنشاء محرك فائض في الوقت الفعلي باستخدام Gemini 3 Flash وAlloyDB

1- نظرة عامة

في هذا الدرس العملي، ستنشئ تطبيق Neighbor Loop، وهو تطبيق مستدام لمشاركة الفائض يعامل الذكاء على أنّه عنصر أساسي في طبقة البيانات.

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

1da27e0c4d9a33e0.jpeg

ما ستنشئه

تطبيق ويب عالي الأداء يتيح مشاركة الفائض من السلع مع أفراد المجتمع من خلال التمرير سريعًا.

أهداف الدورة التعليمية

  • توفير الموارد بنقرة واحدة: كيفية إعداد مجموعة ومثيل AlloyDB مصمَّمَين لأحمال عمل الذكاء الاصطناعي
  • التضمينات داخل قاعدة البيانات: إنشاء متجهات text-embedding-005 مباشرةً ضمن عبارات INSERT
  • الاستدلال المتعدّد الوسائط: استخدام Gemini 3.0 Flash "لرؤية" العناصر وإنشاء نبذات ذكية تلقائيًا بأسلوب مناسب للمواعدة
  • الاستكشاف الدلالي: إجراء "عمليات التحقّق من الأجواء" المستندة إلى المنطق داخل استعلامات SQL باستخدام الدالة ai.if() لتصفية النتائج استنادًا إلى السياق وليس إلى العمليات الحسابية فقط

البنية

تتجاوز Neighbor Loop الاختناقات التقليدية في طبقة التطبيق. بدلاً من استخراج البيانات لمعالجتها، نستخدم ما يلي:

  1. AlloyDB AI: لإنشاء المتجهات وتخزينها في الوقت الفعلي
  2. Google Cloud Storage: لتخزين الصور
  3. ‫Gemini 3.0 Flash: لإجراء عمليات استنتاج في أقل من ثانية على بيانات الصور والنصوص مباشرةً من خلال SQL
  4. ‫Cloud Run: لاستضافة خلفية Flask خفيفة الوزن تتضمّن ملفًا واحدًا

المتطلبات

  • متصفّح، مثل Chrome أو Firefox
  • مشروع Google Cloud تم تفعيل الفوترة فيه
  • الإلمام بأساسيات SQL وPython

2. قبل البدء

إنشاء مشروع

  1. في Google Cloud Console، ضمن صفحة اختيار المشروع، اختَر أو أنشِئ مشروعًا على Google Cloud.
  2. تأكَّد من تفعيل الفوترة لمشروعك على 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 وطريقة استخدامها.

المشاكل المحتملة وتحديد المشاكل وحلّها

متلازمة "المشروع الوهمي"

نفّذت الأمر gcloud config set project، ولكنّك في الواقع تنظر إلى مشروع مختلف في واجهة مستخدم "وحدة التحكّم". تحقَّق من رقم تعريف المشروع في القائمة المنسدلة أعلى يمين الصفحة.

حاجز الفوترة

لقد فعّلت المشروع، ولكن نسيت حساب الفوترة. ‫AlloyDB هو محرّك عالي الأداء، ولن يبدأ إذا كان "خزان الوقود" (الفوترة) فارغًا.

تأخُّر انتشار واجهة برمجة التطبيقات

نقرت على "تفعيل واجهات برمجة التطبيقات"، ولكن سطر الأوامر لا يزال يعرض Service Not Enabled. انتظِر لمدة 60 ثانية. تحتاج السحابة الإلكترونية إلى بعض الوقت لتنشيط الخلايا العصبية.

Quota Quags

إذا كنت تستخدم حسابًا تجريبيًا جديدًا تمامًا، قد تبلغ حصة إقليمية لمثيلات AlloyDB. إذا تعذّر تنفيذ us-central1، جرِّب us-east1.

وكيل الخدمة"مخفي"

في بعض الأحيان، لا يتم منح دور aiplatform.user تلقائيًا إلى AlloyDB Service Agent. إذا تعذّر على طلبات بحث SQL التواصل مع Gemini لاحقًا، يكون هذا هو السبب عادةً.

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

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

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

  1. انقر على الزر أو انسخ الرابط أدناه إلى المتصفّح الذي سجّلت فيه الدخول إلى حساب مستخدم Google Cloud Console.

  1. بعد إكمال هذه الخطوة، سيتم استنساخ المستودع إلى محرّر Cloud Shell المحلي، وستتمكّن من تنفيذ الأمر أدناه من مجلد المشروع (من المهم التأكّد من أنّك في دليل المشروع):
sh run.sh
  1. استخدِم الآن واجهة المستخدم (من خلال النقر على الرابط في الوحدة الطرفية أو النقر على الرابط "معاينة على الويب" في الوحدة الطرفية).
  2. أدخِل تفاصيل معرّف المشروع واسمَي المجموعة والآلة الافتراضية لبدء الاستخدام.
  3. يمكنك تناول القهوة بينما يتم عرض السجلات، ويمكنك الاطّلاع على كيفية تنفيذ ذلك في الخلفية هنا.

المشاكل المحتملة وتحديد المشاكل وحلّها

مشكلة "الصبر"

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

عدم تطابق المنطقة

إذا فعّلت واجهات برمجة التطبيقات في us-central1 وحاولت توفير المجموعة في asia-south1، قد تواجه مشاكل في الحصة أو تأخيرات في أذونات حساب الخدمة. يجب الالتزام بمنطقة واحدة طوال فترة التدريب العملي.

مجموعات الزومبي

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

انتهاء مهلة Cloud Shell

إذا استغرقت استراحة القهوة 30 دقيقة، قد يتم تشغيل وضع السكون في Cloud Shell وفصل عملية sh run.sh. يجب إبقاء علامة التبويب نشطة.

4. توفير المخطط

بعد تشغيل مجموعة AlloyDB ومثيلها، انتقِل إلى أداة تعديل SQL في AlloyDB Studio لتفعيل إضافات الذكاء الاصطناعي وتوفير المخطّط.

1e3ac974b18a8113.png

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

  • اسم المستخدم : "postgres"
  • قاعدة البيانات : "postgres"
  • كلمة المرور : "alloydb" (أو أي كلمة مرور تم ضبطها عند إنشاء الحساب)

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

28cb9a8b6aa0789f.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;

إنشاء جدول

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

-- Items Table (The "Profile" you swipe on)
CREATE TABLE items (
   item_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
   owner_id UUID,
   provider_name TEXT,
   provider_phone TEXT,
   title TEXT,
   bio TEXT,
   category TEXT,
   image_url TEXT,
   item_vector VECTOR(768),
   status TEXT DEFAULT 'available',
   created_at TIMESTAMP DEFAULT NOW()
);

-- Swipes Table (The Interaction)
CREATE TABLE swipes (
   swipe_id SERIAL PRIMARY KEY,
   swiper_id UUID,
   item_id UUID REFERENCES items(item_id),
   direction TEXT CHECK (direction IN ('left', 'right')),
   is_match BOOLEAN DEFAULT FALSE,
   created_at TIMESTAMP DEFAULT NOW()
);

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

منح الإذن

نفِّذ العبارة أدناه لمنح إذن التنفيذ على الدالة "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"

تسجيل نموذج Gemini 3 Flash في AlloyDB

نفِّذ عبارة SQL أدناه من "محرّر طلبات البحث" في AlloyDB

CALL google_ml.create_model(
   model_id => 'gemini-3-flash-preview',
   model_request_url => 'https://aiplatform.googleapis.com/v1/projects/<<YOUR_PROJECT_ID>>/locations/global/publishers/google/models/gemini-3-flash-preview:generateContent',
   model_qualified_name => 'gemini-3-flash-preview',
   model_provider => 'google',
   model_type => 'llm',
   model_auth_type => 'alloydb_service_agent_iam'
);
--replace <<YOUR_PROJECT_ID>> with your project id.

المشاكل المحتملة وتحديد المشاكل وحلّها

حلقة "فقدان الذاكرة" بشأن كلمات المرور

إذا كنت قد استخدمت عملية الإعداد "بنقرة واحدة" ولم تتمكّن من تذكُّر كلمة المرور، انتقِل إلى صفحة "المعلومات الأساسية للمثيل" في وحدة التحكّم وانقر على "تعديل" لإعادة ضبط كلمة مرور postgres.

رسالة الخطأ "لم يتم العثور على الإضافة"

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

فجوة نشر إدارة الهوية وإمكانية الوصول

لقد نفّذت أمر gcloud في "إدارة الهوية وإمكانية الوصول"، ولكن لا يزال أمر SQL CALL يتعذّر تنفيذه بسبب خطأ في الأذونات. قد يستغرق نشر تغييرات "إدارة الهوية وإمكانية الوصول" (IAM) بعض الوقت من خلال البنية الأساسية لشبكة Google. خذوا نفسًا عميقًا.

عدم تطابق أبعاد المتّجه

تم ضبط الجدول items على VECTOR(768). إذا حاولت استخدام نموذج مختلف (مثل نموذج 1536-dim) لاحقًا، ستنفجر عمليات الإدراج. الالتزام بـ text-embedding-005

خطأ إملائي في معرّف المشروع

في create_model، إذا تركت الأقواس « » أو أخطأت في كتابة رقم تعريف مشروعك، ستبدو عملية تسجيل النموذج ناجحة ولكنها ستفشل أثناء الاستعلام الفعلي الأول. يُرجى التحقّق من السلسلة.

5- تخزين الصور (Google Cloud Storage)

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

  1. إنشاء حزمة: أنشئ حزمة جديدة في مشروعك على Google Cloud Platform (مثل neighborloop-images)، ويُفضّل أن تكون في المنطقة نفسها التي توجد فيها قاعدة البيانات والتطبيق.
  2. ضبط الوصول العلني: * انتقِل إلى علامة التبويب الأذونات الخاصة بالحزمة.
  3. أضِف عنصر allUsers الأساسي.
  4. عيِّن دور عارض عنصر التخزين (ليتمكّن الجميع من رؤية الصور) ودور منشئ عنصر التخزين (لأغراض تحميل العرض التوضيحي).

الحل البديل (حساب الخدمة): إذا كنت تفضّل عدم استخدام الوصول العام، تأكَّد من منح حساب الخدمة لتطبيقك إذن الوصول الكامل إلى AlloyDB وأدوار "مساحة التخزين" اللازمة لإدارة العناصر بشكل آمن.

المشاكل المحتملة وتحديد المشاكل وحلّها

The Region Drag

إذا كانت قاعدة البيانات في us-central1 والحزمة في europe-west1، فإنّك تبطئ الذكاء الاصطناعي حرفيًا. تتم عملية "التحقّق من الأجواء" بسرعة، ولكن قد يبدو استرداد الصورة لواجهة المستخدم بطيئًا. يجب أن تكون في المنطقة نفسها

تفرد اسم الحزمة

أسماء الحِزم هي مساحة اسم عامة. إذا حاولت تسمية الحزمة neighborloop-images، من المحتمل أنّ مستخدمًا آخر قد اختار هذا الاسم من قبل. إذا تعذّر إنشاء الفيديو، أضِف لاحقة عشوائية.

الخلط بين "صانع المحتوى" و"المشاهد"

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

6. لننشئ التطبيق

استنسِخ هذا المستودع في مشروعك وسنستعرضه معًا.

  1. لنسخ هذا المستودع، نفِّذ الأمر التالي من "وحدة Cloud Shell الطرفية" (في الدليل الجذر أو من أي مكان تريد إنشاء هذا المشروع منه):
git clone https://github.com/AbiramiSukumaran/neighbor-loop

من المفترض أن يؤدي ذلك إلى إنشاء المشروع، ويمكنك التأكّد من ذلك في "محرِّر Cloud Shell".

53a398aff6ba7d5b.png

  1. كيفية الحصول على مفتاح Gemini API
  2. انتقِل إلى Google AI Studio: انتقِل إلى aistudio.google.com.
  3. تسجيل الدخول: استخدِم حساب Google نفسه الذي تستخدمه لمشروعك على Google Cloud.
  4. إنشاء مفتاح واجهة برمجة تطبيقات:
  5. في الشريط الجانبي الأيمن، انقر على "الحصول على مفتاح واجهة برمجة التطبيقات".
  6. انقر على الزر "إنشاء مفتاح واجهة برمجة التطبيقات في مشروع جديد".
  7. نسخ المفتاح: بعد إنشاء المفتاح، انقر على رمز النسخ.
  8. الآن، اضبط متغيّرات البيئة في ملف ‎ .env
GEMINI_API_KEY=<<YOUR_GEMINI_API_KEY>>
DATABASE_URL=postgresql+pg8000://postgres:<<YOUR_PASSWORD>>@<<HOST_IP>>:<<PORT>>/postgres
GCS_BUCKET_NAME=<<YOUR_GCS_BUCKET>>

استبدِل قيم العناصر النائبة <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<HOST_IP>>, <<PORT>> and <<YOUR_GCS_BUCKET>>.

المشاكل المحتملة وتحديد المشاكل وحلّها

الخلط بين حسابات متعددة

إذا كنت مسجّلاً الدخول إلى حسابات متعدّدة على Google (حساب شخصي مقابل حساب عمل)، قد يتم ضبط AI Studio تلقائيًا على الحساب الخاطئ. تحقَّق من الأفاتار في أعلى يسار الصفحة للتأكّد من أنّه يتطابق مع حساب مشروعك على GCP.

تجاوز حصة "المستوى المجاني"

إذا كنت تستخدم "الإصدار المجاني"، ستكون هناك حدود للمعدّل (طلبات في الدقيقة). إذا "مرّرت" بسرعة كبيرة في Neighbor Loop، قد يظهر لك الخطأ 429 Too Many Requests. تمهَّل!

أمان المفتاح المعرَّض للخطر

إذا git commit ملف .env الذي يحتوي على المفتاح عن طريق الخطأ أضِف دائمًا .env إلى .gitignore.

الفرق بين "انتهاء مهلة الاتصال" و"المهلة"

استخدمت عنوان IP الخاص في ملف ‎ .env ولكنك تحاول الاتصال من خارج شبكة VPC (مثل جهازك المحلي). لا يمكن الوصول إلى عناوين IP الخاصة إلا من داخل شبكة Google Cloud نفسها. التبديل إلى عنوان IP العلني

الافتراض بشأن المنفذ 5432

على الرغم من أنّ 5432 هو منفذ PostgreSQL العادي، يتطلّب AlloyDB أحيانًا إعدادات منافذ معيّنة إذا كنت تستخدم Auth Proxy. في هذا الدرس التطبيقي، تأكَّد من استخدام :5432 في نهاية سلسلة المضيف.

أداة التحكّم "الشبكات المعتمَدة"

حتى إذا كان لديك عنوان IP عام، سترفض AlloyDB الاتصال ما لم تضِف عنوان IP الخاص بالجهاز الذي يتم تشغيل الرمز عليه إلى القائمة البيضاء.الحلّ: في إعدادات مثيل AlloyDB، أضِف 0.0.0.0/0 (لأغراض الاختبار المؤقتة فقط!) أو عنوان IP المحدّد إلى "الشبكات المعتمَدة".

تعذُّر تأكيد الاتصال عبر طبقة المقابس الآمنة (SSL)/بروتوكول أمان طبقة النقل (TLS)

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

التبديل بين "النسخة الأساسية" و"مجموعة القراءة"

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

7. هيا نتحقّق من الرمز

"ملف المواعدة" الخاص بك

c2c543562cc9b353.png

عندما يحمّل المستخدم صورة لمنتج، لا يجب أن يضطر إلى كتابة وصف طويل. أستخدم Gemini 3 Flash "لرؤية" المنتج وكتابة البيانات الخاصة به.

في الخلفية، يقدّم المستخدم عنوانًا وصورة فقط. يتولّى Gemini الباقي:

prompt = """
You are a witty community manager for NeighborLoop.
Analyze this surplus item and return JSON:
{
   "bio": "First-person witty dating-style profile bio for the product, not longer than 2 lines",
   "category": "One-word category",
   "tags": ["tag1", "tag2"]
}
"""
response = genai_client.models.generate_content(
   model="gemini-3-flash-preview",
   contents=[types.Part.from_bytes(data=image_bytes, mime_type="image/jpeg"), prompt],
   config=types.GenerateContentConfig(response_mime_type="application/json")
)

21f871a1b549efcf.png

التضمينات في قاعدة البيانات في الوقت الفعلي

aa783a459f1b02da.png

إحدى أبرز ميزات AlloyDB هي القدرة على إنشاء تضمينات بدون مغادرة سياق SQL. بدلاً من استدعاء نموذج تضمين في Python وإرسال المتّجه مرة أخرى إلى قاعدة البيانات، يمكنني تنفيذ كل ذلك في عبارة INSERT واحدة باستخدام الدالة embedding():

INSERT INTO items (owner_id, provider_name, provider_phone, title, bio, category, image_url, status, item_vector)
VALUES (
   :owner, :name, :phone, :title, :bio, :cat, :url, 'available',
   embedding('text-embedding-005', :title || ' ' || :bio)::vector
)

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

إضافة لقطة شاشة لميزة &quot;بطاقة بيانات المتجر&quot;

ميزة "البحث المتّجه المتقدّم" و"الفلترة الذكية" باستخدام Gemini 3.0

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

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

تسمح لنا AlloyDB AI باستدعاء نماذج مثل Gemini مباشرةً ضمن طلبات بحث SQL. وهذا يعني أنّه يمكننا إجراء عملية "استكشاف دلالي" تتضمّن "فحصًا منطقيًا" استنادًا إلى المنطق باستخدام الدالة ai.if():

SELECT item_id, title, bio, category, image_url,
      1 - (item_vector <=> embedding('text-embedding-005', :query)::vector) as score
FROM items
WHERE status = 'available'
 AND item_vector IS NOT NULL
 AND ai.if(
       prompt => 'Does this text: "' || bio ||'" match the user request: "' ||  :query || '", at least 60%? "',
       model_id => 'gemini-3-flash-preview'
     ) 
ORDER BY score DESC
LIMIT 5

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

لقطة شاشة عن ميزة البحث الدلالي

حلقة "التمرير سريعًا للمطابقة"

واجهة المستخدم عبارة عن مجموعة بطاقات كلاسيكية.

التمرير سريعًا لليمين: تجاهل

التمرير سريعًا لليمين: هذا خيارك المناسب!

لقطة شاشة لميزة &quot;التمرير سريعًا للمطابقة&quot;

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

8. لننشره على Cloud Run

  1. يمكنك نشرها على Cloud Run من خلال تنفيذ الأمر التالي من "وحدة Cloud Shell الطرفية" حيث يتم استنساخ المشروع والتأكّد من أنّك داخل المجلد الجذر للمشروع.

شغِّل الأمر التالي في وحدة Cloud Shell الطرفية:

gcloud beta run deploy neighbor-loop \
   --source . \
   --region=us-central1 \
   --network=<<YOUR_NETWORK_NAME>> \
   --subnet=<<YOUR_SUBNET_NAME>> \
   --allow-unauthenticated \
   --vpc-egress=all-traffic \
   --set-env-vars GEMINI_API_KEY=<<YOUR_GEMINI_API_KEY>>,DATABASE_URL=postgresql+pg8000://postgres:<<YOUR_PASSWORD>>@<<PRIVATE_IP_HOST>>:<<PORT>>/postgres,GCS_BUCKET_NAME=<<YOUR_GCS_BUCKET>>

استبدِل قيم العناصر النائبة <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<PRIVATE_IP_HOST>>, <<PORT>> and <<YOUR_GCS_BUCKET>>

بعد انتهاء الأمر، سيتم عرض عنوان URL للخدمة. انسخها.

  1. امنح دور عميل AlloyDB لحساب خدمة Cloud Run.يتيح ذلك لتطبيقك الذي يعمل بلا خادم إنشاء نفق آمن إلى قاعدة البيانات.

شغِّل الأمر التالي في وحدة Cloud Shell الطرفية:

# 1. Get your Project ID and Project Number
PROJECT_ID=$(gcloud config get-value project)
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

# 2. Grant the AlloyDB Client role
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/alloydb.client"

الآن، استخدِم عنوان URL للخدمة (نقطة نهاية Cloud Run التي نسختها سابقًا) واختبِر التطبيق. حمِّل صورة لأداة الطاقة القديمة، ودَع Gemini يتولّى الباقي.

المشاكل المحتملة وتحديد المشاكل وحلّها

حلقة "تعذّر المراجعة"

إذا انتهى النشر ولكنّ عنوان URL يعرض 500 Internal Server Error، راجِع السجلات. يحدث ذلك عادةً بسبب متغيّر بيئة غير متوفّر (مثل خطأ إملائي في DATABASE_URL) أو لأنّ حساب خدمة Cloud Run لا يملك أذونات القراءة من حزمة GCS.

دور "الظل" في إدارة الهوية وإمكانية الوصول

حتى إذا كان لديك إذن بالتوزيع، يجب أن يكون حساب خدمة Cloud Run (عادةً [project-number]-compute@developer.gserviceaccount.com) لديه دور AlloyDB Client لإنشاء اتصال بقاعدة البيانات.

9- تحديد المشاكل وحلّها على مستوى عالٍ

b6cdd3785d5461a9.jpeg

10. عرض توضيحي

من المفترض أن تتمكّن من استخدام نقطة النهاية لإجراء الاختبارات.

ولأغراض العرض التوضيحي لبضعة أيام، يمكنك تجربة ما يلي:

11. تَنظيم

بعد الانتهاء من هذا المختبر، لا تنسَ حذف مجموعة AlloyDB ونسختها.

يجب أن يؤدي ذلك إلى تنظيف المجموعة بالإضافة إلى مثيلاتها.

12. تهانينا

لقد أنشأت تطبيق Neighbor Loop بنجاح للمجتمعات المستدامة باستخدام Google Cloud. من خلال نقل التضمين ومنطق الذكاء الاصطناعي في Gemini 3 Flash إلى AlloyDB، يصبح التطبيق سريعًا للغاية (حسب إعدادات النشر) ويصبح الرمز البرمجي واضحًا بشكل ملحوظ. نحن لا نخزّن البيانات فقط، بل نخزّن النية.

إنّ الجمع بين سرعة Gemini 3 Flash ومعالجة المتجهات المحسّنة في AlloyDB يمثّل حقًا الجيل التالي من المنصات المستندة إلى المنتديات.