Codelab - Firestore, Vector Search, Langchain ve Gemini ile bağlama dayalı yoga pozu önerici uygulaması oluşturma (Python sürümü)

1. Giriş

Bu codelab'de, yoga pozları önermek için vektör aramayı kullanan bir uygulama oluşturacaksınız.

Codelab'de aşağıdaki gibi adım adım bir yaklaşım uygulayacaksınız:

  1. Yoga pozlarının yer aldığı mevcut bir Hugging Face veri kümesini (JSON biçiminde) kullanın.
  2. Veri kümesini, her bir poz için açıklama oluşturmak üzere Gemini'i kullanan ek bir alan açıklamasıyla zenginleştirin.
  3. Doküman oluşturmak için Langchain'ı, Firestore'da koleksiyonu ve gömmelerini oluşturmak için Firestore Langchain entegrasyonunu kullanın.
  4. Vektör aramaya izin vermek için Firestore'da birleşik dizin oluşturun.
  5. Aşağıda gösterildiği gibi her şeyi bir araya getiren bir Flask uygulamasında Vektör Arama'yı kullanın:

84e1cbf29cbaeedc.png

Yapacaklarınız

  • Yoga pozları önermek için Vektör Arama'yı kullanan bir web uygulaması tasarlayın, oluşturun ve dağıtın.

Neler öğreneceksiniz?

  • Metin içeriği oluşturmak için Gemini'yi kullanma ve bu kod laboratuvarının bağlamında yoga pozları için açıklamalar oluşturma
  • Hugging Face'taki gelişmiş bir veri kümesinden kayıtları Firestore'a vektör yerleştirmeleriyle birlikte yüklemek için Firestore için Langchain Document Loader'ı kullanma
  • Doğal dil sorgusuna göre veri aramak için Firestore için Langchain Vektör Deposu'nu kullanma
  • Ses içeriği oluşturmak için Google Cloud Text-to-Speech API'yi kullanma

Gerekenler

  • Chrome web tarayıcısı
  • Gmail hesabı
  • Faturalandırmanın etkin olduğu bir Cloud projesi

Her seviyeden geliştirici (yeni başlayanlar dahil) için tasarlanan bu kod laboratuvarının örnek uygulamasında Python kullanılır. Ancak sunulan kavramları anlamak için Python bilgisine sahip olmanız gerekmez.

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 projenizde faturalandırmanın etkinleştirildiğinden emin olun. Projede faturalandırmanın etkin olup olmadığını nasıl kontrol edeceğinizi öğrenin .
  3. 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'i etkinleştir düğmesi resmi

  1. 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
  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 ayarlanmadıysa ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project <YOUR_PROJECT_ID>
  1. Aşağıda gösterilen komutu kullanarak gerekli API'leri etkinleştirin. Bu işlem birkaç dakika sürebilir. Lütfen bekleyin.
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 \
                       texttospeech.googleapis.com

Komut başarıyla yürütüldüğünde aşağıdakine benzer bir mesaj görürsünüz:

Operation "operations/..." finished successfully.

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.

Depoyu klonlama ve ortam ayarlarını yapma

Sonraki adım, codelab'in geri kalanında referans vereceğimiz örnek deposunu klonlamaktır. Cloud Shell'de olduğunuzu varsayarak ana dizininizden aşağıdaki komutu verin:

git clone https://github.com/rominirani/yoga-poses-recommender-python

Düzenleyiciyi başlatmak için Cloud Shell penceresinin araç çubuğunda Düzenleyiciyi Aç'ı tıklayın. Sol üst köşedeki menü çubuğunu tıklayın ve aşağıda gösterildiği gibi Dosya → Klasör Aç'ı seçin:

66221fd0d0e5202f.png

yoga-poses-recommender-python klasörünü seçin. Klasör, aşağıdaki gibi aşağıdaki dosyalarla açılacaktır:

44699efc7fb1b911.png

Şimdi kullanacağımız ortam değişkenlerini ayarlamamız gerekiyor. config.template.yaml dosyasını tıkladığınızda, içeriği aşağıdaki gibi görürsünüz:

project_id: your-project-id
location: us-central1
gemini_model_name: gemini-1.5-flash-002
embedding_model_name: text-embedding-004
image_generation_model_name: imagen-3.0-fast-generate-002
database: (default)
collection: poses
test_collection: test-poses
top_k: "3"

Lütfen project_id ve location değerlerini, Google Cloud projesini ve Firestore veritabanı bölgesini oluştururken seçtiğiniz değerlere göre güncelleyin. İdeal olarak, location değerlerinin Google Cloud projesi ve Firestore veritabanı için aynı olmasını isteriz (ör. us-central1).

Bu kod laboratuvarının amacı doğrultusunda, önceden yapılandırılmış değerleri kullanacağız (tabii ki yapılandırmanıza göre ayarlamanız gereken project_id ve location hariç).

Lütfen bu dosyayı config.template.yaml dosyasıyla aynı klasöre config.yaml olarak kaydedin.

Son adımda, bizim için ayarlanmış tüm Python bağımlılıklarıyla yerel olarak kullanacağımız bir Python ortamı oluşturacağız. Bu konuyla ilgili ayrıntıları içeren pyproject.toml dosyasına göz atın. Dosyanın içeriği aşağıda gösterilmiştir:

dependencies = [
    "datasets>=3.2.0",
    "flask>=3.1.0",
    "google-cloud-aiplatform>=1.78.0",
    "google-cloud-texttospeech>=2.24.0",
    "langchain-community>=0.3.15",
    "langchain-core>=0.3.31",
    "langchain-google-community>=2.0.4",
    "langchain-google-firestore>=0.5.0",
    "langchain-google-vertexai>=2.0.7",
    "pydantic-settings>=2.7.1",
    "pyyaml>=6.0.2",
    "tenacity>=9.0.0",
]

Bu bağımlılıklar, requirements.txt. sürümünde zaten sürüm kilitlidir. Özetlemek gerekirse, sanal ortama yüklenecek Python paketi bağımlılıklarını içeren bir sanal Python ortamı oluşturmamız gerekir.requirements.txt Bunun için Cloud Shell IDE'de Command Palette (Ctrl+Üst Karakter+P) bölümüne gidin ve Python: Create Environment yazın. Bir Virtual Environment(venv), Python 3.x interpreter ve requirements.txt dosyası seçmek için sonraki adımları uygulayın.

Ortam oluşturulduktan sonra, oluşturulan ortamı aşağıdaki komutla etkinleştirmemiz gerekir.

source .venv/bin/activate

Konsolunuzda (.venv) ifadesini görürsünüz. Ör. -> (.venv) yourusername@cloudshell:

Mükemmel. Artık Firestore veritabanını oluşturma görevine geçebiliriz.

3. Firestore'u ayarlama

Cloud Firestore, uygulama verilerimiz için arka uç olarak kullanacağımız, tümüyle yönetilen bir sunucusuz belge veritabanıdır. Cloud Firestore'daki veriler, dokümanlardan oluşan koleksiyonlar halinde yapılandırılır.

Firestore veritabanı ilk başlatma

Cloud Console'daki Firestore sayfasını ziyaret edin.

Projede daha önce bir Firestore veritabanı başlatmadıysanız Create Database simgesini tıklayarak default veritabanını oluşturun. Veritabanı oluştururken aşağıdaki değerleri kullanın:

  • Firestore modu: Native.
  • Konum: Varsayılan konum ayarlarını kullanın.
  • Güvenlik Kuralları için Test rules seçeneğini belirleyin.
  • Veritabanını oluşturun.

504cabdb99a222a5.png

Sonraki bölümde, varsayılan Firestore veritabanımızda poses adlı bir koleksiyon oluşturmak için temel hazırlığı yapacağız. Bu koleksiyonda, daha sonra uygulamamızda kullanacağımız örnek veriler (belgeler) veya yoga pozu bilgileri yer alır.

Firestore veritabanı oluşturma bölümü tamamlandı.

4. Yoga duruşları veri kümesini hazırlama

İlk işimiz, uygulamada kullanacağımız Yoga Pozları veri kümesini hazırlamaktır. Mevcut bir Hugging Face veri kümesiyle başlayıp daha sonra ek bilgilerle geliştireceğiz.

