জেমিনি ৩ ফ্ল্যাশ এবং অ্যালয়ডিবি দিয়ে একটি রিয়েল-টাইম উদ্বৃত্ত ইঞ্জিন তৈরি করা

1. সংক্ষিপ্ত বিবরণ

এই কোডল্যাবে, আপনি নেইবার লুপ তৈরি করবেন, একটি টেকসই উদ্বৃত্ত-ভাগাভাগি অ্যাপ যা বুদ্ধিমত্তাকে ডেটা স্তরের প্রথম শ্রেণীর নাগরিক হিসেবে বিবেচনা করে।

জেমিনি ৩.০ ফ্ল্যাশ এবং অ্যালয়ডিবি এআই একীভূত করার মাধ্যমে, আপনি মৌলিক স্টোরেজকে ইন-ডাটাবেস ইন্টেলিজেন্সের ক্ষেত্রে স্থানান্তরিত করতে পারবেন। আপনি শিখবেন কিভাবে SQL-এর মধ্যে সরাসরি মাল্টিমোডাল আইটেম বিশ্লেষণ এবং সিমান্টিক আবিষ্কার করতে হয়, যা ল্যাটেন্সি এবং আর্কিটেকচারাল ব্লোটের "এআই ট্যাক্স" দূর করে।

1da27e0c4d9a33e0.jpeg সম্পর্কে

তুমি কী তৈরি করবে

কমিউনিটি উদ্বৃত্ত ভাগাভাগির জন্য একটি উচ্চ-কার্যক্ষমতাসম্পন্ন "সোয়াইপ-টু-ম্যাচ" ওয়েব অ্যাপ্লিকেশন।

তুমি কি শিখবে

  • এক-ক্লিক প্রভিশনিং: AI ওয়ার্কলোডের জন্য ডিজাইন করা একটি AlloyDB ক্লাস্টার এবং ইনস্ট্যান্স কীভাবে সেট আপ করবেন।
  • ইন-ডাটাবেস এম্বেডিং: INSERT স্টেটমেন্টের মধ্যে সরাসরি টেক্সট-এমবেডিং-005 ভেক্টর তৈরি করা।
  • মাল্টিমোডাল রিজনিং: জেমিনি 3.0 ফ্ল্যাশ ব্যবহার করে আইটেমগুলি "দেখতে" এবং স্বয়ংক্রিয়ভাবে মজাদার, ডেটিং-স্টাইলের জীবনী তৈরি করা।
  • শব্দার্থিক আবিষ্কার: ai.if() ফাংশন ব্যবহার করে SQL কোয়েরির ভেতরে লজিক-ভিত্তিক "ভাইব চেক" করা, যা কেবল গণিতের উপর নয়, বরং প্রসঙ্গের উপর ভিত্তি করে ফলাফল ফিল্টার করে।

স্থাপত্য

নেইবার লুপ ঐতিহ্যবাহী অ্যাপ্লিকেশন-স্তরের বাধাগুলিকে এড়িয়ে যায়। প্রক্রিয়াকরণের জন্য ডেটা বের করার পরিবর্তে, আমরা ব্যবহার করি:

  1. AlloyDB AI: রিয়েল-টাইমে ভেক্টর তৈরি এবং সংরক্ষণ করা।
  2. গুগল ক্লাউড স্টোরেজ: ছবি সংরক্ষণ করতে
  3. জেমিনি ৩.০ ফ্ল্যাশ: SQL এর মাধ্যমে সরাসরি ছবি এবং টেক্সট ডেটার উপর সাব-সেকেন্ড রিজনিং সম্পাদন করা।
  4. ক্লাউড রান: একটি হালকা, একক-ফাইল ফ্লাস্ক ব্যাকএন্ড হোস্ট করার জন্য।

আবশ্যকতা

  • একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
  • বিলিং সক্ষম করা একটি Google ক্লাউড প্রকল্প।
  • SQL এবং Python এর সাথে প্রাথমিক পরিচিতি।

2. শুরু করার আগে

একটি প্রকল্প তৈরি করুন

  1. গুগল ক্লাউড কনসোলে , প্রজেক্ট সিলেক্টর পৃষ্ঠায়, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
  2. আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং সক্ষম আছে কিনা তা নিশ্চিত করুন। কোনও প্রোজেক্টে বিলিং সক্ষম আছে কিনা তা কীভাবে পরীক্ষা করবেন তা শিখুন
  1. আপনি ক্লাউড শেল ব্যবহার করবেন, যা গুগল ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ। গুগল ক্লাউড কনসোলের শীর্ষে অ্যাক্টিভেট ক্লাউড শেল ক্লিক করুন।

