১. ভূমিকা
এই কোডল্যাবে, জাভা, স্প্রিং বুট, ক্লাউড স্প্যানার ডাটাবেস এবং ভার্টেক্স এআই ইমেজ এপিআই ব্যবহার করে একটি এআই-চালিত পোজ জেনারেটর তৈরি করুন। ব্যবহারকারী একটি প্রম্পট ইনপুট দেবেন এবং অ্যাপ্লিকেশনটি সেই প্রম্পটের উপর ভিত্তি করে একটি পোজ তৈরি করবে। আমরা স্প্যানার ডাটাবেস থেকে REST API হিসেবে উপলব্ধ ডেটাও ব্যবহার করব। গুগল ক্লাউডে স্প্রিং বুটের সাথে জেনারেটিভ এআই-এর সক্ষমতা প্রদর্শনের জন্য এটি একটি মজাদার এবং শিক্ষামূলক উপায়।
ব্যবহৃত পরিষেবাগুলোর তালিকা হলো:
- ক্লাউড স্প্যানার
- ভার্টেক্স এআই ইমেজেন এপিআই
- ক্লাউড রান
উচ্চ স্তরের প্রবাহ চিত্র

আপনি যা তৈরি করবেন
আপনি তৈরি করবেন
- স্প্যানার ডেটা অ্যাজ এ সার্ভিস এপিআই-এর জন্য একটি জাভা স্প্রিং বুট অ্যাপ্লিকেশন।
- ইমেজেন ব্যবহার করে ছবি তৈরির জন্য একটি জাভা স্প্রিং বুট অ্যাপ্লিকেশন।
- ইনপুট এবং প্রতিক্রিয়ার জন্য একটি ইন্টারেক্টিভ ইউজার ইন্টারফেস।
২. প্রয়োজনীয়তা
- ক্রোম বা ফায়ারফক্সের মতো একটি ব্রাউজার
- বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট
শুরু করার আগে
- গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
- আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন তা জানুন।
- প্রয়োজনীয় সকল এপিআই (ক্লাউড স্প্যানার এপিআই, ভার্টেক্স এআই এপিআই, ক্লাউড রান এপিআই, ক্লাউড ফাংশনস এপিআই) সক্রিয় আছে কিনা তা নিশ্চিত করুন।
- আপনি ক্লাউড শেল ব্যবহার করবেন, যা গুগল ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ এবং এতে bq আগে থেকেই লোড করা থাকে। gcloud কমান্ড এবং এর ব্যবহারবিধি জানতে ডকুমেন্টেশন দেখুন।
ক্লাউড কনসোল থেকে, উপরের ডান কোণায় থাকা ‘Activate Cloud Shell’-এ ক্লিক করুন:

আপনার প্রজেক্টটি সেট করা না থাকলে, এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
gcloud config set project <YOUR_PROJECT_ID>
- শুরু করার জন্য আপনার সক্রিয় গুগল ক্লাউড প্রজেক্ট সহ ক্লাউড স্প্যানার পৃষ্ঠায় যান।
৩. স্প্যানার দিয়ে ডেটা প্রস্তুত করা
অ্যাপটি তৈরি করার আগে, একটি ক্লাউড স্প্যানার ইনস্ট্যান্স, ডেটাবেস এবং টেবিল তৈরি করে ডেটাবেস সেটআপ সম্পন্ন করা যাক। ক্লাউড স্প্যানারের বৈশিষ্ট্য, DDL, DML এবং আরও অনেক কিছু সম্পর্কে বিস্তারিত জানতে আপনি এই ব্লগটি দেখতে পারেন। এই প্রজেক্টের জন্য প্রয়োজনীয় ডেটাবেস অবজেক্টগুলো তৈরি করতে আপনি নিচের ধাপগুলো অনুসরণ করতে পারেন:
- ইনস্ট্যান্স পেজে CREATE INSTANCE-এ ক্লিক করে একটি ইনস্ট্যান্স তৈরি করুন।
- নিচের ছবিতে দেখানো অনুযায়ী বিবরণগুলো প্রবেশ করান এবং CREATE-এ ক্লিক করুন:

- তৈরি হয়ে গেলে, ইনস্ট্যান্স ওভারভিউ পৃষ্ঠা থেকে, CREATE DATABASE-এ ক্লিক করুন।
- ডাটাবেসের নাম হিসেবে "first-spanner-db" প্রদান করুন এবং DDL TEMPLATES বিভাগে নিম্নলিখিত DDL-টি প্রবেশ করিয়ে SUBMIT-এ ক্লিক করুন:
CREATE TABLE Yoga_Poses(
Pose_Id INT64 NOT NULL,
Name STRING(1024),
Breath STRING(1024),
Description STRING(1024)
) PRIMARY KEY(Pose_Id);
শেষ ধাপের ফলস্বরূপ ডাটাবেস এবং টেবিল তৈরি হয়ে যাবে। এখন আমরা Yoga_Poses টেবিলে কয়েকটি সারি যোগ করব, যাতে আমাদের Spring Boot অ্যাপ্লিকেশনটি তৈরি করার কাজ শুরু করতে পারি।
- বাম দিকের ডেটাবেস প্যানে স্প্যানার স্টুডিও-তে ক্লিক করুন এবং নিচের ছবিতে দেখানো অনুযায়ী একটি নতুন কোয়েরি এডিটর ট্যাব খুলুন:

- নিম্নলিখিত INSERT কোয়েরিগুলো চালান:
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(1, 'STAND', 'INHALE AND EXHALE',
'STAND WITH YOUR FEET HIP WIDTH APART AND ARMS RESTING BY THE SIDES');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(2, 'PLANK', 'INHALE OR EXHALE',
'PLANT YOUR TOES AND PALMS ON THE MAT WITH BODY PARALLEL TO THE GROUND');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(3, 'SIT', 'INHALE AND EXHALE',
'SIT ON THE FLOOR LEGS CROSSED');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(4, 'BEND', 'EXHALE',
'FOLD FORWARD AS YOU STAND, HANDS REACHING TO THE FLOOR');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(5, 'PUSH UP', 'EXHALE',
'PLANK WITH ELBOWS ON MAT');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(6, 'SEATED FORWARD BEND', 'EXHALE',
'FOLD FORWARD AS YOU SIT, HANDS TRYING TO REACH THE FEET');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(7, 'LUNGE', 'EXHALE',
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK LEG STRAIGHT');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(8, 'COURTESY LUNGE', 'INHALE',
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK KNEE TOUCHING THE FLOOR');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(9, 'BANK BEND', 'INHALE',
'STAND WITH ARMS UP AND BODY BENT BACKWARDS, ARCHING YOUR SPINE, LOOKING AT THE SKY');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(10, 'BICEP ACTION', 'INHALE AND EXHALE',
'CURL, PRESS AND WORK YOUR BICEPS');
এখন আমাদের স্প্যানার ইনস্ট্যান্স, ডেটাবেস, টেবিল এবং ডেটা তৈরি হয়ে অ্যাপ্লিকেশনের জন্য প্রস্তুত।
৪. পোজ ডেটার জন্য Spring Boot এবং Spanner ব্যবহার করে একটি REST API তৈরি করুন।
Spring Boot এবং Google Cloud console সম্পর্কে ভালোভাবে জানতে এই ব্লগটি দেখে নিন।
- স্প্রিং বুট অ্যাপটি বুটস্ট্র্যাপ করুন। এই অ্যাপটি একেবারে শুরু থেকে বুটস্ট্র্যাপ করতে, এই ব্লগটি অনুসরণ করুন। রিপো থেকে ক্লোন করে কাজ শুরু করতে, আপনার ক্লাউড শেল টার্মিনালে শুধু নিচের কমান্ডটি চালান:
git clone https://github.com/AbiramiSukumaran/spanner-springb
এর ফলে আপনার ক্লাউড শেল মেশিনে spanner-springb প্রজেক্টটি তৈরি হয়ে যাওয়ার কথা। অ্যাপটির উপাদানগুলো বোঝার জন্য ব্লগটি পড়ুন।
- চলুন অ্যাপটি বিল্ড এবং রান করি। এটি করার জন্য, ক্লাউড শেল টার্মিনাল থেকে নিম্নলিখিত কমান্ডগুলো চালান:
cd spanner-springb
./mvnw package
./mvnw spring-boot:run
- অ্যাপটি ক্লাউড রান-এ ডিপ্লয় করুন, যাতে এটি পোজ জেনারেটর অ্যাপের জন্য উপলব্ধ হয়। এটি করার জন্য, ক্লাউড শেল টার্মিনাল থেকে নিম্নলিখিত কমান্ডটি চালান:
gcloud run deploy –source .
প্রয়োজনীয় প্যারামিটারগুলো পাস করুন এবং নিশ্চিত করুন যে আপনার অ্যাপটি ডেপ্লয় করা হয়েছে। তৈরি হওয়া সার্ভিস ইউআরএলটিতে স্প্যানারে তৈরি করা ডেটাগুলো তালিকাভুক্ত থাকতে হবে।
৫. Spring Boot, Spanner এবং Imagen ব্যবহার করে একটি পোজ জেনারেটর অ্যাপ বুটস্ট্র্যাপ করুন।
এই পর্যায়ে, আমরা ফ্লো ডায়াগ্রামের উপরের অংশটি সম্পন্ন করেছি, অর্থাৎ স্প্যানার ডেটাকে একটি পরিষেবা (REST API) হিসাবে উপলব্ধ করেছি। এখন চলুন এমন একটি ক্লায়েন্ট অ্যাপ্লিকেশন তৈরি করি যা স্প্যানার ডেটাকে আহ্বান করবে, একটি প্রম্পট সহ IMAGEN API-কে কল করবে এবং Base64 এনকোডেড স্ট্রিংটিকে একটি ছবি হিসাবে ইউজার ইন্টারফেসে ফেরত পাঠাবে।
- এতক্ষণে আপনি স্প্রিং বুট প্রোজেক্টের কাঠামো এবং এর গুরুত্ব সম্পর্কে ইতিমধ্যেই পরিচিত। তাই, আপনার ক্লাউড শেল টার্মিনালে নিচের কমান্ডটি চালিয়ে সরাসরি আপনার ক্লাউড শেল মেশিনে রিপোটি ক্লোন করার কাজে চলে যাব:
git clone https://github.com/AbiramiSukumaran/genai-posegen
এর ফলে আপনার ক্লাউড শেল মেশিনে genai-posegen প্রজেক্টটি তৈরি হওয়ার কথা। ক্লোন করা প্রজেক্টের কাঠামোটি ক্লাউড শেল এডিটরে দেখতে এইরকম হয়:

PromptController জাভা ক্লাসে ডাটাবেস সার্ভিস ইনভোকেশন, বিজনেস লজিকের বাস্তবায়ন এবং Imagen-এর জেনারেটিভ এআই এপিআই ইনভোকেশনও রয়েছে। এই ক্লাসটি Thymeleaf টেমপ্লেটগুলোর সাথে ইন্টারঅ্যাক্ট করে, যেগুলো ইউজার ইন্টারফেসে ডেটা ইন্টিগ্রেশনের কাজ করে। এই ক্লাসে ৩টি সার্ভিস মেথড রয়েছে — ১) প্রম্পট ইনপুট নেওয়ার জন্য, ২) রিকোয়েস্ট প্রসেস করে Imagen এপিআই ইনভোক করার জন্য এবং ৩) Imagen রেসপন্স প্রসেস করার জন্য।
Prompt এবং Yoga হলো POJO ক্লাস, যেগুলোতে যথাক্রমে Imagen API এবং Spanner ডেটা সার্ভার API-এর সাথে ইন্টারফেস করার জন্য ফিল্ড, গেটার এবং সেটার রয়েছে।
templates ফোল্ডারের index এবং getImage html ফাইলগুলিতে ইউজার ইন্টারফেসের টেমপ্লেট রয়েছে এবং এগুলোর নিজ নিজ ফোল্ডারে থাকা JS ও css স্ক্রিপ্টের উপর নির্ভরতা রয়েছে।
ভার্টেক্স এআই ইমেজেন এপিআই ইন্টিগ্রেশন: ইমেজ জেনারেশন ব্যবহারের ক্ষেত্রে আমরা ভার্টেক্স এআই-এর ইমেজেন এপিআই নিম্নলিখিত ফরম্যাটে ব্যবহার করছি:
https://<<region>>- aiplatform.googleapis.com/v1/projects/ <<your-project-id>>/locations/<<region>>/publishers/google/models/imagegeneration:predict
আপনি এখানে Imagen-এর সক্ষমতা সম্পর্কে আরও পড়তে পারেন। এটি Base64 এনকোডেড স্ট্রিং ফরম্যাটে প্রতিক্রিয়া ফেরত দেয়। এটিকে ইমেজে রূপান্তর করার জন্য, আমরা getImage.HTML ফাইলে ইমেজ অবজেক্টের উপর (getImage.js ফাইলে থাকা) জাভাস্ক্রিপ্টের setattribute মেথডটি নিম্নরূপভাবে ব্যবহার করেছি:
poseImage.setAttribute('src', "data:image/jpg;base64," + baseStr64);
অনুমোদন: Imagen API অ্যাক্সেস করার জন্য আপনার বেয়ারার টোকেন অথেন্টিকেশন সক্রিয় থাকা প্রয়োজন। আমাদের ক্ষেত্রে, আমি অ্যাপ্লিকেশন ডিফল্ট ক্রেডেনশিয়াল JSON পদ্ধতি ব্যবহার করেছি। আপনি ক্লাউড শেল টার্মিনাল থেকে নিচের কমান্ডটি চালিয়ে এবং টার্মিনালে আসা নির্দেশাবলী অনুসরণ করে এটি প্রয়োগ করতে পারেন:
gcloud auth application-default login
আপনার অ্যাকাউন্ট দিয়ে প্রমাণীকরণের জন্য "Y" চাপুন। অ্যাক্সেসের অনুমতি দিন এবং পপ-আপে দেখানো অনুমোদন কোডটি কপি করুন। এটি করার সাথে সাথেই, আপনি অ্যাপ্লিকেশনটির ডিফল্ট ক্রেডেনশিয়ালগুলো একটি JSON ফাইলে পাবেন, যা /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json-এর মতো একটি লোকেশনে সেভ হবে।
ফাইলটি ডাউনলোড করুন অথবা cat কমান্ড (cat /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json) চালিয়ে JSON ফাইলের বিষয়বস্তু কপি করুন এবং অ্যাপ্লিকেশনের PromptController.java ক্লাসের callImagen() মেথডে এটি ব্যবহার করুন। আপনি এখানে অথেনটিকেশন সম্পর্কে আরও পড়তে পারেন।
ইউজার ইন্টারফেসের জন্য আমরা টেমপ্লেট ইঞ্জিন হিসেবে থাইমলিফ (Thymeleaf) ব্যবহার করেছি, যা ফ্রন্ট-এন্ড টেমপ্লেট ফাইলগুলোতে ডেটা পার্স ও রেন্ডার করে এবং ইউজার ইন্টারফেসে একটি চমৎকার ডিজাইন যোগ করে। এটি এইচটিএমএল (HTML)-এর মতোই, তবে রেন্ডার করা ডেটা নিয়ে কাজ করার জন্য এতে আরও বেশি অ্যাট্রিবিউট রয়েছে। index.html ফাইলটিতে ল্যান্ডিং পেজের ডিজাইনের উপাদানগুলো রয়েছে এবং এটি ব্যবহারকারীকে বিষয় নির্বাচন করার ও কাঙ্ক্ষিত ছবিটি তৈরি করার জন্য একটি ওভাররাইডিং প্রম্পট যোগ করার সুযোগ দেয়।
৬. তৈরি এবং স্থাপন করুন
এখন যেহেতু আপনি কোডটি ক্লোন করেছেন এবং আপনার প্রজেক্ট, অঞ্চল ও প্রমাণীকরণ ক্রেডেনশিয়াল অনুযায়ী প্লেসহোল্ডারগুলোর মান পরিবর্তন করেছেন, চলুন অ্যাপটি বিল্ড এবং ডিপ্লয় করার দিকে এগিয়ে যাই। ক্লাউড শেল টার্মিনালে কমান্ড ব্যবহার করে প্রজেক্ট ফোল্ডারে যান, এরপর নিচের ৩টি কমান্ড এক এক করে ব্যবহার করে বিল্ড করুন এবং ক্লাউড শেল মেশিনে স্থানীয়ভাবে পরীক্ষার জন্য ডিপ্লয় করুন:
cd genai-posegen
./mvnw package
./mvnw spring-boot:run
অ্যাপটি ক্লাউড রান-এ ডিপ্লয় করুন, যাতে এটি ক্লাউডে উপলব্ধ হয়। এটি করার জন্য, প্রজেক্ট ফোল্ডারের মধ্যে থাকা ক্লাউড শেল টার্মিনাল থেকে নিম্নলিখিত কমান্ডটি চালান:
gcloud run deploy –source .
প্রয়োজনীয় প্যারামিটারগুলো পাস করুন এবং আপনার অ্যাপটি ডেপ্লয় করা হয়েছে কিনা তা নিশ্চিত করুন।
৭. ডেমো
অ্যাপটি ডেপ্লয় করা হয়ে গেলে, আপনি টার্মিনালে সার্ভিস ইউআরএলটি দেখতে পাবেন। লিঙ্কটিতে ক্লিক করুন এবং দেখুন আপনার পোজ ইমেজ জেনারেশন অ্যাপটি গুগল ক্লাউড সার্ভার ছাড়াই চলছে!