Yoga Pozları İçin Sarılma Yüzü Veri Kümesi'ne göz atın. Bu kod laboratuvarının veri kümelerinden birini kullandığını ancak başka herhangi bir veri kümesini de kullanabileceğinizi ve veri kümesini geliştirmek için gösterilen teknikleri uygulayabileceğinizi unutmayın.

298cfae7f23e4bef.png

Files and versions bölümüne gidersek tüm pozların JSON veri dosyasını alabiliriz.

3fe6e55abdc032ec.png

yoga_poses.json dosyasını indirip size gönderdik. Bu dosya yoga_poses_alldata.json olarak adlandırılmış ve /data klasöründe yer alıyor.

Cloud Shell Düzenleyici'deki data/yoga_poses.json dosyasına gidin ve her JSON nesnesinin bir yoga pozunu temsil ettiği JSON nesnelerinin listesine göz atın. Toplam 3 kaydımız var. Aşağıda bir örnek kayıt gösterilmektedir:

{
   "name": "Big Toe Pose",
   "sanskrit_name": "Padangusthasana",
   "photo_url": "https://pocketyoga.com/assets/images/full/ForwardBendBigToe.png",
   "expertise_level": "Beginner",
   "pose_type": ["Standing", "Forward Bend"]
 }

Şimdi, Gemini'yi ve varsayılan modeli kullanarak nasıl description alanı oluşturabileceğimizi tanıtmak için mükemmel bir fırsat.

Cloud Shell Düzenleyici'de generate-descriptions.py dosyasına gidin. Bu dosyanın içeriği aşağıda gösterilmiştir:

import json
import time
import logging
import vertexai
from langchain_google_vertexai import VertexAI
from tenacity import retry, stop_after_attempt, wait_exponential
from settings import get_settings

settings = get_settings()
logging.basicConfig(
    level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
)
# Initialize Vertex AI SDK
vertexai.init(project=settings.project_id, location=settings.location)
logging.info("Done Initializing Vertex AI SDK")


@retry(
    stop=stop_after_attempt(5),
    wait=wait_exponential(multiplier=1, min=4, max=10),
)
def generate_description(pose_name, sanskrit_name, expertise_level, pose_types):
    """Generates a description for a yoga pose using the Gemini API."""

    prompt = f"""
    Generate a concise description (max 50 words) for the yoga pose: {pose_name}
    Also known as: {sanskrit_name}
    Expertise Level: {expertise_level}
    Pose Type: {", ".join(pose_types)}

    Include key benefits and any important alignment cues.
    """
    try:
        model = VertexAI(model_name=settings.gemini_model_name, verbose=True)
        response = model.invoke(prompt)
        return response
    except Exception as e:
        logging.info(f"Error generating description for {pose_name}: {e}")
        return ""


def add_descriptions_to_json(input_file, output_file):
    """Loads JSON data, adds descriptions, and saves the updated data."""

    with open(input_file, "r") as f:
        yoga_poses = json.load(f)

    total_poses = len(yoga_poses)
    processed_count = 0

    for pose in yoga_poses:
        if pose["name"] != " Pose":
            start_time = time.time()  # Record start time
            pose["description"] = generate_description(
                pose["name"],
                pose["sanskrit_name"],
                pose["expertise_level"],
                pose["pose_type"],
            )
            end_time = time.time()  # Record end time

            processed_count += 1
            end_time = time.time()  # Record end time
            time_taken = end_time - start_time
            logging.info(
                f"Processed: {processed_count}/{total_poses} - {pose['name']} ({time_taken:.2f} seconds)"
            )

        else:
            pose["description"] = ""
            processed_count += 1
            logging.info(
                f"Processed: {processed_count}/{total_poses} - {pose['name']} ({time_taken:.2f} seconds)"
            )
        # Adding a delay to avoid rate limit
        time.sleep(30)

    with open(output_file, "w") as f:
        json.dump(yoga_poses, f, indent=2)


def main():
    # File paths
    input_file = "./data/yoga_poses.json"
    output_file = "./data/yoga_poses_with_descriptions.json"

    # Add descriptions and save the updated JSON
    add_descriptions_to_json(input_file, output_file)


if __name__ == "__main__":
    main()