ক্লাউড শেল বোতামের ছবি সক্রিয় করুন

  1. ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি নিম্নলিখিত কমান্ড ব্যবহার করে পরীক্ষা করতে পারবেন যে আপনি ইতিমধ্যেই প্রমাণীকরণপ্রাপ্ত এবং প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে কিনা:
gcloud auth list
  1. gcloud কমান্ড আপনার প্রকল্প সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান।
gcloud config list project
  1. যদি আপনার প্রকল্পটি সেট না করা থাকে, তাহলে এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
gcloud config set project <YOUR_PROJECT_ID>
  1. প্রয়োজনীয় API গুলি সক্ষম করুন: লিঙ্কটি অনুসরণ করুন এবং API গুলি সক্ষম করুন।

অন্যথায়, আপনি এর জন্য gcloud কমান্ড ব্যবহার করতে পারেন। gcloud কমান্ড এবং ব্যবহারের জন্য ডকুমেন্টেশন দেখুন।

সমস্যা সমাধান এবং সমস্যা সমাধান

"ঘোস্ট প্রজেক্ট" সিন্ড্রোম

আপনি gcloud config set project চালাচ্ছিলেন, কিন্তু আপনি আসলে Console UI তে একটি ভিন্ন প্রকল্প দেখছেন। উপরের বাম ড্রপডাউনে প্রকল্প আইডিটি পরীক্ষা করুন!

বিলিং ব্যারিকেড

তুমি প্রজেক্টটি চালু করেছো, কিন্তু বিলিং অ্যাকাউন্ট ভুলে গেছো। AlloyDB একটি উচ্চ-কার্যক্ষমতাসম্পন্ন ইঞ্জিন; "গ্যাস ট্যাঙ্ক" (বিলিং) খালি থাকলে এটি চালু হবে না।

এপিআই প্রচার ল্যাগ

তুমি "এনিমেল এপিআই" ক্লিক করেছো, কিন্তু কমান্ড লাইনে এখনও Service Not Enabled লেখা আছে। ৬০ সেকেন্ড সময় দাও। ক্লাউডের নিউরনগুলিকে জাগিয়ে তোলার জন্য একটু সময় প্রয়োজন।

কোটা কোয়াগস

যদি আপনি একটি নতুন ট্রায়াল অ্যাকাউন্ট ব্যবহার করেন, তাহলে AlloyDB ইনস্ট্যান্সের জন্য আপনার আঞ্চলিক কোটা পূরণ হতে পারে। যদি us-central1 ব্যর্থ হয়, তাহলে us-east1 চেষ্টা করুন।

"লুকানো" পরিষেবা এজেন্ট

কখনও কখনও AlloyDB সার্ভিস এজেন্টকে স্বয়ংক্রিয়ভাবে aiplatform.user ভূমিকা দেওয়া হয় না । যদি আপনার SQL কোয়েরিগুলি পরে জেমিনির সাথে কথা বলতে না পারে, তাহলে এটি সাধারণত দোষী।

৩. ডাটাবেস সেটআপ

এই ল্যাবে আমরা পরীক্ষার তথ্যের জন্য ডাটাবেস হিসেবে AlloyDB ব্যবহার করব। এটি ডাটাবেস এবং লগের মতো সমস্ত রিসোর্স ধরে রাখার জন্য ক্লাস্টার ব্যবহার করে। প্রতিটি ক্লাস্টারের একটি প্রাথমিক উদাহরণ থাকে যা ডেটাতে একটি অ্যাক্সেস পয়েন্ট প্রদান করে। টেবিলগুলি প্রকৃত তথ্য ধারণ করবে।

চলুন একটি AlloyDB ক্লাস্টার, ইনস্ট্যান্স এবং টেবিল তৈরি করি যেখানে পরীক্ষার ডেটাসেট লোড করা হবে।

  1. বোতামে ক্লিক করুন অথবা নীচের লিঙ্কটি আপনার ব্রাউজারে কপি করুন যেখানে আপনার Google Cloud Console ব্যবহারকারী লগ ইন করেছেন।

  1. এই ধাপটি সম্পন্ন হলে রেপোটি আপনার স্থানীয় ক্লাউড শেল এডিটরে ক্লোন করা হবে এবং আপনি প্রজেক্ট ফোল্ডার থেকে নীচের কমান্ডটি চালাতে সক্ষম হবেন (আপনি প্রজেক্ট ডিরেক্টরিতে আছেন তা নিশ্চিত করা গুরুত্বপূর্ণ):
