Firestore, ভেক্টর অনুসন্ধান এবং জেমিনি 2.0 (জাভা সংস্করণ) সহ একটি প্রাসঙ্গিক যোগা পোজ সুপারিশকারী অ্যাপ তৈরি করুন!

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

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

ফায়ারস্টোর কেন?

ফায়ারস্টোর, গুগল ক্লাউডের সার্ভারবিহীন NoSQL ডকুমেন্ট ডেটাবেস, স্কেলেবল এবং ডাইনামিক অ্যাপ্লিকেশন তৈরির জন্য একটি চমৎকার পছন্দ। আমাদের Yoga অ্যাপের জন্য এটি কেন এত উপযুক্ত, তা নিচে দেওয়া হলো:

  • স্কেলেবিলিটি এবং পারফরম্যান্স: ফায়ারস্টোর লক্ষ লক্ষ ব্যবহারকারী এবং বিশাল ডেটাসেট সামলানোর জন্য স্বয়ংক্রিয়ভাবে স্কেল করে, যা নিশ্চিত করে যে আপনার অ্যাপটি আকারে বাড়লেও রেসপন্সিভ থাকে।
  • রিয়েল-টাইম আপডেট: অন্তর্নির্মিত রিয়েল-টাইম সিঙ্ক্রোনাইজেশন সমস্ত সংযুক্ত ক্লায়েন্ট জুড়ে ডেটা সামঞ্জস্যপূর্ণ রাখে, যা লাইভ ক্লাস বা সম্মিলিত অনুশীলনের মতো বৈশিষ্ট্যগুলির জন্য এটিকে আদর্শ করে তোলে।
  • নমনীয় ডেটা মডেল: ফায়ারস্টোরের ডকুমেন্ট-ভিত্তিক কাঠামো আপনাকে টেক্সট, ছবি এবং এমনকি এমবেডিং সহ বিভিন্ন ধরণের ডেটা সংরক্ষণ করার সুযোগ দেয়, যা জটিল যোগাসনের তথ্য উপস্থাপনের জন্য এটিকে আদর্শ করে তোলে।
  • শক্তিশালী কোয়েরি: ফায়ারস্টোর জটিল কোয়েরি সমর্থন করে, যার মধ্যে রয়েছে ইকুয়ালিটি, ইনইকুয়ালিটি এবং এখন নতুন এক্সটেনশনের মাধ্যমে ভেক্টর সিমিলারিটি সার্চ
  • অফলাইন সাপোর্ট: ফায়ারস্টোর ডেটা স্থানীয়ভাবে ক্যাশ করে রাখে, ফলে ব্যবহারকারীরা অফলাইনে থাকলেও আপনার অ্যাপটি কাজ করতে পারে।

ফায়ারস্টোর ভেক্টর সার্চ এক্সটেনশন দিয়ে সার্চ উন্নত করা

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

ফায়ারস্টোরের ভেক্টর সার্চ আপনাকে নিম্নলিখিত কাজগুলো করতে দেয়:

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

জেমিনি ২.০ ফ্ল্যাশ একীভূতকরণ (পরীক্ষামূলক)

জেমিনি ২.০ ফ্ল্যাশ হলো গুগলের অত্যাধুনিক মাল্টিমোডাল এআই মডেল। যদিও এটি এখনও পরীক্ষামূলক পর্যায়ে রয়েছে, তবুও এটি আমাদের ইয়োগা অ্যাপটিকে আরও সমৃদ্ধ করার জন্য আকর্ষণীয় সম্ভাবনা তৈরি করে:

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

সম্ভাব্যভাবে, আমি অ্যাপটিকে উন্নত করার জন্য মডেলটির নিম্নলিখিত বৈশিষ্ট্যগুলো ব্যবহারের উদ্দেশ্যে ইন্টিগ্রেশনের প্রস্তাব করার পরিকল্পনা করছি:

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

আরও বিস্তারিত জানতে এই ডকুমেন্টেশন পৃষ্ঠাটি (Gemini 1.5 Flash) দেখুন।

বিশ্বাসযোগ্যতা বাড়াতে এবং আরও তথ্যসূত্র প্রদানের জন্য, আমাদের অ্যাপের দেওয়া তথ্যের ভিত্তি মজবুত করতে আমরা গুগল সার্চকে একীভূত করতে পারি। এর অর্থ হলো:

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

আপনি যা তৈরি করবেন

এই ল্যাবের অংশ হিসেবে, আপনি যা করবেন:

  1. একটি ফায়ারস্টোর কালেকশন তৈরি করুন এবং ইয়োগা ডকুমেন্টগুলো লোড করুন
  2. ফায়ারস্টোর ব্যবহার করে কীভাবে CRUD অ্যাপ্লিকেশন তৈরি করতে হয় তা শিখুন
  3. জেমিনি ২.০ ফ্ল্যাশ ব্যবহার করে যোগাসনের বিবরণ তৈরি করুন।
  4. ফায়ারস্টোর ইন্টিগ্রেশনের সাথে ফায়ারবেস ভেক্টর সার্চ সক্রিয় করুন
  5. যোগের বিবরণ থেকে এমবেডিং তৈরি করুন
  6. ব্যবহারকারীর অনুসন্ধান পাঠ্যের জন্য সাদৃশ্য অনুসন্ধান করুন

