با Firestore، Vector Search و Gemini 2.0 (نسخه جاوا) یک برنامه توصیه‌کننده Yoga Poses متنی بسازید!

۱. مرور کلی

در دنیای برنامه‌های سلامتی و تناسب اندام، ارائه یک تجربه غنی و جذاب به کاربران کلیدی است. برای یک برنامه یوگا، این به معنای فراتر رفتن از توضیحات متنی ساده از حالت‌ها و ارائه اطلاعات جامع، محتوای چندرسانه‌ای و قابلیت‌های جستجوی هوشمند است. در این وبلاگ، ما بررسی خواهیم کرد که چگونه با استفاده از Firestore گوگل کلود، یک پایگاه داده قوی از حالت‌های یوگا بسازیم، از افزونه جستجوی برداری آن برای تطبیق متنی استفاده کنیم و قدرت Gemini 2.0 Flash (Experimental) را برای کار با محتوای چندوجهی ادغام کنیم.

چرا فایر استور؟

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

  • مقیاس‌پذیری و عملکرد: فایراستور به طور خودکار برای مدیریت میلیون‌ها کاربر و مجموعه داده‌های عظیم مقیاس‌پذیر می‌شود و تضمین می‌کند که برنامه شما حتی با رشد، پاسخگو باقی بماند.
  • به‌روزرسانی‌های بلادرنگ: همگام‌سازی بلادرنگ داخلی، داده‌ها را در بین تمام کلاینت‌های متصل، ثابت نگه می‌دارد و آن را برای ویژگی‌هایی مانند کلاس‌های زنده یا تمرین‌های مشارکتی ایده‌آل می‌کند.
  • مدل داده انعطاف‌پذیر: ساختار مبتنی بر سند Firestore به شما امکان می‌دهد انواع داده‌های متنوع، از جمله متن، تصاویر و حتی جاسازی‌ها را ذخیره کنید، که آن را برای نمایش اطلاعات پیچیده حرکات یوگا ایده‌آل می‌کند.
  • پرس‌وجوی قدرتمند: فایراستور از پرس‌وجوهای پیچیده، از جمله برابری، نابرابری، و اکنون، با افزونه جدید، جستجوهای شباهت برداری پشتیبانی می‌کند.
  • پشتیبانی آفلاین: Firestore داده‌ها را به صورت محلی ذخیره می‌کند و به برنامه شما اجازه می‌دهد حتی زمانی که کاربران آفلاین هستند نیز کار کند.

بهبود جستجو با افزونه جستجوی وکتور فایراستور

جستجوی سنتی مبتنی بر کلمات کلیدی می‌تواند هنگام مواجهه با مفاهیم پیچیده‌ای مانند حرکات یوگا محدودکننده باشد. یک کاربر ممکن است بدون دانستن نام دقیق آن حرکت، به دنبال حرکتی باشد که «باسن را باز می‌کند» یا «تعادل را بهبود می‌بخشد». اینجاست که جستجوی برداری (Vector Search) وارد عمل می‌شود.

جستجوی برداری با Firestore به شما امکان می‌دهد:

  • ایجاد جاسازی‌ها: تبدیل توضیحات متنی، و در آینده احتمالاً تصاویر و صدا، به نمایش‌های برداری عددی (جاسازی‌ها) که معنای معنایی آنها را با استفاده از مدل‌هایی مانند مدل‌های موجود در Vertex AI یا مدل‌های سفارشی ثبت می‌کنند.
  • جاسازی‌های فروشگاهی: این جاسازی‌ها را مستقیماً در اسناد Firestore ذخیره کنید.
  • انجام جستجوهای مشابه: پایگاه داده خود را برای یافتن اسنادی که از نظر معنایی مشابه یک بردار جستجوی داده شده هستند، جستجو کنید و تطبیق متنی را فعال کنید.

ادغام فلش Gemini 2.0 (آزمایشی)

