1. Giriş
Bu codelab'de, yoga pozları önermek için vektör arama kullanan bir uygulama oluşturacaksınız.
Bu codelab'de aşağıdaki gibi adım adım bir yaklaşım kullanacaksınız:
- Yoga pozlarının yer aldığı mevcut bir Hugging Face veri kümesini (JSON biçimi) kullanın.
- Gemini'ı kullanarak her poz için açıklama oluşturarak veri kümesini ek bir alan açıklamasıyla zenginleştirin.
- Doküman oluşturmak için Langchain'i, Firestore'da koleksiyon ve yerleştirmeler oluşturmak için Firestore Langchain entegrasyonunu kullanın.
- Vektör aramasına izin vermek için Firestore'da birleşik dizin oluşturun.
- Aşağıda gösterildiği gibi her şeyi bir araya getiren bir Flask uygulamasında Vector Search'ü kullanın:

Yapacaklarınız
- Yoga pozları önermek için Vector Search'ü kullanan bir web uygulaması tasarlayın, oluşturun ve dağıtın.
Neler öğreneceksiniz?
- Gemini'ı kullanarak metin içeriği oluşturma ve bu codelab bağlamında yoga pozları için açıklamalar oluşturma
- Hugging Face'teki geliştirilmiş bir veri kümesinden kayıtları, Langchain Document Loader for Firestore'u kullanarak Firestore'a nasıl yükleyeceğinizi ve vektör yerleştirmelerini nasıl kullanacağınızı öğrenin.
- Doğal dil sorgusuna dayalı olarak veri aramak için Langchain Vector Store for Firestore'u 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 codelab'de örnek uygulamada Python kullanılmaktadır. Ancak sunulan kavramları anlamak için Python bilgisi gerekmez.
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 projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını kontrol etmeyi öğrenin .
- 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'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
- 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 ayarlanmamışsa ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project <YOUR_PROJECT_ID>
- 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ğıda gösterilene benzer bir mesaj görürsünüz:
Operation "operations/..." finished successfully.
Gcloud komutuna alternatif olarak, her ürünü arayarak veya bu bağlantıyı kullanarak konsolu kullanabilirsiniz.
Herhangi bir API atlanırsa 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 depoyu 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 Open Editor'ı (Düzenleyiciyi Aç) tıklayın. Sol üst köşedeki menü çubuğunu tıklayın ve Dosya → Klasörü Aç'ı seçin.

yoga-poses-recommender-python klasörünü seçtiğinizde klasörün aşağıdaki dosyalarla birlikte açıldığını görürsünüz:

Ş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 Google Cloud projesi ve Firestore veritabanı bölgesi oluştururken seçtiğiniz değerlere göre project_id ve location değerlerini güncelleyin. İdeal olarak, location değerlerinin Google Cloud projesi ve Firestore veritabanı için aynı olmasını isteriz. Örneğin, us-central1.
Bu codelab'in amacı doğrultusunda, önceden yapılandırılmış değerleri kullanacağız (project_id ve location hariç. Bunları yapılandırmanıza göre ayarlamanız gerekir).
Lütfen bu dosyayı config.yaml olarak config.template.yaml dosyasıyla aynı klasöre kaydedin.
Son adım olarak, Python bağımlılıklarının bizim için ayarlandığı ve yerel olarak kullanacağımız bir Python ortamı oluşturmamız gerekiyor. Aynı işlemin ayrıntılarını içeren pyproject.toml dosyasına göz atın. Bu 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. içinde zaten sürüm kilitlidir. Özetlemek gerekirse, sanal ortama yüklenmek üzere requirements.txt içindeki Python paketi bağımlılıklarıyla bir sanal Python ortamı oluşturmamız gerekir. Bunu yapmak için Cloud Shell IDE'de Command Palette (Ctrl+Üst Karakter+P) bölümüne gidin ve Python: Create Environment yazın. Virtual Environment(venv), Python 3.x interpreter ve requirements.txt dosyasını seçmek için sonraki adımları uygulayın.
Ortam oluşturulduktan sonra, aşağıdaki komutla oluşturulan ortamı etkinleştirmemiz gerekir.
source .venv/bin/activate
Konsolunuzda (.venv) ifadesini görmeniz gerekir. Ör. -> (.venv) yourusername@cloudshell:
Harika! Artık Firestore veritabanını ayarlama 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üman koleksiyonları halinde yapılandırılır.
Firestore veritabanı başlatma
Cloud Console'da Firestore sayfasını ziyaret edin.
Projede daha önce bir Firestore veritabanı başlatmadıysanız Create Database seçeneğini tıklayarak default veritabanını oluşturun. Veritabanını oluştururken aşağıdaki değerleri kullanın:
- Firestore modu:
Native. - Konum Türü olarak
Region'ı ve bölge içinus-central1konumunu seçin. - Güvenlik kuralları için
Test rulesseçeneğini kullanın. - Veritabanını oluşturun.