প্রয়োজনীয়তা

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

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

  1. গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
  2. আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন, তা জেনে নিন।
  3. আপনি ক্লাউড শেল ব্যবহার করবেন, যা গুগল ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ এবং এটি bq-এর সাথে আগে থেকেই লোড করা থাকে। গুগল ক্লাউড কনসোলের শীর্ষে থাকা ‘Activate Cloud Shell’-এ ক্লিক করুন।

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

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

যদি কোনো API বাদ পড়ে যায়, তাহলে আপনি বাস্তবায়ন চলাকালীন সময়েই তা সক্রিয় করে নিতে পারেন।

gcloud কমান্ড এবং এর ব্যবহার সম্পর্কে জানতে ডকুমেন্টেশন দেখুন।

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

ডকুমেন্টেশনে একটি ফায়ারস্টোর ইনস্ট্যান্স কীভাবে সেট আপ করতে হয় তার আরও বিস্তারিত ধাপ রয়েছে। প্রাথমিকভাবে, আমি এই ধাপগুলো অনুসরণ করব:

১। ফায়ারস্টোর ভিউয়ারে যান এবং 'একটি ডেটাবেস পরিষেবা নির্বাচন করুন' স্ক্রিন থেকে, নেটিভ মোডে ফায়ারস্টোর নির্বাচন করুন।

  1. আপনার ফায়ারস্টোরের জন্য একটি অবস্থান নির্বাচন করুন (অবশ্যই us-central1 বেছে নেবেন এবং এই কোডল্যাব জুড়ে যেখানেই অঞ্চল/অবস্থান নির্বাচন করবেন, এই নির্দেশিকা অনুসরণ করবেন)।
  2. ডেটাবেস তৈরি করুন-এ ক্লিক করুন (যদি এটি প্রথমবার হয়, তবে ডেটাবেসটি "(ডিফল্ট)" হিসাবে রাখুন)।

যখন আপনি একটি ফায়ারস্টোর প্রজেক্ট তৈরি করেন, তখন ক্লাউড এপিআই ম্যানেজারেও এপিআইটি সক্রিয় হয়ে যায়।

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

f7136d53253c59a.png

  1. এই ধাপটি এখনই করবেন না, তবে মনে রাখবেন - আপনি "স্টার্ট কালেকশন" এ ক্লিক করে একটি নতুন কালেকশন তৈরি করতে পারেন। কালেকশন আইডি হিসেবে "poses" সেট করুন। সেভ বাটনে ক্লিক করুন।

a26eb470aa9bfda9.png

প্রোডাকশন অ্যাপ্লিকেশনের জন্য প্রো টিপস:

  1. একবার আপনি আপনার ডেটা মডেল চূড়ান্ত করে ফেললে এবং কারা বিভিন্ন ধরণের ডকুমেন্ট অ্যাক্সেস করতে পারবে তা নির্ধারণ করে ফেললে, আপনি ফায়ারবেস ইন্টারফেস থেকে সিকিউরিটি রুলস তৈরি, সম্পাদনা এবং নিরীক্ষণ করতে পারবেন। আপনি এই লিঙ্ক থেকে সিকিউরিটি রুলস অ্যাক্সেস করতে পারেন: https://console.firebase.google.com/u/0/project/ <<your_project_id>>/firestore/rules
  2. ডেভেলপমেন্ট পর্যায় থেকে প্রজেক্টটি ডেপ্লয় বা রোল আউট করার আগে আপনার সিকিউরিটি রুলগুলো অবশ্যই এডিট, মনিটর এবং টেস্ট করে নিন , কারণ আপনার অ্যাপটি কেন ভিন্নভাবে কাজ করছে তার পেছনের নীরব কারণটি প্রায়শই এটিই হয়ে থাকে :)

এই ডেমোর জন্য আমরা এটি টেস্ট মোডে ব্যবহার করব।