Gemini 2.0 Flash مدل هوش مصنوعی چندوجهی پیشرفته گوگل است. اگرچه هنوز در مرحله آزمایش است، اما امکانات هیجان‌انگیزی را برای غنی‌سازی برنامه یوگای ما ارائه می‌دهد:

  • تولید متن : از Gemini 2.0 Flash برای تولید توضیحات دقیق از حرکات یوگا، شامل مزایا، اصلاحات و موارد منع مصرف، استفاده کنید.
  • تولید تصویر (تقلید شده) : اگرچه تولید مستقیم تصویر با Gemini هنوز به صورت عمومی در دسترس نیست، من این کار را با استفاده از Imagen گوگل شبیه‌سازی کرده‌ام و تصاویری تولید می‌کنم که به صورت بصری حالت‌ها را نشان می‌دهند.
  • تولید صدا (تقلید شده) : به طور مشابه، می‌توانیم از یک سرویس تبدیل متن به گفتار (TTS) برای ایجاد دستورالعمل‌های صوتی برای هر حرکت استفاده کنیم و کاربران را در طول تمرین راهنمایی کنیم.

به طور بالقوه، من پیشنهاد ادغام برای بهبود برنامه را برای استفاده از ویژگی‌های زیر از مدل، پیش‌بینی می‌کنم:

  • رابط برنامه‌نویسی کاربردی چندوجهی زنده : این رابط برنامه‌نویسی کاربردی جدید به شما کمک می‌کند تا با استفاده از ابزار، برنامه‌های بصری و پخش صوتی بلادرنگ ایجاد کنید.
  • سرعت و عملکرد : Gemini 2.0 Flash نسبت به Gemini 1.5 Flash زمان رسیدن به اولین توکن (TTFT) بهبود قابل توجهی دارد.
  • بهبود تجربیات عامل‌محور : Gemini 2.0 بهبودهایی را در درک چندوجهی، کدنویسی، دنبال کردن دستورالعمل‌های پیچیده و فراخوانی توابع ارائه می‌دهد. این پیشرفت‌ها در کنار هم، از تجربیات عامل‌محور بهتری پشتیبانی می‌کنند.

برای جزئیات بیشتر به این صفحه مستندات مراجعه کنید (%20over%20Gemini%201.5%20Flash).

برای افزایش اعتبار و ارائه منابع بیشتر، می‌توانیم جستجوی گوگل را برای پایه‌گذاری اطلاعات ارائه شده توسط برنامه خود ادغام کنیم. این به این معنی است که:

  • جستجوی متنی: وقتی یک کاربر ادمین جزئیات یک ژست را وارد می‌کند، می‌توانیم از نام ژست برای انجام جستجوی گوگل استفاده کنیم.
  • استخراج URL: از نتایج جستجو، می‌توانیم URLهای مرتبط مانند مقالات، ویدیوها یا وب‌سایت‌های معتبر یوگا را استخراج کرده و درون برنامه نمایش دهیم.

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

به عنوان بخشی از این آزمایشگاه، شما:

  1. ایجاد یک مجموعه Firestore و بارگذاری اسناد Yoga
  2. آموزش ایجاد برنامه‌های CRUD با Firestore
  3. ایجاد توضیحات حرکات یوگا با Gemini 2.0 Flash
  4. جستجوی برداری فایربیس را با ادغام فایراستور فعال کنید
  5. ایجاد جاسازی‌ها از توضیحات یوگا
  6. انجام جستجوی شباهت برای متن جستجوی کاربر

الزامات

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

۲. قبل از شروع

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

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

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

مستندات مراحل کامل‌تری در مورد نحوه راه‌اندازی یک نمونه Firestore ارائه می‌دهد. در سطح بالا، برای شروع، این مراحل را دنبال خواهم کرد:

۱- به Firestore Viewer بروید و از صفحه Select a database service، گزینه Firestore in Native mode را انتخاب کنید.

  1. مکانی را برای Firestore خود انتخاب کنید (حتماً us-central1 را انتخاب کنید و در هر کجای این codelab منطقه/مکان را انتخاب می‌کنید، این را دنبال کنید)
  2. روی ایجاد پایگاه داده کلیک کنید (اگر این اولین بار است، آن را روی پایگاه داده "(پیش‌فرض)" بگذارید)