Bu uygulama, her yoga pozu JSON kaydına yeni bir description alanı ekler. Açıklama, Gemini modeline yapılan bir çağrıyla elde edilir. Bu çağrıda, gerekli istemi sağlarız. Alan JSON dosyasına eklenir ve yeni dosya data/yoga_poses_with_descriptions.json dosyasına yazılır.

Ana adımları inceleyelim:

  1. main() işlevinde, add_descriptions_to_json işlevinin çağrıldığını ve beklenen giriş dosyasını ve çıkış dosyasını sağladığını göreceksiniz.
  2. add_descriptions_to_json işlevi, her JSON kaydı (ör. yoga gönderisi bilgileri) için aşağıdakileri yapar:
  3. pose_name, sanskrit_name, expertise_level ve pose_types öğelerini ayıklayın.
  4. Bir istem oluşturan generate_description işlevini çağırır ve ardından yanıt metnini almak için Langchain VertexAI model sınıfını çağırır.
  5. Ardından bu yanıt metni JSON nesnesine eklenir.
  6. Ardından, güncellenen nesnelerin JSON listesi hedef dosyaya yazılır.

Bu uygulamayı çalıştıralım. Yeni bir terminal penceresi (Ctrl+Üst Karakter+C) açıp aşağıdaki komutu verin:

python generate-descriptions.py

Sizden yetkilendirme istenirse lütfen bunu sağlayın.

Uygulamanın çalışmaya başladığını görürsünüz. Yeni Google Cloud hesaplarında olabilecek hız sınırı kotalarını önlemek için kayıtlar arasına 30 saniyelik bir gecikme ekledik. Lütfen bekleyin.

Aşağıda, devam eden bir örnek çalıştırma gösterilmektedir:

8e830d9ea9b6c60.png

3 kayıtın tümü Gemini görüşmesiyle geliştirildikten sonra bir data/yoga_poses_with_description.json dosyası oluşturulur. Buna göz atabilirsiniz.

Veri dosyamız hazır. Sonraki adımda, Firestore veritabanını bu dosyayla nasıl dolduracağımızı ve yerleşik öğe oluşturmayı öğreneceğiz.

5. Verileri Firestore'a aktarma ve vektör yerleştirme işlemleri yapma

data/yoga_poses_with_description.json dosyasını aldık. Şimdi Firestore veritabanını bu dosyayla doldurmamız ve daha da önemlisi, kayıtların her biri için vektör yerleştirmelerini oluşturmamız gerekiyor. Vektör Embedding'leri, daha sonra doğal dilde sağlanan kullanıcı sorgusuyla benzerlik araması yapmamız gerektiğinde faydalı olacaktır.

Yukarıdaki süreci uygulamak için Langchain Firestore bileşenlerini kullanacağız.

Bunun için aşağıdaki adımları uygulayın:

  1. JSON nesnelerinin listesini Langchain Document nesnelerinin listesine dönüştürürüz. Her dokümanın iki özelliği vardır: page_content ve metadata. Meta veri nesnesi, name, description, sanskrit_name gibi özelliklere sahip JSON nesnesinin tamamını içerir. page_content, birkaç alanın birleştirilmesiyle oluşturulan bir dize metni olacaktır.
  2. Document nesnelerinin bir listesini aldıktan sonra, FirestoreVectorStore Langchain sınıfını ve özellikle bu doküman listesi, koleksiyon adı (test-poses değerini işaret eden TEST_COLLECTION değişkenini kullanıyoruz), Vertex AI Embedding sınıfı ve Firestore bağlantı ayrıntılarını (PROJECT_ID ve DATABASE adı) içeren from_documents yöntemini kullanacağız. Bu işlem, koleksiyonu oluşturur ve özelliklerin her biri için bir embedding alanı da oluşturur.

import-data.py için kod aşağıda verilmiştir (kodun bazı kısımları kısaltılmıştır):

... 

def create_langchain_documents(poses):
   """Creates a list of Langchain Documents from a list of poses."""
   documents = []
   for pose in poses:
       # Convert the pose to a string representation for page_content
       page_content = (
           f"name: {pose.get('name', '')}\n"
           f"description: {pose.get('description', '')}\n"
           f"sanskrit_name: {pose.get('sanskrit_name', '')}\n"
           f"expertise_level: {pose.get('expertise_level', 'N/A')}\n"
           f"pose_type: {pose.get('pose_type', 'N/A')}\n"
       ).strip()
       # The metadata will be the whole pose
       metadata = pose

       document = Document(page_content=page_content, metadata=metadata)
       documents.append(document)
   logging.info(f"Created {len(documents)} Langchain documents.")
   return documents