৪. ফায়ারস্টোর REST API

  1. REST API নিম্নলিখিত ব্যবহারের ক্ষেত্রগুলিতে সহায়ক হতে পারে: ক. সীমিত সম্পদযুক্ত পরিবেশ থেকে Firestore অ্যাক্সেস করা, যেখানে একটি সম্পূর্ণ ক্লায়েন্ট লাইব্রেরি চালানো সম্ভব নয়; খ. ডাটাবেস প্রশাসন স্বয়ংক্রিয় করা বা ডাটাবেসের বিস্তারিত মেটাডেটা পুনরুদ্ধার করা।
  2. Firestore ব্যবহারের সবচেয়ে সহজ উপায় হলো এর নেটিভ ক্লায়েন্ট লাইব্রেরিগুলোর একটি ব্যবহার করা, তবে কিছু ক্ষেত্রে সরাসরি REST API কল করাও সুবিধাজনক হতে পারে।
  3. এই ব্লগে আপনারা ফায়ারস্টোর REST API-এর ব্যবহার ও প্রদর্শন দেখতে পাবেন, কোনো নেটিভ ক্লায়েন্ট লাইব্রেরি নয়।
  4. প্রমাণীকরণের জন্য, Firestore REST API একটি Firebase Authentication ID টোকেন অথবা একটি Google Identity OAuth 2.0 টোকেন গ্রহণ করে। প্রমাণীকরণ এবং অনুমোদন বিষয়ে আরও তথ্যের জন্য, ডকুমেন্টেশন দেখুন।
  5. সমস্ত REST API এন্ডপয়েন্ট https://firestore.googleapis.com/v1/ এই বেস URL-এর অধীনে বিদ্যমান।

স্প্রিং বুট এবং ফায়ারস্টোর এপিআই

স্প্রিং বুট ফ্রেমওয়ার্কে তৈরি এই সমাধানটির উদ্দেশ্য হলো এমন একটি ক্লায়েন্ট অ্যাপ্লিকেশন প্রদর্শন করা, যা ব্যবহারকারীর অংশগ্রহণমূলক অভিজ্ঞতার সাথে ফায়ারস্টোর এপিআই ব্যবহার করে যোগাসন ও শ্বাস-প্রশ্বাসের বিবরণ সংগ্রহ এবং পরিবর্তন করে।

Yoga poses অ্যাপের Firestore CRUD সলিউশন অংশের বিস্তারিত ধাপে ধাপে ব্যাখ্যার জন্য, আপনি ব্লগ লিঙ্কটি দেখতে পারেন।

বর্তমান সলিউশনের উপর মনোযোগ দিতে এবং চলতে চলতে CRUD অংশটি শিখে নিতে, আপনার ক্লাউড শেল টার্মিনাল থেকে নিচের রিপোজিটরি থেকে এই ব্লগে আলোচিত সম্পূর্ণ সলিউশনটি ক্লোন করুন এবং কোডবেসের একটি কপি সংগ্রহ করুন।

git clone https://github.com/AbiramiSukumaran/firestore-poserecommender

অনুগ্রহ করে লক্ষ্য করুন:

  1. এই রিপোটি ক্লোন করার পর, আপনাকে শুধু আপনার প্রজেক্ট আইডি, এপিআই ইত্যাদিতে কিছু পরিবর্তন করতে হবে। আপনার অ্যাপ্লিকেশনটি চালু করার জন্য আর কোনো পরিবর্তনের প্রয়োজন নেই। অ্যাপ্লিকেশনটির প্রতিটি অংশ পরবর্তী বিভাগগুলিতে ব্যাখ্যা করা হয়েছে। পরিবর্তনগুলির একটি তালিকা নিচে দেওয়া হলো:
  2. src/main/java/com/example/demo/GenerateImageSample.java ফাইলে, "<<YOUR_PROJECT_ID>>"-কে আপনার প্রজেক্ট আইডি দিয়ে প্রতিস্থাপন করুন।
  3. src/main/java/com/example/demo/GenerateEmbeddings.java ফাইলে, "<<YOUR_PROJECT_ID>>"-কে আপনার প্রজেক্ট আইডি দিয়ে প্রতিস্থাপন করুন।
  4. src/main/java/com/example/demo/PoseController.java ফাইলে, " <<YOUR_PROJECT_ID>>" এবং ডাটাবেসের নাম , এই ক্ষেত্রে "(default)", এর সমস্ত দৃষ্টান্ত আপনার কনফিগারেশন থেকে উপযুক্ত মান দিয়ে প্রতিস্থাপন করুন:
  5. src/main/java/com/example/demo/PoseController.java ফাইলে, " [YOUR_API_KEY] " এর জায়গায় আপনার Gemini 2.0 Flash-এর API KEY বসান। আপনি এটি AI Studio থেকে পেতে পারেন।
  6. আপনি যদি স্থানীয়ভাবে পরীক্ষা করতে চান, তাহলে প্রজেক্ট ফোল্ডার থেকে ক্লাউড শেল টার্মিনালে নিম্নলিখিত কমান্ডগুলো চালান:
mvn package

mvn spring-boot:run

এই মুহূর্তে, আপনি ক্লাউড শেল টার্মিনাল থেকে 'ওয়েব প্রিভিউ' অপশনটিতে ক্লিক করে আপনার অ্যাপ্লিকেশনটি চলতে দেখতে পারেন। আমরা এখনও অ্যাপ্লিকেশনটি পরীক্ষা করার জন্য প্রস্তুত নই।

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

