কোডল্যাব - ফায়ারস্টোর, ভেক্টর অনুসন্ধান, ল্যাংচেইন এবং জেমিনি (পাইথন সংস্করণ) সহ একটি প্রাসঙ্গিক যোগ পোজ সুপারিশকারী অ্যাপ তৈরি করুন

1. ভূমিকা

এই কোডল্যাবে, আপনি একটি অ্যাপ্লিকেশন তৈরি করবেন যা যোগা ভঙ্গি সুপারিশ করতে ভেক্টর অনুসন্ধান ব্যবহার করে।

কোডল্যাবের মাধ্যমে, আপনি নিম্নলিখিত হিসাবে একটি ধাপে ধাপে পদ্ধতি ব্যবহার করবেন:

  1. যোগা ভঙ্গি (JSON ফর্ম্যাট) এর একটি বিদ্যমান আলিঙ্গন মুখ ডেটাসেট ব্যবহার করুন।
  2. একটি অতিরিক্ত ক্ষেত্রের বিবরণ সহ ডেটাসেট উন্নত করুন যা প্রতিটি ভঙ্গির জন্য বর্ণনা তৈরি করতে জেমিনি ব্যবহার করে।
  3. একটি ডকুমেন্ট তৈরি করতে ল্যাংচেন ব্যবহার করুন, ফায়ারস্টোরে সংগ্রহ এবং এম্বেডিং তৈরি করতে ফায়ারস্টোর ল্যাংচেন ইন্টিগ্রেশন ব্যবহার করুন।
  4. ভেক্টর অনুসন্ধানের জন্য Firestore-এ একটি যৌগিক সূচক তৈরি করুন।
  5. একটি ফ্লাস্ক অ্যাপ্লিকেশনে ভেক্টর অনুসন্ধান ব্যবহার করুন যা নীচে দেখানো হিসাবে সবকিছুকে একত্রিত করে:

84e1cbf29cbaeedc.png

আপনি কি করবেন

  • যোগা ভঙ্গি সুপারিশ করার জন্য ভেক্টর অনুসন্ধান নিয়োগ করে এমন একটি ওয়েব অ্যাপ্লিকেশন ডিজাইন, তৈরি এবং স্থাপন করুন।

আপনি কি শিখবেন

  • টেক্সট বিষয়বস্তু তৈরি করতে এবং এই কোডল্যাবের প্রেক্ষাপটে যোগব্যায়াম ভঙ্গির জন্য বর্ণনা তৈরি করতে কীভাবে জেমিনি ব্যবহার করবেন
  • ফায়ারস্টোরের জন্য ল্যাংচেন ডকুমেন্ট লোডার কীভাবে ব্যবহার করবেন একটি বর্ধিত ডেটাসেট থেকে হাগিং ফেস থেকে ফায়ারস্টোরে ভেক্টর এম্বেডিং সহ রেকর্ড লোড করতে
  • একটি প্রাকৃতিক ভাষার প্রশ্নের উপর ভিত্তি করে ডেটা অনুসন্ধান করতে ফায়ারস্টোরের জন্য ল্যাংচেন ভেক্টর স্টোর কীভাবে ব্যবহার করবেন
  • অডিও সামগ্রী তৈরি করতে Google ক্লাউড টেক্সট টু স্পিচ API কীভাবে ব্যবহার করবেন

আপনি কি প্রয়োজন হবে

  • ক্রোম ওয়েব ব্রাউজার
  • একটি জিমেইল অ্যাকাউন্ট
  • বিলিং সক্ষম সহ একটি ক্লাউড প্রকল্প৷

এই কোডল্যাব, সমস্ত স্তরের বিকাশকারীদের জন্য ডিজাইন করা হয়েছে (শিশুদের সহ), এর নমুনা অ্যাপ্লিকেশনে পাইথন ব্যবহার করে। যাইহোক, উপস্থাপিত ধারণাগুলি বোঝার জন্য পাইথন জ্ঞানের প্রয়োজন নেই।

2. আপনি শুরু করার আগে

