Firestore, Vektör Arama ve Gemini 2.0 (Java sürümü) ile bağlama dayalı yoga pozu önerici uygulaması oluşturun.

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, pozların basit metin açıklamalarının ötesine geçmek, kapsamlı bilgiler, multimedya içerikleri ve akıllı arama özellikleri sunmak anlamına gelir. Bu blogda, Google Cloud'un Firestore'unu kullanarak nasıl sağlam bir yoga pozu veritabanı oluşturacağımızı, bağlamsal eşleştirme için vektör arama uzantısından nasıl yararlanacağımızı ve çok formatlı içeriklerle çalışmak için Gemini 2.0 Flash'ın (deneysel) gücünü nasıl entegre edeceğimizi ele alacağız.

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. Yoga uygulamamız için neden mükemmel bir seçim olduğunu aşağıda açıklıyoruz:

  • Ö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üdükçe yanıt vermeye devam eder.
  • Gerçek zamanlı güncellemeler: Yerleşik gerçek zamanlı senkronizasyon, bağlı tüm istemcilerdeki verilerin tutarlı kalmasını sağlar. Bu sayede canlı dersler veya ortak çalışma gibi özellikler için idealdir.
  • Esnek Veri Modeli: Firestore'un doküman tabanlı yapısı, metin, resim ve hatta yerleştirmeler de dahil olmak üzere çeşitli veri türlerini depolamanıza olanak tanır. Bu da Firestore'u karmaşık yoga pozu bilgilerini temsil etmek için ideal kılar.
  • Güçlü Sorgulama: Firestore; eşitlik, eşitsizlik ve artık yeni uzantıyla birlikte vektör benzerliği aramaları dahil olmak üzere karmaşık sorguları destekler.
  • Çevrimdışı Destek: Firestore, verileri yerel olarak önbelleğe alır. Bu sayede uygulamanız, kullanıcılar çevrimdışıyken bile çalışabilir.

Firestore Vector Search uzantısıyla aramayı geliştirme

Geleneksel anahtar kelime tabanlı arama, yoga pozları gibi karmaşık kavramlarla uğraşırken sınırlayıcı olabilir. Kullanıcılar, belirli bir pozun adını bilmeden "kalçaları açan" veya "dengeyi artıran" bir poz arayabilir. İşte bu noktada Vector Search devreye girer.

Firestore ile Vektör Arama özelliği sayesinde:

  • Yerleştirmeler Oluşturma: Metin açıklamalarını, gelecekte ise muhtemelen resimleri ve sesleri, Vertex AI'da bulunanlar gibi modelleri veya özel modelleri kullanarak anlamlarını yakalayan sayısal vektör gösterimlerine (yerleştirmeler) dönüştürün.
  • Yerleştirmeleri Depolama: Bu yerleştirmeleri doğrudan Firestore belgelerinde depolayın.
  • Benzerlik Aramaları Yapma: Bağlamsal eşleşmeyi etkinleştirerek belirli bir sorgu vektörüne semantik olarak benzeyen belgeleri bulmak için veritabanınızda sorgu yapın.

Gemini 2.0 Flash'ı (deneysel) entegre etme

Gemini 2.0 Flash, Google'ın en yeni çok formatlı yapay zeka modelidir. Bu özellik henüz deneysel aşamada olsa da Yoga uygulamamızı zenginleştirmek için heyecan verici olanaklar sunuyor:

  • Metin Üretme: Faydaları, değişiklikleri ve kontrendikasyonları da dahil olmak üzere yoga pozlarının ayrıntılı açıklamalarını oluşturmak için Gemini 2.0 Flash'i kullanın.
  • Görüntü Üretme (Taklit Edildi): Gemini ile doğrudan görüntü üretme özelliği henüz herkese açık olarak kullanılamasa da Google'ın Imagen'ını kullanarak bunu simüle ettim ve pozları görsel olarak temsil eden görüntüler ürettim.
  • Ses Üretimi (Taklit Edilmiş): Benzer şekilde, her poz için sesli talimatlar oluşturmak ve kullanıcılara alıştırma boyunca rehberlik etmek amacıyla metin okuma (TTS) hizmeti kullanabiliriz.