وقتی یک پروژه Firestore ایجاد می‌کنید، API را نیز در Cloud API Manager فعال می‌کند.

  1. مهم: نسخه آزمایشی (نه نسخه تولیدی) قوانین امنیتی را انتخاب کنید تا داده‌ها قابل دسترسی باشند.
  2. پس از راه‌اندازی، باید نمای پایگاه داده، مجموعه و سند Firestore را در حالت بومی (Native) مطابق تصویر زیر مشاهده کنید:

f7136d53253c59a.png

  1. هنوز این مرحله را انجام ندهید، اما فقط برای ثبت - می‌توانید روی "شروع مجموعه" کلیک کنید و یک مجموعه جدید ایجاد کنید. شناسه مجموعه را روی "poses" تنظیم کنید. روی دکمه ذخیره کلیک کنید.

a26eb470aa9bfda9.png

نکات حرفه‌ای برای کاربردهای تولیدی:

  1. پس از نهایی کردن مدل داده خود و شناسایی افرادی که باید به انواع مختلف اسناد دسترسی داشته باشند، می‌توانید قوانین امنیتی را از رابط Firebase ایجاد، ویرایش و نظارت کنید. می‌توانید از طریق این لینک به قوانین امنیتی دسترسی پیدا کنید: https://console.firebase.google.com/u/0/project/ <<your_project_id>>/firestore/rules
  2. قبل از استقرار/اجرای پروژه از مرحله توسعه، حتماً قوانین امنیتی خود را ویرایش، نظارت و آزمایش کنید، زیرا اغلب مقصر خاموش پشت عملکرد متفاوت برنامه شما همین قوانین است :)

برای این نسخه آزمایشی، ما از آن در حالت TEST استفاده خواهیم کرد.

۴. رابط برنامه‌نویسی کاربردی REST فایراستور

  1. API REST می‌تواند برای موارد استفاده زیر مفید باشد: الف) دسترسی به Firestore از یک محیط با منابع محدود که در آن اجرای یک کتابخانه کامل کلاینت امکان‌پذیر نیست ب) خودکارسازی مدیریت پایگاه داده یا بازیابی فراداده‌های دقیق پایگاه داده
  2. ساده‌ترین راه برای استفاده از Firestore استفاده از یکی از کتابخانه‌های کلاینت بومی است، موقعیت‌هایی وجود دارد که فراخوانی مستقیم REST API مفید است.
  3. در محدوده این وبلاگ، شما نحوه استفاده و نمایش APIهای REST فایراستور و نه کتابخانه‌های کلاینت بومی را خواهید دید.
  4. برای احراز هویت، Firestore REST API یا یک توکن Firebase Authentication ID یا یک توکن Google Identity OAuth 2.0 را می‌پذیرد. برای اطلاعات بیشتر در مورد موضوع احراز هویت و مجوز، به مستندات مراجعه کنید.
  5. تمام نقاط پایانی REST API تحت آدرس اینترنتی پایه https://firestore.googleapis.com/v1/ قرار دارند.

Spring Boot و Firestore API

این راهکار در چارچوب Spring Boot، یک برنامه کلاینت را نشان می‌دهد که از APIهای Firestore برای جمع‌آوری و اصلاح جزئیات وضعیت یوگا و تنفس با یک تجربه تعاملی کاربر استفاده می‌کند.

برای توضیح گام به گام و مفصل در مورد بخش راه‌حل CRUD فایراستور از برنامه یوگا، می‌توانید از طریق لینک وبلاگ اقدام کنید.

برای تمرکز روی راه‌حل فعلی و یادگیری بخش CRUD در حال اجرا، کل راه‌حل مورد بحث در این وبلاگ را از مخزن زیر از ترمینال Cloud Shell خود کپی کنید و یک کپی از کدبیس دریافت کنید.

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

لطفا توجه داشته باشید:

  1. پس از اینکه این مخزن را کلون کردید، فقط باید چند تغییر در شناسه پروژه، APIها و غیره ایجاد کنید. برای راه‌اندازی و اجرای برنامه شما، تغییر دیگری لازم نیست. هر جزء برنامه در بخش‌های بعدی توضیح داده خواهد شد. در اینجا لیستی از تغییرات آمده است:
  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] " را با کلید API خود برای Gemini 2.0 Flash جایگزین کنید. می‌توانید این کلید را از AI Studio دریافت کنید.
  6. اگر می‌خواهید به صورت محلی تست کنید، دستورات زیر را از پوشه پروژه در ترمینال Cloud Shell اجرا کنید:
mvn package

mvn spring-boot:run

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

  1. اختیاری: اگر می‌خواهید برنامه را در Cloud Run مستقر کنید، باید یک برنامه کاملاً جدید Java Cloud Run را از ابتدا از Cloud Shell Editor بوت‌استرپ کنید و فایل‌های src و فایل‌های الگو را از مخزن به پروژه جدید خود در پوشه‌های مربوطه اضافه کنید (زیرا پروژه مخزن فعلی github به طور پیش‌فرض برای پیکربندی استقرار Cloud Run تنظیم نشده است). در این صورت (به جای کلون کردن مخزن موجود)، مراحل زیر باید دنبال شوند:
  2. به ویرایشگر Cloud Shell بروید (مطمئن شوید که ویرایشگر باز است و نه ترمینال)، روی نماد نام پروژه Google Cloud در سمت چپ نوار وضعیت کلیک کنید (قسمت مسدود شده در تصویر زیر)

d3f0de417094237d.png

  1. از لیست گزینه‌ها، گزینه New application -> Cloud Run Application -> Java: Cloud Run را انتخاب کنید و نام آن را "firestore-poserecommender" بگذارید.

d5ef8b4ca8bf3f85.png

  1. حالا باید یک الگوی کامل برای برنامه Java Cloud Run ببینید که از پیش پیکربندی شده و آماده استفاده است.
  2. کلاس Controller موجود را حذف کرده و فایل‌های زیر را در پوشه‌های مربوطه در ساختار پروژه کپی کنید:

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

  1. FirestoreSampleApplication.java
  2. GenerateEmbeddings.java
  3. GenerateImageSample.java
  4. ژست.java
  5. PoseController.java
  6. ServletInitializer.java
             firestore-poserecommender/src/main/resources/static/
    
  7. فهرست.html

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

  1. جستجوی زمینه.html
  2. ایجاد پوز.html
  3. پیام خطا
  4. ژست.html
  5. ریوک.html
  6. جستجو.html
  7. نمایش پیام.html

firestore-poserecommender/

  1. داکرفایل
  2. شما باید در فایل‌های مربوطه تغییرات لازم را اعمال کنید تا PROJECT ID و API KEY با مقادیر مربوطه جایگزین شوند (مراحل ۱ الف، ب، ج و د در بالا).

۵. دریافت داده‌ها

داده‌های برنامه در این فایل data.json موجود است: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json

اگر دوست دارید با داده‌های از پیش تعریف‌شده شروع کنید، می‌توانید json را کپی کرده و تمام موارد "<<YOUR_PROJECT_ID>>" را با مقدار خود جایگزین کنید.

  • به استودیوی فایراستور بروید
  • مطمئن شوید که مجموعه‌ای با نام "poses" ایجاد کرده‌اید.
  • اسناد را از فایل repo ذکر شده در بالا به صورت دستی و یکی یکی اضافه کنید

شما می‌توانید به طور جایگزین، داده‌ها را در یک مرحله از مجموعه از پیش تعریف شده‌ای که برای شما ایجاد کرده‌ایم، با اجرای مراحل زیر وارد کنید:

  1. به ترمینال Cloud Shell بروید و مطمئن شوید که پروژه فعال Google Cloud شما تنظیم شده است و مطمئن شوید که مجوز دارید. با دستور gsutil که در زیر آورده شده است، یک سطل در پروژه خود ایجاد کنید. متغیر <PROJECT_ID> را در دستور زیر با شناسه پروژه Google Cloud خود جایگزین کنید:

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

  1. حالا که باکت ایجاد شده است، قبل از اینکه بتوانیم خروجی پایگاه داده را به پایگاه داده Firebase وارد کنیم، باید آن را در این باکت کپی کنیم. از دستور زیر استفاده کنید:

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

