ساخت یک موتور مازاد بلادرنگ با Gemini 3 Flash و AlloyDB

۱. مرور کلی

در این آزمایشگاه کد، شما Neighbor Loop را خواهید ساخت، یک اپلیکیشن اشتراک‌گذاری مازاد پایدار که با هوش به عنوان یک شهروند درجه یک از لایه داده رفتار می‌کند.

با ادغام Gemini 3.0 Flash و AlloyDB AI، شما از فضای ذخیره‌سازی پایه به حوزه هوش درون پایگاه داده قدم خواهید گذاشت. شما یاد خواهید گرفت که چگونه تجزیه و تحلیل آیتم‌های چندوجهی و کشف معنایی را مستقیماً در SQL انجام دهید و "مالیات هوش مصنوعی" ناشی از تأخیر و حجم زیاد معماری را از بین ببرید.

۱da27e0c4d9a33e0.jpeg

آنچه خواهید ساخت

یک برنامه وب با عملکرد بالا و قابلیت «کشیدن برای تطبیق» برای اشتراک‌گذاری مازاد جامعه.

آنچه یاد خواهید گرفت

  • تأمین با یک کلیک: نحوه راه‌اندازی یک کلاستر و نمونه AlloyDB که برای بارهای کاری هوش مصنوعی طراحی شده است.
  • جاسازی‌های درون پایگاه داده: تولید بردارهای text-embedding-005 مستقیماً درون دستورات INSERT.
  • استدلال چندوجهی: استفاده از Gemini 3.0 Flash برای «دیدن» موارد و تولید خودکار بیوگرافی‌های طنزآمیز به سبک قرار ملاقات.
  • کشف معنایی: انجام «بررسی‌های ارتعاشی» مبتنی بر منطق درون کوئری‌های SQL با استفاده از تابع ai.if() برای فیلتر کردن نتایج بر اساس زمینه، نه فقط ریاضی.

معماری

حلقه همسایه (Neighbor Loop) گلوگاه‌های سنتی لایه برنامه را دور می‌زند. به جای بیرون کشیدن داده‌ها برای پردازش آنها، از موارد زیر استفاده می‌کنیم:

  1. AlloyDB AI: برای تولید و ذخیره بردارها به صورت بلادرنگ.
  2. فضای ابری گوگل: برای ذخیره تصاویر
  3. Gemini 3.0 Flash: برای انجام استدلال زیر ثانیه‌ای روی داده‌های تصویر و متن مستقیماً از طریق SQL.
  4. Cloud Run: برای میزبانی یک بک‌اند سبک و تک‌فایلی Flask.

الزامات

  • یک مرورگر، مانند کروم یا فایرفاکس .
  • یک پروژه گوگل کلود با قابلیت پرداخت.
  • آشنایی اولیه با SQL و پایتون.

۲. قبل از شروع

ایجاد یک پروژه

  1. در کنسول گوگل کلود ، در صفحه انتخاب پروژه، یک پروژه گوگل کلود را انتخاب یا ایجاد کنید.
  2. مطمئن شوید که صورتحساب برای پروژه ابری شما فعال است. یاد بگیرید که چگونه بررسی کنید که آیا صورتحساب در یک پروژه فعال است یا خیر .
  1. شما از Cloud Shell ، یک محیط خط فرمان که در Google Cloud اجرا می‌شود، استفاده خواهید کرد. روی Activate 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. فعال کردن API های مورد نیاز: روی لینک کلیک کنید و API ها را فعال کنید.

به عنوان یک روش جایگزین، می‌توانید از دستور gcloud برای این کار استفاده کنید. برای مشاهده دستورات و نحوه استفاده از gcloud به مستندات آن مراجعه کنید.

اشکالات و عیب‌یابی

سندرم «پروژه ارواح»

شما gcloud config set project اجرا کردید، اما در واقع در رابط کاربری کنسول به پروژه‌ی دیگری نگاه می‌کنید. شناسه‌ی پروژه را در منوی کشویی بالا سمت چپ بررسی کنید!