Uygulamayı geliştirmek için entegrasyon önermeyi planlıyorum. Bu entegrasyon, modelin aşağıdaki özelliklerini kullanacak:

  • Çok formatlı Live API: Bu yeni API, araç kullanımıyla gerçek zamanlı görsel ve ses akışı uygulamaları oluşturmanıza yardımcı olur.
  • Hız ve performans: Gemini 2.0 Flash, Gemini 1.5 Flash'e kıyasla ilk jetona kadar geçen süreyi (TTFT) önemli ölçüde iyileştiriyor.
  • Gelişmiş ajan tabanlı deneyimler: Gemini 2.0; çok formatlı anlama, kodlama, karmaşık talimatları takip etme ve işlev çağrısı konusunda iyileştirmeler sunar. Bu iyileştirmeler, daha iyi bir temsilci deneyimi sunmak için birlikte çalışır.

Daha fazla bilgi için Gemini 1.5 Flash ile ilgili bu doküman sayfasına bakın.

Güvenilirliği artırmak ve daha fazla kaynak sağlamak için Google Arama'yı entegre ederek uygulamamızın sağladığı bilgileri temellendirebiliriz. Bu şu anlama gelir:

  • Bağlama Dayalı Arama: Bir yönetici kullanıcı bir pozun ayrıntılarını girdiğinde, Google Arama yapmak için poz adını kullanabiliriz.
  • URL Çıkarma: Arama sonuçlarından makaleler, videolar veya saygın yoga web siteleri gibi alakalı URL'leri çıkarıp uygulamada gösterebiliriz.

Ne oluşturacaksınız?

Bu laboratuvar kapsamında şunları yapacaksınız:

  1. Firestore koleksiyonu oluşturma ve Yoga dokümanlarını yükleme
  2. Firestore ile CRUD uygulamaları oluşturmayı öğrenin
  3. Gemini 2.0 Flash ile yoga pozu açıklaması oluşturma
  4. Firebase Vector Search'ü Firestore entegrasyonuyla etkinleştirme
  5. Yoga açıklamasından yerleştirilmiş öğeler oluşturma
  6. Kullanıcı arama metni için benzerlik araması yapma

Şartlar

  • Chrome veya Firefox gibi bir tarayıcı
  • Faturalandırmanın etkin olduğu bir Google Cloud projesi.

2. Başlamadan önce

Proje oluşturma

  1. Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
  2. Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını kontrol etmeyi öğrenin .
  3. bq'nun önceden yüklendiği, Google Cloud'da çalışan 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'i etkinleştir düğmesinin resmi

  1. Cloud Shell'e bağlandıktan sonra aşağıdaki komutu kullanarak kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını kontrol edin:
gcloud auth list
  1. 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
  1. Projeniz ayarlanmamışsa ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project <YOUR_PROJECT_ID>
  1. "Etkinleştir" düğmesini tıklayabilene kadar bu bağlantıyı takip ederek gerekli API'leri etkinleştirin.

Herhangi bir API atlanırsa uygulama sırasında istediğiniz zaman etkinleştirebilirsiniz.

gcloud komutları ve kullanımı için belgelere bakın.

3. Veritabanı kurulumu

Belgelerde, Firestore örneği oluşturmayla ilgili daha kapsamlı adımlar yer almaktadır. Başlamak için genel olarak şu adımları uygulayacağım:

1 Firestore Görüntüleyici'ye gidin ve Veritabanı hizmeti seçin ekranında Firestore'u Yerel modda seçin.

  1. Firestore'unuz için bir konum seçin (us-central1'i seçtiğinizden emin olun ve bu codelab'de bölge / konum seçtiğiniz her yerde bu seçimi yapın)
  2. Veritabanı Oluştur'u tıklayın (ilk kez yapıyorsanız varsayılan veritabanı olarak bırakın).

Firestore projesi oluşturduğunuzda Cloud API Yöneticisi'nde de API etkinleştirilir.

  1. ÖNEMLİ: Verilere erişilebilmesi için Güvenlik Kuralları'nın TEST (ÜRETİM değil) sürümünü seçin.
  2. 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:

f7136d53253c59a.png

  1. Bu adımı henüz yapmayın ancak kayıtlara geçmesi için "Koleksiyonu başlat"ı tıklayıp yeni bir koleksiyon oluşturabileceğinizi belirtmek isteriz. Koleksiyon kimliğini "poses" olarak ayarlayın. Kaydet düğmesini tıklayın.

a26eb470aa9bfda9.png

Üretim uygulaması için uzman ipuçları:

  1. Veri modelinizi tamamlayıp farklı türdeki dokümanlara kimlerin erişebileceğini belirledikten sonra Firebase arayüzünden güvenlik kuralları oluşturabilir, düzenleyebilir ve bunları izleyebilirsiniz. Güvenlik kurallarına şu bağlantıdan erişebilirsiniz: https://console.firebase.google.com/u/0/project/<<your_project_id>>/firestore/rules
  2. Projeyi geliştirme aşamasından dağıtmadan / kullanıma sunmadan önce güvenlik kurallarınızı düzenlediğinizden, izlediğinizden ve test ettiğinizden emin olun. Çünkü uygulamanızın farklı şekilde çalışmasının nedeni genellikle güvenlik kurallarıdır. :)

Bu demoda TEST modunda kullanacağız.

4. Firestore REST API

  1. REST API, aşağıdaki kullanım alanlarında faydalı olabilir:a. Tam bir istemci kitaplığının çalıştırılmasının mümkün olmadığı, kaynak açısından kısıtlı bir ortamdan Firestore'a erişme Veritabanı yönetimini otomatikleştirme veya ayrıntılı veritabanı meta verilerini alma
  2. Firestore'u kullanmanın en kolay yolu yerel istemci kitaplıklarından birini kullanmaktır. Ancak bazı durumlarda REST API'yi doğrudan çağırmak faydalı olabilir.
  3. Bu blog kapsamında, yerel istemci kitaplıklarının değil, Firestore REST API'lerinin kullanımını ve gösterimini göreceksiniz.
  4. 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 konusu hakkında daha fazla bilgi için belgelere bakın.
  5. 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'teki bu çözüm, kullanıcı etkileşimli bir deneyimle Yoga duruşu ve nefes ayrıntılarını toplamak ve değiştirmek için Firestore API'lerini kullanan bir istemci uygulamasını göstermek amacıyla hazırlanmıştır.

Yoga pozları uygulamasının Firestore CRUD çözümü bölümünün adım adım ayrıntılı açıklaması için blog bağlantısını inceleyebilirsiniz.

Mevcut çözüme odaklanmak ve CRUD bölümünü öğrenmek için aşağıdaki depodan bu bloga odaklanan çözümün tamamını Cloud Shell Terminalinizden klonlayın ve kod tabanının bir kopyasını alın.

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

Not:

  1. Bu depoyu klonladıktan sonra, proje kimliğiniz, API'leriniz vb. ile ilgili birkaç değişiklik yapmanız yeterlidir. Uygulamanızın çalışır duruma gelmesi için başka bir değişiklik yapmanız gerekmez. Uygulamanın her bir bileşeni sonraki bölümlerde açıklanmaktadır. Değişikliklerin listesi:
  2. src/main/java/com/example/demo/GenerateImageSample.java dosyasında "<<YOUR_PROJECT_ID>>" yerine proje kimliğinizi girin.
  3. src/main/java/com/example/demo/GenerateEmbeddings.java dosyasında "<<YOUR_PROJECT_ID>>" yerine proje kimliğinizi girin.
  4. src/main/java/com/example/demo/PoseController.java içinde, "<<YOUR_PROJECT_ID>>" ve bu örnekteki veritabanı adı , "(default)"," ifadelerinin tüm örneklerini yapılandırmanızdaki uygun değerlerle değiştirin:
  5. src/main/java/com/example/demo/PoseController.java içinde "[YOUR_API_KEY]" kısmını Gemini 2.0 Flash için API anahtarınızla değiştirin. Bu kodu AI Studio'dan alabilirsiniz.
  6. Yerel olarak test etmek istiyorsanız Cloud Shell terminalindeki proje klasöründen aşağıdaki komutları çalıştırın:
mvn package

mvn spring-boot:run

Şu anda, Cloud Shell Terminal'den "web önizlemesi" seçeneğini tıklayarak çalışan uygulamanızı görüntüleyebilirsiniz. Henüz test yapmaya ve uygulamayı denemeye hazır değiliz.

  1. İsteğe bağlı: Uygulamayı Cloud Run'da dağıtmak istiyorsanız Cloud Shell Düzenleyici'den sıfırdan yeni bir Java Cloud Run uygulaması başlatmanız ve depodaki src dosyalarını ve şablon dosyalarını yeni projenize ilgili klasörlere eklemeniz gerekir (çünkü mevcut GitHub depo projesi, Cloud Run dağıtım yapılandırması için varsayılan olarak ayarlanmamıştır). Bu durumda (mevcut depoyu klonlamak yerine) aşağıdaki adımlar uygulanır:
  2. 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 tıklayın (aşağıdaki ekran görüntüsünde karartılmış kısım).

d3f0de417094237d.png

  1. Seçenekler listesinden Yeni uygulama -> Cloud Run Uygulaması -> Java: Cloud Run'ı seçin ve "firestore-poserecommender" olarak adlandırın.

d5ef8b4ca8bf3f85.png

  1. Artık Java Cloud Run uygulaması için önceden yapılandırılmış ve kullanıma hazır bir tam yığın şablonu görmelisiniz.
  2. Mevcut denetleyici 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/

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

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

  1. contextsearch.html
  2. createpose.html
  3. errmessage.html
  4. pose.html
  5. ryoq.html
  6. searchpose.html
  7. showmessage.html

firestore-poserecommender/

  1. Dockerfile
  2. PROJECT ID ve API KEY değerlerini kendi değerlerinizle değiştirmek için ilgili dosyalarda değişiklik yapmanız gerekir. (Yukarıdaki 1 a,b, c ve d adımları)

5. Veri Kullanımı

Uygulama verileri şu data.json dosyasında mevcuttur: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json

Önceden tanımlanmış bazı verilerle başlamak isterseniz JSON'u kopyalayıp "<<YOUR_PROJECT_ID>>"nin tüm örneklerini kendi değerinizle değiştirebilirsiniz.

  • Firestore Studio'ya gidin.
  • "pozlar" adlı bir koleksiyon oluşturduğunuzdan emin olun.
  • Yukarıda belirtilen depo 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ış kümeden tek seferde veri içe aktarabilirsiniz:

  1. Cloud Shell Terminali'ne gidin, etkin Google Cloud projenizin ayarlandığından ve yetkilendirildiğinizden emin olun. Aşağıda verilen gsutil komutuyla projenizde bir paket oluşturun. Aşağıdaki komutta <PROJECT_ID> değişkenini Google Cloud proje kimliğinizle değiştirin:

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

  1. Paket oluşturulduğuna göre, Firebase veritabanına aktarabilmemiz için hazırladığımız veritabanı dışa aktarma işlemini bu pakete kopyalamamız gerekir. 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 verilerimiz olduğuna göre, oluşturduğumuz Firebase veritabanına (varsayılan) veri aktarma işleminin son adımına geçebiliriz.

  1. Şimdi Firestore konsoluna gidin ve soldaki gezinme menüsünden İçe/Dışa Aktar'ı tıklayın.

İçe aktar'ı seçin ve yeni oluşturduğunuz Cloud Storage yolunu belirleyin. "yoga_poses.overall_export_metadata" dosyasını seçebilene kadar ilerleyin:

f5c1d16df7d5a64a.png

  1. İçe Aktar'ı tıklayın.

İçe aktarma işlemi birkaç saniye sürer. İşlem tamamlandığında https://console.cloud.google.com/firestore/databases adresini ziyaret ederek Firestore veritabanınızı ve koleksiyonunuzu doğrulayabilirsiniz. Aşağıda gösterildiği gibi varsayılan veritabanını ve poses koleksiyonunu seçin:

  1. Başka bir yöntem olarak, "Yeni Poz Oluştur" işlemini kullanarak dağıtım yaptıktan sonra kayıtları uygulamadan manuel olarak da oluşturabilirsiniz.