حالا که داده‌ها را برای وارد کردن داریم، می‌توانیم به مرحله نهایی وارد کردن داده‌ها به پایگاه داده Firebase ( پیش‌فرض ) که ایجاد کرده‌ایم، برویم.

  1. اکنون به کنسول Firestore بروید و از منوی ناوبری سمت چپ روی Import/Export کلیک کنید.

گزینه Import را انتخاب کنید و مسیر Cloud Storage که ایجاد کرده‌اید را انتخاب کنید و تا زمانی که بتوانید فایل "yoga_poses.overall_export_metadata" را انتخاب کنید، پیمایش کنید:

f5c1d16df7d5a64a.png

  1. روی وارد کردن کلیک کنید.

وارد کردن چند ثانیه طول می‌کشد و پس از آماده شدن، می‌توانید پایگاه داده Firestore و مجموعه آن را با مراجعه به https://console.cloud.google.com/firestore/databases اعتبارسنجی کنید، پایگاه داده پیش‌فرض و مجموعه poses را مطابق شکل زیر انتخاب کنید:

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

۶. جستجوی برداری

افزونه جستجوی برداری Firestore را فعال کنید

از این افزونه برای جاسازی و جستجوی خودکار اسناد Firestore خود با ویژگی جستجوی برداری جدید استفاده کنید! این شما را به مرکز افزونه‌های Firebase می‌برد.

وقتی افزونه‌ی Vector Search را نصب می‌کنید، یک مجموعه و نام فیلد سند را مشخص می‌کنید. اضافه کردن یا به‌روزرسانی یک سند با این فیلد، این افزونه را برای محاسبه‌ی جاسازی برداری برای سند فعال می‌کند. این جاسازی برداری در همان سند نوشته می‌شود و سند در مخزن برداری فهرست‌بندی می‌شود و آماده‌ی پرس‌وجو خواهد بود.

بیایید مراحل را طی کنیم:

افزونه را نصب کنید:

افزونه‌ی «جستجوی برداری با Firestore» را از بازار افزونه‌های Firebase با کلیک روی «نصب در کنسول Firebase» نصب کنید.

مهم:

وقتی برای اولین بار به صفحه افزونه‌ها می‌روید، باید همان پروژه‌ای را که در کنسول Google Cloud که در کنسول Firebase فهرست شده است، روی آن کار می‌کنید، انتخاب کنید.

715426b97c732649.png

اگر پروژه شما در لیست نیست، آن را به Firebase اضافه کنید ( پروژه Google Cloud موجود خود را از لیست انتخاب کنید ).

پیکربندی افزونه:

مجموعه ("poses") ، فیلد حاوی متن برای جاسازی ("posture") و پارامترهای دیگر مانند ابعاد جاسازی را مشخص کنید.

اگر APIهایی وجود دارند که باید در این مرحله فعال شوند، صفحه پیکربندی به شما این امکان را می‌دهد، مراحل مربوطه را دنبال کنید.

اگر صفحه پس از فعال کردن APIها برای مدتی پاسخ نداد، کافیست صفحه را رفرش کنید تا بتوانید فعال شدن APIها را ببینید.

5ba59b45710c567b.png

در یکی از مراحل زیر، به شما امکان می‌دهد از LLM مورد نظر خود برای تولید جاسازی‌ها استفاده کنید. "Vertex AI" را انتخاب کنید.

bb528a04ebb5f976.png

چند تنظیم بعدی مربوط به مجموعه شما و فیلدی است که می‌خواهید جاسازی کنید:

کارشناسی ارشد مدیریت بازرگانی: هوش مصنوعی ورتکس

مسیر مجموعه: ژست‌ها

محدودیت پیش‌فرض پرس‌وجو: ۳

معیار فاصله: کسینوس

نام فیلد ورودی: وضعیت بدن

نام فیلد خروجی: جاسازی

نام فیلد وضعیت: status

اسناد موجود را جاسازی کنید: بله

به‌روزرسانی جاسازی‌های موجود: بله

مکان توابع ابری: us-central1

فعال کردن رویدادها: علامت زده نشده است

fb8cdf1163fac7c.png