سنگر بیلینگ

شما پروژه را فعال کردید، اما حساب صورتحساب را فراموش کردید. AlloyDB یک موتور با کارایی بالا است؛ اگر "مخزن بنزین" (صورتحساب) خالی باشد، روشن نمی‌شود.

تأخیر انتشار API

شما روی «فعال کردن APIها» کلیک کرده‌اید، اما خط فرمان هنوز می‌گوید Service Not Enabled . ۶۰ ثانیه به آن فرصت دهید. ابر به یک لحظه نیاز دارد تا نورون‌های خود را بیدار کند.

کواگ‌های سهمیه‌ای

اگر از یک حساب آزمایشی کاملاً جدید استفاده می‌کنید، ممکن است به سهمیه منطقه‌ای برای نمونه‌های AlloyDB برسید. اگر us-central1 با شکست مواجه شد، us-east1 امتحان کنید.

نماینده خدمات "پنهان"

گاهی اوقات به طور خودکار نقش aiplatform.user به عامل سرویس AlloyDB اعطا نمی‌شود . اگر کوئری‌های SQL شما بعداً نتوانند با Gemini ارتباط برقرار کنند، معمولاً مشکل از همین است.

۳. راه‌اندازی پایگاه داده

در این آزمایش، ما از AlloyDB به عنوان پایگاه داده برای داده‌های آزمایشی استفاده خواهیم کرد. این پایگاه داده از خوشه‌ها برای نگهداری تمام منابع، مانند پایگاه‌های داده و گزارش‌ها، استفاده می‌کند. هر خوشه یک نمونه اصلی دارد که یک نقطه دسترسی به داده‌ها را فراهم می‌کند. جداول، داده‌های واقعی را نگهداری می‌کنند.

بیایید یک کلاستر، نمونه و جدول AlloyDB ایجاد کنیم که مجموعه داده‌های آزمایشی در آن بارگذاری شوند.

  1. روی دکمه کلیک کنید یا لینک زیر را در مرورگر خود که کاربر Google Cloud Console در آن وارد شده است، کپی کنید.

  1. پس از اتمام این مرحله، مخزن در ویرایشگر پوسته ابری محلی شما کلون می‌شود و می‌توانید دستور زیر را از پوشه پروژه اجرا کنید (مهم است که مطمئن شوید در دایرکتوری پروژه هستید):
sh run.sh
  1. حالا از رابط کاربری استفاده کنید (با کلیک روی لینک در ترمینال یا کلیک روی لینک «پیش‌نمایش در وب» در ترمینال).
  2. برای شروع، اطلاعات مربوط به شناسه پروژه، نام کلاستر و نمونه را وارد کنید.
  3. در حالی که کنده‌ها در حال حرکت هستند، یک قهوه بنوشید و می‌توانید در اینجا در مورد چگونگی انجام این کار در پشت صحنه بخوانید.

اشکالات و عیب‌یابی

مشکل «صبر»

خوشه‌های پایگاه داده زیرساخت‌های سنگینی هستند. اگر صفحه را رفرش کنید یا جلسه Cloud Shell را به دلیل «گیر کردن» از بین ببرید، ممکن است در نهایت با یک نمونه «شبح» مواجه شوید که تا حدی آماده شده و حذف آن بدون مداخله دستی غیرممکن است.

عدم تطابق منطقه

اگر APIهای خود را در us-central1 فعال کرده‌اید اما سعی می‌کنید کلاستر را در asia-south1 آماده‌سازی کنید، ممکن است با مشکلات سهمیه‌بندی یا تأخیر در مجوز حساب سرویس مواجه شوید. در کل آزمایش به یک منطقه پایبند باشید!

خوشه‌های زامبی

اگر قبلاً از نام یکسانی برای یک خوشه استفاده کرده باشید و آن را حذف نکرده باشید، ممکن است اسکریپت بگوید که نام خوشه از قبل وجود دارد. نام خوشه‌ها باید در یک پروژه منحصر به فرد باشند.