6. Vector Search

Firestore Vector Search uzantısını etkinleştirme

Yeni vektör arama özelliğiyle Firestore belgelerinizi otomatik olarak yerleştirmek ve sorgulamak için bu uzantıyı kullanın. Bu işlem sizi Firebase Extensions Hub'a yönlendirir.

Vector Search uzantısını yüklediğinizde bir koleksiyon ve belge alanı adı belirtirsiniz. Bu alanı içeren bir doküman eklemek veya güncellemek, bu uzantının doküman için bir vektör yerleştirme hesaplamasına neden olur. Bu vektör yerleştirme aynı belgeye geri yazılır ve belge, vektör deposunda dizine eklenir. Böylece belgeye karşı sorgu oluşturulabilir.

Adımlara göz atalım:

Uzantıyı yükleme:

Firebase Extensions Marketplace'ten "Firestore ile Vektör Arama" uzantısını yüklemek için "Firebase Konsolu'na yükle"yi tıklayın.

Ö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.

715426b97c732649.png

Projeniz listede yoksa Firebase'de projeyi 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 listeleniyorsa yapılandırma sayfası bunları etkinleştirmenize olanak tanır. Adımları buna göre uygulayın.

API'ler etkinleştirildikten sonra sayfa bir süre yanıt vermezse sayfayı yenileyin. Etkinleştirilen API'leri görebilirsiniz.

5ba59b45710c567b.png

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.

bb528a04ebb5f976.png

Aşağıdaki birkaç ayar, koleksiyonunuz ve yerleştirmek istediğiniz alanla ilgilidir:

LLM: Vertex AI

Koleksiyon yolu: poses

Varsayılan sorgu sınırı: 3

Uzaklık ölçüsü: Kosinüs

Giriş alanı adı: duruş

Çıkış alanı adı: embedding

Durum alanı adı: durum

Mevcut dokümanları yerleştirme: Evet

Mevcut yerleştirmeleri güncelleme: Evet

Cloud Functions konumu: us-central1

Etkinlikleri Etkinleştir: İşaretli değil

fb8cdf1163fac7cb.png

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 eklerken veya belgeleri güncellerken uzantı, önceden eğitilmiş bir modeli ya da API uç noktası aracılığıyla seçtiğiniz bir modeli kullanarak otomatik olarak yerleştirmeler oluşturur. Bu durumda, uzantı yapılandırmasında Vertex AI'ı seçtik.

Dizin Oluşturma

Uygulamada yerleştirme kullanılırken yerleştirme alanında dizin oluşturulması zorunlu kılınır.

Firestore, temel sorgular için dizinleri otomatik olarak oluşturur. Ancak dizin içermeyen sorguları çalıştırarak Firestore'un dizin söz dizimi oluşturmasına izin verebilirsiniz. Bu durumda, uygulama tarafındaki hata mesajında oluşturulan dizine bir bağlantı sağlanır. Vektör dizini oluşturma adımlarının listesini aşağıda bulabilirsiniz:

  1. Cloud Shell Terminal'e gitme
  2. 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.

Vektör dizini oluşturulduktan sonra vektör yerleştirmelerinizle 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 talimatları uygulayın.

Yeni oluşturduğunuz uygulamanın vektör arama yaklaşımına göz atalım. Yerleştirmeler 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ştirmesini Firestore'daki dokümanların yerleştirmeleriyle karşılaştırır ve bağlamsal olarak en yakın olanı ayıklar.

7. Gemini 2.0 Flash

Gemini 2.0 Flash'ı 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 göz atalım.

Şimdi de bir yönetici kullanıcının / yoga eğitmeninin, Gemini 2.0 Flash'in yardımıyla pozların ayrıntılarını girmek ve ardından en yakın eşleşmeleri görmek için arama yapmak istediğini varsayalım. Bu sayede, sonuçları destekleyen çok formatlı nesnelerle birlikte eşleşen pozların ayrıntıları da çıkarılı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. Mimicking Image and Audio Generation