پس از انجام تنظیمات لازم، روی دکمه‌ی نصب افزونه کلیک کنید. این کار ۳ تا ۵ دقیقه طول خواهد کشید.

ایجاد جاسازی‌ها:

همزمان با اضافه یا به‌روزرسانی اسناد در مجموعه "poses"، افزونه به طور خودکار با استفاده از یک مدل از پیش آموزش‌دیده یا مدلی به انتخاب شما از طریق یک نقطه پایانی API، جاسازی‌ها را ایجاد می‌کند. در این مورد، ما Vertex AI را در پیکربندی افزونه انتخاب کرده‌ایم.

ایجاد فهرست

این امر ایجاد Index را در فیلد جاسازی در زمان استفاده از جاسازی در برنامه الزامی می‌کند.

فایراستور به طور خودکار برای کوئری‌های پایه ایندکس ایجاد می‌کند؛ با این حال، می‌توانید به فایراستور اجازه دهید با اجرای کوئری‌هایی که ایندکس ندارند، سینتکس ایندکس ایجاد کند و در پیام خطا در سمت برنامه، لینکی به ایندکس تولید شده در اختیار شما قرار می‌دهد. در اینجا لیستی از مراحل ایجاد ایندکس برداری آمده است:

  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"

اینجا درباره‌اش بیشتر بخوانید.

پس از ایجاد یک شاخص برداری، می‌توانید با تعبیه‌های برداری خود، جستجوی نزدیکترین همسایه را انجام دهید.

نکته مهم:

از این مرحله به بعد، لازم نیست هیچ تغییری در کد منبع ایجاد کنید. فقط کافیست مراحل را دنبال کنید تا بفهمید برنامه چه کاری انجام می‌دهد.

بیایید نگاهی به نحوه‌ی عملکرد برنامه‌ی تازه ساخته شده‌ی شما در جستجوی برداری (Vector Search) بیندازیم. پس از ذخیره‌ی جاسازی‌ها، می‌توانید از کلاس VectorQuery از Firestore Java SDK برای انجام جستجوی برداری و دریافت نتایج نزدیکترین همسایه استفاده کنید:

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();

این قطعه کد، جاسازی متن جستجوی کاربر را با جاسازی اسناد در Firestore مقایسه می‌کند و نزدیکترین مورد از نظر محتوایی را استخراج می‌کند.

۷. فلش جمینی ۲.۰

ادغام Gemini 2.0 Flash (برای تولید توضیحات)

بیایید نگاهی به نحوه مدیریت یکپارچه‌سازی Gemini 2.0 Flash برای تولید توضیحات توسط برنامه تازه ساخته شده شما بیندازیم.

حالا فرض کنید یک کاربر ادمین/مربی یوگا می‌خواهد جزئیات حرکات را با کمک Gemini 2.0 Flash وارد کند و سپس جستجو را برای یافتن نزدیکترین موارد منطبق انجام دهد. این کار منجر به استخراج جزئیات حرکات منطبق به همراه اشیاء چندوجهی می‌شود که از نتایج پشتیبانی می‌کنند.

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);

الف) تقلید از تولید تصویر و صدا

Gemini 2.0 Flash Experimental قادر به تولید نتایج چندوجهی است، با این حال من هنوز برای دسترسی اولیه آن ثبت نام نکرده‌ام، بنابراین خروجی تصویر و صدا را به ترتیب با APIهای Imagen و TTS تقلید کرده‌ام. تصور کنید چقدر عالی است که همه اینها را با یک فراخوانی API به Gemini 2.0 Flash تولید کنیم!!

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";
        }
}

ب) اتصال به زمین با جستجوی گوگل:

اگر کد فراخوانی Gemini را در مرحله 6 بررسی کنید، متوجه قطعه کد زیر خواهید شد که برای فعال کردن زمینه‌سازی جستجوی گوگل برای پاسخ LLM استفاده می‌شود:

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

این برای اطمینان از این است که ما:

  • مدل خود را بر اساس نتایج جستجوی واقعی تنظیم کنیم
  • استخراج URL های مرتبط ارجاع شده در جستجو

۸. برنامه خود را اجرا کنید