sh run.sh
  1. এখন UI ব্যবহার করুন (টার্মিনালে লিঙ্কে ক্লিক করে অথবা টার্মিনালে "প্রিভিউ অন ওয়েব" লিঙ্কে ক্লিক করে)।
  2. শুরু করার জন্য প্রকল্প আইডি, ক্লাস্টার এবং উদাহরণের নামের জন্য আপনার বিবরণ লিখুন।
  3. লগগুলি স্ক্রোল করার সময় কফি খেয়ে নাও এবং পর্দার আড়ালে এটি কীভাবে এটি করছে তা আপনি এখানে পড়তে পারেন।

সমস্যা সমাধান এবং সমস্যা সমাধান

"ধৈর্য" সমস্যা

ডাটাবেস ক্লাস্টারগুলি ভারী অবকাঠামো। যদি আপনি পৃষ্ঠাটি রিফ্রেশ করেন বা ক্লাউড শেল সেশনটি বন্ধ করে দেন কারণ এটি "আটকে আছে" বলে মনে হয়, তাহলে আপনার একটি "ঘোস্ট" ইনস্ট্যান্স তৈরি হতে পারে যা আংশিকভাবে প্রভিশন করা হয়েছে এবং ম্যানুয়াল হস্তক্ষেপ ছাড়া মুছে ফেলা অসম্ভব।

অঞ্চলের মিল নেই

যদি আপনি us-central1 এ আপনার API গুলি সক্রিয় করে থাকেন কিন্তু asia-south1 এ ক্লাস্টারটি সরবরাহ করার চেষ্টা করেন, তাহলে আপনার কোটা সংক্রান্ত সমস্যা বা পরিষেবা অ্যাকাউন্টের অনুমতি বিলম্বিত হতে পারে। পুরো ল্যাবের জন্য একটি অঞ্চলে আটকে থাকুন!

জম্বি ক্লাস্টার

যদি আপনি পূর্বে একটি ক্লাস্টারের জন্য একই নাম ব্যবহার করে থাকেন এবং এটি মুছে না ফেলে থাকেন, তাহলে স্ক্রিপ্টটি বলতে পারে যে ক্লাস্টারের নামটি ইতিমধ্যেই বিদ্যমান। একটি প্রকল্পের মধ্যে ক্লাস্টারের নামগুলি অবশ্যই অনন্য হতে হবে।

ক্লাউড শেল টাইমআউট

যদি আপনার কফি ব্রেক ৩০ মিনিটের হয়, তাহলে ক্লাউড শেল স্লিপ মোডে যেতে পারে এবং sh run.sh প্রক্রিয়াটি সংযোগ বিচ্ছিন্ন করতে পারে। ট্যাবটি সক্রিয় রাখুন!

৪. স্কিমা প্রভিশনিং

আপনার AlloyDB ক্লাস্টার এবং ইনস্ট্যান্স চালু হয়ে গেলে, AI এক্সটেনশনগুলি সক্ষম করতে এবং স্কিমাটি সরবরাহ করতে AlloyDB স্টুডিও SQL এডিটরে যান।

1e3ac974b18a8113.png সম্পর্কে

আপনার ইনস্ট্যান্স তৈরি শেষ না হওয়া পর্যন্ত আপনাকে অপেক্ষা করতে হতে পারে। একবার এটি হয়ে গেলে, ক্লাস্টার তৈরি করার সময় তৈরি করা শংসাপত্রগুলি ব্যবহার করে AlloyDB-তে সাইন ইন করুন। PostgreSQL-এ প্রমাণীকরণের জন্য নিম্নলিখিত ডেটা ব্যবহার করুন:

  • ব্যবহারকারীর নাম: " postgres "
  • ডাটাবেস: " postgres "
  • পাসওয়ার্ড: " alloydb " (অথবা তৈরির সময় আপনি যা সেট করেছেন)