একটি প্রকল্প তৈরি করুন

  1. Google ক্লাউড কনসোলে , প্রকল্প নির্বাচক পৃষ্ঠায়, একটি Google ক্লাউড প্রকল্প নির্বাচন করুন বা তৈরি করুন।
  2. নিশ্চিত করুন যে আপনার ক্লাউড প্রকল্পের জন্য বিলিং সক্ষম করা আছে৷ একটি প্রকল্পে বিলিং সক্ষম কিনা তা পরীক্ষা করতে শিখুন।
  3. আপনি ক্লাউড শেল ব্যবহার করবেন, Google ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ যা bq এর সাথে প্রিলোড করা হয়। গুগল ক্লাউড কনসোলের শীর্ষে সক্রিয় ক্লাউড শেল ক্লিক করুন।

ক্লাউড শেল বোতামের ছবি সক্রিয় করুন

  1. একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি পরীক্ষা করে দেখুন যে আপনি ইতিমধ্যেই প্রমাণীকৃত হয়েছেন এবং নিম্নলিখিত কমান্ডটি ব্যবহার করে প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে:
gcloud auth list
  1. gcloud কমান্ড আপনার প্রকল্প সম্পর্কে জানে তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান।
gcloud config list project
  1. যদি আপনার প্রজেক্ট সেট করা না থাকে, তাহলে এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
gcloud config set project <YOUR_PROJECT_ID>
  1. নীচে দেখানো কমান্ডের মাধ্যমে প্রয়োজনীয় API গুলি সক্ষম করুন৷ এটি কয়েক মিনিট সময় নিতে পারে, তাই ধৈর্য ধরুন।
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

কমান্ডের সফল সঞ্চালন হলে, আপনি নীচের দেখানো একটি অনুরূপ একটি বার্তা দেখতে হবে:

Operation "operations/..." finished successfully.

gcloud কমান্ডের বিকল্প হল কনসোলের মাধ্যমে প্রতিটি পণ্য অনুসন্ধান করে বা এই লিঙ্কটি ব্যবহার করে।

যদি কোনো API মিস হয়, আপনি সর্বদা বাস্তবায়নের সময় এটি সক্রিয় করতে পারেন।

জিক্লাউড কমান্ড এবং ব্যবহারের জন্য ডকুমেন্টেশন পড়ুন।

ক্লোন সংগ্রহস্থল এবং সেটআপ পরিবেশ সেটিংস

পরবর্তী ধাপ হল নমুনা সংগ্রহস্থল ক্লোন করা যা আমরা কোডল্যাবের বাকি অংশে উল্লেখ করব। ধরে নিই যে আপনি ক্লাউড শেলে আছেন, আপনার হোম ডিরেক্টরি থেকে নিম্নলিখিত কমান্ড দিন:

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

সম্পাদক চালু করতে, ক্লাউড শেল উইন্ডোর টুলবারে সম্পাদক খুলুন ক্লিক করুন। উপরের বাম কোণে মেনু বারে ক্লিক করুন এবং নীচে দেখানো হিসাবে ফাইল → ফোল্ডার খুলুন নির্বাচন করুন:

66221fd0d0e5202f.png

yoga-poses-recommender-python ফোল্ডারটি নির্বাচন করুন এবং আপনি নীচের দেখানো ফাইলগুলির সাথে ফোল্ডারটি খোলা দেখতে পাবেন:

44699efc7fb1b911.png

আমাদের এখন পরিবেশের ভেরিয়েবল সেট আপ করতে হবে যা আমরা ব্যবহার করব। config.template.yaml ফাইলটিতে ক্লিক করুন এবং আপনি নীচে দেখানো বিষয়বস্তু দেখতে পাবেন:

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"

Google ক্লাউড প্রজেক্ট এবং ফায়ারস্টোর ডেটাবেস অঞ্চল তৈরি করার সময় আপনি যা নির্বাচন করেছেন সেই অনুযায়ী অনুগ্রহ করে project_id এবং location মান আপডেট করুন। আদর্শভাবে, আমরা চাই যে location মানগুলি Google ক্লাউড প্রজেক্ট এবং ফায়ারস্টোর ডেটাবেসের জন্য একই হোক, যেমন us-central1

