১. সংক্ষিপ্ত বিবরণ
এই কোডল্যাবে, আপনি নেইবার লুপ (Neighbor Loop) তৈরি করবেন, যা একটি টেকসই উদ্বৃত্ত-ভাগাভাগি অ্যাপ এবং এটি ডেটা লেয়ারে ইন্টেলিজেন্সকে একটি প্রথম শ্রেণীর উপাদান হিসেবে বিবেচনা করে।
Gemini 3.0 Flash এবং AlloyDB AI-কে একীভূত করার মাধ্যমে, আপনি সাধারণ স্টোরেজকে অতিক্রম করে ইন-ডাটাবেস ইন্টেলিজেন্সের জগতে প্রবেশ করবেন। আপনি শিখবেন কীভাবে সরাসরি SQL-এর মধ্যেই মাল্টিমোডাল আইটেম অ্যানালাইসিস এবং সিমান্টিক ডিসকভারি সম্পাদন করতে হয়, যা ল্যাটেন্সি এবং আর্কিটেকচারাল ব্লটের মতো "এআই ট্যাক্স" দূর করে।

আপনি যা তৈরি করবেন
সামাজিকভাবে উদ্বৃত্ত সম্পদ ভাগাভাগি করার জন্য একটি উচ্চ কর্মক্ষমতা সম্পন্ন "সোয়াইপ-টু-ম্যাচ" ওয়েব অ্যাপ্লিকেশন।
আপনি যা শিখবেন
- এক-ক্লিকে প্রোভিশনিং: এআই ওয়ার্কলোডের জন্য ডিজাইন করা একটি AlloyDB ক্লাস্টার এবং ইনস্ট্যান্স কীভাবে সেট আপ করবেন।
- ইন-ডাটাবেস এমবেডিং: INSERT স্টেটমেন্টের মধ্যেই সরাসরি text-embedding-005 ভেক্টর তৈরি করা।
- বহুমুখী যুক্তিপদ্ধতি: জেমিনি ৩.০ ফ্ল্যাশ ব্যবহার করে বিভিন্ন আইটেম 'দেখা' এবং স্বয়ংক্রিয়ভাবে মজাদার, ডেটিং-ধাঁচের বায়ো তৈরি করা।
- শব্দার্থগত আবিষ্কার: শুধুমাত্র গাণিতিক হিসাবের ওপর ভিত্তি করে নয়, বরং প্রসঙ্গের ওপর ভিত্তি করে ফলাফল ফিল্টার করার জন্য ai.if() ফাংশন ব্যবহার করে SQL কোয়েরির ভেতরে যুক্তিভিত্তিক 'ভাব যাচাই' করা।
স্থাপত্য
নেইবার লুপ প্রচলিত অ্যাপ্লিকেশন-লেয়ারের প্রতিবন্ধকতাগুলো এড়িয়ে যায়। ডেটা প্রসেস করার জন্য বাইরে নিয়ে আসার পরিবর্তে, আমরা ব্যবহার করি:
- AlloyDB AI: রিয়েল-টাইমে ভেক্টর তৈরি ও সংরক্ষণ করার জন্য।
- গুগল ক্লাউড স্টোরেজ: ছবি সংরক্ষণ করতে
- জেমিনি ৩.০ ফ্ল্যাশ: সরাসরি SQL-এর মাধ্যমে ছবি এবং টেক্সট ডেটার ওপর এক সেকেন্ডেরও কম সময়ে বিশ্লেষণ সম্পাদন করার জন্য।
- ক্লাউড রান: একটি হালকা ও একক-ফাইল ফ্লাস্ক ব্যাকএন্ড হোস্ট করার জন্য।
প্রয়োজনীয়তা
- একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স ।
- বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট।
- SQL এবং Python সম্পর্কে প্রাথমিক ধারণা।
২. শুরু করার আগে
একটি প্রকল্প তৈরি করুন
- গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
- আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন, তা জেনে নিন ।
- আপনি ক্লাউড শেল ব্যবহার করবেন, যা গুগল ক্লাউডে চালিত একটি কমান্ড-লাইন পরিবেশ। গুগল ক্লাউড কনসোলের শীর্ষে থাকা ‘Activate Cloud Shell’-এ ক্লিক করুন।

- ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে যাচাই করে নিন যে আপনি ইতিমধ্যেই প্রমাণীকৃত এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে:
gcloud auth list
- gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে অবগত আছে কিনা, তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান।
gcloud config list project
- আপনার প্রজেক্টটি সেট করা না থাকলে, এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
gcloud config set project <YOUR_PROJECT_ID>
- প্রয়োজনীয় এপিআইগুলো সক্রিয় করুন: লিঙ্কটি অনুসরণ করুন এবং এপিআইগুলো সক্রিয় করুন।
বিকল্পভাবে আপনি এর জন্য gcloud কমান্ড ব্যবহার করতে পারেন। gcloud কমান্ড এবং এর ব্যবহার সম্পর্কে জানতে ডকুমেন্টেশন দেখুন।
অপ্রত্যাশিত সমস্যা ও সমাধান
"ঘোস্ট প্রজেক্ট" সিন্ড্রোম | আপনি |
বিলিং ব্যারিকেড | আপনি প্রজেক্টটি চালু করেছেন, কিন্তু বিলিং অ্যাকাউন্টটি দিতে ভুলে গেছেন। AlloyDB একটি উচ্চ-ক্ষমতাসম্পন্ন ইঞ্জিন; এর 'গ্যাস ট্যাঙ্ক' (বিলিং) খালি থাকলে এটি চালু হবে না। |
এপিআই প্রচার বিলম্ব | আপনি "এপিআই সক্ষম করুন" এ ক্লিক করেছেন, কিন্তু কমান্ড লাইনে এখনও |
কোটা কোয়াগস | আপনি যদি একটি একেবারে নতুন ট্রায়াল অ্যাকাউন্ট ব্যবহার করেন, তাহলে AlloyDB ইনস্ট্যান্সের জন্য আপনার আঞ্চলিক কোটা শেষ হয়ে যেতে পারে। যদি |
"লুকানো" পরিষেবা এজেন্ট | কখনও কখনও AlloyDB সার্ভিস এজেন্টকে স্বয়ংক্রিয়ভাবে |
৩. ডাটাবেস সেটআপ
এই ল্যাবে আমরা পরীক্ষার ডেটার জন্য ডাটাবেস হিসেবে AlloyDB ব্যবহার করব। এটি ডাটাবেস এবং লগের মতো সমস্ত রিসোর্স ধারণ করার জন্য ক্লাস্টার ব্যবহার করে। প্রতিটি ক্লাস্টারে একটি প্রাইমারি ইনস্ট্যান্স থাকে যা ডেটাতে অ্যাক্সেস পয়েন্ট সরবরাহ করে। টেবিলগুলোতে আসল ডেটা থাকবে।
চলুন একটি AlloyDB ক্লাস্টার, ইনস্ট্যান্স এবং টেবিল তৈরি করি যেখানে টেস্ট ডেটাসেটটি লোড করা হবে।
- নিচের বোতামটিতে ক্লিক করুন অথবা লিঙ্কটি কপি করে আপনার ব্রাউজারে পেস্ট করুন, যেখানে গুগল ক্লাউড কনসোল ব্যবহারকারী লগ ইন করা আছেন।
- এই ধাপটি সম্পন্ন হলে রিপোটি আপনার লোকাল ক্লাউড শেল এডিটরে ক্লোন করা হবে এবং আপনি প্রজেক্ট ফোল্ডার থেকে নিচের কমান্ডটি চালাতে পারবেন (আপনাকে অবশ্যই প্রজেক্ট ডিরেক্টরিতে থাকতে হবে):
sh run.sh
- এখন UI ব্যবহার করুন (টার্মিনালে থাকা লিঙ্কে ক্লিক করে অথবা টার্মিনালে থাকা 'preview on web' লিঙ্কে ক্লিক করে)।
- শুরু করার জন্য আপনার প্রজেক্ট আইডি, ক্লাস্টার এবং ইনস্ট্যান্সের নামগুলোর বিবরণ লিখুন।
- লগগুলো স্ক্রল হতে হতে আপনি এক কাপ কফি নিয়ে আসুন এবং পর্দার আড়ালে এটি কীভাবে কাজ করছে তা এখানে পড়ে নিন।
অপ্রত্যাশিত সমস্যা ও সমাধান
"ধৈর্য" সমস্যা | ডাটাবেস ক্লাস্টার একটি ভারী অবকাঠামো। যদি আপনি পৃষ্ঠাটি রিফ্রেশ করেন বা ক্লাউড শেল সেশনটি "আটকে গেছে" ভেবে বন্ধ করে দেন, তাহলে এর ফলে একটি "ঘোস্ট" ইনস্ট্যান্স তৈরি হতে পারে যা আংশিকভাবে প্রোভিশন করা এবং ম্যানুয়াল হস্তক্ষেপ ছাড়া মুছে ফেলা অসম্ভব। |
অঞ্চলের অমিল | আপনি যদি |
জম্বি ক্লাস্টার | যদি আপনি আগে কোনো ক্লাস্টারের জন্য একই নাম ব্যবহার করে থাকেন এবং সেটি মুছে না ফেলেন, তাহলে স্ক্রিপ্টটি বলতে পারে যে ক্লাস্টারের নামটি ইতিমধ্যেই বিদ্যমান। একটি প্রোজেক্টের মধ্যে ক্লাস্টারের নাম অবশ্যই অনন্য হতে হবে। |
ক্লাউড শেল টাইমআউট | আপনার কফি বিরতি যদি ৩০ মিনিটের হয়, তাহলে ক্লাউড শেল স্লিপ মোডে চলে যেতে পারে এবং |
৪. স্কিমা প্রোভিশনিং
আপনার AlloyDB ক্লাস্টার এবং ইনস্ট্যান্স চালু হয়ে গেলে, AI এক্সটেনশনগুলি সক্রিয় করতে এবং স্কিমাটি প্রোভিশন করতে AlloyDB Studio SQL এডিটরে যান।