AlloyDB স্টুডিওতে সফলভাবে প্রমাণীকরণ করার পরে, SQL কমান্ডগুলি এডিটরে প্রবেশ করানো হবে। আপনি শেষ উইন্ডোর ডানদিকে প্লাস ব্যবহার করে একাধিক এডিটর উইন্ডো যুক্ত করতে পারেন।

28cb9a8b6aa0789f.png সম্পর্কে

আপনি এডিটর উইন্ডোতে AlloyDB-এর জন্য কমান্ড লিখবেন, প্রয়োজনে Run, Format এবং Clear অপশন ব্যবহার করে।

এক্সটেনশনগুলি সক্ষম করুন

এই অ্যাপটি তৈরির জন্য, আমরা pgvector এবং google_ml_integration এক্সটেনশনগুলি ব্যবহার করব। pgvector এক্সটেনশন আপনাকে ভেক্টর এম্বেডিংগুলি সংরক্ষণ এবং অনুসন্ধান করতে দেয়। google_ml_integration এক্সটেনশনটি SQL-এ ভবিষ্যদ্বাণী পেতে Vertex AI ভবিষ্যদ্বাণী এন্ডপয়েন্টগুলি অ্যাক্সেস করার জন্য আপনি যে ফাংশনগুলি ব্যবহার করেন তা প্রদান করে। নিম্নলিখিত DDLগুলি চালিয়ে এই এক্সটেনশনগুলি সক্ষম করুন :

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

একটি টেবিল তৈরি করুন

AlloyDB স্টুডিওতে নিচের 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 কলামটি টেক্সটের ভেক্টর মান সংরক্ষণের অনুমতি দেবে।

অনুমতি দিন

"এমবেডিং" ফাংশনে এক্সিকিউট করার জন্য নিচের স্টেটমেন্টটি রান করুন:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

AlloyDB পরিষেবা অ্যাকাউন্টে Vertex AI ব্যবহারকারীর ভূমিকা প্রদান করুন

গুগল ক্লাউড 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 তে জেমিনি 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.

সমস্যা সমাধান এবং সমস্যা সমাধান

"পাসওয়ার্ড অ্যামনেসিয়া" লুপ

যদি আপনি "One Click" সেটআপ ব্যবহার করে থাকেন এবং আপনার পাসওয়ার্ড মনে না রাখেন, তাহলে কনসোলের Instance বেসিক তথ্য পৃষ্ঠায় যান এবং postgres পাসওয়ার্ড রিসেট করতে "Edit" এ ক্লিক করুন।

"এক্সটেনশন পাওয়া যায়নি" ত্রুটি

যদি CREATE EXTENSION ব্যর্থ হয়, তাহলে প্রায়শই কারণ হল প্রাথমিক প্রভিশনিং থেকে ইনস্ট্যান্সটি এখনও "রক্ষণাবেক্ষণ" বা "আপডেট করা" অবস্থায় থাকে। ইনস্ট্যান্স তৈরির ধাপটি সম্পূর্ণ হয়েছে কিনা তা পরীক্ষা করে দেখুন এবং প্রয়োজনে কয়েক সেকেন্ড অপেক্ষা করুন।

আইএএম প্রচারের ব্যবধান

আপনি gcloud IAM কমান্ডটি চালিয়েছেন, কিন্তু SQL CALL এখনও একটি অনুমতি ত্রুটির কারণে ব্যর্থ হয়েছে। IAM পরিবর্তনগুলি Google ব্যাকবোন জুড়ে ছড়িয়ে পড়তে একটু সময় নিতে পারে । একটি নিঃশ্বাস নিন।

ভেক্টরের মাত্রা অমিল

items টেবিলটি VECTOR(768) এ সেট করা আছে। যদি আপনি পরে অন্য কোনও মডেল (যেমন 1536-dim মডেল) ব্যবহার করার চেষ্টা করেন, তাহলে আপনার ইনসার্টগুলি বিস্ফোরিত হবে। text-embedding-005 তে লেগে থাকুন।

প্রকল্প আইডি টাইপো

create_model কলে, যদি আপনি বন্ধনী « » ছেড়ে যান অথবা আপনার প্রকল্প আইডি ভুল টাইপ করেন, তাহলে মডেল নিবন্ধন সফল দেখাবে কিন্তু প্রথম প্রকৃত কোয়েরির সময় ব্যর্থ হবে। আপনার স্ট্রিংটি দুবার পরীক্ষা করুন!