এই কোডল্যাবের উদ্দেশ্যে, আমরা পূর্ব-কনফিগার করা মানগুলির সাথে যেতে যাচ্ছি (অবশ্যই project_id এবং location জন্য, যা আপনাকে আপনার কনফিগারেশন অনুযায়ী সেট করতে হবে।

অনুগ্রহ করে এই ফাইলটিকে config.yaml হিসাবে config.template.yaml ফাইলের মতো একই ফোল্ডারে সংরক্ষণ করুন৷

এখন চূড়ান্ত পদক্ষেপ হল একটি পাইথন পরিবেশ তৈরি করা যা আমরা আমাদের জন্য সেট আপ করা সমস্ত পাইথন নির্ভরতার সাথে স্থানীয়ভাবে ব্যবহার করব। pyproject.toml ফাইলটি দেখুন যাতে একই বিবরণ রয়েছে, যার বিষয়বস্তু নীচে দেখানো হয়েছে:

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",
]

এই নির্ভরতাগুলো আগে থেকেই requirements.txt এ লক করা আছে . সংক্ষেপে, ভার্চুয়াল এনভায়রনমেন্টে ইনস্টল করার জন্য requirements.txt এ পাইথন প্যাকেজ নির্ভরতা সহ একটি ভার্চুয়াল পাইথন পরিবেশ তৈরি করতে হবে। এটি করতে, ক্লাউড শেল IDE-এর Command Palette (Ctrl+Shift+P) যান এবং Python: Create Environment । একটি Virtual Environment(venv) , Python 3.x interpreter এবং requirements.txt ফাইল নির্বাচন করতে পরবর্তী কয়েকটি ধাপ অনুসরণ করুন।

একবার পরিবেশ তৈরি হয়ে গেলে, আমাদের নিম্নলিখিত কমান্ডের সাহায্যে তৈরি পরিবেশ সক্রিয় করতে হবে

source .venv/bin/activate

আপনার কনসোলে (.venv) দেখতে হবে। যেমন -> (.venv) yourusername@cloudshell:

দারুণ! আমরা এখন Firestore ডাটাবেস সেট আপ করার কাজে এগিয়ে যাওয়ার জন্য প্রস্তুত।

3. ফায়ারস্টোর সেটআপ করুন

ক্লাউড ফায়ারস্টোর হল একটি সম্পূর্ণ-পরিচালিত সার্ভারহীন ডকুমেন্ট ডাটাবেস যা আমরা আমাদের অ্যাপ্লিকেশন ডেটার জন্য ব্যাকএন্ড হিসাবে ব্যবহার করব। ক্লাউড ফায়ারস্টোরের ডেটা নথির সংগ্রহে গঠন করা হয়।

ফায়ারস্টোর ডাটাবেস আরম্ভ

ক্লাউড কনসোলে Firestore পৃষ্ঠায় যান।

আপনি যদি প্রজেক্টে আগে ফায়ারস্টোর ডাটাবেস চালু না করে থাকেন, তাহলে Create Database -এ ক্লিক করে default ডাটাবেস তৈরি করুন। ডাটাবেস তৈরি করার সময়, নিম্নলিখিত মানগুলির সাথে যান:

  • ফায়ারস্টোর মোড: Native.
  • অবস্থান: ডিফল্ট অবস্থান সেটিংস দিয়ে যান।
  • নিরাপত্তা বিধিগুলির জন্য, Test rules সাথে যান৷
  • ডাটাবেস তৈরি করুন।

504cabdb99a222a5.png

পরবর্তী বিভাগে, আমরা আমাদের ডিফল্ট ফায়ারস্টোর ডাটাবেসে poses নামে একটি সংগ্রহ তৈরি করার ভিত্তি স্থাপন করব। এই সংগ্রহে নমুনা ডেটা (ডকুমেন্ট) বা যোগ পোজ তথ্য থাকবে, যা আমরা আমাদের অ্যাপ্লিকেশনে ব্যবহার করব।

এটি ফায়ারস্টোর ডাটাবেস সেট আপ করার জন্য বিভাগটি সম্পূর্ণ করে।

4. যোগা পোজ ডেটাসেট প্রস্তুত করুন

আমাদের প্রথম কাজ হল যোগা পোজ ডেটাসেট প্রস্তুত করা যা আমরা অ্যাপ্লিকেশনের জন্য ব্যবহার করব। আমরা একটি বিদ্যমান হাগিং ফেস ডেটাসেট দিয়ে শুরু করব এবং তারপরে অতিরিক্ত তথ্য দিয়ে এটিকে উন্নত করব।