আপনার ইনস্ট্যান্সটি তৈরি হওয়া শেষ না হওয়া পর্যন্ত আপনাকে অপেক্ষা করতে হতে পারে। এটি তৈরি হয়ে গেলে, ক্লাস্টার তৈরির সময় আপনি যে ক্রেডেনশিয়ালগুলো তৈরি করেছিলেন, সেগুলো ব্যবহার করে AlloyDB-তে সাইন ইন করুন। PostgreSQL-এ প্রমাণীকরণের জন্য নিম্নলিখিত ডেটা ব্যবহার করুন:
- ব্যবহারকারীর নাম : "
postgres" - ডাটাবেস : "
postgres" - পাসওয়ার্ড : "
alloydb" (অথবা তৈরির সময় আপনি যা সেট করেছিলেন)
AlloyDB Studio-তে সফলভাবে প্রমাণীকরণের পর, এডিটর-এ SQL কমান্ডগুলো প্রবেশ করানো হয়। শেষ উইন্ডোটির ডানদিকে থাকা প্লাস চিহ্নটি ব্যবহার করে আপনি একাধিক এডিটর উইন্ডো যোগ করতে পারেন।

আপনি এডিটর উইন্ডোতে AlloyDB-এর জন্য কমান্ড লিখবেন এবং প্রয়োজন অনুযায়ী Run, Format ও Clear অপশনগুলো ব্যবহার করবেন।
এক্সটেনশনগুলি সক্ষম করুন
এই অ্যাপটি তৈরি করার জন্য, আমরা 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;
একটি টেবিল তৈরি করুন
আপনি AlloyDB Studio-তে নিচের DDL স্টেটমেন্টটি ব্যবহার করে একটি টেবিল তৈরি করতে পারেন:
-- 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' ফাংশনটিতে execute অনুমোদন দিতে নিচের স্টেটমেন্টটি চালান:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
AlloyDB পরিষেবা অ্যাকাউন্টে Vertex AI ব্যবহারকারীর ROLE প্রদান করুন।
Google Cloud IAM কনসোল থেকে, AlloyDB সার্ভিস অ্যাকাউন্টকে (যা দেখতে এইরকম: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) "Vertex AI User" রোলের অ্যাক্সেস দিন। PROJECT_NUMBER-এ আপনার প্রজেক্ট নম্বরটি থাকবে।
বিকল্পভাবে আপনি ক্লাউড শেল টার্মিনাল থেকে নিচের কমান্ডটি চালাতে পারেন:
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"
AlloyDB-তে Gemini 3 ফ্ল্যাশ মডেলটি নিবন্ধন করুন।
AlloyDB কোয়েরি এডিটর থেকে নিচের SQL স্টেটমেন্টটি চালান।
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.
অপ্রত্যাশিত সমস্যা ও সমাধান
"পাসওয়ার্ড অ্যামনেসিয়া" লুপ | আপনি যদি "ওয়ান ক্লিক" সেটআপ ব্যবহার করে থাকেন এবং আপনার পাসওয়ার্ড মনে না থাকে, তাহলে কনসোলে থাকা ইনস্ট্যান্স বেসিক ইনফরমেশন পেজে গিয়ে |
"এক্সটেনশন খুঁজে পাওয়া যায়নি" ত্রুটি | যদি |
আইএএম প্রসারণ ব্যবধান | আপনি |
ভেক্টর মাত্রার অমিল | |
প্রজেক্ট আইডি টাইপো | |
৫. ছবি সংরক্ষণ (গুগল ক্লাউড স্টোরেজ)
আমাদের অতিরিক্ত জিনিসপত্রের ছবি সংরক্ষণ করার জন্য আমরা একটি GCS বাকেট ব্যবহার করি। এই ডেমো অ্যাপটির জন্য আমরা চাই ছবিগুলো যেন সবার জন্য সহজলভ্য হয়, যাতে সেগুলো আমাদের সোয়াইপ কার্ডে সঙ্গে সঙ্গে প্রদর্শিত হয়।
- একটি বাকেট তৈরি করুন: আপনার GCP প্রোজেক্টে (যেমন, neighborloop-images) একটি নতুন বাকেট তৈরি করুন , বিশেষত আপনার ডাটাবেস এবং অ্যাপ্লিকেশনের মতো একই অঞ্চলে।
- সর্বজনীন অ্যাক্সেস কনফিগার করুন: * বাকেটটির পারমিশন ট্যাবে যান।
- allUsers প্রিন্সিপালটি যোগ করুন।
- স্টোরেজ অবজেক্ট ভিউয়ার রোল (যাতে সবাই ছবিগুলো দেখতে পারে) এবং স্টোরেজ অবজেক্ট ক্রিয়েটর রোল (ডেমো আপলোডের উদ্দেশ্যে) নির্ধারণ করুন।
বিকল্প (সার্ভিস অ্যাকাউন্ট): আপনি যদি পাবলিক অ্যাক্সেস ব্যবহার করতে না চান, তবে নিশ্চিত করুন যে আপনার অ্যাপ্লিকেশনের সার্ভিস অ্যাকাউন্টকে AlloyDB-তে সম্পূর্ণ অ্যাক্সেস এবং অবজেক্টগুলি নিরাপদে পরিচালনা করার জন্য প্রয়োজনীয় স্টোরেজ রোলগুলি দেওয়া হয়েছে।
অপ্রত্যাশিত সমস্যা ও সমাধান
অঞ্চল ড্র্যাগ | যদি আপনার ডাটাবেস |
বালতির নামের অনন্যতা | বাকেটের নামগুলো একটি গ্লোবাল নেমস্পেস। আপনি যদি আপনার বাকেটের নাম |
'স্রষ্টা' বনাম 'দর্শক' এর বিভ্রান্তি | 'Creator' এবং 'Viewer'-এর মধ্যে বিভ্রান্তি: আপনি যদি শুধু 'Viewer' যোগ করেন, তাহলে কোনো ব্যবহারকারী যখন একটি নতুন আইটেম তালিকাভুক্ত করার চেষ্টা করবে, তখন আপনার অ্যাপটি ক্র্যাশ করবে, কারণ ফাইলটিতে লেখার অনুমতি তার থাকবে না। এই নির্দিষ্ট ডেমো সেটআপের জন্য আপনার উভয়ই প্রয়োজন। |
৬. চলুন অ্যাপ্লিকেশনটি তৈরি করি।
এই রিপোটি আপনার প্রজেক্টে ক্লোন করুন এবং চলুন বিষয়টি ধাপে ধাপে দেখি।
- এটি ক্লোন করতে, আপনার ক্লাউড শেল টার্মিনাল থেকে (রুট ডিরেক্টরিতে অথবা যেখান থেকে আপনি এই প্রজেক্টটি তৈরি করতে চান), নিম্নলিখিত কমান্ডটি চালান:
git clone https://github.com/AbiramiSukumaran/neighbor-loop
এতে প্রজেক্টটি তৈরি হয়ে যাবে এবং আপনি ক্লাউড শেল এডিটর-এ তা যাচাই করতে পারবেন।