d3f0de417094237d.png

  1. বিকল্পগুলির তালিকা থেকে নতুন অ্যাপ্লিকেশন -> ক্লাউড রান অ্যাপ্লিকেশন -> জাভা: ক্লাউড রান নির্বাচন করুন এবং এর নাম দিন "firestore-poserecommender"।

d5ef8b4ca8bf3f85.png

  1. এখন আপনি জাভা ক্লাউড রান অ্যাপ্লিকেশনের জন্য একটি সম্পূর্ণ স্ট্যাক টেমপ্লেট দেখতে পাবেন, যা আগে থেকেই কনফিগার করা এবং ব্যবহারের জন্য প্রস্তুত।
  2. বিদ্যমান কন্ট্রোলার ক্লাসটি মুছে ফেলুন এবং নিম্নলিখিত ফাইলগুলি প্রজেক্ট স্ট্রাকচারে তাদের নিজ নিজ ফোল্ডারে কপি করুন:

firestore-poserecommender/src/main/java/com/example/demo/

  1. FirestoreSampleApplication.java
  2. GenerateEmbeddings.java
  3. GenerateImageSample.java
  4. পোজ.জাভা
  5. PoseController.java
  6. ServletInitializer.java
             firestore-poserecommender/src/main/resources/static/
    
  7. Index.html

firestore-poserecommender/src/main/resources/templates/

  1. প্রসঙ্গ অনুসন্ধান html
  2. createpose.html
  3. errmessage.html
  4. ভঙ্গি.html
  5. ryoq.html
  6. সার্চপোজ.এইচটিএমএল
  7. showmessage.html

ফায়ারস্টোর-পোজরেকমেন্ডার/

  1. ডকারফাইল
  2. আপনাকে সংশ্লিষ্ট ফাইলগুলিতে PROJECT ID এবং API KEY-এর জায়গায় আপনার নিজ নিজ মান বসাতে হবে। (উপরের ধাপ ১ ক, খ, গ এবং ঘ)।

৫. ডেটা ইনজেশন

অ্যাপ্লিকেশনটির ডেটা এই data.json ফাইলে পাওয়া যাবে: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json

আপনি যদি কিছু পূর্বনির্ধারিত ডেটা দিয়ে শুরু করতে চান, তাহলে json ফাইলটি কপি করে "<<YOUR_PROJECT_ID>>"-এর প্রতিটি জায়গায় আপনার নিজের মান বসিয়ে দিতে পারেন।

  • ফায়ারস্টোর স্টুডিওতে যান
  • নিশ্চিত করুন যে আপনি 'poses' নামে একটি কালেকশন তৈরি করেছেন।
  • উপরে উল্লিখিত রিপো ফাইল থেকে ডকুমেন্টগুলো এক এক করে ম্যানুয়ালি যোগ করুন।

বিকল্পভাবে, আপনি নিম্নলিখিত ধাপগুলো অনুসরণ করে আমাদের তৈরি করা পূর্বনির্ধারিত সেট থেকে একবারে ডেটা ইম্পোর্ট করতে পারেন:

  1. ক্লাউড শেল টার্মিনালে যান এবং নিশ্চিত করুন যে আপনার সক্রিয় গুগল ক্লাউড প্রজেক্টটি সেট করা আছে এবং আপনি অনুমোদিত। নিচে দেওয়া gsutil কমান্ডটি ব্যবহার করে আপনার প্রজেক্টে একটি বাকেট তৈরি করুন। নিচের কমান্ডে <PROJECT_ID> ভেরিয়েবলটি আপনার গুগল ক্লাউড প্রজেক্ট আইডি দিয়ে প্রতিস্থাপন করুন:

gsutil mb -l us gs:// <PROJECT_ID> -yoga-poses-bucket

  1. বাকেটটি তৈরি হয়ে গেলে, ফায়ারবেস ডেটাবেসে ইম্পোর্ট করার আগে, আমাদের প্রস্তুত করা ডেটাবেস এক্সপোর্টটি এই বাকেটে কপি করতে হবে। নিচে দেওয়া কমান্ডটি ব্যবহার করুন:

gsutil cp -r gs://demo-bq-gemini-public/yoga_poses gs:// <PROJECT_ID> -yoga-poses-bucket

এখন যেহেতু আমাদের কাছে ইম্পোর্ট করার জন্য ডেটা আছে, আমরা আমাদের তৈরি করা ফায়ারবেস ডেটাবেসে ( ডিফল্ট ) ডেটা ইম্পোর্ট করার চূড়ান্ত ধাপে যেতে পারি।

  1. এখন ফায়ারস্টোর কনসোলে যান এবং বাম দিকের নেভিগেশন মেনু থেকে ইম্পোর্ট/এক্সপোর্ট-এ ক্লিক করুন।

ইমপোর্ট নির্বাচন করুন এবং আপনার এইমাত্র তৈরি করা ক্লাউড স্টোরেজ পাথটি বেছে নিন ও নেভিগেট করতে থাকুন যতক্ষণ না আপনি 'yoga_poses.overall_export_metadata' ফাইলটি নির্বাচন করতে পারছেন:

f5c1d16df7d5a64a.png

  1. ইম্পোর্ট-এ ক্লিক করুন।

ইম্পোর্ট হতে কয়েক সেকেন্ড সময় লাগবে এবং এটি প্রস্তুত হয়ে গেলে, আপনি https://console.cloud.google.com/firestore/databases- এ গিয়ে আপনার ফায়ারস্টোর ডেটাবেস এবং কালেকশনটি যাচাই করতে পারবেন, এবং নিচে দেখানো অনুযায়ী ডিফল্ট ডেটাবেস ও 'poses' কালেকশনটি নির্বাচন করুন:

  1. আরেকটি পদ্ধতি হলো, অ্যাপ্লিকেশনটি ডিপ্লয় করার পর আপনি "Create a New Pose" অ্যাকশনটি ব্যবহার করে ম্যানুয়ালিও রেকর্ডগুলো তৈরি করতে পারেন।

৬. ভেক্টর অনুসন্ধান

ফায়ারস্টোর ভেক্টর সার্চ এক্সটেনশন সক্রিয় করুন

নতুন ভেক্টর সার্চ ফিচারের সাহায্যে আপনার ফায়ারস্টোর ডকুমেন্টগুলো স্বয়ংক্রিয়ভাবে এমবেড ও কোয়েরি করতে এই এক্সটেনশনটি ব্যবহার করুন! এটি আপনাকে ফায়ারবেস এক্সটেনশনস হাবে নিয়ে যাবে।

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

চলুন ধাপগুলো দেখে নেওয়া যাক:

এক্সটেনশনটি ইনস্টল করুন:

"Install in Firebase Console"-এ ক্লিক করে Firebase Extensions Marketplace থেকে "Vector Search with Firestore" এক্সটেনশনটি ইনস্টল করুন।

গুরুত্বপূর্ণ:

আপনি যখন প্রথমবার এই এক্সটেনশন পৃষ্ঠায় আসবেন, তখন আপনাকে ফায়ারবেস কনসোলে তালিকাভুক্ত সেই একই প্রজেক্টটি নির্বাচন করতে হবে, যেটিতে আপনি গুগল ক্লাউড কনসোলে কাজ করছেন।

715426b97c732649.png

আপনার প্রজেক্টটি যদি তালিকায় না থাকে, তবে ফায়ারবেসে প্রজেক্টটি যোগ করে নিন (তালিকা থেকে আপনার বিদ্যমান গুগল ক্লাউড প্রজেক্টটি বেছে নিন )।

এক্সটেনশনটি কনফিগার করুন:

সংগ্রহ ("poses"), এমবেড করার জন্য টেক্সট ধারণকারী ফিল্ড ("posture"), এবং এমবেডিং ডাইমেনশনের মতো অন্যান্য প্যারামিটার নির্দিষ্ট করুন।

এই ধাপে তালিকাভুক্ত কোনো API সক্রিয় করার প্রয়োজন হলে, কনফিগারেশন পৃষ্ঠাটি আপনাকে তা করার সুযোগ দেবে, সেই অনুযায়ী ধাপগুলো অনুসরণ করুন।

এপিআইগুলো চালু করার কিছুক্ষণ পরেও যদি পেজটি সাড়া না দেয়, তাহলে শুধু রিফ্রেশ করুন এবং আপনি এপিআইগুলো চালু দেখতে পাবেন।

5ba59b45710c567b.png

পরবর্তী ধাপগুলোর মধ্যে একটিতে, এটি আপনাকে এমবেডিং তৈরি করার জন্য আপনার পছন্দের এলএলএম (LLM) ব্যবহার করার সুযোগ দেবে। "ভার্টেক্স এআই" (Vertex AI) নির্বাচন করুন।

bb528a04ebb5f976.png

পরবর্তী কয়েকটি সেটিং আপনার কালেকশন এবং যে ফিল্ডটি আপনি এমবেড করতে চান তার সাথে সম্পর্কিত:

এলএলএম: ভার্টেক্স এআই

সংগ্রহের পথ: ভঙ্গি

ডিফল্ট কোয়েরি সীমা: ৩

দূরত্বের পরিমাপ: কোসাইন

ইনপুট ফিল্ডের নাম: ভঙ্গি

আউটপুট ফিল্ডের নাম: এমবেডিং

স্ট্যাটাস ফিল্ডের নাম: স্ট্যাটাস

বিদ্যমান নথি সংযুক্ত করুন: হ্যাঁ

বিদ্যমান এমবেডিং আপডেট করুন: হ্যাঁ

ক্লাউড ফাংশনের অবস্থান: us-central1

ইভেন্ট সক্ষম করুন: চেক করা হয়নি

fb8cdf1163fac7cb.png