যোগা ভঙ্গির জন্য আলিঙ্গন করা মুখের ডেটাসেটটি দেখুন। মনে রাখবেন যে এই কোডল্যাবটি যখন ডেটাসেটগুলির একটি ব্যবহার করে, আপনি আসলে অন্য কোনও ডেটাসেট ব্যবহার করতে পারেন এবং ডেটাসেট উন্নত করতে প্রদর্শিত একই কৌশলগুলি অনুসরণ করতে পারেন৷

298cfae7f23e4bef.png

আমরা যদি Files and versions বিভাগে যাই, আমরা সমস্ত ভঙ্গির জন্য JSON ডেটা ফাইল পেতে পারি।

3fe6e55abdc032ec.png

আমরা yoga_poses.json ডাউনলোড করেছি এবং সেই ফাইলটি আপনাকে প্রদান করেছি। এই ফাইলটির নাম yoga_poses_alldata.json এবং এটি /data ফোল্ডারে রয়েছে।

ক্লাউড শেল এডিটরে data/yoga_poses.json ফাইলটিতে যান এবং JSON অবজেক্টের তালিকাটি দেখুন, যেখানে প্রতিটি JSON অবজেক্ট একটি যোগ পোজ উপস্থাপন করে। আমাদের মোট 3টি রেকর্ড রয়েছে এবং একটি নমুনা রেকর্ড নীচে দেখানো হয়েছে:

{
   "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"]
 }

মিথুনের সাথে পরিচয় করিয়ে দেওয়ার এবং কীভাবে আমরা এটির জন্য একটি description ক্ষেত্র তৈরি করতে ডিফল্ট মডেলটি ব্যবহার করতে পারি তা এখন আমাদের জন্য একটি দুর্দান্ত সুযোগ।

ক্লাউড শেল এডিটরে, generate-descriptions.py ফাইলে যান। এই ফাইলের বিষয়বস্তু নীচে দেখানো হয়েছে:

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()

এই অ্যাপ্লিকেশনটি প্রতিটি যোগা পোজ JSON রেকর্ডে একটি নতুন description ক্ষেত্র যোগ করবে। এটি মিথুন মডেলের কাছে একটি কলের মাধ্যমে বিবরণটি পাবে, যেখানে আমরা এটিকে প্রয়োজনীয় প্রম্পট প্রদান করব। ক্ষেত্রটি JSON ফাইলে যোগ করা হয় এবং নতুন ফাইলটি data/yoga_poses_with_descriptions.json ফাইলে লেখা হয়।

চলুন প্রধান পদক্ষেপের মাধ্যমে যান:

  1. main() ফাংশনে, আপনি দেখতে পাবেন যে এটি add_descriptions_to_json ফাংশনকে আহ্বান করে এবং ইনপুট ফাইল এবং প্রত্যাশিত আউটপুট ফাইল সরবরাহ করে।
  2. add_descriptions_to_json ফাংশন প্রতিটি JSON রেকর্ডের জন্য নিম্নলিখিত কাজ করে যেমন যোগ পোস্ট তথ্য:
  3. এটি pose_name , sanskrit_name , expertise_level এবং pose_types বের করে।
  4. এটি generate_description ফাংশনকে আহ্বান করে যা একটি প্রম্পট তৈরি করে এবং তারপরে প্রতিক্রিয়া পাঠ্য পেতে Langchain VertexAI মডেল ক্লাসকে আহ্বান করে।
  5. এই প্রতিক্রিয়া পাঠ্য তারপর JSON অবজেক্ট যোগ করা হয়.
  6. অবজেক্টের আপডেট করা JSON তালিকা তারপর গন্তব্য ফাইলে লেখা হয়।

আমাদের এই অ্যাপ্লিকেশন চালানো যাক. একটি নতুন টার্মিনাল উইন্ডো চালু করুন (Ctrl+Shift+C) এবং নিম্নলিখিত কমান্ড দিন:

python generate-descriptions.py

যদি আপনাকে কোনো অনুমোদনের জন্য বলা হয়, অনুগ্রহ করে এগিয়ে যান এবং সেটি প্রদান করুন।

আপনি দেখতে পাবেন যে অ্যাপ্লিকেশনটি কার্যকর করা শুরু হয়েছে। নতুন Google ক্লাউড অ্যাকাউন্টে যেকোন হারের সীমা কোটা এড়াতে আমরা রেকর্ডগুলির মধ্যে 30 সেকেন্ডের বিলম্ব যোগ করেছি, তাই অনুগ্রহ করে ধৈর্য ধরুন।