مهلت زمانی پوسته ابری

اگر زمان استراحت قهوه شما 30 دقیقه طول بکشد، ممکن است Cloud Shell به حالت خواب برود و فرآیند sh run.sh قطع کند. تب را فعال نگه دارید!

۴. تأمین طرحواره

پس از اجرای کلاستر و نمونه AlloyDB، به ویرایشگر SQL در AlloyDB Studio بروید تا افزونه‌های هوش مصنوعی را فعال کرده و طرحواره را آماده کنید.

1e3ac974b18a8113.png

ممکن است لازم باشد منتظر بمانید تا نمونه شما به طور کامل ایجاد شود. پس از اتمام این کار، با استفاده از اعتبارنامه‌هایی که هنگام ایجاد خوشه ایجاد کرده‌اید، وارد AlloyDB شوید. از داده‌های زیر برای تأیید اعتبار در PostgreSQL استفاده کنید:

  • نام کاربری: " postgres "
  • پایگاه داده: " postgres "
  • رمز عبور: " alloydb " (یا هر چیزی که در زمان ایجاد تعیین کرده‌اید)

پس از اینکه با موفقیت در AlloyDB Studio احراز هویت شدید، دستورات SQL در ویرایشگر وارد می‌شوند. می‌توانید با استفاده از علامت + در سمت راست آخرین پنجره، چندین پنجره ویرایشگر اضافه کنید.

۲۸cb9a8b6aa0789f.png

شما می‌توانید دستورات AlloyDB را در پنجره‌های ویرایشگر وارد کنید و در صورت لزوم از گزینه‌های Run، Format و Clear استفاده کنید.

فعال کردن افزونه‌ها

برای ساخت این برنامه، از افزونه‌های pgvector و google_ml_integration استفاده خواهیم کرد. افزونه pgvector به شما امکان ذخیره و جستجوی جاسازی‌های برداری را می‌دهد. افزونه google_ml_integration توابعی را ارائه می‌دهد که برای دسترسی به نقاط پایانی پیش‌بینی هوش مصنوعی Vertex برای دریافت پیش‌بینی‌ها در SQL استفاده می‌کنید. این افزونه‌ها را با اجرای DDL های زیر فعال کنید :

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 User" را بدهید. 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.

اشکالات و عیب‌یابی

حلقه‌ی «فراموشی رمز عبور»

اگر از تنظیمات «یک کلیک» استفاده کرده‌اید و رمز عبور خود را به خاطر نمی‌آورید، به صفحه اطلاعات اولیه Instance در کنسول بروید و برای تنظیم مجدد رمز عبور postgres روی «ویرایش» کلیک کنید.

خطای "افزونه یافت نشد"

اگر CREATE EXTENSION با شکست مواجه شود، اغلب به این دلیل است که نمونه هنوز از زمان آماده‌سازی اولیه در حالت "Maintenance" یا "Updating" است. بررسی کنید که آیا مرحله ایجاد نمونه کامل شده است یا خیر و در صورت نیاز چند ثانیه صبر کنید.

شکاف انتشار IAM

شما دستور gcloud IAM را اجرا کردید، اما CALL SQL همچنان با خطای مجوز مواجه می‌شود. تغییرات IAM ممکن است کمی طول بکشد تا در ستون فقرات گوگل منتشر شوند . نفس عمیقی بکشید.

عدم تطابق ابعاد برداری

جدول items روی VECTOR(768) تنظیم شده است. اگر بعداً سعی کنید از مدل متفاوتی (مانند مدل 1536-dim) استفاده کنید، درج‌های شما از بین می‌روند. به text-embedding-005 پایبند باشید.

شناسه پروژه، غلط املایی

در فراخوانی create_model ، اگر براکت‌ها را « » بگذارید یا شناسه پروژه خود را اشتباه تایپ کنید، ثبت مدل موفقیت‌آمیز به نظر می‌رسد اما در اولین پرس‌وجوی واقعی با شکست مواجه می‌شود. رشته خود را دوباره بررسی کنید!