Sonraki bölümde, varsayılan Firestore veritabanımızda poses adlı bir koleksiyon oluşturmanın temelini atacağız. Bu koleksiyonda, uygulamamızda kullanacağımız örnek veriler (dokümanlar) veya yoga pozları bilgileri yer alır.
Bu işlemle Firestore veritabanı kurulumu bölümü tamamlanır.
4. Yoga pozları veri kümesini hazırlama
İlk görevimiz, uygulamada kullanacağımız Yoga Pozları veri kümesini hazırlamaktır. Mevcut bir Hugging Face veri kümesiyle başlayıp ek bilgilerle geliştireceğiz.
Hugging Face Dataset for Yoga Poses'i inceleyin. Bu codelab'de veri kümelerinden biri kullanılsa da aslında diğer veri kümelerini kullanabilir ve veri kümesini geliştirmek için gösterilen teknikleri uygulayabilirsiniz.

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

yoga_poses.json dosyasını indirip size gönderdik. Bu dosya yoga_poses_alldata.json olarak adlandırılmış ve /data klasöründe bulunuyor.
Cloud Shell Düzenleyici'de data/yoga_poses.json dosyasına gidin ve her bir JSON nesnesinin bir yoga pozunu temsil ettiği JSON nesneleri listesine göz atın. Toplam 3 kaydımız var ve örnek bir kayıt aşağıda gösteriliyor:
{
"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'ı ve varsayılan modeli kullanarak nasıl description alanı oluşturabileceğimizi tanıtmak için harika bir fırsat.
Cloud Shell Düzenleyici'de generate-descriptions.py dosyasına gidin. Bu dosyanın içeriği aşağıda gösterilmektedir:
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ı aracılığıyla alınır. Bu çağrıda, Gemini modeline gerekli istem sağlanır. Alan, JSON dosyasına eklenir ve yeni dosya data/yoga_poses_with_descriptions.json dosyasına yazılır.
Başlıca adımları inceleyelim:
main()işlevinin,add_descriptions_to_jsonişlevini çağırdığını ve beklenen giriş dosyasını ve çıkış dosyasını sağladığını görürsünüz.add_descriptions_to_jsonişlevi, her JSON kaydı (ör. Yoga gönderisi bilgileri) için aşağıdakileri yapar:pose_name,sanskrit_name,expertise_levelvepose_typesdeğerlerini ayıklar.- Bu işlev, 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.
- Bu yanıt metni daha sonra JSON nesnesine eklenir.
- Güncellenen nesne JSON listesi daha sonra hedef dosyaya yazılır.
Bu uygulamayı çalıştırmamıza izin verin. Yeni bir terminal penceresi (Ctrl+Üst Karakter+C) başlatın ve aşağıdaki komutu verin:
python generate-descriptions.py
Yetkilendirme istenirse lütfen yetkilendirme işlemini yapın.
Uygulamanın yürütülmeye 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 sabırlı olun.
Devam eden örnek bir çalıştırma aşağıda gösterilmektedir:

3 kaydın tamamı Gemini çağrısıyla geliştirildikten sonra data/yoga_poses_with_description.json dosyası oluşturulur. Bu makaleye göz atabilirsiniz.
Veri dosyamız hazır. Bir sonraki adımda, yerleştirme oluşturmanın yanı sıra Firestore veritabanını bu dosya ile nasıl dolduracağımızı öğreneceğiz.
5. Firestore'a veri aktarma ve vektör yerleştirmeleri oluşturma
data/yoga_poses_with_description.json dosyamız var. Şimdi Firestore veritabanını bu dosya ile doldurmamız ve en önemlisi, her kayıt için Vector Embeddings oluşturmamız gerekiyor. Vektör yerleştirmeleri, daha sonra doğal dilde sağlanan kullanıcı sorgusuyla benzerlik araması yapmamız gerektiğinde faydalı olacaktır.
Yukarıdaki işlemi uygulamak için Langchain Firestore bileşenlerini kullanacağız.
Bunun için aşağıdaki adımları uygulayın:
- JSON nesneleri listesini Langchain Document nesneleri listesine dönüştürürüz. Her belgenin iki özelliği olacaktır:
page_contentvemetadata. Meta veri nesnesi,name,description,sanskrit_namegibi özelliklere sahip tüm JSON nesnesini içerir.page_content, birkaç alanın birleştirilmesiyle oluşturulan bir dize metin olacaktır. Documentnesnelerinin listesini aldıktan sonra, bu belge listesiyle birlikteFirestoreVectorStoreLangchain sınıfını ve özelliklefrom_documentsyöntemini kullanacağız. Ayrıca bir koleksiyon adı (test-poses'ı işaret edenTEST_COLLECTIONdeğişkenini kullanıyoruz), bir Vertex AI Embedding sınıfı ve Firestore bağlantı ayrıntıları (PROJECT_IDveDATABASEadı) da kullanacağız. Bu işlemle koleksiyon oluşturulur ve her özellik için birembeddingalanı oluşturulur.
import-data.py kodunu aşağıda bulabilirsiniz (kodun bazı bölümleri kısa olması için 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ırmamıza izin verin. Yeni bir terminal penceresi (Ctrl+Üst Karakter+C) başlatın ve 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ştirmelerin oluşturulup oluşturulmadığını kontrol etmek için Cloud Console'daki Firestore sayfasını ziyaret edin.

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

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 bulacaksınız. Bu sınıfta, text-embedding-004 Vertex AI Embedding modelini sağladık.

Kayıtlar yerleştirmelerle birlikte Firestore veritabanına yüklendiğine göre bir sonraki adıma geçebilir ve Firestore'da nasıl Vector Similarity Search yapılacağını görebiliriz.
6. Tam yoga pozlarını Firestore Database koleksiyonuna aktarma
Şimdi, doğrudan içe aktarabileceğiniz bir veritabanı içe aktarma dosyası oluşturduğumuz 160 yoga pozunun tam listesi olan poses koleksiyonunu oluşturacağız. Bu işlem, laboratuvarda zaman kazanmak için yapılır. Açıklama ve yerleştirmeleri içeren veritabanını oluşturma süreci, önceki bölümde gördüğümüz süreçle aynıdır.
Aşağıdaki adımları uygulayarak veritabanını içe aktarın:
- Aşağıda verilen
gsutilkomutuyla 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-central1 gs://<PROJECT_ID>-my-bucket
- 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://yoga-database-firestore-export-bucket/2025-01-27T05:11:02_62615 gs://<PROJECT_ID>-my-bucket
İçe aktarılacak veriler olduğuna göre, oluşturduğumuz Firebase veritabanına (default) veri aktarma işleminin son adımına geçebiliriz.
- Aşağıdaki 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ığı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 default veritabanını ve poses koleksiyonunu seçin:

Böylece, 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 gelen 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. İncelenmesi gereken temel işlev, aşağıda gösterilen arama işlevidir. Genel olarak, kullanıcı sorgusu için yerleştirme oluşturmak üzere kullanılacak bir yerleştirme 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)
Bu işlemi birkaç sorgu örneğiyle çalıştırmadan önce, arama sorgularınızın başarılı olması için gereken Firestore bileşik dizinini oluşturmanız gerekir. Uygulamayı dizini oluşturmadan çalıştırırsanız önce dizini oluşturmanız gerektiğini belirten bir hata, dizini önce oluşturma komutuyla birlikte 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 tamamlanması birkaç dakika sürer. İşlem tamamlandığında dizini aşağıdaki komutla görüntüleyebilirsiniz:
gcloud firestore indexes composite list
Yeni oluşturduğunuz dizini listede görmeniz gerekir.
Şimdi aşağıdaki komutu deneyin:
python search-data.py --prompt "Recommend me some exercises for back pain relief"
Size birkaç öneri sunulur. Örnek bir çalıştırma aşağıda 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şlem tamamlandıktan sonra, kayıtları yüklemek, yerleştirmeler oluşturmak ve vektör benzerliği araması yapmak için Firestore vektör veritabanının nasıl kullanılacağını öğrenmiş olursunuz. Artık vektör arama işlevini bir web ön ucuna entegre edecek bir web uygulaması oluşturabiliriz.
8. Web Uygulaması
Python Flask web uygulaması main.py dosyasında, ön uç HTML dosyası ise templates/index.html. dosyasında bulunur.
Her iki dosyaya da göz atmanız önerilir. Öncelikle, ön uç 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.
Yanıt, öneri listesiyle birlikte index.html'ye 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 başlatı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
Uygulama çalışmaya başladıktan sonra aşağıdaki Web Önizlemesi düğmesini tıklayarak uygulamanın ana sayfa URL'sini ziyaret edin:

Aşağıda gösterildiği gibi, sunulan index.html dosyası gösterilmelidir:

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

9. (İsteğe bağlı) Google Cloud Run'a dağıtma
Son adımımız bu uygulamayı Google Cloud Run'a dağıtmak olacak. Dağıtım komutu aşağıda gösterilmiştir. Dağıtmadan önce değişkenin (<<YOUR_PROJECT_ID>>) değerlerini projenize özel olanlarla değiştirdiğinizden emin olun. Bu değerleri config.yaml dosyasından alabilirsiniz.
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 çalıştırın. Ayrıca Google Cloud API'lerini etkinleştirmeniz ve çeşitli izinler için onay vermeniz de istenebilir. Lütfen bu işlemleri yapın.
Dağıtım işleminin tamamlanması yaklaşık 5-7 dakika sürer. Lütfen bekleyin.

Başarıyla dağıtıldıktan sonra dağıtım çıktısında Cloud Run hizmeti URL'si sağlanır. Şu biçimde olacaktır:
Service URL: https://yogaposes-<<UNIQUEID>.us-central1.run.app
Herkese açık URL'yi ziyaret ettiğinizde aynı web uygulamasının başarıyla dağıtıldığını ve çalıştığını görmeniz gerekir.

Google Cloud Console'dan Cloud Run'ı da ziyaret edebilirsiniz. Bu durumda, Cloud Run'daki hizmetlerin listesini görürsünüz. yogaposes hizmeti, orada listelenen hizmetlerden biri (tek hizmet değilse) olmalıdır.

Belirli bir hizmet adını (bizim örneğimizde yogaposes) tıklayarak URL, yapılandırmalar, günlükler gibi hizmet ayrıntılarını görüntüleyebilirsiniz.

Bu işlem, Cloud Run'da yoga pozları öneri aracı web uygulamamızın geliştirme ve dağıtımını tamamlar.
10. Tebrikler
Tebrikler. Bir veri kümesini Firestore'a yükleyen, yerleştirmeleri oluşturan ve kullanıcı sorgusuna göre vektör benzerliği araması yapan bir uygulamayı başarıyla oluşturdunuz.