- আপনার জেমিনি এপিআই কী কীভাবে পাবেন
- গুগল এআই স্টুডিও পরিদর্শন করুন: aistudio.google.com -এ যান।
- সাইন ইন করুন: আপনার গুগল ক্লাউড প্রোজেক্টের জন্য ব্যবহৃত একই গুগল অ্যাকাউন্টটি ব্যবহার করুন।
- এপিআই কী তৈরি করুন:
- বাম পাশের সাইডবারে, "Get API key"-তে ক্লিক করুন।
- "নতুন প্রজেক্টে এপিআই কী তৈরি করুন" বোতামটিতে ক্লিক করুন।
- কী-টি কপি করুন: কী-টি তৈরি হয়ে গেলে, কপি আইকনে ক্লিক করুন।
- এখন .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>>.
অপ্রত্যাশিত সমস্যা ও সমাধান
একাধিক অ্যাকাউন্ট বিভ্রান্তি | আপনি যদি একাধিক গুগল অ্যাকাউন্টে (ব্যক্তিগত এবং কর্মক্ষেত্রের) লগ ইন করে থাকেন, তাহলে এআই স্টুডিও ভুল অ্যাকাউন্টটি ডিফল্ট হিসেবে ব্যবহার করতে পারে। এটি আপনার জিসিপি প্রজেক্ট অ্যাকাউন্টের সাথে মিলছে কিনা তা নিশ্চিত করতে উপরের ডান কোণায় থাকা অ্যাভাটারটি দেখুন । |
'ফ্রি টিয়ার' কোটার প্রভাব | আপনি যদি ফ্রি টিয়ার ব্যবহার করেন, তাহলে রেট লিমিট (RPM - রিকোয়েস্টস পার মিনিট) রয়েছে। নেইবার লুপ-এ খুব দ্রুত "সোয়াইপ" করলে, আপনি একটি |
উন্মুক্ত কী নিরাপত্তা | যদি আপনি ভুলবশত আপনার |
"কানেকশন টাইমআউট" ভয়েড | আপনি আপনার .env ফাইলে প্রাইভেট আইপি অ্যাড্রেস ব্যবহার করেছেন, কিন্তু ভিপিসি-র বাইরে থেকে (যেমন আপনার লোকাল মেশিন থেকে) সংযোগ করার চেষ্টা করছেন। প্রাইভেট আইপি শুধুমাত্র একই গুগল ক্লাউড নেটওয়ার্কের ভেতর থেকেই অ্যাক্সেসযোগ্য। পাবলিক আইপি ব্যবহার করুন! |
পোর্ট ৫৪৩২ অনুমান | যদিও 5432 হলো PostgreSQL-এর স্ট্যান্ডার্ড পোর্ট, Auth Proxy ব্যবহার করলে AlloyDB-এর জন্য কখনও কখনও নির্দিষ্ট পোর্ট কনফিগারেশনের প্রয়োজন হয়। এই ল্যাবের জন্য, আপনার হোস্ট স্ট্রিং-এর শেষে :5432 ব্যবহার করা নিশ্চিত করুন। |
"অনুমোদিত নেটওয়ার্ক" গেটকিপার | আপনার পাবলিক আইপি থাকলেও, যে মেশিনে কোডটি চলছে তার আইপি অ্যাড্রেস হোয়াইটলিস্টে যোগ না করলে AlloyDB "কানেকশন প্রত্যাখ্যান" করবে। সমাধান: AlloyDB ইনস্ট্যান্স সেটিংসে, অনুমোদিত নেটওয়ার্কের তালিকায় 0.0.0.0/0 (শুধুমাত্র অস্থায়ী পরীক্ষার জন্য!) অথবা আপনার নির্দিষ্ট আইপি যোগ করুন। |
SSL/TLS হ্যান্ডশেক ব্যর্থতা | AlloyDB সুরক্ষিত সংযোগ পছন্দ করে। যদি আপনার DATABASE_URL-এ ড্রাইভারটি সঠিকভাবে উল্লেখ করা না থাকে (যেমন pg8000 ব্যবহার করলে), তাহলে হ্যান্ডশেকটি নীরবে ব্যর্থ হতে পারে, যার ফলে আপনি একটি সাধারণ "Database not reachable" ত্রুটি দেখতে পাবেন। |
"প্রাইমারি বনাম রিড পুল" অদলবদল | আপনি যদি ভুলবশত প্রাইমারি ইনস্ট্যান্সের পরিবর্তে রিড পুলের আইপি অ্যাড্রেস কপি করেন, তাহলে আপনার অ্যাপটি আইটেম খোঁজার জন্য কাজ করলেও, নতুন কোনো আইটেম তালিকাভুক্ত করার চেষ্টা করলে "রিড-অনলি" ত্রুটি দেখিয়ে ক্র্যাশ করবে। লেখার জন্য সর্বদা প্রাইমারি ইনস্ট্যান্সের আইপি ব্যবহার করুন। |
৭. চলো কোডটি যাচাই করি।
আপনার জিনিসপত্রের জন্য "ডেটিং প্রোফাইল"

