1. Genel Bakış
Sağlık ve fitness uygulamaları dünyasında kullanıcılara zengin ve ilgi çekici bir deneyim sunmak çok önemlidir. Yoga uygulaması için bu, duruşların basit metin açıklamalarının ötesine geçerek kapsamlı bilgiler, multimedya içerikler ve akıllı arama özellikleri sunmak anlamına gelir. Bu blogda, Google Cloud'un Firestore'unu kullanarak sağlam bir yoga pozu veritabanı oluşturmayı, bağlama dayalı eşleme için Vektör Arama Uzantısı'ndan yararlanmayı ve çoklu biçimli içeriklerle çalışmak için Gemini 2.0 Flash'ın (Deneysel) gücünü entegre etmeyi inceleyeceğiz.
Neden Firestore?
Google Cloud'un sunucusuz NoSQL belge veritabanı olan Firestore, ölçeklenebilir ve dinamik uygulamalar oluşturmak için mükemmel bir seçimdir. Bu nedenle, Yoga uygulamamız için mükemmel bir seçimdir:
- Ölçeklenebilirlik ve Performans: Firestore, milyonlarca kullanıcıyı ve büyük veri kümelerini işlemek için otomatik olarak ölçeklenir. Böylece, uygulamanız büyürken bile duyarlılığını korur.
- Gerçek Zamanlı Güncellemeler: Yerleşik gerçek zamanlı senkronizasyon, verileri bağlı tüm istemciler arasında tutarlı tutar. Bu sayede canlı sınıflar veya ortak alıştırma gibi özellikler için mükemmel bir çözümdür.
- Esnek Veri Modeli: Firestore'un belge tabanlı yapısı, metin, resim ve hatta gömmeler gibi çeşitli veri türlerini depolamanıza olanak tanır. Bu sayede Firestore, karmaşık yoga pozu bilgilerini temsil etmek için idealdir.
- Güçlü Sorgulama: Firestore, eşitlik, eşitsizlik ve yeni uzantıyla birlikte vektör benzerliği aramaları dahil olmak üzere karmaşık sorguları destekler.
- Çevrimdışı Destek: Firestore, verileri yerel olarak önbelleğe alarak uygulamanızın kullanıcılar çevrimdışıyken bile çalışmasını sağlar.
Firestore Vektör Arama Uzantısı ile Arama'yı Geliştirme
Yoga pozları gibi karmaşık kavramlarla uğraşırken geleneksel anahtar kelime tabanlı arama sınırlı olabilir. Bir kullanıcı, belirli bir pozun adını bilmeden "kalçaları açan" veya "dengeyi iyileştiren" bir poz arayabilir. İşte bu noktada Vector Search devreye girer.
Firestore ile Vektör Arama özelliği sayesinde şunları yapabilirsiniz:
- Embedding Oluşturma: Metin açıklamalarını ve gelecekte görselleri ve sesleri, Vertex AI'da bulunan modeller veya özel modeller gibi modelleri kullanarak anlamsal anlamlarını yakalayan sayısal vektör temsillerine (embedding'ler) dönüştürün.
- Gömmeleri depolama: Bu gömmeleri doğrudan Firestore dokümanlarına kaydedin.
- Benzerlik aramaları yapma: Belirli bir sorgu vektörüne semantik olarak benzer dokümanları bulmak için veritabanınızı sorgulayarak bağlamsal eşleştirmeyi etkinleştirin.
Gemini 2.0 Flash'i entegre etme (Deneysel)
Gemini 2.0 Flash, Google'ın son teknoloji çok formatlı yapay zeka modelidir. Henüz deneysel aşamada olan bu özellik, Yoga uygulamamızı zenginleştirmek için heyecan verici olanaklar sunuyor:
- Metin Oluşturma: Yoga pozlarının faydaları, modifikasyonları ve kontrendikasyonlarını içeren ayrıntılı açıklamaları oluşturmak için Gemini 2.0 Flash'ı kullanın.
- Görsel Oluşturma (Taklit Edilmiş): Gemini ile doğrudan görüntü oluşturma henüz herkese açık olarak kullanıma sunulmamış olsa da Google'ın Imagen'ini kullanarak bu özelliği simüle ettim ve pozları görsel olarak temsil eden resimler oluşturdum.
- Ses Oluşturma (Taklit Edilmiş): Benzer şekilde, her bir poz için sesli talimatlar oluşturmak ve kullanıcılara egzersiz boyunca rehberlik etmek üzere bir metin okuma (TTS) hizmeti kullanabiliriz.
Uygulamayı, modelin aşağıdaki özelliklerini kullanacak şekilde geliştirmek için entegrasyonu önermeyi düşünüyorum:
- Multimodal Live API: Bu yeni API, araç kullanımıyla anlık görüntü ve ses aktarma uygulamaları oluşturmanıza yardımcı olur.
- Hız ve performans: Gemini 2.0 Flash, Gemini 1.5 Flash'a kıyasla ilk jetona ulaşma süresi (TTFT) açısından önemli ölçüde iyileştirilmiştir.
- Daha iyi temsilci deneyimleri: Gemini 2.0; çoklu formatlı anlama, kodlama, karmaşık talimatları takip etme ve işlev çağırma konularında iyileştirmeler sunar. Bu iyileştirmeler, daha iyi temsilci deneyimleri sunmak için birlikte çalışır.
Daha fazla bilgi için bu doküman sayfasına%20over%20Gemini%201.5%20Flash) bakın.
Google Arama ile topraklama
Güvenilirliği artırmak ve daha fazla kaynak sağlamak için uygulamamız tarafından sağlanan bilgileri temellendirmek amacıyla Google Arama'yı entegre edebiliriz. Bu, şu anlama gelir:
- Bağlamsal Arama: Bir yönetici kullanıcı bir pozun ayrıntılarını girdiğinde, Google Arama'yı gerçekleştirmek için poz adını kullanabiliriz.
- URL Ayıklama: Arama sonuçlarından makaleler, videolar veya saygın yoga web siteleri gibi alakalı URL'leri ayıklayabilir ve bunları uygulama içinde gösterebiliriz.
Ne oluşturacaksınız?
Bu laboratuvarda şunları yapacaksınız:
- Firestore koleksiyonu oluşturun ve yoga dokümanlarını yükleyin
- Firestore ile CRUD uygulamaları oluşturmayı öğrenin
- Gemini 2.0 Flash ile yoga pozu açıklaması oluşturma
- Firestore entegrasyonuyla Firebase Vector Search'i etkinleştirme
- Yoga açıklamasından yerleştirilmiş öğeler oluşturma
- Kullanıcı arama metni için benzerlik araması yapma
Şartlar
2. Başlamadan önce
Proje oluşturma
- Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
- Cloud projenizde faturalandırmanın etkinleştirildiğinden emin olun. Projede faturalandırmanın etkin olup olmadığını nasıl kontrol edeceğinizi öğrenin .
- Google Cloud'da çalışan ve bq ile önceden yüklenmiş bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız. Google Cloud Console'un üst kısmından Cloud Shell'i etkinleştir'i tıklayın.
- Cloud Shell'e bağlandıktan sonra aşağıdaki komutu kullanarak kimliğinizin doğrulanıp doğrulanmadığını ve projenin proje kimliğinize ayarlanıp ayarlanmadığını kontrol edin:
gcloud auth list
- gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın.
gcloud config list project
- Projeniz ayarlanmadıysa ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project <YOUR_PROJECT_ID>
- Gerekli API'leri etkinleştirin.
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 komutunun alternatifi, her ürünü arayarak veya bu bağlantıyı kullanarak konsoldan geçmektir.
Atlanan bir API varsa uygulama sırasında istediğiniz zaman etkinleştirebilirsiniz.
gcloud komutları ve kullanımı için belgelere bakın.
3. Veritabanı kurulumu
Firestore örneği oluşturmayla ilgili daha ayrıntılı adımlar dokümanda yer almaktadır. Başlangıç olarak genel hatlarıyla şu adımları uygulayacağım:
1 Firestore Görüntüleyici'ye gidin ve veritabanı hizmeti seçin ekranında Yerel moddaki Firestore'u seçin.
- Firestore için konum seçme
- Veritabanı Oluştur'u tıklayın (Bu ilk kezse "(default)" veritabanı olarak bırakın)
Firestore projesi oluşturduğunuzda API, Cloud API Yöneticisi'nde de etkinleştirilir.
- ÖNEMLİ: Verilere erişilebilmesi için Güvenlik Kurallarının TEST (PRODÜKSİYON değil) sürümünü seçin.
- Kurulum tamamlandıktan sonra, aşağıdaki resimde gösterildiği gibi yerel modda Firestore veritabanı, koleksiyon ve belge görünümünü görürsünüz:
- Henüz bu adımı uygulamayın. Ancak "Koleksiyon Başlat"ı tıklayıp yeni bir koleksiyon oluşturabilirsiniz. Koleksiyon kimliğini "poses" olarak ayarlayın. Kaydet düğmesini tıklayın.
Prodüksiyon uygulaması için profesyonel ipuçları:
- Veri modelinizi tamamladıktan ve farklı doküman türlerine kimlerin erişebileceğini belirledikten sonra Firebase arayüzünden Güvenlik Kuralları oluşturabilir, düzenleyebilir ve izleyebilirsiniz. Güvenlik kurallarına şu bağlantıdan erişebilirsiniz: https://console.firebase.google.com/u/0/project/<<proje_kimliğiniz>>/firestore/rules
- Uygulamanızın farklı şekilde çalışmamasının nedeni genellikle güvenlik kurallarınızdan kaynaklanır. Bu nedenle, projeyi geliştirme aşamasından dağıtmadan / yayından çıkarmadan önce güvenlik kurallarınızı düzenlediğinizden, izlediğinizden ve test ettiğinizden emin olun.
Bu demo için TEST modunda kullanacağız.
4. Firestore REST API
- REST API, aşağıdaki kullanım alanları için yararlı olabilir:a. Tam bir istemci kitaplığının çalıştırılmasının mümkün olmadığı, kaynak açısından kısıtlanmış bir ortamdan Firestore'a erişme Veritabanı yönetimini otomatikleştirme veya ayrıntılı veritabanı meta verilerini alma
- Firestore'u kullanmanın en kolay yolu, yerel istemci kitaplıklarından birini kullanmaktır. Ancak REST API'yi doğrudan çağırmanın yararlı olduğu bazı durumlar vardır.
- Bu blog kapsamında, yerel istemci kitaplıklarının değil, Firestore REST API'lerinin kullanımını ve gösterimini göreceksiniz.
- Firestore REST API, kimlik doğrulama için Firebase Authentication kimlik jetonunu veya Google Identity OAuth 2.0 jetonunu kabul eder. Kimlik doğrulama ve yetkilendirme hakkında daha fazla bilgi için dokümanlara bakın.
- Tüm REST API uç noktaları, https://firestore.googleapis.com/v1/ temel URL'si altında bulunur.
Spring Boot ve Firestore API
Spring Boot Framework'deki bu çözüm, yoga duruşu ve nefes ayrıntılarını kullanıcı etkileşimli bir deneyimle toplamak ve değiştirmek için Firestore API'lerini kullanan bir istemci uygulamasını göstermek içindir.
Yoga pozları uygulamasının Firestore CRUD çözümü bölümünün adım adım ayrıntılı açıklamasını blog bağlantısında bulabilirsiniz.
Mevcut çözüme odaklanmak ve CRUD bölümünü hareket halindeyken öğrenmek için Cloud Shell Terminal'inizden aşağıdaki depoda bu bloga odaklanan çözümün tamamını klonlayın ve kod tabanının bir kopyasını alın.
git clone https://github.com/AbiramiSukumaran/firestore-poserecommender
Not:
- Bu deposu klonladıktan sonra proje kimliğiniz, API'leriniz vb. ile ilgili birkaç değişiklik yapmanız yeterlidir. Uygulamanızın çalışmaya başlaması için başka bir değişiklik yapmanız gerekmez. Uygulamanın her bir bileşeni sonraki bölümlerde açıklanmıştır. Değişikliklerin listesi aşağıda verilmiştir:
src/main/java/com/example/demo/GenerateImageSample.java
dosyasında "<<YOUR_PROJECT_ID>>" ifadesini proje kimliğinizle değiştirin.src/main/java/com/example/demo/GenerateEmbeddings.java
dosyasında "<<YOUR_PROJECT_ID>>" ifadesini proje kimliğinizle değiştirin.src/main/java/com/example/demo/PoseController.java
içinde, "<<YOUR_PROJECT_ID>>"
ve veritabanı adı,
(bu durumda"(default)",
) ifadelerinin tüm örneklerini yapılandırmanızdaki uygun değerlerle değiştirin:src/main/java/com/example/demo/PoseController.java
bölümünde "[YOUR_API_KEY]
" ifadesini Gemini 2.0 Flash için API ANAHTARINIZLA değiştirin. Bu anahtarı AI Studio'dan alabilirsiniz.- Yerel olarak test etmek istiyorsanız Cloud Shell Terminal'deki proje klasöründen aşağıdaki komutları çalıştırın:
mvn package
mvn spring-boot:run
Şu anda Cloud Shell Terminal'de "web önizlemesi" seçeneğini tıklayarak uygulamanızı çalışırken görüntüleyebilirsiniz. Henüz testler yapmaya ve uygulamayı denemeye hazır değiliz.
- İsteğe bağlı: Uygulamayı Cloud Run'a dağıtmak istiyorsanız Cloud Shell Düzenleyici'de sıfırdan yepyeni bir Java Cloud Run uygulaması oluşturmanız ve repo bulunan src dosyalarını ve şablon dosyalarını ilgili klasörlerdeki yeni projenize eklemeniz gerekir (mevcut GitHub deposu projesi, Cloud Run dağıtım yapılandırması için varsayılan olarak ayarlanmadığından). Bu durumda, aşağıdaki adımlar uygulanmalıdır (mevcut repoyu klonlamak yerine):
- Cloud Shell Düzenleyici'ye gidin (Terminalin değil, Düzenleyici'nin açık olduğundan emin olun), durum çubuğunun sol tarafındaki Google Cloud projesi adı simgesini (aşağıdaki ekran görüntüsünde engellenen kısım) tıklayın.
- Seçim listesinden Yeni uygulama -> Cloud Run Uygulaması -> Java: Cloud Run'u seçin ve uygulamaya "firestore-poserecommender" adını verin.
- Artık Java Cloud Run uygulaması için önceden yapılandırılmış ve kullanıma hazır bir tam yığın şablonu göreceksiniz.
- Mevcut Controller sınıfını kaldırın ve aşağıdaki dosyaları proje yapısındaki ilgili klasörlere kopyalayın:
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 ve API_KEY değerlerini kendi değerlerinizle değiştirmek için ilgili dosyalarda değişiklikler yapmanız gerekir. (yukarıdaki 1. a,b, c ve d adımları).
5. Veri Kullanımı
Uygulamanın verileri şu dosyada yer alır: data.json https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json
Önceden tanımlanmış verilerle başlamak isterseniz JSON'u kopyalayıp "<<PROJECT_ID_YOUR>>" ifadesinin tüm kullanımlarını kendi değerinizle değiştirebilirsiniz.
- Firestore Studio'ya gidin.
- "Pozlar" adlı bir koleksiyon oluşturduğunuzdan emin olun.
- Yukarıda belirtilen repo dosyasından belgeleri tek tek manuel olarak ekleyin
Alternatif olarak, aşağıdaki adımları uygulayarak sizin için oluşturduğumuz önceden tanımlanmış veri kümesinden verileri tek seferde içe aktarabilirsiniz:
- Cloud Shell Terminal'e gidin ve etkin Google Cloud projenizin ayarlandığından ve yetkilendirildiğinizden emin olun. Aşağıda verilen gsutil komutunu kullanarak projenizde bir paket oluşturun. Aşağıdaki komuttaki <PROJECT_ID> değişkenini Google Cloud proje kimliğinizle değiştirin:
gsutil mb -l us gs://<PROJECT_ID>-yoga-poses-bucket
- Paket oluşturulduğuna göre, Firebase veritabanına aktarmadan önce hazırladığımız veritabanı dışa aktarma işlemini bu pakete kopyalamamız gerekiyor. Aşağıdaki komutu kullanın:
gsutil cp -r gs://demo-bq-gemini-public/yoga_poses gs://<PROJECT_ID>-yoga-poses-bucket
İçe aktarılacak verilere sahip olduğumuza göre, verileri oluşturduğumuz Firebase veritabanına (varsayılan) aktarma işleminin son adımına geçebiliriz.
- Şimdi Firestore konsoluna gidin ve soldaki gezinme menüsünden İçe Aktar/Dışa Aktar'ı tıklayın.
İçe aktar'ı seçin ve yeni oluşturduğunuz Cloud Storage yolunu seçin. Ardından "yoga_poses.overall_export_metadata" dosyasını seçene kadar gezinin:
- İçe Aktar'ı tıklayın.
İçe aktarma işlemi birkaç saniye sürer. İşlem tamamlandıktan sonra https://console.cloud.google.com/firestore/databases adresine gidip varsayılan veritabanını ve aşağıdaki gibi pozisyonlar koleksiyonunu seçerek Firestore veritabanınızı ve koleksiyonunuzu doğrulayabilirsiniz:
- "Yeni Poz Oluştur" işlemini kullanarak dağıttıktan sonra kayıtları uygulama üzerinden manuel olarak da oluşturabilirsiniz.
6. Vektör Arama
Firestore Vektör Arama Uzantısı'nı etkinleştirme
Firestore belgelerinizi yeni vektör arama özelliğiyle otomatik olarak yerleştirmek ve sorgulamak için bu uzantıyı kullanın. Bu işlem sizi Firebase Extensions Hub'a yönlendirir.
Vektör Arama uzantısını yüklediğinizde bir koleksiyon ve bir belge alanı adı belirtirsiniz. Bu alanla bir doküman eklemek veya mevcut bir dokümanı güncellemek, bu uzantının doküman için bir vektör yerleştirme hesaplamasını tetikler. Bu vektör gömmesi aynı dokümana geri yazılır ve doküman, sorgulamaya hazır olacak şekilde vektör deposunda dizine eklenir.
Adımları birlikte inceleyelim:
Uzantıyı yükleme:
"Firebase Konsolu'na yükle"yi tıklayarak Firebase Uzantı Pazar Yeri'nden "Firestore ile Vektör Arama" uzantısını yükleyin.
ÖNEMLİ:
Bu uzantılar sayfasına ilk kez gittiğinizde, Firebase konsolunda listelenen Google Cloud Console'da üzerinde çalıştığınız projeyi seçmeniz gerekir.
Projeniz listede yoksa projeyi Firebase'e ekleyin (listeden mevcut Google Cloud projenizi seçin).
Uzantıyı yapılandırma:
Koleksiyonu ("poses"), yerleştirilecek metni içeren alanı ("posture") ve yerleştirme boyutları gibi diğer parametreleri belirtin.
Bu adımda etkinleştirilmesi gereken API'ler varsa yapılandırma sayfası bunu yapmanıza olanak tanır. Adımları uygun şekilde uygulayın.
API'leri etkinleştirdikten sonra sayfa bir süre boyunca yanıt vermezse sayfayı yenilemeniz yeterlidir. Yeniledikten sonra API'lerin etkinleştirildiğini görebilirsiniz.
Aşağıdaki adımlardan birinde, yerleştirmeleri oluşturmak için istediğiniz LLM'yi kullanmanıza olanak tanır. "Vertex AI"ı seçin.
Sonraki birkaç ayar, koleksiyonunuz ve yerleştirmek istediğiniz alanla ilgilidir:
LLM: Vertex AI
Koleksiyon yolu: pozlar
Varsayılan sorgu sınırı: 3
Mesafe ölçümü: Kosinüs
Giriş alanı adı: posture
Çıkış alanı adı: embedding
Durum alanı adı: durum
Mevcut dokümanları yerleştir: Evet
Mevcut yerleştirmeleri güncelle: Evet
Cloud Functions konumu: us-central1
Etkinlikleri Etkinleştir: İşaretli değil
Tüm bu ayarlar yapıldıktan sonra Uzantıyı Yükle düğmesini tıklayın. Bu işlem 3-5 dakika sürer.
Yerleştirilmiş öğeler oluşturma:
"Pozlar" koleksiyonuna belge ekledikçe veya mevcut belgeleri güncelledikçe uzantı, API uç noktası üzerinden önceden eğitilmiş bir modeli veya seçtiğiniz bir modeli kullanarak otomatik olarak yerleştirmeler oluşturur. Bu örnekte, uzantı yapılandırmasında Vertex AI'ı seçtik.
Dizin Oluşturma
Yerleşim, uygulamada kullanıldığında yerleşim alanında dizine ekleme işleminin yapılmasını zorunlu kılar.
Firestore, temel sorgular için dizinleri otomatik olarak oluşturur. Ancak dizin içermeyen sorgular çalıştırarak Firestore'un dizin söz dizimini oluşturmasına izin verebilirsiniz. Bu durumda, uygulama tarafındaki hata mesajında oluşturulan dizinin bağlantısı sağlanır. Vektör dizini oluşturma adımlarının listesi aşağıda verilmiştir:
- Cloud Shell Terminal'e gitme
- Aşağıdaki komutu çalıştırın:
gcloud firestore indexes composite create --collection-group="poses" --query-scope=COLLECTION --database="(default)" --field-config vector-config='{"dimension":"768", "flat": "{}"}',field-path="embedding"
Bu konu hakkında daha fazla bilgiye buradan ulaşabilirsiniz.
Bir vektör dizini oluşturulduktan sonra, vektör gömmelerinizle en yakın komşu araması yapabilirsiniz.
Önemli Not:
Bu noktadan itibaren kaynakta herhangi bir değişiklik yapmanız gerekmez. Uygulamanın ne yaptığını anlamak için adımları uygulayın.
Vektör araması yapma
Yeni oluşturduğunuz uygulamanın Vektör Arama'ya nasıl yaklaştığına göz atalım. Yerleşimler depolandıktan sonra, vektör araması yapmak ve en yakın komşu sonuçlarını almak için Firestore Java SDK'sının VectorQuery sınıfını kullanabilirsiniz:
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();
Bu snippet, kullanıcı arama metninin yerleştirilmesini Firestore'daki dokümanların yerleştirilmesiyle karşılaştırır ve bağlama en yakın olanı çıkarır.
7. Gemini 2.0 Flash
Gemini 2.0 Flash'i entegre etme (açıklama oluşturma için)
Yeni oluşturduğunuz uygulamanın, açıklama oluşturma için Gemini 2.0 Flash entegrasyonunu nasıl işlediğine bakalım.
Bir yönetici kullanıcının / yoga eğitmeninin, Gemini 2.0 Flash'ın yardımıyla pozların ayrıntılarını girip en yakın eşleşmeleri görmek için arama yaptığını varsayalım. Bu işlem sonucunda, eşleşen pozların ayrıntıları ve sonuçları destekleyen çoklu biçimli nesneler ayıklanır.
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);
a. Görüntü ve Ses Üretme'yi Taklit Etme
Gemini 2.0 Flash Experimental, çok formatlı sonuçlar üretebilir ancak henüz erken erişim için kaydolmadığım için resim ve ses çıkışını sırasıyla Imagen ve TTS API'leriyle taklit ettim. Tüm bunların Gemini 2.0 Flash'a tek bir API çağrısıyla oluşturulmasının ne kadar harika olduğunu bir düşünün.
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";
}
}
b. Google Arama ile temellendirme:
6. adımdaki Gemini çağırma kodunu kontrol ederseniz LLM yanıtı için Google Arama'yı bağlama uydurma özelliğini etkinleştiren aşağıdaki kod snippet'ini görürsünüz:
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);
Bu sayede:
- Modelimizi gerçek arama sonuçlarına dayandırın
- Aramada atıfta bulunulan alakalı URL'leri ayıklayın
8. Uygulamanızı çalıştırma
Basit bir Thymeleaf web arayüzüyle yeni oluşturduğunuz Java Spring Boot uygulamanızın tüm özelliklerine göz atalım:
- Firestore CRUD işlemleri (Oluşturma, Okuma, Güncelleme, Silme)
- Anahtar Kelime Arama
- Üretken yapay zeka tabanlı bağlam oluşturma
- Bağlama Dayalı Arama (Vektör Arama)
- Aramayla ilişkilendirilecek çok modlu çıkış
- Kendi Sorgunuzu Çalıştırma (structuredQuery biçimindeki sorgular)
Örnek: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}
Şimdiye kadar bahsedilen tüm özellikler, şu depodan yeni oluşturduğunuz uygulamanın bir parçasıdır: https://github.com/AbiramiSukumaran/firestore-poserecommender
Uygulamayı derlemek, çalıştırmak ve dağıtmak için Cloud Shell Terminal'de aşağıdaki komutları çalıştırın:
mvn package
mvn spring-boot:run
Sonuçları görür ve uygulamanızın özellikleriyle oynayabilirsiniz. Çıktının demosu için aşağıdaki videoya göz atın:
Firestore, Vector Search ve Gemini 2.0 Flash ile Poz Önerici
İsteğe bağlı adım:
Cloud Run'a dağıtmak için (Dockerfile ile yepyeni bir uygulamayı temel oluşturduğunuz ve dosyaları gerektiği gibi kopyaladığınız varsayılarak) proje dizininizden Cloud Shell Terminal'de aşağıdaki komutu çalıştırın:
gcloud run deploy --source .
Uygulama adını, bölge kodunu (us-central1 için olanı seçin) girin ve istendiğinde kimliği doğrulanmamış çağrıyı "Y" olarak seçin. Dağıtım başarılı olduğunda terminalde uygulama uç noktanızı görürsünüz.
9. Temizleme
Bu yayında kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız şu adımları uygulayın:
- Google Cloud Console'da Kaynakları yönetin sayfasına gidin.
- Proje listesinde, silmek istediğiniz projeyi seçin ve ardından Sil'i tıklayın.
- İletişim kutusuna proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.
10. Tebrikler
Tebrikler! Sağlam ve akıllı bir yoga duruşu yönetimi uygulaması oluşturmak için Firestore'u başarıyla kullandınız. Firestore'un gücünü, Vektör Arama Uzantısı'nı ve Gemini 2.0 Flash'ın (sanal resim ve ses oluşturma özelliğiyle) özelliklerini birleştirerek CRUD işlemlerini uygulamak, anahtar kelimeye dayalı arama, bağlama dayalı vektör arama ve oluşturulmuş multimedya içeriği gerçekleştirmek için gerçekten ilgi çekici ve bilgilendirici bir Yoga uygulaması oluşturduk.
Bu yaklaşım, yoga uygulamalarıyla sınırlı değildir. Gemini gibi yapay zeka modelleri gelişmeye devam ettikçe daha da etkileyici ve kişiselleştirilmiş kullanıcı deneyimleri oluşturma olanakları artacaktır. Bu teknolojilerin potansiyelinden tam olarak yararlanmak için Google Cloud ve Firebase'daki en son gelişmelerden ve dokümanlardan haberdar olmayı unutmayın.
Bu uygulamayı genişletecek olsam Gemini 2.0 Flash ile iki şey yapmaya çalışırdım:
- Kullanım alanı için gerçek zamanlı görüntü ve ses akışı oluşturarak Multimodal Live API'yi kullanmaya başlayın.
- Deneyimi daha gerçekçi hale getirmek için Düşünme Modu'nu kullanarak anlık verilerle etkileşime yönelik yanıtların arkasındaki düşünceleri oluşturun.
Deneyebilir ve bir çekme isteği gönderebilirsiniz :>D!!!