৫. ইমেজ স্টোরেজ (গুগল ক্লাউড স্টোরেজ)

আমাদের উদ্বৃত্ত জিনিসপত্রের ছবি সংরক্ষণ করার জন্য, আমরা একটি GCS বাকেট ব্যবহার করি। এই ডেমো অ্যাপের উদ্দেশ্যে, আমরা চাই ছবিগুলি সর্বজনীনভাবে অ্যাক্সেসযোগ্য হোক যাতে সেগুলি আমাদের সোয়াইপ কার্ডগুলিতে তাৎক্ষণিকভাবে রেন্ডার হয়।

  1. একটি বাকেট তৈরি করুন: আপনার GCP প্রকল্পে (যেমন, neighborloop-images) একটি নতুন বাকেট তৈরি করুন , বিশেষ করে আপনার ডাটাবেস এবং অ্যাপ্লিকেশনের মতো একই অঞ্চলে।
  2. পাবলিক অ্যাক্সেস কনফিগার করুন: * বাকেটের অনুমতি ট্যাবে নেভিগেট করুন।
  3. allUsers প্রিন্সিপাল যোগ করুন।
  4. স্টোরেজ অবজেক্ট ভিউয়ারের ভূমিকা (যাতে সবাই ছবি দেখতে পারে) এবং স্টোরেজ অবজেক্ট ক্রিয়েটরের ভূমিকা (ডেমো আপলোডের উদ্দেশ্যে) নির্ধারণ করুন।

বিকল্প (পরিষেবা অ্যাকাউন্ট): যদি আপনি পাবলিক অ্যাক্সেস ব্যবহার না করতে চান, তাহলে নিশ্চিত করুন যে আপনার অ্যাপ্লিকেশনের পরিষেবা অ্যাকাউন্টে AlloyDB-তে সম্পূর্ণ অ্যাক্সেস এবং বস্তুগুলি নিরাপদে পরিচালনা করার জন্য প্রয়োজনীয় স্টোরেজ ভূমিকা রয়েছে।

সমস্যা সমাধান এবং সমস্যা সমাধান

অঞ্চল টানা

যদি আপনার ডাটাবেস us-central1 এ থাকে এবং আপনার বাকেট europe-west1 এ থাকে, তাহলে আপনি আক্ষরিক অর্থেই আপনার AI এর গতি কমিয়ে দিচ্ছেন। "ভাইব চেক" দ্রুত ঘটে, কিন্তু UI এর জন্য ছবি আনা ধীর মনে হবে। একই অঞ্চলে রাখুন!

বালতির নামের অনন্যতা

বাকেটের নাম হল একটি বিশ্বব্যাপী নেমস্পেস। যদি আপনি আপনার বাকেটের নাম neighborloop-images রাখার চেষ্টা করেন, তাহলে সম্ভবত অন্য কারো কাছে এটি ইতিমধ্যেই আছে। যদি আপনার তৈরি ব্যর্থ হয়, তাহলে একটি এলোমেলো প্রত্যয় যোগ করুন।

"স্রষ্টা" বনাম "দর্শক" মিশ্রণ

"ক্রিয়েটর" বনাম "ভিউয়ার" মিশ্রণ: যদি আপনি শুধুমাত্র "ভিউয়ার" যোগ করেন, তাহলে আপনার অ্যাপটি ক্র্যাশ করবে যখন কোনও ব্যবহারকারী একটি নতুন আইটেম তালিকাভুক্ত করার চেষ্টা করবে কারণ ফাইলটি লেখার অনুমতি তাদের নেই। এই নির্দিষ্ট ডেমো সেটআপের জন্য আপনার উভয়েরই প্রয়োজন।

৬. আসুন অ্যাপ্লিকেশনটি তৈরি করি

আপনার প্রকল্পে এই রেপোটি ক্লোন করুন এবং আসুন এটি দেখে নেওয়া যাক।

  1. এটি ক্লোন করতে, আপনার ক্লাউড শেল টার্মিনাল থেকে (রুট ডিরেক্টরিতে অথবা আপনি যেখান থেকে এই প্রকল্পটি তৈরি করতে চান) নিম্নলিখিত কমান্ডটি চালান:
git clone https://github.com/AbiramiSukumaran/neighbor-loop

এটি প্রকল্পটি তৈরি করবে এবং আপনি ক্লাউড শেল এডিটরে এটি যাচাই করতে পারবেন।