def main():
    all_poses = load_yoga_poses_data_from_local_file(
        "./data/yoga_poses_with_descriptions.json"
    )
    documents = create_langchain_documents(all_poses)
    logging.info(
        f"Successfully created langchain documents. Total documents: {len(documents)}"
    )

    embedding = VertexAIEmbeddings(
        model_name=settings.embedding_model_name,
        project=settings.project_id,
        location=settings.location,
    )

    client = firestore.Client(project=settings.project_id, database=settings.database)

    vector_store = FirestoreVectorStore.from_documents(
        client=client,
        collection=settings.test_collection,
        documents=documents,
        embedding=embedding,
    )
    logging.info("Added documents to the vector store.")


if __name__ == "__main__":
    main()

Bu uygulamayı çalıştıralım. Yeni bir terminal penceresi (Ctrl+Üst Karakter+C) açıp aşağıdaki komutu verin:

python import-data.py

Her şey yolunda giderse aşağıdakine benzer bir mesaj görürsünüz:

2025-01-21 14:50:06,479 - INFO - Added documents to the vector store.

Kayıtların başarıyla eklenip eklenmediğini ve yerleştirilmelerin oluşturulup oluşturulmadığını kontrol etmek için Cloud Console'daki Firestore sayfasını ziyaret edin.

504cabdb99a222a5.png

(Varsayılan) veritabanını tıklayın. Bu işlem, test-poses koleksiyonunu ve bu koleksiyon altındaki birden fazla dokümanı gösterir. Her doküman bir yoga duruşudur.

d0708499e403aebc.png

Alanları incelemek için dokümanlardan birini tıklayın. İçe aktardığımız alanlara ek olarak, kullandığımız Langchain VertexAIEmbeddings sınıfı aracılığıyla sizin için otomatik olarak oluşturulan bir vektör alanı olan embedding alanını da görürsünüz. Bu alanda text-embedding-004 Vertex AI Embedding modelini sağladık.

d67113e2dc63cd6b.png

Firestore veritabanına yerleştirilmiş yerleştirmelerle birlikte kayıtları yüklediğimize göre, bir sonraki adıma geçip Firestore'da vektör benzerliği aramasının nasıl yapıldığını öğrenebiliriz.

6. Tam yoga pozlarını Firestore veritabanı koleksiyonuna aktarma

Şimdi, 160 yoga pozunun tam listesini içeren poses koleksiyonunu oluşturacağız. Bu koleksiyon için doğrudan içe aktarabileceğiniz bir veritabanı içe aktarma dosyası oluşturduk. Bu işlem, laboratuvarda zaman kazanmak için yapılır. Açıklamayı ve yerleştirmeleri içeren veritabanını oluşturma işlemi, önceki bölümde gördüğümüzle aynıdır.

Aşağıdaki adımları uygulayarak veritabanını içe aktarın:

  1. Aşağıda verilen gsutil komutuyla 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-central1 gs://<PROJECT_ID>-my-bucket
  1. 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://yoga-database-firestore-export-bucket/2025-01-27T05:11:02_62615  gs://<PROJECT_ID>-my-bucket

İçe aktarılacak verilere sahip olduğumuza göre, verileri oluşturduğumuz Firebase veritabanına (default) aktarma işleminin son adımına geçebiliriz.

  1. Aşağıda verilen gcloud komutunu kullanın:
gcloud firestore import gs://<PROJECT_ID>-my-bucket/2025-01-27T05:11:02_62615

İçe aktarma işlemi birkaç saniye sürer. İşlem tamamlandıktan sonra 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 default veritabanını ve poses koleksiyonunu seçin:

a8f5a6ba69bec69b.png

Bu işlemle, uygulamamızda kullanacağımız Firestore koleksiyonunun oluşturulması tamamlanır.

7. Firestore'da vektör benzerliği araması yapma

Vektör Benzerliği araması yapmak için kullanıcıdan sorguyu alırız. Bu sorguya örnek olarak "Suggest me some exercises to relieve back pain" verilebilir.