بیایید نگاهی به تمام قابلیت‌های برنامه Java Spring Boot تازه ساخته شده شما با یک رابط وب ساده Thymeleaf بیندازیم:

  1. عملیات CRUD در Firestore (ایجاد، خواندن، به‌روزرسانی، حذف)
  2. جستجوی کلمات کلیدی
  3. ایجاد زمینه مبتنی بر هوش مصنوعی مولد
  4. جستجوی متنی (جستجوی برداری)
  5. خروجی چندوجهی برای ارتباط با جستجو
  6. اجرای کوئری خودتان (کوئری‌ها در قالب structuredQuery)

مثال: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}

تمام این ویژگی‌هایی که تاکنون مورد بحث قرار گرفته‌اند، بخشی از برنامه‌ای هستند که شما از مخزن زیر ایجاد کرده‌اید: https://github.com/AbiramiSukumaran/firestore-poserecommender

برای ساخت، اجرا و استقرار آن، دستورات زیر را از ترمینال Cloud Shell اجرا کنید:

mvn package

mvn spring-boot:run

شما باید نتیجه را ببینید و بتوانید با ویژگی‌های برنامه خود کار کنید. برای نمایش خروجی، ویدیوی زیر را تماشا کنید:

پیشنهاد دهنده ژست با Firestore، Vector Search و Gemini 2.0 Flash

مرحله اختیاری:

برای استقرار آن در Cloud Run (با فرض اینکه یک برنامه کاملاً جدید را با Dockerfile بوت‌استرپ کرده‌اید و در صورت نیاز فایل‌ها را کپی کرده‌اید)، دستور زیر را از ترمینال Cloud Shell از داخل دایرکتوری پروژه خود اجرا کنید:

gcloud run deploy --source .

نام برنامه، کد منطقه (کد مربوط به us-central1 را انتخاب کنید) را وارد کنید و در صورت درخواست، گزینه "Y" را برای فراخوانی احراز هویت نشده انتخاب کنید. پس از موفقیت‌آمیز بودن استقرار، باید نقطه پایانی برنامه خود را در ترمینال دریافت کنید.

۹. تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید:

  1. در کنسول گوگل کلود، به صفحه مدیریت منابع بروید.
  2. در لیست پروژه‌ها، پروژه‌ای را که می‌خواهید حذف کنید انتخاب کنید و سپس روی «حذف» کلیک کنید.
  3. در کادر محاوره‌ای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن کلیک کنید.

۱۰. تبریک

تبریک! شما با موفقیت از Firestore برای ایجاد یک برنامه مدیریت وضعیت یوگا قوی و هوشمند استفاده کردید. با ترکیب قدرت Firestore، افزونه جستجوی برداری و قابلیت‌های Gemini 2.0 Flash (با تولید تصویر و صدای شبیه‌سازی شده)، ما یک برنامه یوگا واقعاً جذاب و آموزنده برای پیاده‌سازی عملیات CRUD، انجام جستجوی مبتنی بر کلمات کلیدی، جستجوی برداری متنی و تولید محتوای چندرسانه‌ای ایجاد کرده‌ایم.

این رویکرد محدود به برنامه‌های یوگا نیست. با تکامل مدل‌های هوش مصنوعی مانند Gemini، امکان ایجاد تجربیات کاربری فراگیرتر و شخصی‌سازی‌شده‌تر، بیشتر و بیشتر خواهد شد. به یاد داشته باشید که برای بهره‌برداری از پتانسیل کامل این فناوری‌ها، از آخرین پیشرفت‌ها و مستندات Google Cloud و Firebase مطلع باشید.

اگر بخواهم این برنامه را گسترش دهم، سعی می‌کنم دو کار را با Gemini 2.0 Flash انجام دهم:

  1. با ایجاد دید بلادرنگ و پخش صوتی برای مورد استفاده، از API زنده چندوجهی استفاده کنید.
  2. حالت تفکر را فعال کنید تا افکار پشت پاسخ‌ها را برای تعامل با داده‌های بلادرنگ ایجاد کنید تا تجربه را واقعی‌تر جلوه دهید.

اگه دوست داشتین امتحانش کنین و یه درخواست pull بفرستین :>D!!!