চলমান একটি নমুনা নীচে দেখানো হয়েছে:

8e830d9ea9b6c60.png

একবার জেমিনি কলের সাথে 3টি রেকর্ডের সবকটি উন্নত হয়ে গেলে, একটি ফাইল data/yoga_poses_with_description.json তৈরি করা হবে। আপনি যে কটাক্ষপাত করতে পারেন.

আমরা এখন আমাদের ডেটা ফাইলের সাথে প্রস্তুত এবং পরবর্তী পদক্ষেপটি হল এম্বেডিং জেনারেশনের সাথে একটি ফায়ারস্টোর ডেটাবেস কীভাবে পপুলেট করা যায় তা বোঝা।

5. ফায়ারস্টোরে ডেটা আমদানি করুন এবং ভেক্টর এমবেডিং তৈরি করুন

আমাদের কাছে data/yoga_poses_with_description.json ফাইল আছে এবং এখন এটির সাথে Firestore ডেটাবেস তৈরি করতে হবে এবং গুরুত্বপূর্ণভাবে, প্রতিটি রেকর্ডের জন্য ভেক্টর এমবেডিং তৈরি করতে হবে। ভেক্টর এমবেডিংগুলি পরবর্তীতে কাজে লাগবে যখন আমাদের প্রাকৃতিক ভাষায় দেওয়া ব্যবহারকারীর প্রশ্নের সাথে তাদের একটি মিল অনুসন্ধান করতে হবে।

উপরের প্রক্রিয়াটি বাস্তবায়ন করতে আমরা ল্যাংচেইন ফায়ারস্টোর উপাদানগুলি ব্যবহার করব।

এটি করার পদক্ষেপগুলি নিম্নরূপ হবে:

  1. আমরা JSON অবজেক্টের তালিকাকে ল্যাংচেইন ডকুমেন্ট অবজেক্টের তালিকায় রূপান্তর করব। প্রতিটি নথিতে দুটি বৈশিষ্ট্য থাকবে: page_content এবং metadata । মেটাডেটা অবজেক্টে পুরো JSON অবজেক্ট থাকবে যার মধ্যে name , description , sanskrit_name , ইত্যাদির মতো বৈশিষ্ট্য রয়েছে। page_content হবে একটি স্ট্রিং টেক্সট যা কয়েকটি ক্ষেত্রের সমন্বয় হবে।
  2. একবার আমাদের কাছে Document অবজেক্টের একটি তালিকা হয়ে গেলে, আমরা FirestoreVectorStore Langchain ক্লাস এবং বিশেষ করে from_documents পদ্ধতি ব্যবহার করব নথির এই তালিকার সাথে, একটি সংগ্রহের নাম (আমরা TEST_COLLECTION ভেরিয়েবল ব্যবহার করছি যা test-poses নির্দেশ করে), একটি Vertex AI এমবেডিং ক্লাস এবং Firestore সংযোগের বিবরণ ( এবং PROJECT_ID নাম) DATABASE এটি সংগ্রহ তৈরি করবে এবং প্রতিটি বৈশিষ্ট্যের জন্য একটি embedding ক্ষেত্র তৈরি করবে।

import-data.py এর কোডটি নীচে দেওয়া হয়েছে (কোডের অংশগুলি সংক্ষিপ্ততার জন্য কেটে দেওয়া হয়েছে):

... 

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()

আমাদের এই অ্যাপ্লিকেশন চালানো যাক. একটি নতুন টার্মিনাল উইন্ডো চালু করুন (Ctrl+Shift+C) এবং নিম্নলিখিত কমান্ড দিন:

python import-data.py

সবকিছু ঠিকঠাক থাকলে, আপনি নীচের মত একটি বার্তা দেখতে পাবেন:

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

রেকর্ডগুলি সফলভাবে ঢোকানো হয়েছে এবং এমবেডিংগুলি তৈরি হয়েছে কিনা তা পরীক্ষা করতে, ক্লাউড কনসোলে ফায়ারস্টোর পৃষ্ঠায় যান৷

504cabdb99a222a5.png

(ডিফল্ট) ডাটাবেসে ক্লিক করুন, এটি সেই সংগ্রহের অধীনে test-poses সংগ্রহ এবং একাধিক নথি প্রদর্শন করবে। প্রতিটি নথি একটি যোগ ভঙ্গি.