এই সবকিছু সেট আপ হয়ে গেলে, 'Install Extension' বোতামে ক্লিক করুন। এতে ৩ থেকে ৫ মিনিট সময় লাগবে।

এমবেডিং তৈরি করুন:

আপনি যখন 'poses' সংগ্রহে ডকুমেন্ট যোগ বা আপডেট করবেন, তখন এক্সটেনশনটি একটি প্রি-ট্রেইনড মডেল অথবা একটি এপিআই এন্ডপয়েন্টের মাধ্যমে আপনার পছন্দের কোনো মডেল ব্যবহার করে স্বয়ংক্রিয়ভাবে এমবেডিং তৈরি করবে। এক্ষেত্রে আমরা এক্সটেনশন কনফিগারেশনে Vertex AI বেছে নিয়েছি।

সূচী তৈরি

অ্যাপ্লিকেশনে এমবেডিং ব্যবহারের সময় এমবেডিং ফিল্ডে ইনডেক্স তৈরি করা বাধ্যতামূলক করা হবে।

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

  1. ক্লাউড শেল টার্মিনালে যান
  2. নিম্নলিখিত কমান্ডটি চালান:
gcloud firestore indexes composite create --collection-group="poses" --query-scope=COLLECTION --database="(default)" --field-config vector-config='{"dimension":"768", "flat": "{}"}',field-path="embedding"

এ সম্পর্কে আরও জানতে এখানে পড়ুন।

একবার ভেক্টর ইনডেক্স তৈরি হয়ে গেলে, আপনি আপনার ভেক্টর এমবেডিংগুলো দিয়ে নিকটতম প্রতিবেশী অনুসন্ধান (nearest neighbor search) করতে পারেন।

গুরুত্বপূর্ণ দ্রষ্টব্য:

এই পর্যায় থেকে আপনাকে সোর্সে কোনো পরিবর্তন করতে হবে না। অ্যাপ্লিকেশনটি কী করছে তা বোঝার জন্য শুধু অনুসরণ করুন।

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

CollectionReference coll = firestore.collection("poses");
    VectorQuery vectorQuery = coll.findNearest(
        "embedding",
        userSearchTextEmbedding, 
        /* limit */ 3,
        VectorQuery.DistanceMeasure.EUCLIDEAN,
        VectorQueryOptions.newBuilder().setDistanceResultField("vector_distance")
         .setDistanceThreshold(2.0)
          .build());
ApiFuture<VectorQuerySnapshot> future = vectorQuery.get();
VectorQuerySnapshot vectorQuerySnapshot = future.get();
List<Pose> posesList = new ArrayList<Pose>();
// Get the ID of the closest document (assuming results are sorted by distance)
String closestDocumentId = vectorQuerySnapshot.getDocuments().get(0).getId();

এই কোড স্নিপেটটি ব্যবহারকারীর সার্চ টেক্সটের এমবেডিং-এর সাথে ফায়ারস্টোরে থাকা ডকুমেন্টগুলোর এমবেডিং-এর তুলনা করে এবং প্রাসঙ্গিকভাবে সবচেয়ে কাছের এমবেডিংটি বের করে আনে।

৭. জেমিনি ২.০ ফ্ল্যাশ

জেমিনি ২.০ ফ্ল্যাশ একীভূতকরণ (বর্ণনা তৈরির জন্য)

চলুন দেখে নেওয়া যাক, আপনার নতুন তৈরি করা অ্যাপ্লিকেশনটি বর্ণনা তৈরির জন্য জেমিনি ২.০ ফ্ল্যাশ ইন্টিগ্রেশন কীভাবে পরিচালনা করে।

এখন ধরা যাক, একজন অ্যাডমিন ব্যবহারকারী / যোগ প্রশিক্ষক জেমিনি ২.০ ফ্ল্যাশ-এর ​​সাহায্যে আসনগুলোর বিবরণ প্রবেশ করাতে চান এবং তারপর নিকটতম মিলগুলো দেখার জন্য একটি অনুসন্ধান চালাতে চান। এর ফলে মিলে যাওয়া আসনগুলোর বিবরণের পাশাপাশি ফলাফলগুলোকে সমর্থনকারী মাল্টিমোডাল অবজেক্টগুলোও নিষ্কাশিত হয়।

String apiUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent?key=[YOUR_API_KEY]";
Map<String, Object> requestBody = new HashMap<>();
List<Map<String, Object>> contents = new ArrayList<>();
List<Map<String, Object>> tools = new ArrayList<>();
Map<String, Object> content = new HashMap<>();
List<Map<String, Object>> parts = new ArrayList<>();
Map<String, Object> part = new HashMap<>();
part.put("text", prompt);
parts.add(part);
content.put("parts", parts);
contents.add(content);
requestBody.put("contents", contents);
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.POST, requestEntity, String.class);
System.out.println("Generated response: " + response);
String responseBody = response.getBody();
JSONObject jsonObject = new JSONObject(responseBody);
JSONArray candidates = jsonObject.getJSONArray("candidates");
JSONObject candidate = candidates.getJSONObject(0);
JSONObject contentResponse = candidate.getJSONObject("content");
JSONArray partsResponse = contentResponse.getJSONArray("parts");
JSONObject partResponse = partsResponse.getJSONObject(0);
String generatedText = partResponse.getString("text");
System.out.println("Generated Text: " + generatedText);