Gemini 2.0 Flash Experimental, çok formatlı sonuçlar üretebilir ancak henüz erken erişime kaydolmadığım için görüntü ve ses çıkışını sırasıyla Imagen ve TTS API'leri ile taklit ettim. Tüm bunların Gemini 2.0 Flash'a yapılan tek bir API çağrısıyla oluşturulduğunu hayal edin.

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ımda Gemini çağırma kodunu kontrol ederseniz LLM yanıtı için Google Arama temellendirme ö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);

Bunu yapmamızın nedeni:

  • Modelimizi gerçek arama sonuçlarına dayandırma
  • Aramada referans verilen alakalı URL'leri ayıklama

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:

  1. Firestore CRUD işlemleri (oluşturma, okuma, güncelleme, silme)
  2. Anahtar kelime araması
  3. Üretken yapay zekaya dayalı içerik oluşturma
  4. Bağlama dayalı arama (Vector Search)
  5. Aramayla ilgili çok formatlı çıkış
  6. Kendi Sorgunuzu Çalıştırma (structuredQuery biçimindeki sorgular)

Örnek: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}

Şimdiye kadar bahsedilen tüm bu özellikler, depodan yeni oluşturduğunuz uygulamanın bir parçasıdır: https://github.com/AbiramiSukumaran/firestore-poserecommender

Derlemek, çalıştırmak ve dağıtmak için Cloud Shell terminalinde aşağıdaki komutları çalıştırın:

mvn package

mvn spring-boot:run

Sonucu görmeli ve uygulama özelliklerinizi deneyebilmelisiniz. Çıktının demosunu görmek 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'da dağıtmak için (Dockerfile ile yepyeni bir uygulama başlattığınızı ve dosyaları gerektiği gibi kopyaladığınızı varsayarak) proje dizininizden Cloud Shell terminalinde aşağıdaki komutu çalıştırın:

gcloud run deploy --source .

Uygulama adını ve bölge kodunu (us-central1 için olanı seçin) girin ve istendiğinde kimliği doğrulanmamış çağırma için "Y" seçeneğini belirleyin. Dağıtım başarılı olduğunda terminalde uygulama uç noktanızı alı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:

  1. Google Cloud Console'da Kaynakları yönetin sayfasına gidin.
  2. Proje listesinde silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
  3. İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.

10. Tebrikler

Tebrikler! Güçlü ve akıllı bir yoga duruşu yönetim uygulaması oluşturmak için Firestore'u başarıyla kullandınız. Firestore'un, Vector Search uzantısının ve Gemini 2.0 Flash'in (simüle edilmiş resim ve ses üretimiyle) özelliklerini birleştirerek CRUD işlemlerini gerçekleştirmek, anahtar kelime tabanlı arama, bağlamsal vektör araması yapmak ve multimedya içeriği oluşturmak için gerçekten ilgi çekici ve bilgilendirici bir yoga uygulaması oluşturduk.

Bu yaklaşım yalnızca Yoga uygulamalarıyla sınırlı değildir. Gemini gibi yapay zeka modelleri gelişmeye devam ettikçe daha da ilgi çekici ve kişiselleştirilmiş kullanıcı deneyimleri oluşturma olasılıkları artacak. Bu teknolojilerin tüm potansiyelinden yararlanmak için Google Cloud ve Firebase'deki en son gelişmelerden ve dokümanlardan haberdar olmayı unutmayın.

Bu uygulamayı genişletmek isteseydim Gemini 2.0 Flash ile iki şey yapmaya çalışırdım:

  1. Kullanım alanı için anlık görüntü ve ses akışı oluşturarak Multimodal Live API'yi kullanın.
  2. Deneyimi daha gerçekçi hale getirmek için etkileşim yanıtlarının arkasındaki düşünceleri anlık verilerle birlikte oluşturmak üzere Düşünme Modu'nu etkinleştirin.

Deneyebilir ve pull isteği gönderebilirsiniz :>D!!!