53a398aff6ba7d5b.png সম্পর্কে

  1. আপনার জেমিনি এপিআই কী কীভাবে পাবেন
  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 স্টুডিও ডিফল্টভাবে ভুল অ্যাকাউন্টে লগইন করতে পারে। উপরের ডানদিকে কোণায় অবতারটি পরীক্ষা করে দেখুন যাতে এটি আপনার GCP প্রজেক্ট অ্যাকাউন্টের সাথে মেলে।

"ফ্রি টিয়ার" কোটার আঘাত

যদি আপনি ফ্রি অফ চার্জ টিয়ার ব্যবহার করেন, তাহলে রেট লিমিট (RPM - প্রতি মিনিটে অনুরোধ) আছে। যদি আপনি Neighbor Loop-এ খুব দ্রুত "সোয়াইপ" করেন, তাহলে আপনি 429 Too Many Requests ত্রুটি পেতে পারেন। ধীর গতিতে!

উন্মুক্ত কী সুরক্ষা

যদি আপনি ভুলবশত আপনার .env ফাইলটি ভিতরে থাকা কী দিয়ে git commit , তাহলে সর্বদা আপনার .gitignore.env যোগ করুন।

"সংযোগের সময়সীমা" শূন্যতা

আপনি আপনার .env ফাইলে ব্যক্তিগত IP ঠিকানা ব্যবহার করেছেন কিন্তু আপনি VPC এর বাইরে থেকে (যেমন আপনার স্থানীয় মেশিন) সংযোগ করার চেষ্টা করছেন। ব্যক্তিগত IP গুলি শুধুমাত্র একই Google ক্লাউড নেটওয়ার্কের মধ্যে থেকে পৌঁছানো যায়। পাবলিক IP তে স্যুইচ করুন!

বন্দর ৫৪৩২ অনুমান

যদিও 5432 হল স্ট্যান্ডার্ড PostgreSQL পোর্ট, AlloyDB-এর জন্য কখনও কখনও নির্দিষ্ট পোর্ট কনফিগারেশনের প্রয়োজন হয় যদি আপনি একটি Auth Proxy ব্যবহার করেন। এই ল্যাবের জন্য, নিশ্চিত করুন যে আপনি আপনার হোস্ট স্ট্রিংয়ের শেষে :5432 ব্যবহার করছেন।

"অনুমোদিত নেটওয়ার্ক" এর দারোয়ান

আপনার যদি পাবলিক আইপি থাকে, তবুও AlloyDB "সংযোগ প্রত্যাখ্যান করবে" যদি না আপনি কোডটি চালানো মেশিনের আইপি ঠিকানাটি সাদা তালিকাভুক্ত করেন। সমাধান: AlloyDB ইনস্ট্যান্স সেটিংসে, 0.0.0.0/0 (শুধুমাত্র অস্থায়ী পরীক্ষার জন্য!) অথবা আপনার নির্দিষ্ট আইপি অনুমোদিত নেটওয়ার্কগুলিতে যোগ করুন।

SSL/TLS হ্যান্ডশেক ব্যর্থতা

AlloyDB নিরাপদ সংযোগ পছন্দ করে। যদি আপনার DATABASE_URL ড্রাইভারটি সঠিকভাবে নির্দিষ্ট না করে (যেমন pg8000 ব্যবহার করে), তাহলে হ্যান্ডশেক নীরবে ব্যর্থ হতে পারে, যার ফলে আপনার একটি জেনেরিক "Database not reachable" ত্রুটি দেখা দিতে পারে।

"প্রাথমিক বনাম পঠন পুল" অদলবদল

যদি আপনি ভুল করে প্রাইমারি ইনস্ট্যান্সের পরিবর্তে রিড পুলের আইপি ঠিকানাটি কপি করেন, তাহলে আপনার অ্যাপটি আইটেম অনুসন্ধানের জন্য কাজ করবে কিন্তু নতুন আইটেম তালিকাভুক্ত করার সময় "রিড-অনলি" ত্রুটির সাথে ক্র্যাশ করবে। লেখার জন্য সর্বদা প্রাইমারি ইনস্ট্যান্স আইপি ব্যবহার করুন।

৭. কোডটি পরীক্ষা করা যাক

আপনার জিনিসপত্রের জন্য "ডেটিং প্রোফাইল"