যখন কোনো ব্যবহারকারী কোনো পণ্যের ছবি আপলোড করেন, তখন তাদের দীর্ঘ বিবরণ লিখতে হবে না। আমি জেমিনি ৩ ফ্ল্যাশ ব্যবহার করে পণ্যটি 'দেখি' এবং তাদের জন্য লিস্টিংটি লিখে দিই।
ব্যাকএন্ডে, ব্যবহারকারী শুধু একটি শিরোনাম এবং একটি ছবি প্রদান করেন। বাকিটা জেমিনি সামলে নেয়:
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")
)

রিয়েল-টাইম ইন-ডাটাবেস এমবেডিংস

AlloyDB-এর অন্যতম সেরা একটি বৈশিষ্ট্য হলো SQL কনটেক্সট থেকে বের না হয়েই এমবেডিং তৈরি করার ক্ষমতা। পাইথনে একটি এমবেডিং মডেল কল করে ভেক্টরটি ডেটাবেসে ফেরত পাঠানোর পরিবর্তে, আমি embedding() ফাংশনটি ব্যবহার করে একটিমাত্র INSERT স্টেটমেন্টের মধ্যেই এই কাজটি করে ফেলি:
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
)
এটি নিশ্চিত করে যে প্রতিটি আইটেম পোস্ট করার সাথে সাথেই তার অর্থ অনুযায়ী "অনুসন্ধানযোগ্য" হয়ে ওঠে। এবং মনে রাখবেন যে, এই অংশটিই নেইবার লুপ অ্যাপের "পণ্য তালিকাভুক্ত করার" বৈশিষ্ট্যটিকে অন্তর্ভুক্ত করে।