ক. ছবি এবং অডিও তৈরির অনুকরণ

জেমিনি ২.০ ফ্ল্যাশ এক্সপেরিমেন্টাল মাল্টিমোডাল ফলাফল তৈরি করতে সক্ষম, তবে আমি এখনও এর আর্লি অ্যাক্সেসের জন্য সাইন আপ করিনি, তাই আমি যথাক্রমে Imagen এবং TTS API ব্যবহার করে ছবি এবং অডিও আউটপুট অনুকরণ করেছি। ভাবুন তো, জেমিনি ২.০ ফ্ল্যাশে একটিমাত্র API কলের মাধ্যমে এই সবকিছু তৈরি হয়ে যাওয়াটা কতটা দারুণ হবে!!

try (PredictionServiceClient predictionServiceClient =
          PredictionServiceClient.create(predictionServiceSettings)) {
  
        final EndpointName endpointName =
            EndpointName.ofProjectLocationPublisherModelName(
                projectId, location, "google", "imagen-3.0-generate-001");
  
        Map<String, Object> instancesMap = new HashMap<>();
        instancesMap.put("prompt", prompt);
        Value instances = mapToValue(instancesMap);
  
        Map<String, Object> paramsMap = new HashMap<>();
        paramsMap.put("sampleCount", 1);
        paramsMap.put("aspectRatio", "1:1");
        paramsMap.put("safetyFilterLevel", "block_few");
        paramsMap.put("personGeneration", "allow_adult");
        Value parameters = mapToValue(paramsMap);
  
        PredictResponse predictResponse =
            predictionServiceClient.predict(
                endpointName, Collections.singletonList(instances), parameters);
  
        for (Value prediction : predictResponse.getPredictionsList()) {
          Map<String, Value> fieldsMap = prediction.getStructValue().getFieldsMap();
          if (fieldsMap.containsKey("bytesBase64Encoded")) {
            bytesBase64Encoded = fieldsMap.get("bytesBase64Encoded").getStringValue();
       }
      }
      return bytesBase64Encoded;
    }
 try {
            // Create a Text-to-Speech client
            try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) {
                // Set the text input to be synthesized
                SynthesisInput input = SynthesisInput.newBuilder().setText(postureString).build();

                // Build the voice request, select the language code ("en-US") and the ssml
                // voice gender
                // ("neutral")
                VoiceSelectionParams voice =
                        VoiceSelectionParams.newBuilder()
                                .setLanguageCode("en-US")
                                .setSsmlGender(SsmlVoiceGender.NEUTRAL)
                                .build();

                // Select the type of audio file you want returned
                AudioConfig audioConfig =
                        AudioConfig.newBuilder().setAudioEncoding(AudioEncoding.MP3).build();

                // Perform the text-to-speech request on the text input with the selected voice
                // parameters and audio file type
                SynthesizeSpeechResponse response =
                        textToSpeechClient.synthesizeSpeech(input, voice, audioConfig);

                // Get the audio contents from the response
                ByteString audioContents = response.getAudioContent();

                // Convert to Base64 string
                String base64Audio = Base64.getEncoder().encodeToString(audioContents.toByteArray());

                // Add the Base64 encoded audio to the Pose object
               return base64Audio;
            }

        } catch (Exception e) {
            e.printStackTrace(); // Handle exceptions appropriately. For a real app, log and provide user feedback.
            return "Error in Audio Generation";
        }
}

খ. গুগল সার্চের মাধ্যমে ভিত্তি স্থাপন:

আপনি যদি ধাপ ৬-এর জেমিনি ইনভোকেশন কোডটি পরীক্ষা করেন, তাহলে LLM রেসপন্সের জন্য গুগল সার্চ গ্রাউন্ডিং সক্রিয় করতে নিম্নলিখিত কোড স্নিপেটটি দেখতে পাবেন:

 /**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);

এর মাধ্যমে আমরা নিশ্চিত করতে পারি যে:

  • আমাদের মডেলটিকে প্রকৃত অনুসন্ধানের ফলাফলের সাথে মিলিয়ে দেখুন।
  • অনুসন্ধানে উল্লেখিত প্রাসঙ্গিক URL গুলি বের করুন।

৮. আপনার অ্যাপ্লিকেশনটি চালান।

চলুন একটি সাধারণ থাইমলিফ ওয়েব ইন্টারফেসের সাহায্যে আপনার নতুন তৈরি করা জাভা স্প্রিং বুট অ্যাপ্লিকেশনটির সমস্ত সক্ষমতা দেখে নেওয়া যাক:

  1. ফায়ারস্টোর CRUD অপারেশন (তৈরি, পড়া, আপডেট, মুছে ফেলা)
  2. কীওয়ার্ড অনুসন্ধান
  3. জেনারেটিভ এআই ভিত্তিক প্রেক্ষাপট তৈরি
  4. প্রসঙ্গভিত্তিক অনুসন্ধান (ভেক্টর অনুসন্ধান)
  5. অনুসন্ধানের সাথে সম্পর্কিত মাল্টিমোডাল আউটপুট
  6. আপনার নিজের কোয়েরি চালান (স্ট্রাকচার্ডকোয়েরি ফরম্যাটে কোয়েরি)

উদাহরণ: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}

এখন পর্যন্ত আলোচিত এই সমস্ত বৈশিষ্ট্যই সেই অ্যাপ্লিকেশনটির অংশ যা আপনি এইমাত্র https://github.com/AbiramiSukumaran/firestore-poserecommender রিপো থেকে তৈরি করেছেন।

এটি বিল্ড, রান এবং ডিপ্লয় করতে, ক্লাউড শেল টার্মিনাল থেকে নিম্নলিখিত কমান্ডগুলো চালান:

mvn package

mvn spring-boot:run

আপনি ফলাফলটি দেখতে পাবেন এবং আপনার অ্যাপ্লিকেশনের ফিচারগুলো নিয়ে পরীক্ষা-নিরীক্ষা করতে পারবেন। আউটপুটের ডেমো দেখতে নিচের ভিডিওটি দেখুন:

ফায়ারস্টোর, ভেক্টর সার্চ এবং জেমিনি ২.০ ফ্ল্যাশ ব্যবহার করে পোজ রিকমেন্ডার

ঐচ্ছিক ধাপ:

ক্লাউড রান-এ এটি ডেপ্লয় করতে (ধরে নিচ্ছি যে আপনি ডকারফাইল দিয়ে একটি একদম নতুন অ্যাপ্লিকেশন বুটস্ট্র্যাপ করেছেন এবং প্রয়োজন অনুযায়ী ফাইলগুলো কপি করে নিয়েছেন), আপনার প্রজেক্ট ডিরেক্টরির ভেতর থেকে ক্লাউড শেল টার্মিনালে নিম্নলিখিত কমান্ডটি চালান:

gcloud run deploy --source .

অ্যাপ্লিকেশনের নাম, অঞ্চল কোড ( us-central1 এর জন্য কোডটি বেছে নিন) প্রদান করুন এবং নির্দেশ অনুযায়ী প্রমাণীকরণবিহীন ইনভোকেশনের জন্য "Y" নির্বাচন করুন। ডেপ্লয়মেন্ট সফল হলে আপনি টার্মিনালে আপনার অ্যাপ্লিকেশন এন্ডপয়েন্টটি পেয়ে যাবেন।

৯. পরিষ্কার করুন

এই পোস্টে ব্যবহৃত রিসোর্সগুলোর জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, এই ধাপগুলো অনুসরণ করুন:

  1. গুগল ক্লাউড কনসোলে, রিসোর্স পরিচালনা (Manage resources) পৃষ্ঠায় যান।
  2. প্রজেক্ট তালিকা থেকে, আপনি যে প্রজেক্টটি মুছতে চান সেটি নির্বাচন করুন এবং তারপর ডিলিট বোতামে ক্লিক করুন।
  3. ডায়ালগ বক্সে প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলার জন্য 'শাট ডাউন'-এ ক্লিক করুন।

১০. অভিনন্দন

অভিনন্দন! আপনি সফলভাবে ফায়ারস্টোর ব্যবহার করে একটি শক্তিশালী এবং বুদ্ধিমান যোগাসন ব্যবস্থাপনা অ্যাপ্লিকেশন তৈরি করেছেন। ফায়ারস্টোরের শক্তি, ভেক্টর সার্চ এক্সটেনশন এবং জেমিনি ২.০ ফ্ল্যাশের সক্ষমতা (সিমুলেটেড ছবি ও অডিও জেনারেশন সহ) একত্রিত করে, আমরা CRUD অপারেশন বাস্তবায়ন, কীওয়ার্ড-ভিত্তিক অনুসন্ধান, প্রাসঙ্গিক ভেক্টর অনুসন্ধান এবং মাল্টিমিডিয়া কন্টেন্ট তৈরির জন্য একটি সত্যিকারের আকর্ষক ও তথ্যপূর্ণ যোগ অ্যাপ তৈরি করেছি।

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

যদি আমি এই অ্যাপটিকে আরও সম্প্রসারিত করতাম, তাহলে জেমিনি ২.০ ফ্ল্যাশ দিয়ে দুটি কাজ করার চেষ্টা করতাম:

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

নির্দ্বিধায় চেষ্টা করে দেখুন এবং একটি পুল রিকোয়েস্ট পাঠিয়ে দিন :>D!!!