search-data.py dosyasına göz atın. Dikkat etmeniz gereken temel işlev, aşağıda gösterilen arama işlevidir. Genel hatlarıyla, kullanıcı sorgusunun yerleştirilmesini sağlamak için kullanılacak bir yerleşik sınıf oluşturur. Ardından, similarity_search işlevini çağırmak için FirestoreVectorStore sınıfını kullanır.

def search(query: str):
    """Executes Firestore Vector Similarity Search"""
    embedding = VertexAIEmbeddings(
        model_name=settings.embedding_model_name,
        project=settings.project_id,
        location=settings.location,
    )

    client = firestore.Client(project=settings.project_id, database=settings.database)

    vector_store = FirestoreVectorStore(
        client=client, collection=settings.collection, embedding_service=embedding
    )

    logging.info(f"Now executing query: {query}")
    results: list[Document] = vector_store.similarity_search(
        query=query, k=int(settings.top_k), include_metadata=True
    )
    for result in results:
        print(result.page_content)

Bunu birkaç sorgu örneğiyle çalıştırmadan önce, arama sorgularınızın başarılı olması için gereken bir Firestore birleşik dizini oluşturmanız gerekir. Uygulamayı dizin oluşturmadan çalıştırırsanız önce dizini oluşturmanız gerektiğini belirten bir hata mesajı ve önce dizini oluşturma komutu gösterilir.

Bileşik dizini oluşturmak için kullanılan gcloud komutu aşağıda gösterilmiştir:

gcloud firestore indexes composite create --project=<YOUR_PROJECT_ID> --collection-group=poses --query-scope=COLLECTION --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding

Veritabanında 150'den fazla kayıt bulunduğundan dizinin oluşturulması birkaç dakika sürer. İşlem tamamlandığında dizini aşağıdaki komutla görüntüleyebilirsiniz:

gcloud firestore indexes composite list

Az önce oluşturduğunuz dizini listede görürsünüz.

Aşağıdaki komutu hemen deneyin:

python search-data.py --prompt "Recommend me some exercises for back pain relief"

Size birkaç öneri sunulur. Aşağıda örnek bir çalıştırma gösterilmektedir:

2025-01-21 15:48:51,282 - INFO - Now executing query: Recommend me some exercises for back pain relief
name: Supine Spinal Twist Pose
description: A gentle supine twist (Supta Matsyendrasana), great for beginners.  Releases spinal tension, improves digestion, and calms the nervous system.  Keep shoulders flat on the floor and lengthen the spine.

sanskrit_name: Supta Matsyendrasana
expertise_level: Beginner
pose_type: ['Supine', 'Twist']
name: Cow Pose
description: Cow Pose (Bitilasana) is a gentle backbend, stretching the chest, shoulders, and abdomen.  Maintain a neutral spine, lengthen the tailbone, and avoid hyperextension.  Benefits include improved posture and stress relief.

sanskrit_name: Bitilasana
expertise_level: Beginner
pose_type: ['Arm Leg Support', 'Back Bend']
name: Locust I Pose
description: Locust Pose I (Shalabhasana A) strengthens the back, glutes, and shoulders.  Lie prone, lift chest and legs simultaneously, engaging back muscles.  Keep hips grounded and gaze slightly forward.

sanskrit_name: Shalabhasana A
expertise_level: Intermediate
pose_type: ['Prone', 'Back Bend']

Bu işlemi tamamladığınızda, kayıt yüklemek, yerleştirme oluşturmak ve vektör benzerliği araması yapmak için Firestore vektör veritabanı ile nasıl çalışacağınızı anlamış olursunuz. Artık vektör aramayı bir web ön ucu ile entegre edecek bir web uygulaması oluşturabiliriz.

8. Web Uygulaması

Python Flask web uygulaması main.py dosyasında, kullanıcı arayüzü HTML dosyası ise templates/index.html. dosyasında bulunur.

Her iki dosyayı da incelemeniz önerilir. Öncelikle, kullanıcı arayüzü HTML index.html dosyasından iletilen istemi alan /search işleyicisini içeren main.py dosyasıyla başlayın. Bu işlem, önceki bölümde incelediğimiz vektör benzerliği aramasını yapan arama yöntemini çağırır.

