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:
- Yoga pozlarının yer aldığı mevcut bir Hugging Face veri kümesini (JSON biçiminde) kullanın.
- Veri kümesini, her bir poz için açıklama oluşturmak üzere Gemini'i kullanan ek bir alan açıklamasıyla zenginleştirin.
- Doküman oluşturmak için Langchain'ı, Firestore'da koleksiyonu ve gömmelerini oluşturmak için Firestore Langchain entegrasyonunu kullanın.
- Vektör aramaya 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 Vektör Arama'yı kullanın:
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
- 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>
- 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:
yoga-poses-recommender-python
klasörünü seçin. Klasör, aşağıdaki gibi aşağıdaki dosyalarla açılacaktır:
Ş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.
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.
Files and versions
bölümüne gidersek tüm pozların 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 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:
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.add_descriptions_to_json
işlevi, her JSON kaydı (ör. yoga gönderisi bilgileri) için aşağıdakileri yapar:pose_name
,sanskrit_name
,expertise_level
vepose_types
öğelerini ayıklayın.- 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.
- Ardından bu yanıt metni JSON nesnesine eklenir.
- 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:
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:
- JSON nesnelerinin listesini Langchain Document nesnelerinin listesine dönüştürürüz. Her dokümanın iki özelliği vardır:
page_content
vemetadata
. 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. 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 edenTEST_COLLECTION
değişkenini kullanıyoruz), Vertex AI Embedding sınıfı ve Firestore bağlantı ayrıntılarını (PROJECT_ID
veDATABASE
adı) içerenfrom_documents
yöntemini kullanacağız. Bu işlem, koleksiyonu oluşturur ve özelliklerin her biri için birembedding
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.
(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.
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.
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:
- 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
- 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.
- 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:
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:
Aşağıda gösterildiği gibi, yayınlanan index.html
dosyasını gösterir:
Ö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.
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.
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.
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.
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.
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.