۵. فضای ذخیره‌سازی تصویر (فضای ذخیره‌سازی ابری گوگل)

برای ذخیره عکس‌های اقلام اضافی‌مان، از یک سطل GCS استفاده می‌کنیم. برای این اپلیکیشن آزمایشی، می‌خواهیم تصاویر به صورت عمومی در دسترس باشند تا فوراً در کارت‌های ما نمایش داده شوند.

  1. ایجاد یک سطل: یک سطل جدید در پروژه GCP خود (مثلاً neighborloop-images) ایجاد کنید ، ترجیحاً در همان ناحیه‌ای که پایگاه داده و برنامه شما قرار دارد.
  2. پیکربندی دسترسی عمومی: * به برگه مجوزهای سطل بروید.
  3. تابع اصلی allUsers را اضافه کنید.
  4. نقش «مشاهده‌گر اشیاء ذخیره‌سازی» (تا همه بتوانند عکس‌ها را ببینند) و نقش « خالق اشیاء ذخیره‌سازی» (برای آپلود نسخه آزمایشی) را تعیین کنید.

جایگزین (حساب کاربری سرویس): اگر ترجیح می‌دهید از دسترسی عمومی استفاده نکنید، مطمئن شوید که به حساب کاربری سرویس برنامه شما دسترسی کامل به AlloyDB و نقش‌های ذخیره‌سازی لازم برای مدیریت ایمن اشیاء داده شده است.

اشکالات و عیب‌یابی

کشش منطقه

اگر پایگاه داده شما در us-central1 و باکت شما در europe-west1 باشد، شما به معنای واقعی کلمه هوش مصنوعی خود را کند می‌کنید. "بررسی ارتعاش" سریع اتفاق می‌افتد، اما دریافت تصویر برای رابط کاربری کند به نظر می‌رسد. آنها را در یک منطقه نگه دارید!

منحصر به فرد بودن نام سطل

نام‌های سطل یک فضای نام سراسری هستند. اگر سعی کنید سطل خود را neighborloop-images نامگذاری کنید، احتمالاً شخص دیگری از قبل آن را دارد. اگر ایجاد شما با شکست مواجه شد، یک پسوند تصادفی اضافه کنید.

خلط مبحث «خالق» در مقابل «بیننده»

اشتباه در انتخاب «خالق» در مقابل «مشاهده‌گر»: اگر فقط «مشاهده‌گر» را اضافه کنید، وقتی کاربر سعی می‌کند یک مورد جدید را فهرست کند، برنامه شما از کار می‌افتد زیرا مجوز نوشتن فایل را ندارد. برای این تنظیمات نمایشی خاص، به هر دو نیاز دارید.

۶. بیایید برنامه را ایجاد کنیم

این مخزن را در پروژه خود کلون کنید و بیایید آن را بررسی کنیم.

  1. برای کلون کردن این، از ترمینال Cloud Shell خود (در دایرکتوری ریشه یا از هر جایی که می‌خواهید این پروژه را ایجاد کنید)، دستور زیر را اجرا کنید:
git clone https://github.com/AbiramiSukumaran/neighbor-loop

این باید پروژه را ایجاد کند و شما می‌توانید آن را در ویرایشگر Cloud Shell تأیید کنید.

53a398aff6ba7d5b.png

  1. چگونه کلید API جمینی خود را دریافت کنید
  2. از استودیوی هوش مصنوعی گوگل دیدن کنید: به aistudio.google.com بروید.
  3. ورود: از همان حساب گوگلی که برای پروژه گوگل کلود خود استفاده می‌کنید، استفاده کنید.
  4. ایجاد کلید API:
  5. در نوار کناری سمت چپ، روی «دریافت کلید API» کلیک کنید.
  6. روی دکمه‌ی «ایجاد کلید API در پروژه‌ی جدید» کلیک کنید.
  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>>.

اشکالات و عیب‌یابی

سردرگمی در مورد حساب‌های کاربری متعدد