c2c543562cc9b353.png সম্পর্কে

যখন একজন ব্যবহারকারী কোনও জিনিসের ছবি আপলোড করেন, তখন তাদের দীর্ঘ বিবরণ লিখতে হয় না। আমি আইটেমটি "দেখতে" এবং তাদের জন্য তালিকা লিখতে জেমিনি 3 ফ্ল্যাশ ব্যবহার করি।

ব্যাকএন্ডে, ব্যবহারকারী কেবল একটি শিরোনাম এবং একটি ছবি প্রদান করে। বাকিটা জেমিনি পরিচালনা করে:

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-এ একটি এম্বেডিং মডেল কল করে ভেক্টরটিকে DB-তে ফেরত পাঠানোর পরিবর্তে, আমি 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
)

এটি নিশ্চিত করে যে প্রতিটি আইটেম পোস্ট করার সাথে সাথেই তার অর্থ অনুসারে "অনুসন্ধানযোগ্য"। এবং মনে রাখবেন যে এটি সেই অংশ যা Neighbour Loop অ্যাপের "পণ্য তালিকাভুক্ত করা" বৈশিষ্ট্যটি কভার করে।

পণ্য তালিকা বৈশিষ্ট্যের স্ক্রিনশট যোগ করুন

জেমিনি ৩.০ এর সাথে উন্নত ভেক্টর অনুসন্ধান এবং স্মার্ট ফিল্টারিং

স্ট্যান্ডার্ড কিওয়ার্ড অনুসন্ধান সীমিত। যদি আপনি "something to fix my chair" অনুসন্ধান করেন, তাহলে একটি ঐতিহ্যবাহী ডাটাবেস শিরোনামে "chear" শব্দটি না থাকলে কিছুই ফেরত নাও দিতে পারে। Neighbor Loop AlloyDB AI এর উন্নত ভেক্টর অনুসন্ধানের মাধ্যমে এই সমস্যাটি সমাধান করে।

pgvector এক্সটেনশন এবং AlloyDB এর অপ্টিমাইজড স্টোরেজ ব্যবহার করে, আমরা অত্যন্ত দ্রুত সাদৃশ্য অনুসন্ধান করতে পারি। কিন্তু আসল "জাদু" তখনই ঘটে যখন আমরা ভেক্টর প্রক্সিমিটি এবং LLM-ভিত্তিক লজিক একত্রিত করি।

AlloyDB AI আমাদের SQL কোয়েরির মধ্যে সরাসরি Gemini এর মতো মডেলগুলিকে কল করার সুযোগ দেয়। এর মানে হল আমরা ai.if() ফাংশন ব্যবহার করে একটি লজিক-ভিত্তিক "স্যানিটি চেক" সহ একটি Semantic Discovery সম্পাদন করতে পারি:

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

এই কোয়েরিটি একটি বড় স্থাপত্য পরিবর্তনের প্রতিনিধিত্ব করে: আমরা যুক্তিকে ডেটাতে স্থানান্তর করছি। হাজার হাজার ফলাফলকে অ্যাপ্লিকেশন কোডে ফিল্টার করার পরিবর্তে, জেমিনি 3 ফ্ল্যাশ ডাটাবেস ইঞ্জিনের ভিতরে একটি "ভাইব চেক" সম্পাদন করে। এটি ল্যাটেন্সি হ্রাস করে, বহির্গমন খরচ কমায় এবং নিশ্চিত করে যে ফলাফলগুলি কেবল গাণিতিকভাবে একই রকম নয়, বরং প্রাসঙ্গিকভাবে প্রাসঙ্গিক।

শব্দার্থিক অনুসন্ধান বৈশিষ্ট্যের স্ক্রিনশট

"সোয়াইপ টু ম্যাচ" লুপ

ইউআই হলো কার্ডের একটি ক্লাসিক ডেক।

বাম দিকে সোয়াইপ করুন: বাতিল করুন।

ডানদিকে সোয়াইপ করুন: এটি একটি ম্যাচ!

সোয়াইপ-টু-ম্যাচ ফিচারের স্ক্রিনশট

