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

1. ভূমিকা

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

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

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

84e1cbf29cbaeedc.png সম্পর্কে

তুমি কি করবে

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

তুমি কি শিখবে

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

তোমার যা লাগবে

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

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

2. শুরু করার আগে

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

  1. গুগল ক্লাউড কনসোলে , প্রজেক্ট সিলেক্টর পৃষ্ঠায়, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
  2. আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং সক্ষম আছে কিনা তা নিশ্চিত করুন। কোনও প্রোজেক্টে বিলিং সক্ষম আছে কিনা তা কীভাবে পরীক্ষা করবেন তা শিখুন।
  3. আপনি ক্লাউড শেল ব্যবহার করবেন, এটি গুগল ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ যা 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 মিস হয়ে যায়, তাহলে বাস্তবায়নের সময় আপনি সর্বদা এটি সক্ষম করতে পারেন।

gcloud কমান্ড এবং ব্যবহারের জন্য ডকুমেন্টেশন দেখুন।

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

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

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"

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

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

অনুগ্রহ করে config.template.yaml ফাইলের মতো একই ফোল্ডারে config.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 এ Python প্যাকেজ নির্ভরতা সহ একটি ভার্চুয়াল Python পরিবেশ তৈরি করতে হবে। এটি করার জন্য, Cloud Shell 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:

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

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

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

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

ক্লাউড কনসোলে ফায়ারস্টোর পৃষ্ঠাটি দেখুন।

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

  • ফায়ারস্টোর মোড: Native.
  • Region হিসেবে অবস্থানের ধরণ নির্বাচন করুন এবং অঞ্চলের জন্য us-central1 অবস্থান নির্বাচন করুন।
  • নিরাপত্তা নিয়মের জন্য, Test rules ব্যবহার করুন।
  • ডাটাবেস তৈরি করুন।

61d0277510803c8d.png সম্পর্কে

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

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

৪. যোগব্যায়ামের ভঙ্গির ডেটাসেট প্রস্তুত করুন

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

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

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

যদি আপনার কাছে কোনও অনুমোদন চাওয়া হয়, তাহলে অনুগ্রহ করে তা প্রদান করুন।

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

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

8e830d9ea9b6c60.png সম্পর্কে

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

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

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

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

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

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

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

d67113e2dc63cd6b.png সম্পর্কে

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

৬. ফায়ারস্টোর ডাটাবেস সংগ্রহে সম্পূর্ণ যোগব্যায়াম ভঙ্গি আমদানি করুন

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

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

  1. নিচে দেওয়া gsutil কমান্ড দিয়ে তোমার প্রোজেক্টে একটি বাকেট তৈরি করো। নিচের কমান্ডের <PROJECT_ID> ভেরিয়েবলটি তোমার Google Cloud Project Id দিয়ে প্রতিস্থাপন করো।
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 সম্পর্কে

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

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

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

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

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 composite index তৈরি করতে হবে, যা আপনার সার্চ কোয়েরি সফল করার জন্য প্রয়োজন। যদি আপনি ইনডেক্স তৈরি না করে অ্যাপ্লিকেশনটি চালান, তাহলে প্রথমে ইনডেক্স তৈরি করার কমান্ডের সাথে একটি ত্রুটি প্রদর্শিত হবে যা নির্দেশ করবে যে আপনাকে প্রথমে ইনডেক্স তৈরি করতে হবে।

কম্পোজিট ইনডেক্স তৈরির জন্য 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

ডাটাবেসে ১৫০+ রেকর্ড থাকায় সূচকটি সম্পূর্ণ হতে কয়েক মিনিট সময় লাগবে। এটি সম্পূর্ণ হয়ে গেলে, আপনি নীচের কমান্ডের মাধ্যমে সূচকটি দেখতে পারবেন:

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

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

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

পাইথন ফ্লাস্ক ওয়েব অ্যাপ্লিকেশনটি 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 সম্পর্কে

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

আমাদের শেষ ধাপ হবে এই অ্যাপ্লিকেশনটি Google Cloud Run-এ স্থাপন করা। স্থাপন কমান্ডটি নীচে দেখানো হয়েছে, নিশ্চিত করুন যে এটি স্থাপন করার আগে, আপনি (<<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

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

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

3a6d86fd32e4a5e.png সম্পর্কে

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

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

সেই পাবলিক URL টি দেখুন এবং আপনি একই ওয়েব অ্যাপ্লিকেশনটি স্থাপন এবং সফলভাবে চলমান দেখতে পাবেন।

84e1cbf29cbaeedc.png সম্পর্কে

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

f2b34a8c9011be4c.png সম্পর্কে

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

অনুসরণ

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

১০. অভিনন্দন

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

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