1. بررسی اجمالی
در دنیای برنامه های تناسب اندام و تناسب اندام، ارائه تجربه ای غنی و جذاب به کاربران امری کلیدی است. برای یک برنامه یوگا، این به معنای فراتر رفتن از توضیحات متنی ساده ژستها و ارائه اطلاعات جامع، محتوای چندرسانهای و قابلیتهای جستجوی هوشمند است. در این وبلاگ، نحوه ساخت پایگاه داده پوز یوگا قوی با استفاده از Google Cloud's Firestore را بررسی خواهیم کرد، از افزونه جستجوی برداری آن برای تطبیق متنی استفاده کنیم، و قدرت Gemini 2.0 Flash (تجربی) را برای کار با محتوای چندوجهی یکپارچه کنیم.
چرا Firestore؟
Firestore، پایگاه داده اسناد NoSQL بدون سرور Google Cloud، یک انتخاب عالی برای ساخت برنامه های کاربردی مقیاس پذیر و پویا است. در اینجا دلیل مناسب بودن آن برای برنامه یوگا ما آمده است:
- مقیاسپذیری و عملکرد: Firestore بهطور خودکار مقیاس میشود تا میلیونها کاربر و مجموعه دادههای عظیم را مدیریت کند، و اطمینان حاصل میکند که برنامه شما حتی با رشدش پاسخگو باقی میماند.
- بهروزرسانیهای بیدرنگ: همگامسازی همزمان داخلی دادهها را در همه مشتریان متصل ثابت نگه میدارد، و آن را برای ویژگیهایی مانند کلاسهای زنده یا تمرین مشترک عالی میکند.
- مدل دادههای انعطافپذیر: ساختار مبتنی بر اسناد Firestore به شما اجازه میدهد تا انواع دادهها، از جمله متن، تصاویر، و حتی جاسازیها را ذخیره کنید، که آن را برای نمایش اطلاعات پیچیده یوگا ایدهآل میکند.
- جستجوی قدرتمند: Firestore از جستارهای پیچیده، از جمله برابری، نابرابری، و اکنون، با پسوند جدید، جستجوهای شباهت برداری را پشتیبانی می کند.
- پشتیبانی آفلاین: Firestore داده ها را به صورت محلی ذخیره می کند و به برنامه شما اجازه می دهد حتی زمانی که کاربران آفلاین هستند کار کند.
افزایش جستجو با افزونه جستجوی بردار Firestore
جستجوی سنتی مبتنی بر کلمه کلیدی می تواند در مواجهه با مفاهیم پیچیده ای مانند ژست های یوگا محدود کننده باشد. کاربر ممکن است بدون دانستن نام ژست خاص، پوزی را جستجو کند که "لسن را باز می کند" یا "تعادل را بهبود می بخشد". اینجاست که Vector Search وارد می شود.
جستجوی برداری با Firestore به شما امکان می دهد:
- ایجاد تعبیهها: توضیحات متن و در آینده تصاویر و صداهای بالقوه را به نمایشهای برداری عددی (جاسازیها) تبدیل کنید که معنای معنایی آنها را با استفاده از مدلهایی مانند مدلهای موجود در Vertex AI یا مدلهای سفارشی دریافت میکند.
- Store Embeddings: این جاسازی ها را مستقیماً در اسناد Firestore ذخیره کنید.
- انجام جستجوهای مشابه: پایگاه داده خود را پرس و جو کنید تا اسنادی را بیابید که از نظر معنایی مشابه یک بردار پرس و جو هستند و تطابق متنی را ممکن می کند.
یکپارچه سازی Gemini 2.0 Flash (تجربی)
Gemini 2.0 Flash مدل پیشرفته هوش مصنوعی چندوجهی گوگل است. در حالی که هنوز آزمایشی است، امکانات هیجان انگیزی برای غنی سازی برنامه یوگا ما ارائه می دهد:
- تولید متن : از Gemini 2.0 Flash برای ایجاد توضیحات مفصل در مورد حرکات یوگا، از جمله مزایا، تغییرات، و موارد منع استفاده کنید.
- تولید تصویر (تقلید شده) : اگرچه تولید مستقیم تصویر با Gemini هنوز به صورت عمومی در دسترس نیست، من این را با استفاده از Imagen گوگل شبیهسازی کردهام و تصاویری تولید میکنم که به صورت بصری ژستها را نشان میدهند.
- تولید صدا (تقلید شده) : به طور مشابه، ما میتوانیم از سرویس Text-to-Speech (TTS) برای ایجاد دستورالعملهای صوتی برای هر ژست استفاده کنیم و کاربران را از طریق تمرین راهنمایی کنیم.
به طور بالقوه، من پیشنهاد یکپارچهسازی را برای بهبود برنامه برای استفاده از ویژگیهای مدل زیر در نظر میگیرم:
- Multimodal Live API : این API جدید به شما کمک میکند تا با استفاده از ابزار، برنامههای بینایی و پخش صدا را در زمان واقعی ایجاد کنید.
- سرعت و عملکرد : Gemini 2.0 Flash نسبت به فلش Gemini 1.5 نسبت به اولین توکن (TTFT) به طور قابل توجهی بهبود یافته است.
- تجارب عامل بهبود یافته : Gemini 2.0 بهبودهایی را در درک چندوجهی، کدگذاری، دنبال کردن دستورالعمل های پیچیده و فراخوانی عملکرد ارائه می دهد. این بهبودها با هم کار می کنند تا از تجربیات نمایندگی بهتر پشتیبانی کنند.
برای جزئیات بیشتر به این صفحه مستندات %20over%20Gemini%201.5%20Flash مراجعه کنید.
زمینه سازی با جستجوی گوگل
برای افزایش اعتبار و ارائه منابع بیشتر، میتوانیم جستجوی Google را برای پایهگذاری اطلاعات ارائهشده توسط برنامهمان ادغام کنیم. این یعنی:
- جستجوی متنی: وقتی یک کاربر ادمین جزئیات یک ژست را وارد می کند، می توانیم از نام پوز برای انجام جستجوی گوگل استفاده کنیم.
- استخراج URL: از نتایج جستجو، میتوانیم URLهای مرتبط مانند مقالهها، ویدیوها یا وبسایتهای معتبر یوگا را استخراج کنیم و آنها را در برنامه نمایش دهیم.
چیزی که خواهی ساخت
به عنوان بخشی از این آزمایشگاه، شما:
- یک مجموعه Firestore ایجاد کنید و اسناد یوگا را بارگیری کنید
- نحوه ایجاد برنامه های CRUD با Firestore را بیاموزید
- با Gemini 2.0 Flash توضیحات پوز یوگا را ایجاد کنید
- Firebase Vector Search با Firestore Integration را فعال کنید
- تعبیههایی را از توضیحات یوگا ایجاد کنید
- جستجوی شباهت را برای متن جستجوی کاربر انجام دهید
الزامات
2. قبل از شروع
یک پروژه ایجاد کنید
- در Google Cloud Console ، در صفحه انتخاب پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید.
- مطمئن شوید که صورتحساب برای پروژه Cloud شما فعال است. با نحوه بررسی فعال بودن صورتحساب در پروژه آشنا شوید.
- شما از Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان در حال اجرا در Google Cloud که با bq از قبل بارگذاری شده است. روی Activate Cloud Shell در بالای کنسول Google Cloud کلیک کنید.
- پس از اتصال به Cloud Shell، با استفاده از دستور زیر بررسی میکنید که قبلاً احراز هویت شدهاید و پروژه به ID پروژه شما تنظیم شده است:
gcloud auth list
- دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد.
gcloud config list project
- اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:
gcloud config set project <YOUR_PROJECT_ID>
- API های مورد نیاز را فعال کنید.
gcloud services enable firestore.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com \
storage.googleapis.com \
secretmanager.googleapis.com \
texttospeech.googleapis.com
جایگزین دستور gcloud از طریق کنسول با جستجوی هر محصول یا استفاده از این پیوند است.
اگر هر یک از API از دست رفته است، همیشه می توانید آن را در طول پیاده سازی فعال کنید.
برای دستورات و استفاده از gcloud به اسناد مراجعه کنید.
3. راه اندازی پایگاه داده
مستندات مراحل کامل تری در مورد نحوه راه اندازی یک نمونه Firestore دارد. در سطح بالا، برای شروع، این مراحل را دنبال خواهم کرد:
1 به Firestore Viewer بروید و از صفحه Select a database services، Firestore را در حالت Native انتخاب کنید
- مکانی را برای Firestore خود انتخاب کنید
- روی ایجاد پایگاه داده کلیک کنید (اگر این اولین بار است، آن را به عنوان پایگاه داده "(پیش فرض)" بگذارید)
هنگامی که یک پروژه Firestore ایجاد می کنید، API را در Cloud API Manager نیز فعال می کند
- مهم: نسخه تست (نه تولید) قوانین امنیتی را انتخاب کنید تا داده ها در دسترس باشند
- پس از راه اندازی، باید نمای Firestore Database، Collection و Document را در حالت Native همانطور که در تصویر زیر مشاهده می کنید ببینید:
- هنوز این مرحله را انجام ندهید، اما فقط برای ثبت - می توانید روی "شروع مجموعه" کلیک کنید و یک مجموعه جدید ایجاد کنید. شناسه مجموعه را به عنوان "ژست" تنظیم کنید. بر روی دکمه ذخیره کلیک کنید.
نکات حرفه ای برای کاربرد تولید:
- هنگامی که مدل داده خود را نهایی کردید و تشخیص دادید چه کسی باید به انواع مختلف اسناد دسترسی داشته باشد، می توانید قوانین امنیتی را از رابط Firebase ایجاد، ویرایش و نظارت کنید. از این لینک میتوانید به قوانین امنیتی دسترسی پیدا کنید: https://console.firebase.google.com/u/0/project/ <<your_project_id>>/firestore/rules
- حتماً قوانین امنیتی خود را قبل از استقرار / اجرا کردن پروژه از مرحله توسعه ویرایش، نظارت و آزمایش کنید زیرا اغلب این مقصر خاموش است که چرا برنامه شما متفاوت کار می کند :)
برای این نسخه ی نمایشی، از آن در حالت TEST استفاده خواهیم کرد.
4. Firestore REST API
- REST API می تواند برای موارد استفاده زیر مفید باشد: a. دسترسی به Firestore از محیطی با محدودیت منابع که در آن اجرای کتابخانه کامل کلاینت امکان پذیر نیست. مدیریت خودکار پایگاه داده یا بازیابی اطلاعات فراداده پایگاه داده
- ساده ترین راه برای استفاده از Firestore استفاده از یکی از کتابخانه های کلاینت بومی است، در شرایطی وجود دارد که تماس مستقیم با REST API مفید است.
- در محدوده این وبلاگ، استفاده و نمایش API های Firestore REST و نه کتابخانه های مشتری اصلی را مشاهده خواهید کرد.
- برای احراز هویت، Firestore REST API یک نشانه Firebase Authentication ID یا یک توکن Google Identity OAuth 2.0 را میپذیرد. برای اطلاعات بیشتر در مورد موضوع احراز هویت و مجوز، به مستندات مراجعه کنید.
- همه نقاط پایانی REST API در زیر URL اصلی https://firestore.googleapis.com/v1/ وجود دارند.
Spring Boot and Firestore API
این راه حل در Spring Boot Framework برای نشان دادن یک برنامه مشتری است که از API های Firestore برای جمع آوری و اصلاح جزئیات وضعیت و تنفس یوگا با تجربه تعاملی کاربر استفاده می کند.
برای توضیح گام به گام جزئیات بخش راه حل Firestore CRUD از برنامه پوزهای یوگا، می توانید از طریق پیوند وبلاگ بروید.
برای تمرکز بر راه حل فعلی و یادگیری بخش CRUD در حال حرکت، کل راه حل متمرکز بر این وبلاگ را از مخزن زیر از ترمینال Cloud Shell خود شبیه سازی کنید و یک کپی از پایگاه کد دریافت کنید.
git clone https://github.com/AbiramiSukumaran/firestore-poserecommender
لطفا توجه داشته باشید:
- هنگامی که این مخزن را شبیهسازی کردید، فقط باید چند تغییر در مورد شناسه پروژه، APIها و غیره ایجاد کنید. برای راهاندازی برنامهتان نیازی به تغییر دیگری نیست. هر یک از اجزای برنامه در بخش های آینده توضیح داده شده است. در اینجا لیستی از تغییرات آمده است:
- در فایل
src/main/java/com/example/demo/GenerateImageSample.java
، "<<YOUR_PROJECT_ID>>" را با شناسه پروژه خود جایگزین کنید. - در فایل
src/main/java/com/example/demo/GenerateEmbeddings.java
، "<<YOUR_PROJECT_ID>>" را با شناسه پروژه خود جایگزین کنید. - در
src/main/java/com/example/demo/PoseController.java
، همه نمونههای "<<YOUR_PROJECT_ID>>"
و نام پایگاه داده,
در این مورد"(default)",
را با مقادیر مناسب از پیکربندی خود جایگزین کنید: - در
src/main/java/com/example/demo/PoseController.java
، «[YOUR_API_KEY]
» را با API KEY خود برای Gemini 2.0 Flash جایگزین کنید. می توانید این را از AI Studio دریافت کنید. - اگر می خواهید به صورت محلی آزمایش کنید، دستورات زیر را از پوشه پروژه در ترمینال Cloud Shell اجرا کنید:
mvn package
mvn spring-boot:run
در حال حاضر، می توانید با کلیک بر روی گزینه "web preview" از Cloud Shell Terminal برنامه خود را در حال اجرا مشاهده کنید. ما هنوز آماده انجام آزمایش و امتحان برنامه نیستیم.
- اختیاری: اگر میخواهید برنامه را در Cloud Run اجرا کنید، باید یک برنامه Java Cloud Run کاملاً جدید را از ابتدا از Cloud Shell Editor بوت استرپ کنید و فایلهای src و فایلهای الگو را از مخزن به پروژه جدید خود در پوشههای مربوطه اضافه کنید (زیرا پروژه github repo فعلی بهطور پیشفرض برای تنظیمات Cloud Run تنظیم نشده است). مراحل زیر در این مورد (به جای شبیه سازی مخزن موجود):
- به Cloud Shell Editor بروید (مطمئن شوید که ویرایشگر باز است و ترمینال نیست)، روی نماد نام پروژه Google Cloud در سمت چپ نوار وضعیت کلیک کنید (بخش مسدود شده در تصویر زیر)
- برنامه جدید -> Cloud Run Application -> Java: Cloud Run را از لیست انتخاب ها انتخاب کنید و نام آن را "firestore-poserecommender" بگذارید.
- اکنون باید یک الگوی پشته کامل برای Java Cloud Run Application، از پیش پیکربندی شده و آماده برای کار را ببینید.
- کلاس Controller موجود را حذف کنید و فایل های زیر را در پوشه های مربوطه در ساختار پروژه کپی کنید:
firestore-poserecommender/src/main/java/com/example/demo/
- FirestoreSampleApplication.java
- GenerateEmbeddings.java
- GenerateImageSample.java
- Pose.java
- PoseController.java
- ServletInitializer.java
firestore-poserecommender/src/main/resources/static/
- Index.html
firestore-poserecommender/src/main/resources/templates/
- contextsearch.html
- createpose.html
- errmessage.html
- pose.html
- ryoq.html
- searchpose.html
- showmessage.html
firestore-poserecommender/
- Dockerfile
- برای جایگزینی PROJECT ID و API KEY با مقادیر مربوطه باید تغییرات را در فایل های مربوطه اعمال کنید. (مراحل 1 a، b، c و d در بالا).
5. بلع داده ها
اطلاعات مربوط به برنامه در این فایل data.json موجود است: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json
اگر میخواهید با برخی از دادههای از پیش تعریفشده شروع کنید، میتوانید json را کپی کنید و همه موارد "<YOUR_PROJECT_ID>>" را با مقدار خود جایگزین کنید.
- به استودیو Firestore بروید
- اطمینان حاصل کنید که مجموعه ای به نام "پوز" ایجاد کرده اید.
- اسناد را از فایل مخزن ذکر شده در بالا به صورت دستی یکی یکی اضافه کنید
میتوانید با اجرای مراحل زیر، دادهها را در یک عکس از مجموعه از پیش تعریفشدهای که برای شما ایجاد کردهایم وارد کنید:
- به ترمینال Cloud Shell بروید و مطمئن شوید که پروژه Google Cloud فعال شما تنظیم شده است و مطمئن شوید که مجاز هستید. با دستور gsutil که در زیر داده شده است یک سطل در پروژه خود ایجاد کنید. متغیر <PROJECT_ID> در دستور زیر را با شناسه پروژه Google Cloud خود جایگزین کنید:
gsutil mb -l us gs:// <PROJECT_ID> -yoga-poses-bucket
- اکنون که سطل ایجاد شده است، قبل از اینکه بتوانیم آن را به پایگاه داده Firebase وارد کنیم، باید صادرات دیتابیس را که آماده کرده ایم در این سطل کپی کنیم. از دستور زیر استفاده کنید:
gsutil cp -r gs://demo-bq-gemini-public/yoga_poses gs:// <PROJECT_ID> -yoga-poses-bucket
اکنون که دادههایی برای وارد کردن داریم، میتوانیم به مرحله نهایی وارد کردن دادهها به پایگاه داده Firebase ( پیشفرض ) که ایجاد کردهایم برویم.
- اکنون به کنسول Firestore بروید و از منوی پیمایش در سمت چپ روی Import/Export کلیک کنید.
Import را انتخاب کنید و مسیر Cloud Storage را که ایجاد کردید انتخاب کنید و تا زمانی که بتوانید فایل "yoga_poses.overall_export_metadata" را انتخاب کنید پیمایش کنید:
- روی Import کلیک کنید.
وارد کردن چند ثانیه طول میکشد و پس از آماده شدن، میتوانید با مراجعه به https://console.cloud.google.com/firestore/databases پایگاه داده Firestore و مجموعه را تأیید کنید، پایگاه داده پیشفرض و مجموعه پوزها را مطابق شکل زیر انتخاب کنید:
- روش دیگر این است که میتوانید پس از استقرار با استفاده از عمل «ایجاد یک موقعیت جدید»، رکوردها را به صورت دستی از طریق برنامه ایجاد کنید.
6. جستجوی برداری
افزونه جستجوی بردار Firestore را فعال کنید
از این برنامه افزودنی برای جاسازی و پرس و جو خودکار اسناد Firestore خود با ویژگی جدید جستجوی برداری استفاده کنید! این شما را به مرکز برنامه های افزودنی Firebase می برد.
وقتی افزونه جستجوی برداری را نصب میکنید، یک مجموعه و نام فیلد سند را مشخص میکنید. افزودن یا بهروزرسانی یک سند با این فیلد، این پسوند را برای محاسبه تعبیه برداری برای سند فعال میکند. این جاسازی برداری در همان سند نوشته میشود و سند در ذخیرهگاه برداری نمایه میشود و آماده استعلام شود.
بیایید مراحل را طی کنیم:
برنامه افزودنی را نصب کنید:
برنامه افزودنی "Vector Search with Firestore" را از Firebase Extensions Marketplace با کلیک روی "Install in Firebase Console" نصب کنید.
مهم:
هنگامی که برای اولین بار به این صفحه برنامههای افزودنی پیمایش میکنید، باید همان پروژهای را که در کنسول Google Cloud فهرست شده در کنسول Firebase روی آن کار میکنید، انتخاب کنید.
اگر پروژه شما در لیست نیست، ادامه دهید و پروژه را در Firebase اضافه کنید ( پروژه Google Cloud موجود خود را از لیست انتخاب کنید ).
برنامه افزودنی را پیکربندی کنید:
مجموعه ("حالت")، فیلد حاوی متن برای جاسازی ("حالت") و سایر پارامترها مانند ابعاد جاسازی را مشخص کنید.
اگر APIهایی وجود دارد که باید در این مرحله فعال شوند، صفحه پیکربندی به شما اجازه انجام این کار را می دهد، مراحل را مطابق با آن دنبال کنید.
اگر صفحه پس از مدتی فعال کردن APIها پاسخ نمیدهد، فقط Refresh کنید و باید بتوانید APIها را فعال کنید.
در یکی از مراحل زیر به شما این امکان را می دهد که از LLM انتخابی خود برای تولید جاسازی ها استفاده کنید. "Vertex AI" را انتخاب کنید.
چند تنظیمات بعدی مربوط به مجموعه شما و زمینه ای است که می خواهید جاسازی کنید:
LLM: Vertex AI
مسیر مجموعه: پوزها
محدودیت پرس و جو پیش فرض: 3
اندازه گیری فاصله: کسینوس
نام فیلد ورودی: وضعیت بدن
نام فیلد خروجی: embedding
نام فیلد وضعیت: وضعیت
قراردادن اسناد موجود: بله
به روز رسانی جاسازی های موجود: بله
مکان توابع ابری: us-central1
فعال کردن رویدادها: بررسی نشده است
پس از تنظیم همه این موارد، روی دکمه Install Extension کلیک کنید. این 3 تا 5 دقیقه طول می کشد.
ایجاد جاسازی ها:
همانطور که اسناد را در مجموعه "poses" اضافه یا به روز می کنید، برنامه افزودنی به طور خودکار با استفاده از یک مدل از پیش آموزش دیده یا مدل انتخابی شما از طریق یک نقطه پایانی API، جاسازی ها را ایجاد می کند. در این مورد ما Vertex AI را در پیکربندی افزونه انتخاب کرده ایم.
ایجاد شاخص
ایجاد Index در قسمت جاسازی در زمان استفاده از جاسازی در برنامه الزامی است.
Firestore به طور خودکار برای پرس و جوهای اساسی ایندکس ایجاد می کند. با این حال، میتوانید به Firestore اجازه دهید با اجرای پرسوجوهایی که ایندکس ندارند، نحو ایندکس را ایجاد کند و پیوندی به نمایه تولید شده در پیام خطا در سمت برنامه در اختیار شما قرار میدهد. در اینجا لیستی از مراحل ایجاد نمایه برداری آمده است:
- به ترمینال Cloud Shell بروید
- دستور زیر را اجرا کنید:
gcloud firestore indexes composite create --collection-group="poses" --query-scope=COLLECTION --database="(default)" --field-config vector-config='{"dimension":"768", "flat": "{}"}',field-path="embedding"
اطلاعات بیشتر در مورد آن را اینجا بخوانید.
هنگامی که یک نمایه برداری ایجاد شد، می توانید نزدیکترین همسایه را با جاسازی های برداری خود انجام دهید.
نکته مهم:
از این مرحله به بعد، شما نیازی به تغییر در منبع ندارید. فقط دنبال کنید تا بفهمید برنامه چه کاری انجام می دهد.
انجام جستجوی برداری
بیایید نگاهی به نحوه نزدیک شدن برنامه جدید ساخته شده شما به جستجوی برداری بیندازیم. هنگامی که embedding ها ذخیره شدند، می توانید از کلاس 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 مقایسه میکند و نزدیکترین متن را استخراج میکند.
7. فلش جمینی 2.0
یکپارچه سازی Gemini 2.0 Flash (برای تولید توضیحات)
بیایید نگاهی بیندازیم که چگونه برنامه جدید ساخته شده شما با ادغام Gemini 2.0 Flash برای تولید توضیحات مدیریت می کند.
حالا فرض کنید یک کاربر ادمین / مربی یوگا میخواهد جزئیات ژستها را با کمک فلش Gemini 2.0 وارد کند و سپس جستجوی انجام دهد تا نزدیکترین موارد را ببیند. این منجر به استخراج جزئیات ژست های تطبیق به همراه اشیاء چندوجهی می شود که از نتایج پشتیبانی می کنند.
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 قادر به تولید نتایج چندوجهی است، با این حال من هنوز برای دسترسی اولیه آن ثبت نام نکرده ام، بنابراین خروجی تصویر و صدا را به ترتیب با Imagen و TTS API تقلید کرده ام. تصور کنید چقدر عالی است که همه اینها را با یک تماس 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 بررسی کنید، قطعه کد زیر را برای فعال کردن زمینه جستجوی Google برای پاسخ LLM مشاهده خواهید کرد:
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);
این برای اطمینان از ما است:
- مدل ما را به نتایج جستجوی واقعی متصل کنید
- URL های مرتبطی که در جستجو به آنها ارجاع داده شده است را استخراج کنید
8. برنامه خود را اجرا کنید
بیایید با یک رابط وب ساده Thymeleaf به تمام قابلیت های برنامه تازه ساخته شده Java Spring Boot شما نگاهی بیندازیم:
- عملیات CRUD Firestore (ایجاد، خواندن، بهروزرسانی، حذف)
- جستجوی کلمات کلیدی
- ایجاد زمینه مبتنی بر هوش مصنوعی
- جستجوی متنی (جستجوی برداری)
- خروجی چندوجهی برای ارتباط با جستجو
- پرس و جوی خود را اجرا کنید (پرس و جوها در قالب ساختاری کوئری)
مثال: {"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 Recommender Pose
مرحله اختیاری:
برای استقرار آن در Cloud Run (با فرض اینکه یک برنامه کاملاً جدید را با Dockerfile بوت استرپ کرده اید و در صورت نیاز روی فایل ها کپی کرده اید)، دستور زیر را از ترمینال Cloud Shell از داخل فهرست پروژه خود اجرا کنید:
gcloud run deploy --source .
نام برنامه، کد منطقه را ارائه کنید (یکی را برای us-central1 انتخاب کنید) و فراخوانی غیرمجاز "Y" را همانطور که از شما خواسته شد انتخاب کنید. پس از موفقیت آمیز بودن استقرار، باید نقطه پایانی برنامه خود را در ترمینال دریافت کنید.
9. پاکسازی کنید
برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید:
- در کنسول Google Cloud، به صفحه مدیریت منابع بروید.
- در لیست پروژه، پروژه ای را که می خواهید حذف کنید انتخاب کنید و سپس روی Delete کلیک کنید.
- در محاوره، شناسه پروژه را تایپ کنید و سپس روی Shut down کلیک کنید تا پروژه حذف شود.
10. تبریک می گویم
تبریک می گویم! شما با موفقیت از Firestore برای ایجاد یک برنامه مدیریت پوسچر یوگا قوی و هوشمند استفاده کرده اید. با ترکیب قدرت Firestore، افزونه جستجوی برداری و قابلیتهای فلش Gemini 2.0 (با تولید تصویر و صدا شبیهسازی شده)، ما یک برنامه یوگا واقعا جذاب و آموزنده برای اجرای عملیات CRUD، انجام جستجوی مبتنی بر کلمه کلیدی، جستجوی برداری متنی، و تولید محتوای چندرسانهای ایجاد کردهایم.
این رویکرد به برنامه های یوگا محدود نمی شود. همانطور که مدلهای هوش مصنوعی مانند Gemini به تکامل خود ادامه میدهند، امکان ایجاد تجربههای کاربر حتی فراگیرتر و شخصیشدهتر افزایش مییابد. به خاطر داشته باشید که با آخرین پیشرفت ها و اسناد Google Cloud و Firebase به روز باشید تا از پتانسیل کامل این فناوری ها استفاده کنید.
اگر بخواهم این برنامه را گسترش دهم، سعی می کنم دو کار را با Gemini 2.0 Flash انجام دهم:
- Multimodal Live API را با ایجاد دید در زمان واقعی و پخش صدا برای مورد استفاده، استفاده کنید.
- حالت تفکر را درگیر کنید تا افکار پشت پاسخها را برای تعامل با دادههای همزمان ایجاد کنید تا تجربه را واقعیتر کنید.
با خیال راحت آن را امتحان کنید و یک درخواست کشش ارسال کنید :>D!!!