৮. পরিষ্কার করুন
এই পোস্টে ব্যবহৃত রিসোর্সগুলোর জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, এই ধাপগুলো অনুসরণ করুন:
- Google Cloud কনসোলে, রিসোর্স পরিচালনা (Manage resources) পৃষ্ঠায় যান।
- প্রজেক্ট তালিকা থেকে আপনি যে প্রজেক্টটি মুছতে চান সেটি নির্বাচন করুন এবং তারপর ডিলিট-এ ক্লিক করুন।
- ডায়ালগ বক্সে প্রজেক্ট আইডি টাইপ করুন, এবং তারপর প্রজেক্টটি ডিলিট করতে শাট ডাউন-এ ক্লিক করুন।
- আপনি যদি প্রজেক্টটি ডিলিট করতে না চান, তাহলে এই প্রজেক্টের জন্য এইমাত্র তৈরি করা ইনস্ট্যান্সটিতে গিয়ে ইনস্ট্যান্স ওভারভিউ পেজের উপরের ডান কোণায় থাকা DELETE INSTANCE বোতামটিতে ক্লিক করে স্প্যানার ইনস্ট্যান্সটি ডিলিট করুন।
- এছাড়াও আপনি ক্লাউড রান সার্ভিসেস পেজে গিয়ে, এই প্রজেক্টে তৈরি করা সার্ভিসগুলো নির্বাচন করে ডিলিট বাটনে ক্লিক করে সার্ভিসগুলো ডিলিট করতে পারেন।
৯. অভিনন্দন
এই ব্লগে, আমরা ক্লাউড স্প্যানারে ডেটা সংরক্ষণ ও পরিচালনাকারী একটি সম্পূর্ণ স্প্রিং বুট অ্যাপ্লিকেশনকে, ক্লাউড রানে ডেপ্লয় করা একটি ইন্টারেক্টিভ ক্লায়েন্ট অ্যাপ্লিকেশনে গুগল ক্লাউড ভার্টেক্স এআই-এর ইমেজেন এপিআই ব্যবহার করে পোজ তৈরি করার কাজে লাগাতে পেরেছি। এই ব্লগের আর্কিটেকচার ডায়াগ্রাম অংশে, আপনি ক্লাউড ফাংশনস (জাভা) কম্পোনেন্টটি দেখতে পাচ্ছেন, যা আমরা কখনোই তৈরি করতে পারিনি? আপনি যদি অবদান রাখতে চান, তবে সেটি আপনার জন্য উন্মুক্ত। আপনি getimage.html ফাইলে থাকা দুটি মেথড—ডেটাবেসে পোজ সংরক্ষণ এবং ইমেজ আপলোড মেথড—সম্পাদন করার জন্য দুটি জাভা ক্লাউড ফাংশন ইমপ্লিমেন্ট করতে পারেন। মডেলটি সম্পর্কে আরও জানতে ভার্টেক্স এআই-এর ইমেজেন ডকুমেন্টেশন দেখুন।