যখন আপনি ডানদিকে সোয়াইপ করেন, তখন ব্যাকএন্ড আমাদের সোয়াইপ টেবিলে ইন্টারঅ্যাকশন রেকর্ড করে এবং আইটেমটিকে মিলে যাওয়া হিসেবে চিহ্নিত করে। ফ্রন্টএন্ড তাৎক্ষণিকভাবে একটি মডেল ট্রিগার করে যেখানে প্রদানকারীর যোগাযোগের তথ্য দেখানো হয় যাতে আপনি পিকআপের ব্যবস্থা করতে পারেন।

৮. আসুন এটি ক্লাউড রানে স্থাপন করি

  1. ক্লাউড শেল টার্মিনাল থেকে যেখানে প্রকল্পটি ক্লোন করা হয়েছে, নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড রানে এটি স্থাপন করুন এবং নিশ্চিত করুন যে আপনি প্রকল্পের রুট ফোল্ডারের ভিতরে আছেন

আপনার ক্লাউড শেল টার্মিনালে এটি চালান:

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 ক্লায়েন্ট ভূমিকা প্রদান করুন। এটি আপনার সার্ভারলেস অ্যাপ্লিকেশনটিকে নিরাপদে ডাটাবেসে টানেল করতে দেয়।

আপনার ক্লাউড শেল টার্মিনালে এটি চালান:

# 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 (আপনি আগে কপি করা ক্লাউড রান এন্ডপয়েন্ট) ব্যবহার করুন এবং অ্যাপটি পরীক্ষা করুন। সেই পুরানো পাওয়ার টুলের একটি ছবি আপলোড করুন, এবং বাকিটা জেমিনিকে করতে দিন!

সমস্যা সমাধান এবং সমস্যা সমাধান

"সংশোধন ব্যর্থ" লুপ

যদি ডিপ্লয়মেন্ট শেষ হয় কিন্তু URL 500 Internal Server Error দেখায়, তাহলে লগগুলি পরীক্ষা করুন! এটি সাধারণত একটি অনুপস্থিত পরিবেশ পরিবর্তনশীল (যেমন আপনার DATABASE_URL এ টাইপো) অথবা ক্লাউড রান সার্ভিস অ্যাকাউন্টের আপনার GCS বাকেট থেকে পড়ার অনুমতি না থাকার কারণে ঘটে।

আইএএম "ছায়া" ভূমিকা

আপনার কাছে স্থাপনের অনুমতি থাকলেও, ক্লাউড রান সার্ভিস অ্যাকাউন্ট (সাধারণত [project-number]-compute@developer.gserviceaccount.com ) ডাটাবেসের সাথে সংযোগ স্থাপনের জন্য AlloyDB Client ভূমিকার প্রয়োজন হয়।

৯. উচ্চ স্তরের সমস্যা সমাধান

b6cdd3785d5461a9.jpeg সম্পর্কে

১০. ডেমো

পরীক্ষার জন্য তোমার শেষ বিন্দু ব্যবহার করতে সক্ষম হওয়া উচিত।

কিন্তু কয়েক দিনের জন্য ডেমোর উদ্দেশ্যে, আপনি এটি দিয়ে খেলতে পারেন:

১১. পরিষ্কার করা

এই ল্যাবটি সম্পন্ন হয়ে গেলে, alloyDB ক্লাস্টার এবং ইনস্ট্যান্স মুছে ফেলতে ভুলবেন না।

এটির ক্লাস্টারটি তার ইনস্ট্যান্স(গুলি) সহ পরিষ্কার করা উচিত।

১২. অভিনন্দন

আপনি গুগল ক্লাউডের সাহায্যে টেকসই সম্প্রদায়ের জন্য নেবার লুপ অ্যাপটি সফলভাবে তৈরি করেছেন। এম্বেডিং এবং জেমিনি 3 ফ্ল্যাশ এআই লজিককে AlloyDB তে স্থানান্তর করার মাধ্যমে, অ্যাপটি অবিশ্বাস্যভাবে দ্রুত (ডিপ্লয়মেন্ট সেটিংস সাপেক্ষে) এবং কোডটি উল্লেখযোগ্যভাবে পরিষ্কার। আমরা কেবল ডেটা সংরক্ষণ করছি না - আমরা উদ্দেশ্য সংরক্ষণ করছি।

জেমিনি ৩ ফ্ল্যাশের গতি এবং অ্যালয়ডিবি-র অপ্টিমাইজড ভেক্টর প্রক্রিয়াকরণের সমন্বয় সত্যিই সম্প্রদায়-চালিত প্ল্যাটফর্মগুলির জন্য পরবর্তী সীমানা।