d0708499e403aebc.png

ক্ষেত্রগুলি তদন্ত করতে যেকোন নথিতে ক্লিক করুন। আমরা যে ক্ষেত্রগুলি আমদানি করেছি তা ছাড়াও, আপনি embedding ক্ষেত্রটিও পাবেন, যা একটি ভেক্টর ক্ষেত্র যা আপনার জন্য স্বয়ংক্রিয়ভাবে তৈরি করা হয়েছে Langchain VertexAIEmbeddings ক্লাসের মাধ্যমে যা আমরা ব্যবহার করেছি, যেখানে আমরা text-embedding-004 ভার্টেক্স এআই এমবেডিং মডেল প্রদান করেছি৷

d67113e2dc63cd6b.png

এখন যেহেতু আমাদের কাছে ফায়ারস্টোর ডাটাবেসে এম্বেডিং সহ রেকর্ডগুলি আপলোড করা আছে, আমরা পরবর্তী ধাপে যেতে পারি এবং দেখতে পারি কিভাবে ফায়ারস্টোরে ভেক্টরের সাদৃশ্য অনুসন্ধান করা যায়।

6. Firestore ডেটাবেস সংগ্রহে সম্পূর্ণ যোগ পোজ আমদানি করুন

আমরা এখন poses সংগ্রহ তৈরি করব, যা 160টি যোগ পোজের একটি সম্পূর্ণ তালিকা, যার জন্য আমরা একটি ডাটাবেস আমদানি ফাইল তৈরি করেছি যা আপনি সরাসরি আমদানি করতে পারেন। ল্যাবে সময় বাঁচানোর জন্য এটি করা হয়। বর্ণনা এবং এম্বেডিং ধারণ করে ডেটাবেস তৈরি করার প্রক্রিয়াটি একই যা আমরা আগের বিভাগে দেখেছি।

নীচের ধাপগুলি অনুসরণ করে ডাটাবেস আমদানি করুন:

  1. নীচে দেওয়া gsutil কমান্ড দিয়ে আপনার প্রকল্পে একটি বালতি তৈরি করুন। নিচের কমান্ডে <PROJECT_ID> ভেরিয়েবলটিকে আপনার Google ক্লাউড প্রজেক্ট আইডি দিয়ে প্রতিস্থাপন করুন।
gsutil mb -l us-central1 gs://<PROJECT_ID>-my-bucket
  1. এখন যেহেতু বালতি তৈরি হয়েছে, আমরা ফায়ারবেস ডাটাবেসে আমদানি করার আগে আমাদের এই বালতিতে প্রস্তুত করা ডাটাবেস এক্সপোর্ট কপি করতে হবে। নীচে দেওয়া কমান্ড ব্যবহার করুন:
gsutil cp -r gs://yoga-database-firestore-export-bucket/2025-01-27T05:11:02_62615  gs://<PROJECT_ID>-my-bucket

এখন যেহেতু আমাদের কাছে আমদানি করার ডেটা আছে, আমরা যে Firebase ডাটাবেস ( default ) তৈরি করেছি তাতে ডেটা আমদানির চূড়ান্ত ধাপে যেতে পারি।

  1. নিচে দেওয়া gcloud কমান্ডটি ব্যবহার করুন:
gcloud firestore import gs://<PROJECT_ID>-my-bucket/2025-01-27T05:11:02_62615

আমদানিতে কয়েক সেকেন্ড সময় লাগবে এবং এটি প্রস্তুত হয়ে গেলে, আপনি https://console.cloud.google.com/firestore/databases- এ গিয়ে আপনার Firestore ডাটাবেস এবং সংগ্রহটি যাচাই করতে পারেন, default ডাটাবেস এবং poses সংগ্রহটি নীচে দেখানো হিসাবে নির্বাচন করুন:

a8f5a6ba69bec69b.png

এটি Firestore সংগ্রহের তৈরি সম্পূর্ণ করে যা আমরা আমাদের অ্যাপ্লিকেশনে ব্যবহার করব।

7. ফায়ারস্টোরে ভেক্টর সাদৃশ্য অনুসন্ধান করুন৷

ভেক্টর সাদৃশ্য অনুসন্ধান করতে, আমরা ব্যবহারকারীর কাছ থেকে প্রশ্ন নেব। এই প্রশ্নের একটি উদাহরণ হতে পারে "Suggest me some exercises to relieve back pain"