জেমিনি ৩.০ এর সাহায্যে উন্নত ভেক্টর অনুসন্ধান এবং স্মার্ট ফিল্টারিং
সাধারণ কীওয়ার্ড সার্চ সীমিত। আপনি যদি "আমার চেয়ার ঠিক করার মতো কিছু" লিখে সার্চ করেন, তাহলে কোনো শিরোনামে "চেয়ার" শব্দটি না থাকলে একটি প্রচলিত ডেটাবেস কিছুই খুঁজে নাও পেতে পারে। নেইবার লুপ অ্যালয়ডিবি এআই-এর উন্নত ভেক্টর সার্চের মাধ্যমে এই সমস্যার সমাধান করে।
pgvector এক্সটেনশন এবং AlloyDB-এর অপ্টিমাইজড স্টোরেজ ব্যবহার করে আমরা অত্যন্ত দ্রুত সাদৃশ্য অনুসন্ধান করতে পারি। কিন্তু আসল 'জাদু' তখনই ঘটে যখন আমরা ভেক্টর প্রক্সিমিটির সাথে LLM-ভিত্তিক লজিককে একত্রিত করি।
AlloyDB AI আমাদেরকে আমাদের SQL কোয়েরির মধ্যে সরাসরি Gemini-এর মতো মডেল কল করার সুযোগ দেয়। এর মানে হলো, আমরা 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
এই কোয়েরিটি একটি বড় ধরনের আর্কিটেকচারাল পরিবর্তন নিয়ে এসেছে: আমরা লজিককে ডেটার কাছে নিয়ে যাচ্ছি। হাজার হাজার ফলাফল ফিল্টার করার জন্য অ্যাপ্লিকেশন কোডে টেনে আনার পরিবর্তে, জেমিনি ৩ ফ্ল্যাশ ডাটাবেস ইঞ্জিনের ভেতরেই একটি 'ভাইব চেক' করে। এটি ল্যাটেন্সি কমায়, ডেটা স্থানান্তরের খরচ হ্রাস করে এবং নিশ্চিত করে যে ফলাফলগুলো শুধু গাণিতিকভাবেই সাদৃশ্যপূর্ণ নয়, বরং প্রাসঙ্গিকভাবেও গুরুত্বপূর্ণ।