اگر به چندین حساب گوگل (شخصی در مقابل کاری) وارد شده‌اید، ممکن است AI Studio به طور پیش‌فرض روی حساب اشتباهی تنظیم شود. آواتار گوشه بالا سمت راست را بررسی کنید تا مطمئن شوید که با حساب پروژه GCP شما مطابقت دارد.

سهمیه «ردیف رایگان» به اوج خود رسید

اگر از سطح رایگان استفاده می‌کنید، محدودیت‌های سرعت وجود دارد (RPM - درخواست در دقیقه). اگر در حلقه همسایه خیلی سریع "swipe" کنید، ممکن است با خطای 429 Too Many Requests مواجه شوید. سرعت خود را کم کنید!

امنیت کلید افشا شده

اگر به طور تصادفی فایل .env خود را که کلید درون آن قرار دارد، با git commit کردید، همیشه .env را به .gitignore خود اضافه کنید.

اعتبار «زمان اتصال»

شما از آدرس IP خصوصی در فایل .env خود استفاده کرده‌اید، اما سعی دارید از خارج از VPC (مانند دستگاه محلی خود) متصل شوید. IPهای خصوصی فقط از داخل همان شبکه Google Cloud قابل دسترسی هستند. به IP عمومی تغییر دهید!

فرضیه بندر ۵۴۳۲

اگرچه ۵۴۳۲ پورت استاندارد PostgreSQL است، اما AlloyDB گاهی اوقات در صورت استفاده از Auth Proxy به پیکربندی‌های خاصی از پورت نیاز دارد. برای این آزمایش، مطمئن شوید که از :۵۴۳۲ در انتهای رشته میزبان خود استفاده می‌کنید.

دروازه‌بان «شبکه‌های مجاز»

حتی اگر IP عمومی را داشته باشید، AlloyDB اتصال را "رد می‌کند" مگر اینکه آدرس IP دستگاهی که کد را اجرا می‌کند را در لیست سفید قرار داده باشید. راه حل: در تنظیمات نمونه AlloyDB، 0.0.0.0/0 (فقط برای آزمایش موقت!) یا IP خاص خود را به شبکه‌های مجاز اضافه کنید.

خطای SSL/TLS Handshake

AlloyDB اتصالات امن را ترجیح می‌دهد. اگر DATABASE_URL شما درایور را به درستی مشخص نکند (مانند استفاده از pg8000 )، ممکن است عملیات handshake به طور بی‌صدا انجام نشود و شما را با خطای عمومی "Database not reachable" مواجه کند.

تعویض «مخزن اصلی در مقابل مخزن خواندن»

اگر به طور تصادفی آدرس IP مربوط به Read Pool را به جای Primary Instance کپی کنید، برنامه شما برای جستجوی موارد کار می‌کند اما هنگام تلاش برای لیست کردن یک مورد جدید، با خطای "فقط خواندنی" از کار می‌افتد. همیشه برای نوشتن از Primary Instance IP استفاده کنید.

۷. بیایید کد را بررسی کنیم

«پروفایل دوستیابی» برای سایت شما

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 است. به جای فراخوانی یک مدل جاسازی در پایتون و ارسال بردار به پایگاه داده، من همه این کارها را در یک دستور 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 را پوشش می‌دهد.

اضافه کردن تصویر ویژگی لیست محصولات

جستجوی برداری پیشرفته و فیلتر هوشمند با Gemini 3.0

جستجوی استاندارد کلمات کلیدی محدود است. اگر عبارت "چیزی برای تعمیر صندلی من" را جستجو کنید، یک پایگاه داده سنتی ممکن است در صورت عدم وجود کلمه "صندلی" در عنوان، چیزی برنگرداند. Neighbor Loop این مشکل را با جستجوی برداری پیشرفته AlloyDB AI حل می‌کند.

با استفاده از افزونه pgvector و فضای ذخیره‌سازی بهینه AlloyDB، می‌توانیم جستجوهای بسیار سریعی برای یافتن شباهت انجام دهیم. اما «جادو»ی واقعی زمانی اتفاق می‌افتد که نزدیکی برداری را با منطق مبتنی بر LLM ترکیب کنیم.