search-data.py ফাইলটি একবার দেখুন। দেখতে কী ফাংশন হল অনুসন্ধান ফাংশন, যা নীচে দেখানো হয়েছে। একটি উচ্চ স্তরে, এটি একটি এমবেডিং ক্লাস তৈরি করে যা ব্যবহারকারীর প্রশ্নের জন্য এম্বেডিং তৈরি করতে ব্যবহার করা হবে। এটি তারপর FirestoreVectorStore ক্লাস ব্যবহার করে তার similarity_search ফাংশন চালু করতে।

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)

আপনি কয়েকটি ক্যোয়ারী উদাহরণ সহ এটি চালানোর আগে, আপনাকে প্রথমে একটি Firestore কম্পোজিট সূচক তৈরি করতে হবে, যা আপনার অনুসন্ধান ক্যোয়ারী সফল হওয়ার জন্য প্রয়োজন। আপনি যদি সূচী তৈরি না করেই অ্যাপ্লিকেশনটি চালান, একটি ত্রুটি নির্দেশ করে যে আপনাকে প্রথমে সূচী তৈরি করতে হবে প্রথমে সূচী তৈরি করতে কমান্ডের সাথে প্রদর্শিত হবে।

যৌগিক সূচক তৈরি করার জন্য gcloud কমান্ডটি নীচে দেখানো হয়েছে:

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

সূচকটি সম্পূর্ণ হতে কয়েক মিনিট সময় নেবে যেহেতু ডাটাবেসে উপস্থিত 150+ রেকর্ড রয়েছে৷ এটি সম্পূর্ণ হয়ে গেলে, আপনি নীচে দেখানো কমান্ডের মাধ্যমে সূচকটি দেখতে পারেন:

gcloud firestore indexes composite list

আপনি তালিকায় যে সূচীটি তৈরি করেছেন তা দেখতে হবে।

এখন নিম্নলিখিত কমান্ড ব্যবহার করে দেখুন:

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

আপনাকে দেওয়া কয়েকটি সুপারিশ থাকা উচিত। একটি নমুনা রান নীচে দেখানো হয়েছে:

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']

একবার আপনার কাজ হয়ে গেলে, আমরা এখন বুঝতে পেরেছি কিভাবে রেকর্ড আপলোড করতে, এম্বেডিং তৈরি করতে এবং একটি ভেক্টর সাদৃশ্য অনুসন্ধান করতে Firestore ভেক্টর ডেটাবেস কাজ করতে হয়। আমরা এখন একটি ওয়েব অ্যাপ্লিকেশন তৈরি করতে পারি যা একটি ওয়েব ফ্রন্ট-এন্ডে ভেক্টর অনুসন্ধানকে একীভূত করবে।

8. ওয়েব অ্যাপ্লিকেশন

পাইথন ফ্লাস্ক ওয়েব অ্যাপ্লিকেশনটি main.py ফাইলে পাওয়া যায় এবং ফ্রন্ট-এন্ড HTML ফাইলটি templates/index.html.

এটি সুপারিশ করা হয় যে আপনি উভয় ফাইল কটাক্ষপাত করুন. প্রথমে main.py ফাইল দিয়ে শুরু করুন যেটিতে /search হ্যান্ডলার রয়েছে, যেটি প্রম্পট নেয় যা ফ্রন্ট-এন্ড HTML index.html ফাইল থেকে পাস করা হয়েছে। এটি তারপর অনুসন্ধান পদ্ধতির আহ্বান করে, যা আমরা পূর্ববর্তী বিভাগে দেখেছি এমন ভেক্টর সাদৃশ্য অনুসন্ধান করে।

তারপর প্রতিক্রিয়াটি সুপারিশের তালিকা সহ index.html এ ফেরত পাঠানো হয়। তারপর index.html বিভিন্ন কার্ড হিসাবে সুপারিশগুলি প্রদর্শন করে৷

স্থানীয়ভাবে অ্যাপ্লিকেশন চালান

একটি নতুন টার্মিনাল উইন্ডো (Ctrl+Shift+C) বা বিদ্যমান কোনো টার্মিনাল উইন্ডো চালু করুন এবং নিম্নলিখিত কমান্ড দিন:

python main.py