"সোয়াইপ টু ম্যাচ" লুপ
UI-টি হলো একটি চিরায়ত তাসের ডেক।
বাম দিকে সোয়াইপ করুন: বাতিল করুন।
ডানদিকে সোয়াইপ করুন: মিলে গেছে!

আপনি যখন ডানদিকে সোয়াইপ করেন, তখন ব্যাকএন্ড আমাদের সোয়াইপ টেবিলে এই ইন্টারঅ্যাকশনটি রেকর্ড করে এবং আইটেমটিকে 'ম্যাচড' হিসেবে চিহ্নিত করে। ফ্রন্টএন্ড সঙ্গে সঙ্গে একটি মোডাল চালু করে, যেখানে প্রোভাইডারের যোগাযোগের তথ্য দেখানো হয়, যাতে আপনি পিকআপের ব্যবস্থা করতে পারেন।
৮. চলুন এটি ক্লাউড রানে ডেপ্লয় করি।
- প্রজেক্টটি যেখানে ক্লোন করা হয়েছে, সেখানকার ক্লাউড শেল টার্মিনাল থেকে নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড রান-এ এটি ডিপ্লয় করুন এবং নিশ্চিত করুন যে আপনি প্রজেক্টটির রুট ফোল্ডারের ভিতরে আছেন ।
আপনার ক্লাউড শেল টার্মিনালে এটি চালান:
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>> প্লেসহোল্ডারগুলির মান প্রতিস্থাপন করুন।
কমান্ডটি শেষ হলে এটি একটি সার্ভিস ইউআরএল (Service URL) দেবে। সেটি কপি করুন।
- ক্লাউড রান সার্ভিস অ্যাকাউন্টকে AlloyDB ক্লায়েন্ট রোলটি প্রদান করুন। এর ফলে আপনার সার্ভারলেস অ্যাপ্লিকেশনটি নিরাপদে ডাটাবেসে টানেল করতে পারবে।
আপনার ক্লাউড শেল টার্মিনালে এটি চালান:
# 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-টিতে |
আইএএম "শ্যাডো" ভূমিকা | আপনার ডেপ্লয় করার অনুমতি থাকলেও, ডাটাবেসের সাথে প্রকৃত সংযোগ স্থাপন করার জন্য ক্লাউড রান সার্ভিস অ্যাকাউন্টের (সাধারণত |
৯. উচ্চ স্তরের সমস্যা সমাধান

১০. ডেমো
আপনি পরীক্ষার জন্য আপনার এন্ডপয়েন্টটি ব্যবহার করতে পারবেন।
কিন্তু ডেমো দেখানোর জন্য কয়েক দিনের জন্য আপনি এটি নিয়ে খেলতে পারেন:
১১. পরিষ্কার করুন
এই ল্যাবটি সম্পন্ন হয়ে গেলে, alloyDB ক্লাস্টার এবং ইনস্ট্যান্সটি ডিলিট করতে ভুলবেন না।
এটি ক্লাস্টারটিকে তার ইনস্ট্যান্স(গুলি) সহ পরিষ্কার করে দেবে।
১২. অভিনন্দন
আপনি গুগল ক্লাউড ব্যবহার করে টেকসই কমিউনিটির জন্য নেইবার লুপ অ্যাপটি সফলভাবে তৈরি করেছেন। এমবেডিং এবং জেমিনি ৩ ফ্ল্যাশ এআই লজিককে অ্যালয়ডিবি-তে স্থানান্তর করার ফলে, অ্যাপটি অবিশ্বাস্যভাবে দ্রুত (ডিপ্লয়মেন্ট সেটিংস সাপেক্ষে) এবং এর কোডও অসাধারণভাবে পরিচ্ছন্ন। আমরা শুধু ডেটা সংরক্ষণ করছি না — আমরা উদ্দেশ্য সংরক্ষণ করছি।
জেমিনি ৩ ফ্ল্যাশের গতি এবং অ্যালয়ডিবি-র অপ্টিমাইজড ভেক্টর প্রসেসিংয়ের সমন্বয় প্রকৃতপক্ষে কমিউনিটি-চালিত প্ল্যাটফর্মগুলোর জন্য পরবর্তী দিগন্ত।