هوش مصنوعی AlloyDB به ما اجازه می‌دهد مدل‌هایی مانند 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 یک "بررسی ارتعاش" را در داخل موتور پایگاه داده انجام می‌دهد. این امر باعث کاهش تأخیر، کاهش هزینه‌های خروجی و تضمین این می‌شود که نتایج نه تنها از نظر ریاضی مشابه هستند، بلکه از نظر زمینه‌ای نیز مرتبط هستند.

تصویر ویژگی جستجوی معنایی

حلقه «کشیدن برای تطبیق»

رابط کاربری یک دسته کارت کلاسیک است.

کشیدن انگشت به چپ: حذف کردن.

به راست بکشید: این یک تطابق است!

تصویر صفحه با قابلیت کشیدن انگشت برای تطبیق

وقتی به سمت راست می‌کشید، بک‌اند تعامل را در جدول سوایپ‌های ما ثبت می‌کند و کالا را به عنوان منطبق علامت‌گذاری می‌کند. فرانت‌اند فوراً یک پنجره‌ی مودال را باز می‌کند که اطلاعات تماس ارائه‌دهنده را نشان می‌دهد تا بتوانید زمان تحویل گرفتن کالا را هماهنگ کنید.

۸. بیایید آن را در Cloud Run مستقر کنیم

  1. با اجرای دستور زیر از ترمینال Cloud Shell که پروژه در آن کلون شده است، آن را روی Cloud Run مستقر کنید و مطمئن شوید که در پوشه ریشه پروژه هستید .

این را در ترمینال 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 Client را به حساب سرویس 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"

حالا از آدرس اینترنتی سرویس (نقطه پایانی Cloud Run که قبلاً کپی کرده‌اید) استفاده کنید و برنامه را آزمایش کنید. عکسی از آن ابزار برقی قدیمی آپلود کنید و بگذارید Gemini بقیه کارها را انجام دهد!

اشکالات و عیب‌یابی

حلقه‌ی «بازنگری ناموفق»

اگر نصب تمام شد اما URL 500 Internal Server Error را نشان داد، لاگ‌ها را بررسی کنید! این مشکل معمولاً به دلیل از دست رفتن یک متغیر محیطی (مانند اشتباه تایپی در DATABASE_URL ) یا عدم دسترسی حساب سرویس Cloud Run برای خواندن از مخزن GCS شما ایجاد می‌شود.

نقش «سایه» IAM

حتی اگر مجوز استقرار را داشته باشید ، حساب کاربری سرویس Cloud Run (معمولاً [project-number]-compute@developer.gserviceaccount.com ) برای برقراری ارتباط با پایگاه داده به نقش AlloyDB Client نیاز دارد.

۹. عیب‌یابی سطح بالا

b6cdd3785d5461a9.jpeg

۱۰. نسخه آزمایشی

شما باید بتوانید از نقطه پایانی خود برای آزمایش‌ها استفاده کنید.

اما برای اهداف آزمایشی برای چند روز، می‌توانید با این کار کنید:

۱۱. تمیز کردن

پس از انجام این آزمایش، فراموش نکنید که کلاستر و نمونه alloyDB را حذف کنید.

باید کلاستر را به همراه نمونه(های) آن پاکسازی کند.

۱۲. تبریک

شما با موفقیت برنامه Neighbor Loop را برای جوامع پایدار با Google Cloud ساختید. با انتقال جاسازی و منطق هوش مصنوعی Gemini 3 Flash به AlloyDB ، برنامه فوق‌العاده سریع است (منوط به تنظیمات استقرار) و کد به طرز چشمگیری تمیز است. ما فقط داده‌ها را ذخیره نمی‌کنیم - ما قصد (intent) را ذخیره می‌کنیم.

ترکیب سرعت Gemini 3 Flash و پردازش برداری بهینه AlloyDB واقعاً مرز بعدی برای پلتفرم‌های مبتنی بر جامعه است.