একটি নমুনা মৃত্যুদন্ড নীচে দেখানো হয়েছে:

 * 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

একবার চালু হয়ে গেলে, নীচে দেখানো ওয়েব প্রিভিউ বোতামে ক্লিক করে অ্যাপ্লিকেশনটির হোম URL-এ যান:

de297d4cee10e0bf.png

এটি আপনাকে index.html ফাইলটি দেখানো উচিত যা নীচে দেখানো হয়েছে:

20240a0e885ac17b.png

একটি নমুনা প্রশ্ন প্রদান করুন (উদাহরণ: Provide me some exercises for back pain relief ) এবং Search বোতামে ক্লিক করুন। এটি ডাটাবেস থেকে কিছু সুপারিশ পুনরুদ্ধার করা উচিত। আপনি একটি Play Audio বোতামও দেখতে পাবেন, যা বর্ণনার উপর ভিত্তি করে একটি অডিও স্ট্রিম তৈরি করবে, যা আপনি সরাসরি শুনতে পারবেন।

789b4277dc40e2be.png

9. (ঐচ্ছিক) গুগল ক্লাউড রানে স্থাপন করা হচ্ছে

আমাদের চূড়ান্ত পদক্ষেপ Google ক্লাউড রানে এই অ্যাপ্লিকেশনটি স্থাপন করা হবে৷ ডিপ্লয়মেন্ট কমান্ডটি নীচে দেখানো হয়েছে, নিশ্চিত করুন যে আপনি এটি স্থাপন করার আগে, আপনি পরিবর্তনশীল (<<YOUR_PROJECT_ID>>) এর মানগুলিকে আপনার প্রকল্পের সাথে নির্দিষ্ট করে প্রতিস্থাপন করেছেন। এই মানগুলি আপনি config.yaml ফাইল থেকে পুনরুদ্ধার করতে সক্ষম হবেন।

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

অ্যাপ্লিকেশনটির রুট ফোল্ডার থেকে উপরের কমান্ডটি চালান। আপনাকে Google ক্লাউড API সক্রিয় করতে বলা হতে পারে, বিভিন্ন অনুমতির জন্য আপনার স্বীকৃতি দিন, অনুগ্রহ করে তা করুন৷

স্থাপনার প্রক্রিয়াটি সম্পূর্ণ হতে প্রায় 5-7 মিনিট সময় লাগবে, তাই অনুগ্রহ করে ধৈর্য ধরুন।

3a6d86fd32e4a5e.png

একবার সফলভাবে স্থাপন করা হলে, স্থাপনার আউটপুট ক্লাউড রান পরিষেবা URL প্রদান করবে। এটি ফর্মের হবে:

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

সেই সর্বজনীন URL-এ যান এবং আপনি দেখতে পাবেন একই ওয়েব অ্যাপ্লিকেশন সফলভাবে স্থাপন করা হয়েছে এবং চলছে৷

84e1cbf29cbaeedc.png

আপনি Google ক্লাউড কনসোল থেকে ক্লাউড রানেও যেতে পারেন এবং আপনি ক্লাউড রানে পরিষেবার তালিকা দেখতে পাবেন। yogaposes পরিষেবাটি সেখানে তালিকাভুক্ত পরিষেবাগুলির মধ্যে একটি হওয়া উচিত (যদি একমাত্র না হয়)।

f2b34a8c9011be4c.png

আপনি নির্দিষ্ট পরিষেবার নামের উপর ক্লিক করে ইউআরএল, কনফিগারেশন, লগ এবং আরও অনেক কিছুর মতো পরিষেবার বিশদ বিবরণ দেখতে পারেন (আমাদের ক্ষেত্রে yogaposes )।

faaa5e0c02fe0423.png

এটি ক্লাউড রানে আমাদের যোগ পোজ সুপারিশকারী ওয়েব অ্যাপ্লিকেশনের বিকাশ এবং স্থাপনা সম্পূর্ণ করে।

10. অভিনন্দন

অভিনন্দন, আপনি সফলভাবে একটি অ্যাপ্লিকেশন তৈরি করেছেন যা Firestore-এ একটি ডেটাসেট আপলোড করে, এম্বেডিং তৈরি করে এবং ব্যবহারকারীদের প্রশ্নের উপর ভিত্তি করে একটি ভেক্টর সাদৃশ্য অনুসন্ধান করে।

রেফারেন্স ডক্স