Ardından yanıt, öneri listesini de ekleyerek index.html'e geri gönderilir. index.html, önerileri farklı kartlar olarak gösterir.

Uygulamayı yerel olarak çalıştırma

Yeni bir terminal penceresi (Ctrl+Üst Karakter+C) veya mevcut bir terminal penceresi açıp aşağıdaki komutu verin:

python main.py

Aşağıda örnek bir yürütme gösterilmektedir:

 * Serving Flask app 'main'
 * Debug mode: on
2025-01-21 16:02:37,473 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:8080
 * Running on http://10.88.0.4:8080
2025-01-21 16:02:37,473 - INFO - Press CTRL+C to quit
2025-01-21 16:02:37,474 - INFO -  * Restarting with stat
2025-01-21 16:02:41,462 - WARNING -  * Debugger is active!
2025-01-21 16:02:41,484 - INFO -  * Debugger PIN: 440-653-555

Uygulamayı çalıştırdıktan sonra, aşağıda gösterilen Web Önizlemesi düğmesini tıklayarak uygulamanın ana sayfa URL'sini ziyaret edin:

de297d4cee10e0bf.png

Aşağıda gösterildiği gibi, yayınlanan index.html dosyasını gösterir:

20240a0e885ac17b.png

Örnek bir sorgu girin (Örnek : Provide me some exercises for back pain relief) ve Search düğmesini tıklayın. Bu işlem, veritabanından bazı öneriler getirir. Ayrıca, açıklamaya göre doğrudan dinleyebileceğiniz bir ses akışı oluşturan bir Play Audio düğmesi de görürsünüz.

789b4277dc40e2be.png

9. (İsteğe bağlı) Google Cloud Run'a dağıtma

Son adımımız bu uygulamayı Google Cloud Run'a dağıtmaktır. Dağıtım komutu aşağıda gösterilmiştir. Dağıtmadan önce değişkenin (<<YOUR_PROJECT_ID>>) değerlerini projenize özgü değerlerle değiştirdiğinizden emin olun. Bunlar, config.yaml dosyasından alabileceğiniz değerlerdir.

gcloud run deploy yogaposes --source . \
  --port=8080 \
  --allow-unauthenticated \
  --region=us-central1 \
  --platform=managed  \
  --project=<<YOUR_PROJECT_ID>> \
  --env-vars-file=config.yaml

Yukarıdaki komutu uygulamanın kök klasöründen yürütün. Google Cloud API'lerini etkinleştirmeniz ve çeşitli izinleri onaylamanız da istenebilir. Lütfen bunu yapın.

Dağıtım işleminin tamamlanması yaklaşık 5-7 dakika sürer. Lütfen bekleyin.

3a6d86fd32e4a5e.png

Dağıtım başarıyla tamamlandığında dağıtım çıkışında Cloud Run hizmet URL'si sağlanır. Şekli şu şekildedir:

Service URL: https://yogaposes-<<UNIQUEID>.us-central1.run.app

Bu herkese açık URL'yi ziyaret ettiğinizde aynı web uygulamasının dağıtıldığını ve başarıyla çalıştığını görürsünüz.

84e1cbf29cbaeedc.png

Google Cloud Console'dan Cloud Run'u da ziyaret edebilirsiniz. Burada Cloud Run'daki hizmetlerin listesini görebilirsiniz. yogaposes hizmeti, burada listelenen hizmetlerden biri (tek hizmet değilse) olmalıdır.

f2b34a8c9011be4c.png

Belirli bir hizmet adını (bizim durumumuzda yogaposes) tıklayarak hizmetin URL'si, yapılandırmaları, günlükleri ve diğer ayrıntılarını görüntüleyebilirsiniz.

faaa5e0c02fe0423.png

Bu işlemle, Cloud Run'da yoga pozu önerici web uygulamamızın geliştirilmesi ve dağıtımı tamamlanır.

10. Tebrikler

Tebrikler, Firestore'a veri kümesi yükleyen, yerleştirmeleri oluşturan ve kullanıcı sorgusuna göre bir Vektör Benzerliği Araması yapan bir uygulamayı başarıyla oluşturdunuz.

Referans dokümanları