ভার্টেক্স এআই এসডিকে দিয়ে এলএলএম অ্যাপস তৈরি করা, ভার্টেক্স এআই এসডিকে দিয়ে এলএলএম অ্যাপস তৈরি করা

1. ভূমিকা

সংক্ষিপ্ত বিবরণ

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

তুমি কি করবে

এই ল্যাবে, আপনি Vertex AI- তে Gemini 2.5 Flash মডেল ব্যবহার করে একটি ভ্রমণ সহকারী চ্যাটবট তৈরি করবেন।

আবেদনপত্রে থাকা উচিত:

  • ব্যবহারকারীদের ভ্রমণ সম্পর্কে প্রশ্ন জিজ্ঞাসা করতে, ভ্রমণ বুক করতে এবং তারা যে জায়গাগুলিতে যাওয়ার পরিকল্পনা করছেন সেগুলি সম্পর্কে জানতে সাহায্য করে
  • ব্যবহারকারীদের তাদের নির্দিষ্ট ভ্রমণ পরিকল্পনা সম্পর্কে সাহায্য পাওয়ার উপায় প্রদান করে
  • টুল ব্যবহার করে আবহাওয়ার মতো রিয়েল-টাইম ডেটা আনতে সক্ষম হোন।

আপনি একটি পূর্ব-কনফিগার করা গুগল ক্লাউড পরিবেশে কাজ করবেন, বিশেষ করে ক্লাউড শেল এডিটরের মধ্যে। আপনার জন্য একটি মৌলিক ওয়েব অ্যাপ্লিকেশন ফ্রন্টএন্ড ইতিমধ্যেই সেট আপ করা আছে, সাথে Vertex AI অ্যাক্সেস করার জন্য প্রয়োজনীয় অনুমতিও রয়েছে। এই অ্যাপটি Streamlit ব্যবহার করে তৈরি করা হয়েছে।

তুমি কি শিখবে

এই ল্যাবে, আপনি নিম্নলিখিত কাজগুলি কীভাবে সম্পাদন করবেন তা শিখবেন:

2. প্রকল্প সেটআপ

গুগল অ্যাকাউন্ট

যদি আপনার ইতিমধ্যেই একটি ব্যক্তিগত Google অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি Google অ্যাকাউন্ট তৈরি করতে হবে।

কর্মক্ষেত্র বা স্কুল অ্যাকাউন্টের পরিবর্তে ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করুন

গুগল ক্লাউড কনসোলে সাইন-ইন করুন

একটি ব্যক্তিগত গুগল অ্যাকাউন্ট ব্যবহার করে গুগল ক্লাউড কনসোলে সাইন-ইন করুন।

বিলিং সক্ষম করুন

$৫ গুগল ক্লাউড ক্রেডিট রিডিম করুন (ঐচ্ছিক)

এই কর্মশালাটি পরিচালনা করার জন্য, আপনার কিছু ক্রেডিট সহ একটি বিলিং অ্যাকাউন্ট প্রয়োজন। আপনি যদি নিজের বিলিং ব্যবহার করার পরিকল্পনা করেন, তাহলে আপনি এই ধাপটি এড়িয়ে যেতে পারেন।

  1. এই লিঙ্কে ক্লিক করুন এবং একটি ব্যক্তিগত গুগল অ্যাকাউন্ট দিয়ে সাইন ইন করুন। আপনি এরকম কিছু দেখতে পাবেন: ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
  2. আপনার ক্রেডিট অ্যাক্সেস করতে এখানে ক্লিক করুন বোতামটি ক্লিক করুন। এটি আপনাকে আপনার বিলিং প্রোফাইল সেট আপ করার জন্য একটি পৃষ্ঠায় নিয়ে যাবে। ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
  3. নিশ্চিত করুন ক্লিক করুন

আপনি এখন একটি Google ক্লাউড প্ল্যাটফর্ম ট্রায়াল বিলিং অ্যাকাউন্টের সাথে সংযুক্ত।

বিলিং ওভারভিউয়ের স্ক্রিনশট

একটি ব্যক্তিগত বিলিং অ্যাকাউন্ট সেট আপ করুন

আপনি যদি গুগল ক্লাউড ক্রেডিট ব্যবহার করে বিলিং সেট আপ করেন, তাহলে আপনি এই ধাপটি এড়িয়ে যেতে পারেন।

একটি ব্যক্তিগত বিলিং অ্যাকাউন্ট সেট আপ করতে, ক্লাউড কনসোলে বিলিং সক্ষম করতে এখানে যান

কিছু নোট:

  • এই ল্যাবটি সম্পূর্ণ করতে ক্লাউড রিসোর্সে $1 USD এর কম খরচ হবে।
  • আরও চার্জ এড়াতে আপনি এই ল্যাবের শেষে রিসোর্স মুছে ফেলার ধাপগুলি অনুসরণ করতে পারেন।
  • নতুন ব্যবহারকারীরা $300 USD বিনামূল্যে ট্রায়ালের জন্য যোগ্য।

একটি প্রকল্প তৈরি করুন (ঐচ্ছিক)

যদি আপনার কাছে এই ল্যাবের জন্য ব্যবহার করতে চান এমন কোন বর্তমান প্রকল্প না থাকে, তাহলে এখানে একটি নতুন প্রকল্প তৈরি করুন

৩. ক্লাউড শেল এডিটর খুলুন

  1. সরাসরি ক্লাউড শেল এডিটরে যেতে এই লিঙ্কে ক্লিক করুন।
  2. আজই যদি যেকোনো সময় অনুমোদনের অনুরোধ করা হয়, তাহলে চালিয়ে যেতে অনুমোদন করুন-এ ক্লিক করুন। ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
  3. যদি স্ক্রিনের নীচে টার্মিনালটি না দেখা যায়, তাহলে এটি খুলুন:
    • ভিউ ক্লিক করুন
    • টার্মিনাল ক্লিক করুন ক্লাউড শেল এডিটরে নতুন টার্মিনাল খুলুন
  4. টার্মিনালে, এই কমান্ড দিয়ে আপনার প্রকল্পটি সেট করুন:
    gcloud config set project [PROJECT_ID]
    
    • উদাহরণ:
      gcloud config set project lab-project-id-example
      
    • যদি আপনি আপনার প্রজেক্ট আইডি মনে রাখতে না পারেন, তাহলে আপনি আপনার সমস্ত প্রজেক্ট আইডি তালিকাভুক্ত করতে পারেন:
      gcloud projects list | awk '/PROJECT_ID/{print $2}'
      
      ক্লাউড শেল এডিটর টার্মিনালে প্রোজেক্ট আইডি সেট করুন
  5. আপনার এই বার্তাটি দেখা উচিত:
    Updated property [core/project].
    
    >একদিকে নেতিবাচক যদি আপনি একটি `সতর্কতা` দেখতে পান এবং `আপনি কি চালিয়ে যেতে চান (Y/n)?` জিজ্ঞাসা করা হয়, তাহলে সম্ভবত আপনি প্রজেক্ট আইডি ভুলভাবে প্রবেশ করেছেন। `n` টিপুন, `Enter` টিপুন, এবং `gcloud config set project` কমান্ডটি আবার চালানোর চেষ্টা করুন। >

৪. API গুলি সক্ষম করুন

Vertex AI SDK ব্যবহার করতে এবং Gemini মডেলের সাথে ইন্টারঅ্যাক্ট করতে, আপনার Google Cloud Project-এ Vertex AI API সক্ষম করতে হবে।

  1. টার্মিনালে, API গুলি সক্রিয় করুন:
    gcloud services enable \
      aiplatform.googleapis.com
    

পাইথনের জন্য ভার্টেক্স এআই এসডিকে-এর ভূমিকা

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

পাইথনের জন্য ভার্টেক্স এআই এসডিকে-র জন্য বিস্তারিত ডকুমেন্টেশন আপনি এখানে পাবেন: পাইথনের জন্য ভার্টেক্স এআই এসডিকে-র ভূমিকা | গুগল ক্লাউড

৫. একটি ভার্চুয়াল পরিবেশ তৈরি করুন এবং নির্ভরতা ইনস্টল করুন

যেকোনো পাইথন প্রকল্প শুরু করার আগে, একটি ভার্চুয়াল পরিবেশ তৈরি করা ভালো অভ্যাস। এটি প্রকল্পের নির্ভরতাগুলিকে বিচ্ছিন্ন করে, অন্যান্য প্রকল্প বা সিস্টেমের বিশ্বব্যাপী পাইথন প্যাকেজগুলির সাথে দ্বন্দ্ব রোধ করে।

  1. আপনার ভ্রমণ সহকারী অ্যাপের কোড সংরক্ষণ করার জন্য wanderbot নামে একটি ফোল্ডার তৈরি করুন। টার্মিনালে নিম্নলিখিত কোডটি চালান:
    mkdir wanderbot && cd wanderbot
    
  2. একটি ভার্চুয়াল পরিবেশ তৈরি এবং সক্রিয় করুন:
    uv venv --python 3.12
    source .venv/bin/activate
    
    তুমি দেখতে পাবে ( wanderbot ) তোমার টার্মিনাল প্রম্পটের পূর্বে লিখছে, যা ভার্চুয়াল পরিবেশ সক্রিয় বলে নির্দেশ করছে। এটি দেখতে এরকম কিছু হবে:

    একটি সক্রিয় ভার্চুয়াল পরিবেশ সহ টার্মিনালের একটি স্ক্রিনশট

৬. ওয়ান্ডারবটের জন্য স্টার্টার ফাইল তৈরি করুন

  1. অ্যাপ্লিকেশনটির জন্য একটি নতুন app.py ফাইল তৈরি করুন এবং খুলুন। টার্মিনালে নিম্নলিখিত কোডটি চালান:
    cloudshell edit app.py
    
    cloudshell edit কমান্ড টার্মিনালের উপরে এডিটরে app.py ফাইলটি খুলবে।
  2. নিম্নলিখিত অ্যাপ স্টার্টার কোডটি app.py তে পেস্ট করুন:
    import streamlit as st
    from google import genai
    from google.genai import types
    import requests
    import logging
    
    # --- Defining variables and parameters  ---
    REGION = "global"
    PROJECT_ID = None # TO DO: Insert Project ID
    GEMINI_MODEL_NAME = "gemini-2.5-flash"
    
    temperature = .2
    top_p = 0.95
    
    system_instructions = None
    
    # --- Tooling ---
    # TODO: Define the weather tool function declaration
    
    # TODO: Define the get_current_temperature function
    
    
    # --- Initialize the Vertex AI Client ---
    try:
        # TODO: Initialize the Vertex AI client
    
        print(f"VertexAI Client initialized successfully with model {GEMINI_MODEL_NAME}")
    except Exception as e:
        st.error(f"Error initializing VertexAI client: {e}")
        st.stop()
    
    
    # TODO: Add the get_chat function here in Task 15.
    
    
    # --- Call the Model ---
    def call_model(prompt: str, model_name: str) -> str:
        """
        This function interacts with a large language model (LLM) to generate text based on a given prompt and system instructions. 
        It will be replaced in a later step with a more advanced version that handles tooling.
        """
        try:
    
            # TODO: Prepare the content for the model
    
            # TODO: Define generate_content configuration (needed for system instructions and parameters)
    
            # TODO: Define response
    
            logging.info(f"[call_model_response] LLM Response: \"{response.text}\"")
            # TODO: Uncomment the below "return response.text" line
            # return response.text
    
        except Exception as e:
            return f"Error: {e}"
    
    
    # --- Presentation Tier (Streamlit) ---
    # Set the title of the Streamlit application
    st.title("Travel Chat Bot")
    
    # Initialize session state variables if they don't exist
    if "messages" not in st.session_state:
        # Initialize the chat history with a welcome message
        st.session_state["messages"] = [
            {"role": "assistant", "content": "How can I help you today?"}
        ]
    
    # Display the chat history
    for msg in st.session_state.messages:
        st.chat_message(msg["role"]).write(msg["content"])
    
    # Get user input
    if prompt := st.chat_input():
        # Add the user's message to the chat history
        st.session_state.messages.append({"role": "user", "content": prompt})
        # Display the user's message
        st.chat_message("user").write(prompt)
    
        # Show a spinner while waiting for the model's response
        with st.spinner("Thinking..."):
            # Get the model's response using the call_model function
            model_response = call_model(prompt, GEMINI_MODEL_NAME)
            # Add the model's response to the chat history
            st.session_state.messages.append(
                {"role": "assistant", "content": model_response}
            )
            # Display the model's response
            st.chat_message("assistant").write(model_response)
    
  3. অ্যাপ্লিকেশন কোডের জন্য একটি নতুন requirements.txt ফাইল তৈরি করুন এবং খুলুন। টার্মিনালে নিম্নলিখিত কোডটি চালান:
    cloudshell edit requirements.txt
    
    cloudshell edit কমান্ড টার্মিনালের উপরে এডিটরে requirements.txt ফাইলটি খুলবে।
  4. নিম্নলিখিত অ্যাপ স্টার্টার কোডটি requirements.txt ফাইলে পেস্ট করুন।
    google-genai
    streamlit
    requests
    
  5. এই প্রকল্পের জন্য প্রয়োজনীয় পাইথন নির্ভরতা ইনস্টল করুন। টার্মিনালে নিম্নলিখিত কোডটি চালান:
    uv pip install -r requirements.txt
    

৭. কোডটি অন্বেষণ করুন

আপনার তৈরি করা ফাইলগুলিতে একটি মৌলিক চ্যাট অ্যাপ্লিকেশন ফ্রন্টএন্ড অন্তর্ভুক্ত রয়েছে। এর মধ্যে রয়েছে:

  • app.py : এই ফাইলটিতে আমরা কাজ করব। বর্তমানে এতে নিম্নলিখিতগুলি রয়েছে:
    • প্রয়োজনীয় আমদানি
    • পরিবেশগত ভেরিয়েবল এবং প্যারামিটার (যার মধ্যে কিছু স্থানধারক)
    • একটি খালি call_model ফাংশন, যা আমরা পূরণ করব
    • ফ্রন্ট-এন্ড চ্যাট অ্যাপের জন্য স্ট্রিমলিট কোড
  • requirements.txt :
    • app.py চালানোর জন্য ইনস্টলেশনের প্রয়োজনীয়তা অন্তর্ভুক্ত করে

এখন, কোডটি অন্বেষণ করার সময়!

জেমিনি কোড অ্যাসিস্ট চ্যাট খুলুন

জেমিনি কোড অ্যাসিস্ট চ্যাটটি ক্লাউড শেল এডিটরের ডানদিকের একটি প্যানেলে ইতিমধ্যেই খোলা থাকা উচিত। যদি জেমিনি কোড অ্যাসিস্ট চ্যাটটি ইতিমধ্যেই খোলা না থাকে, তাহলে আপনি নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করে এটি খুলতে পারেন:

  1. জেমিনি কোড অ্যাসিস্ট বোতামে ক্লিক করা ( জেমিনি কোড অ্যাসিস্ট সক্রিয় করতে এখানে ক্লিক করুন ) স্ক্রিনের উপরের দিকে।
  2. জেমিনি কোড অ্যাসিস্ট চ্যাট খুলুন নির্বাচন করুন। জেমিনি কোড অ্যাসিস্ট মেনু

কোডটি বুঝতে জেমিনি কোড অ্যাসিস্ট ব্যবহার করুন।

কোডটি আরও ভালোভাবে বুঝতে আপনি জেমিনি কোড অ্যাসিস্ট চ্যাট ব্যবহার করতে পারেন।

  1. পছন্দসই কোড বিভাগটি হাইলাইট করুন বা নির্বাচন করুন।
  2. জেমিনি চ্যাটে "এই কোডটি ব্যাখ্যা করুন" টাইপ করুন।
  3. জমা দিতে এন্টার ক্লিক করুন

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

৮. ওয়েবঅ্যাপ চালু করুন

এই অ্যাপটিকে LLM-এর সাথে সংযুক্ত করার আগে, এটি চালু করে দেখুন এটি প্রাথমিকভাবে কেমন আচরণ করে।

  1. wanderbot ডিরেক্টরির মধ্যে থেকে, স্ট্রিমলিট অ্যাপ্লিকেশনটি শুরু করতে এবং আপনার ক্লাউড শেল পরিবেশের মধ্যে স্থানীয়ভাবে অ্যাক্সেসযোগ্য করতে টার্মিনালে নিম্নলিখিত কমান্ডটি চালান:
    streamlit run app.py --browser.serverAddress=localhost --server.enableCORS=false --server.enableXsrfProtection=false --server.port 8080
    
    এই টার্মিনাল উইন্ডোটি খোলা রাখুন, কারণ Streamlit অ্যাপ্লিকেশনটি চলতে থাকবে। অন্যান্য কমান্ড চালানোর জন্য আপনি Cloud Shell-এ একটি নতুন টার্মিনাল উইন্ডো খুলতে পারেন।
  2. কমান্ডটি চালানোর পর, ক্লাউড শেল এডিটরের উপরে থাকা ওয়েব প্রিভিউ বোতামে ক্লিক করুন এবং পোর্ট 8080-এ প্রিভিউ নির্বাচন করুন।
    প্রিভিউ মেনু খোলা, এর সাথে

    আপনার ভ্রমণ অ্যাপের জন্য আপনি একটি সহজ চ্যাট ইন্টারফেস দেখতে পাবেন।
  3. যেকোনো বার্তা টাইপ করুন (যেমন Hi! ) এবং ENTER টিপুন।

    আপনি লক্ষ্য করবেন যে বার্তাটি চ্যাট ইতিহাসে প্রদর্শিত হবে, কিন্তু আপনি সহকারীর কাছ থেকে প্রতিক্রিয়ার পরিবর্তে একটি ত্রুটি বার্তা পাবেন । এর কারণ হল অ্যাপ্লিকেশনটি এখনও একটি বৃহৎ ভাষা মডেলের সাথে সংযুক্ত নয়। ল্যাবের শুরুর বিন্দুটি বুঝতে এই আচরণটি পর্যবেক্ষণ করুন।

৯. ভার্টেক্স এআই ক্লায়েন্ট আরম্ভ করুন

ভার্টেক্স এআই-তে উপলব্ধ মডেলগুলি অন্বেষণ করুন

গুগল ক্লাউডের ভার্টেক্স এআই প্ল্যাটফর্ম বিভিন্ন ধরণের জেনারেটিভ এআই মডেলের অ্যাক্সেস প্রদান করে। একটি ইন্টিগ্রেট করার আগে, আপনি গুগল ক্লাউড কনসোলে উপলব্ধ বিকল্পগুলি অন্বেষণ করতে পারেন।

  1. গুগল ক্লাউড কনসোল থেকে, মডেল গার্ডেনে নেভিগেট করুন। আপনি স্ক্রিনের উপরে সার্চ বারে "মডেল গার্ডেন" অনুসন্ধান করে এবং Vertex AI নির্বাচন করে এটি করতে পারেন।( শো )
  2. উপলব্ধ মডেলগুলি ব্রাউজ করুন। আপনি মোডালিটি, কাজের ধরণ এবং বৈশিষ্ট্যগুলির মতো জিনিসগুলি দ্বারা ফিল্টার করতে পারেন।

এই ল্যাবের উদ্দেশ্যে, আপনি জেমিনি ২.৫ ফ্ল্যাশ মডেল ব্যবহার করবেন, যা এর গতির কারণে প্রতিক্রিয়াশীল চ্যাট অ্যাপ্লিকেশন তৈরির জন্য একটি ভালো পছন্দ।

ভার্টেক্স এআই ক্লায়েন্ট আরম্ভ করুন

এখন আপনি app.py তে Vertex AI ক্লায়েন্ট চালু করার জন্য --- Initialize the Vertex AI Client --- বিভাগটি পরিবর্তন করবেন। এই ক্লায়েন্ট অবজেক্টটি মডেলে প্রম্পট পাঠানোর জন্য ব্যবহার করা হবে।

  1. ক্লাউড শেল এডিটরে app.py খুলুন।
  2. app.py তে, PROJECT_ID = None লাইনটি খুঁজুন।
  3. None এর পরিবর্তে আপনার Google Cloud Project ID কোটেশনে লিখুন। (যেমন PROJECT_ID = "google-cloud-labs" )
    যদি আপনি আপনার প্রজেক্ট আইডি মনে রাখতে না পারেন, তাহলে আপনি আপনার সমস্ত প্রজেক্ট আইডি তালিকাভুক্ত করতে পারেন:
    gcloud projects list | awk '/PROJECT_ID/{print $2}'
    
  4. ক্লায়েন্ট সংজ্ঞায়িত করুন : try ব্লকের ভিতরে, ভার্টেক্স এআই ক্লায়েন্টটি ইনিশিয়ালাইজ করুন।
        client = genai.Client(
            vertexai=True,
            project=PROJECT_ID,
            location=REGION,
        )
    

আপডেট করা Vertex AI ক্লায়েন্ট ইনিশিয়ালাইজেশন

এই মুহুর্তে, "Initialize the Vertex AI Client" বিভাগটি এরকম দেখাবে:

# --- Initialize the Vertex AI Client ---
try:
    client = genai.Client(
        vertexai=True,
        project=PROJECT_ID,
        location=REGION,
    )
    print(f"VertexAI Client initialized successfully with model {GEMINI_MODEL_NAME}")
except Exception as e:
    st.error(f"Error initializing VertexAI client: {e}")
    st.stop()

১০. তথ্য প্রস্তুত করুন এবং মডেলটিকে কল করুন

এখন তুমি মডেলটিতে পাঠানোর জন্য কন্টেন্ট প্রস্তুত করবে এবং জেমিনি মডেলটিতে কল করবে।

  1. --- Call the Model --- বিভাগটি খুঁজুন যেখানে call_model ফাংশনটি সংজ্ঞায়িত করা হয়েছে।
  2. বিষয়বস্তু নির্ধারণ করুন : # TODO: Prepare the content for the model , মডেলে পাঠানো ইনপুট বিষয়বস্তু নির্ধারণ করুন। একটি মৌলিক প্রম্পটের জন্য, এটি হবে ব্যবহারকারীর ইনপুট বার্তা।
            contents = [prompt]
    
  3. প্রতিক্রিয়া সংজ্ঞায়িত করুন : এই কোডটি # TODO: Define response এর অধীনে আটকান।
            response = client.models.generate_content(
                model=model_name,
                contents=contents,
            )
    
  4. উত্তরটি ফেরত দিন : নিম্নলিখিত লাইনটি আনকমেন্ট করুন:
            return response.text
    
  5. ফাইলের নীচের দিকে with ব্লকে যেখানে call_model ফাংশনটি কল করা হচ্ছে সেই লাইনটি পরীক্ষা করুন। যদি আপনি বুঝতে না পারেন যে এখানে কী ঘটছে, তাহলে লাইনটি হাইলাইট করুন এবং জেমিনি কোড অ্যাসিস্টকে ব্যাখ্যা করতে বলুন।

contents সংজ্ঞায়িত করার আরও স্পষ্ট উপায়

উপরের contents সংজ্ঞায়িত করার পদ্ধতিটি কাজ করে কারণ SDK যথেষ্ট স্মার্ট যে বুঝতে পারে যে স্ট্রিং ধারণকারী একটি তালিকা ব্যবহারকারীর টেক্সট ইনপুটকে প্রতিনিধিত্ব করে। এটি স্বয়ংক্রিয়ভাবে মডেল API-এর জন্য এটি সঠিকভাবে ফর্ম্যাট করে।

তবে, ইনপুট গঠনের আরও স্পষ্ট এবং মৌলিক উপায় হল types.Part এবং types.Content অবজেক্ট ব্যবহার করা, যেমন:

user_message_parts = [types.Part.from_text(text=prompt)]
contents = [
    types.Content(
        role="user", # Indicates the content is from the user
        parts=user_message_parts, # A list, allowing multiple types of content
    ),
]

call_model ফাংশন আপডেট করা হয়েছে

এই মুহুর্তে, call_model ফাংশনটি এইরকম দেখাবে:

def call_model(prompt: str, model_name: str) -> str:
    """
    This function interacts with a large language model (LLM) to generate text based on a given prompt and system instructions. 
    It will be replaced in a later step with a more advanced version that handles tooling.
    """
    try:

        contents = [prompt]

        # TODO: Define generate_content configuration (needed later for system instructions and parameters)

        response = client.models.generate_content(
            model=model_name,
            contents=contents,
        )
        logging.info(f"[call_model_response] LLM Response: \"{response.text}\"")

        return response.text
    except Exception as e:
        return f"Error: {e}"

১১. সংযুক্ত অ্যাপটি পরীক্ষা করুন

  1. টার্মিনালের মধ্যে, বর্তমানে চলমান প্রক্রিয়াটি বন্ধ করুন ( CTRL+C )
  2. Streamlit অ্যাপ্লিকেশনটি আবার শুরু করতে কমান্ডটি পুনরায় চালান।
    streamlit run app.py --browser.serverAddress=localhost --server.enableCORS=false --server.enableXsrfProtection=false --server.port 8080
    
  3. Streamlit অ্যাপ্লিকেশনটি রিফ্রেশ করুন। যদি Streamlit অ্যাপ্লিকেশনটি এখনও চলমান থাকে, তাহলে আপনি কেবল আপনার ব্রাউজারে ওয়েব প্রিভিউ পৃষ্ঠাটি রিফ্রেশ করতে পারেন।
  4. এখন, চ্যাট ইনপুটে নিম্নলিখিত প্রশ্নের মতো একটি প্রশ্ন টাইপ করুন:
    What is the best time of year to go to Iceland?
    
  5. ENTER টিপুন।

    তুমি অ্যাপ্লিকেশনটিতে তোমার বার্তা, একটি "চিন্তা..." স্পিনার এবং তারপর জেমিনি মডেল দ্বারা তৈরি একটি প্রতিক্রিয়া দেখতে পাবে! যদি তুমি করে থাকো, তাহলে তুমি তোমার ওয়েব অ্যাপ্লিকেশনটিকে Vertex AI-তে একটি LLM-এর সাথে সফলভাবে সংযুক্ত করেছ। 🙌 🥳

১২. সিস্টেম নির্দেশাবলী সংজ্ঞায়িত করুন

মৌলিক সংযোগটি কাজ করলেও, LLM-এর প্রতিক্রিয়ার গুণমান এবং স্টাইল এটি যে ইনপুটটি গ্রহণ করে তার উপর ব্যাপকভাবে প্রভাবিত হয়। প্রম্পট ইঞ্জিনিয়ারিং হল এই ইনপুটগুলি (প্রম্পটগুলি) ডিজাইন এবং পরিমার্জন করার প্রক্রিয়া যা মডেলটিকে পছন্দসই আউটপুট তৈরির দিকে পরিচালিত করে।

সেই লক্ষ্যে, আপনি কিছু সিস্টেম নির্দেশাবলী তৈরি করে এবং সেগুলি মডেলটিতে প্রেরণ করে শুরু করবেন।

দরকারী সিস্টেম নির্দেশাবলী তৈরি করতে তুমি Ask Gemini ব্যবহার করবে।

  1. app.py তে, system_instructions ভেরিয়েবলটি সনাক্ত করুন, যা বর্তমানে None তে সেট করা আছে।
    system_instructions = None
    
    আপনি None এর পরিবর্তে একটি বহু-লাইন স্ট্রিং ব্যবহার করবেন যা আমাদের ভ্রমণ সহকারী বটের জন্য নির্দেশাবলী প্রদান করবে।
  2. জেমিনি কোড অ্যাসিস্টকে জিজ্ঞাসা করুন : জেমিনি কোড অ্যাসিস্টে নিম্নলিখিত প্রম্পটটি পাস করুন (অথবা আপনার নিজস্বটি তৈরি করুন!):
    I am a developer at a travel marketing company, and my sales department has decided that they need a new chat application to keep up with the bigger booking and search companies. I'm building a simple travel assistant chatbot using the Gemini 2.5 Flash model on Vertex AI.
    
    The application should:
    - Helps users ask questions about travel, book travel, and learn about places they are going to go
    - Provides users ways to get help about their specific travel plans
    - Provides all this in a production quality way (multiple environments, logging and monitoring, etc.)
    
    Please create system instructions appropriate for that chat app. Be thorough.
    
    Do not alter the code in any way beyond providing me with system instructions.
    
  3. system_instructions সংজ্ঞায়িত করুন : জেমিনি কোড অ্যাসিস্ট ব্যবহার করে আপনি যে সিস্টেম নির্দেশাবলী তৈরি করেছেন তার সমান system_instructions সেট করুন। আপনি বিকল্পভাবে এই সিস্টেম নির্দেশাবলী ব্যবহার করতে পারেন, যা জেমিনি দ্বারা একই রকম প্রম্পট দিয়ে তৈরি করা হয়েছিল।
    system_instructions = """
    You are a sophisticated travel assistant chatbot designed to provide comprehensive support to users throughout their travel journey. Your capabilities include answering travel-related questions, assisting with booking travel arrangements, offering detailed information about destinations, and providing support for existing travel plans.
    
    **Core Functionalities:**
    
    1.  **Travel Information and Recommendations:**
        *   Answer user inquiries about travel destinations, including popular attractions, local customs, visa requirements, weather conditions, and safety advice.
        *   Provide personalized recommendations for destinations, activities, and accommodations based on user preferences, interests, and budget.
        *   Offer insights into the best times to visit specific locations, considering factors like weather, crowds, and pricing.
        *   Suggest alternative destinations or activities if the user's initial choices are unavailable or unsuitable.
    
    2.  **Booking Assistance:**
        *   Facilitate the booking of flights, hotels, rental cars, tours, and activities.
        *   Search for available options based on user-specified criteria such as dates, destinations, budget, and preferences.
        *   Present clear and concise information about available options, including pricing, amenities, and booking terms.
        *   Guide users through the booking process, ensuring accurate information and secure transactions.
        *   Provide booking confirmations and relevant details, such as booking references and contact information.
    
    3.  **Travel Planning and Itinerary Management:**
        *   Assist users in creating detailed travel itineraries, including flights, accommodations, activities, and transportation.
        *   Offer suggestions for optimizing travel plans, such as minimizing travel time or maximizing sightseeing opportunities.
        *   Provide tools for managing and modifying existing itineraries, including adding or removing activities, changing booking dates, or upgrading accommodations.
        *   Offer reminders and notifications for upcoming travel events, such as flight check-in or tour departure times.
    
    4.  **Customer Support and Troubleshooting:**
        *   Provide prompt and helpful support to users with questions or issues related to their travel plans.
        *   Assist with resolving booking discrepancies, cancellations, or modifications.
        *   Offer guidance on travel-related emergencies, such as lost luggage or travel delays.
        *   Provide access to relevant contact information for airlines, hotels, and other travel providers.
    
    **Interaction Guidelines:**
    
    *   **Professionalism:** Maintain a polite, respectful, and professional tone in all interactions.
    *   **Clarity and Conciseness:** Provide clear, concise, and easy-to-understand information. Avoid jargon or technical terms unless necessary and always explain them.
    *   **Accuracy:** Ensure all information provided is accurate and up-to-date. Double-check details before sharing them with users. If unsure about something, admit that you don't know and offer to find the information.
    *   **Personalization:** Tailor your responses and recommendations to the specific needs and preferences of each user.
    *   **Proactive Assistance:** Anticipate user needs and offer relevant information or suggestions proactively.
    *   **Error Handling:** Gracefully handle user errors or misunderstandings. Provide helpful guidance and alternative options when necessary.
    *   **Confidentiality:** Respect user privacy and handle personal information with the utmost confidentiality and in compliance with data protection regulations.
    
    **Example Interactions:**
    
    **User:** "I want to go on a beach vacation in the Caribbean. I have a budget of $2000 per person for a week."
    **Chatbot:** "Certainly! The Caribbean offers many beautiful beach destinations within your budget. Some popular options include Punta Cana in the Dominican Republic, Cancun in Mexico, and Montego Bay in Jamaica. These destinations offer stunning beaches, all-inclusive resorts, and various activities. Would you like me to search for flights and accommodations for these locations based on your travel dates?"
    
    **User:** "My flight is delayed. What should I do?"
    **Chatbot:** "I'm sorry to hear about the delay. Please check with the airline for the updated departure time and any assistance they can offer. You may be entitled to compensation or rebooking options depending on the length of the delay and the airline's policy. Do you have your flight number handy so I can look up the current status for you?"
    
    **User:** "Tell me about the best time to visit Japan."
    **Chatbot:** "Japan is a fantastic destination with distinct seasons offering unique experiences. Spring (March-May) is famous for the beautiful cherry blossoms, while autumn (September-November) boasts stunning fall foliage. Both seasons have pleasant temperatures, making them ideal for sightseeing. Summer (June-August) can be hot and humid, but it's a great time for festivals and outdoor activities in the mountains. Winter (December-February) offers opportunities for skiing and snowboarding in the Japanese Alps, though some areas may experience heavy snowfall. To recommend the best time for you, could you tell me what you'd like to experience in Japan?"
    
    By following these instructions, you will be able to provide exceptional travel assistance and create a positive experience for every user.
    """
    
  4. generate_content কনফিগারেশন সংজ্ঞায়িত করুন: একটি কনফিগারেশন অবজেক্ট শুরু করুন, যেখানে আপনি এই সিস্টেম নির্দেশাবলী প্রেরণ করবেন। যেহেতু system_instructions আমাদের স্ক্রিপ্টে বিশ্বব্যাপী সংজ্ঞায়িত করা হয়েছে, ফাংশনটি সরাসরি এটি অ্যাক্সেস করতে পারে।
            generate_content_config = types.GenerateContentConfig(
                system_instruction=[
                    types.Part.from_text(text=system_instructions)
                ],
            )
            logging.info(f"[generate_config_details] System Instruction: {generate_content_config.system_instruction[0].text}")
    
  5. প্রতিক্রিয়াতে সিস্টেম নির্দেশাবলী যোগ করতে, generate content পদ্ধতিতে একটি config প্যারামিটার যোগ করুন এবং এটি উপরে তৈরি generate_content_config অবজেক্টের সমান সেট করুন।
            response = client.models.generate_content(
                model=model_name,
                contents=contents,
                config=generate_content_config, # This is the new line
            )
    

call_model ফাংশন আপডেট করা হয়েছে

সম্পূর্ণ call_model ফাংশনটি এখন এরকম দেখাচ্ছে:

def call_model(prompt: str, model_name: str) -> str:
    """
    This function interacts with a large language model (LLM) to generate text based on a given prompt and system instructions. 
    It will be replaced in a later step with a more advanced version that handles tooling.
    """
    try:
        contents = [prompt]

        generate_content_config = types.GenerateContentConfig(
            system_instruction=[
                types.Part.from_text(text=system_instructions)
            ],
        )
        logging.info(f"[generate_config_details] System Instruction: {generate_content_config.system_instruction[0].text}")
        response = client.models.generate_content(
            model=model_name,
            contents=contents,
            config=generate_content_config,
        )

        logging.info(f"[call_model_response] LLM Response: \"{response.text}\"")
        
        return response.text
    except Exception as e:
        return f"Error: {e}"

১৩. সিস্টেম নির্দেশাবলী ব্যবহার করে অ্যাপটি পরীক্ষা করুন।

  1. টার্মিনালের মধ্যে, বর্তমানে চলমান প্রক্রিয়াটি বন্ধ করুন ( CTRL+C )
  2. Streamlit অ্যাপ্লিকেশনটি আবার শুরু করতে কমান্ডটি পুনরায় চালান।
    streamlit run app.py --browser.serverAddress=localhost --server.enableCORS=false --server.enableXsrfProtection=false --server.port 8080
    
  3. Streamlit অ্যাপ্লিকেশনটি রিফ্রেশ করুন। যদি Streamlit অ্যাপ্লিকেশনটি এখনও চলমান থাকে, তাহলে আপনি কেবল আপনার ব্রাউজারে ওয়েব প্রিভিউ পৃষ্ঠাটি রিফ্রেশ করতে পারেন।
  4. আগের মত একই প্রশ্নটি চেষ্টা করে দেখুন:
    What is the best time of year to go to Iceland?
    
  5. ENTER টিপুন।
    গতবারের সাথে এবার কেমন সাড়া দিচ্ছে তার তুলনা করো।

১৪. একটি আবহাওয়া সরঞ্জাম সংজ্ঞায়িত করুন

এখন পর্যন্ত, আমাদের চ্যাটবট জ্ঞানী, কিন্তু এর জ্ঞান কেবলমাত্র সেই তথ্যের মধ্যেই সীমাবদ্ধ যা এটিকে প্রশিক্ষণ দেওয়া হয়েছিল। এটি রিয়েল-টাইম তথ্য অ্যাক্সেস করতে পারে না। একটি ভ্রমণ বটের জন্য, আবহাওয়ার পূর্বাভাসের মতো লাইভ ডেটা আনতে সক্ষম হওয়া একটি বিশাল সুবিধা।

এখানেই টুলিং , যা ফাংশন কলিং নামেও পরিচিত, আসে। আমরা এমন কিছু টুল (পাইথন ফাংশন) সংজ্ঞায়িত করতে পারি যা LLM বাহ্যিক তথ্য পেতে কল করতে পারে।

টুলিং কীভাবে কাজ করে

  1. আমরা মডেলের কাছে আমাদের সরঞ্জামগুলি বর্ণনা করি, তারা কী করে এবং কোন পরামিতিগুলি গ্রহণ করে তা সহ।
  2. ব্যবহারকারী একটি প্রম্পট পাঠান (যেমন, " লন্ডনের আবহাওয়া কেমন? ")।
  3. মডেলটি প্রম্পটটি গ্রহণ করে এবং দেখে যে ব্যবহারকারী এমন কিছু সম্পর্কে জিজ্ঞাসা করছে যা তারা তার একটি টুল ব্যবহার করে জানতে পারে।
  4. টেক্সট দিয়ে সাড়া দেওয়ার পরিবর্তে, মডেলটি একটি বিশেষ function_call অবজেক্ট দিয়ে সাড়া দেয়, যা নির্দেশ করে যে এটি কোন টুলটি কল করতে চায় এবং কোন আর্গুমেন্ট দিয়ে।
  5. আমাদের পাইথন কোড এই function_call গ্রহণ করে, প্রদত্ত আর্গুমেন্ট সহ আমাদের প্রকৃত get_current_temperature ফাংশনটি কার্যকর করে এবং ফলাফল পায় (যেমন, 15°C)।
  6. আমরা এই ফলাফলটি মডেলটিতে ফেরত পাঠাই।
  7. মডেলটি ফলাফল গ্রহণ করে এবং ব্যবহারকারীর জন্য একটি স্বাভাবিক ভাষা প্রতিক্রিয়া তৈরি করে (যেমন, "লন্ডনের বর্তমান তাপমাত্রা ১৫°C।")।

এই প্রক্রিয়াটি মডেলটিকে তার প্রশিক্ষণ তথ্যের বাইরেও অনেক প্রশ্নের উত্তর দিতে সাহায্য করে, যা এটিকে অনেক বেশি শক্তিশালী এবং কার্যকর সহকারী করে তোলে।

একটি আবহাওয়া সরঞ্জাম সংজ্ঞায়িত করুন

যদি কোন ভ্রমণকারী কী করবেন সে সম্পর্কে পরামর্শ খুঁজছেন এবং আবহাওয়ার দ্বারা প্রভাবিত কার্যকলাপের মধ্যে একটি বেছে নিচ্ছেন, তাহলে একটি আবহাওয়া সরঞ্জাম কাজে আসতে পারে! আসুন আমাদের মডেলের জন্য বর্তমান আবহাওয়া সম্পর্কে জানতে একটি সরঞ্জাম তৈরি করি। আমাদের দুটি অংশের প্রয়োজন: একটি ফাংশন ঘোষণা যা মডেলের কাছে সরঞ্জামটি বর্ণনা করে এবং প্রকৃত পাইথন ফাংশন যা এটি বাস্তবায়ন করে।

  1. app.py তে, মন্তব্যটি খুঁজুন # TODO: Define the weather tool function declaration
  2. এই মন্তব্যের নিচে, weather_function ভেরিয়েবলটি যোগ করুন। এটি একটি অভিধান যা মডেলটিকে ফাংশনের উদ্দেশ্য, পরামিতি এবং প্রয়োজনীয় আর্গুমেন্ট সম্পর্কে যা জানা দরকার তা বলে দেয়।
    weather_function = {
        "name": "get_current_temperature",
        "description": "Gets the current temperature for a given location.",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city name, e.g. San Francisco",
                },
            },
            "required": ["location"],
        },
    }
    
  3. এরপর, মন্তব্যটি খুঁজুন # TODO: Define the get_current_temperature function । এর অধীনে, নিম্নলিখিত পাইথন কোডটি যুক্ত করুন। এই ফাংশনটি করবে:
    • অবস্থানের স্থানাঙ্ক পেতে একটি জিওকোডিং API কল করুন।
    • একটি আবহাওয়া API কল করতে সেই স্থানাঙ্কগুলি ব্যবহার করুন।
    • তাপমাত্রা এবং একক সহ একটি সরল স্ট্রিং প্রদান করুন।
    def get_current_temperature(location: str) -> str:
        """Gets the current temperature for a given location."""
    
        try:
            # --- Get Latitude and Longitude for the location ---
            geocode_url = f"https://geocoding-api.open-meteo.com/v1/search?name={location}&count=1&language=en&format=json"
            geocode_response = requests.get(geocode_url)
            geocode_data = geocode_response.json()
    
            if not geocode_data.get("results"):
                return f"Could not find coordinates for {location}."
    
            lat = geocode_data["results"][0]["latitude"]
            lon = geocode_data["results"][0]["longitude"]
    
            # --- Get Weather for the coordinates ---
            weather_url = f"https://api.open-meteo.com/v1/forecast?latitude={lat}&longitude={lon}&current_weather=true"
            weather_response = requests.get(weather_url)
            weather_data = weather_response.json()
    
            temperature = weather_data["current_weather"]["temperature"]
            unit = "°C"
    
            return f"{temperature}{unit}"
    
        except Exception as e:
            return f"Error fetching weather: {e}"
    

১৫. চ্যাট এবং টুলিংয়ের জন্য রিফ্যাক্টর

আমাদের বর্তমান call_model ফাংশনটি একটি সহজ, এক-শট generate_content কল ব্যবহার করে। এটি একক প্রশ্নের জন্য দুর্দান্ত কিন্তু একাধিক-পালা কথোপকথনের জন্য আদর্শ নয়, বিশেষ করে যেখানে টুলিংয়ের জন্য এদিক-ওদিক আলোচনা জড়িত।

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

  1. বিদ্যমান call_model ফাংশনটি মুছে ফেলুন। আমরা এটিকে আরও উন্নত সংস্করণ দিয়ে প্রতিস্থাপন করব।
  2. এর জায়গায়, নীচের কোড ব্লক থেকে নতুন call_model ফাংশনটি যোগ করুন। এই নতুন ফাংশনটিতে আমরা আগে আলোচনা করা টুল-কলিং লুপটি পরিচালনা করার জন্য যুক্তি রয়েছে। লক্ষ্য করুন এতে বেশ কয়েকটি TODO মন্তব্য রয়েছে যা আমরা পরবর্তী ধাপগুলিতে সম্পূর্ণ করব।
    # --- Call the Model ---
    def call_model(prompt: str, model_name: str) -> str:
        """
        This function interacts with a large language model (LLM) to generate text based on a given prompt.
        It maintains a chat session and handles function calls from the model to external tools.
        """
        try:
            # TODO: Get the existing chat session or create a new one.
    
            message_content = prompt
    
            # Start the tool-calling loop
            while True:
                # TODO: Send the message to the model.
    
                # Check if the model wants to call a tool
                has_tool_calls = False
                for part in response.candidates[0].content.parts:
                    if part.function_call:
                        has_tool_calls = True
                        function_call = part.function_call
                        logging.info(f"Function to call: {function_call.name}")
                        logging.info(f"Arguments: {function_call.args}")
    
                        # TODO: Call the appropriate function if the model requests it.
    
                # If no tool call was made, break the loop
                if not has_tool_calls:
                    break
    
            # TODO: Return the model's final text response.
    
        except Exception as e:
            return f"Error: {e}"
    
  3. এখন, চ্যাট সেশন পরিচালনা করার জন্য একটি সহায়ক ফাংশন যোগ করা যাক। নতুন call_model ফাংশনের উপরে, get_chat ফাংশন যোগ করুন। এই ফাংশনটি আমাদের সিস্টেম নির্দেশাবলী এবং টুল সংজ্ঞা সহ একটি নতুন চ্যাট সেশন তৈরি করবে, অথবা বিদ্যমানটি পুনরুদ্ধার করবে। কোড সংগঠিত করার জন্য এটি একটি ভাল অনুশীলন।
    def get_chat(model_name: str):
        if f"chat-{model_name}" not in st.session_state:
    
            # TODO: Define the tools configuration for the model
    
            # TODO: Define the generate_content configuration, including tools
    
            # TODO: Create a new chat session
    
            st.session_state[f"chat-{model_name}"] = chat
        return st.session_state[f"chat-{model_name}"]
    

আপনি এখন আমাদের উন্নত, টুল-সক্ষম চ্যাট লজিকের জন্য ভারা সেট আপ করেছেন!

১৬. টুল-কলিং লজিক বাস্তবায়ন করুন

এখন, আমাদের টুল-কলিং লজিককে সম্পূর্ণরূপে কার্যকরী করার জন্য TODOs পূরণ করা যাক।

get_chat বাস্তবায়ন করুন

  1. # TODO: Define the tools configuration... মন্তব্যের অধীনে get_chat ফাংশনে, আমাদের weather_function ঘোষণা থেকে একটি types.Tool উদাহরণ তৈরি করে tools অবজেক্টটি সংজ্ঞায়িত করুন।
            tools = types.Tool(function_declarations=[weather_function])
    
  2. # TODO: Define the generate_content configuration... এর অধীনে, generate_content_config সংজ্ঞায়িত করুন, মডেলের কাছে tools অবজেক্টটি পাস করতে ভুলবেন না। এইভাবে মডেলটি কোন টুলস ব্যবহার করতে পারে তা সম্পর্কে জানতে পারে।
            generate_content_config = types.GenerateContentConfig(
                system_instruction=[types.Part.from_text(text=system_instructions)],
                tools=[tools] # Pass the tool definition here
            )
    
  3. # TODO: Create a new chat session , client.chats.create() ব্যবহার করে চ্যাট অবজেক্ট তৈরি করুন, আমাদের মডেলের নাম এবং কনফিগারেশনটি প্রবেশ করান।
            chat = client.chats.create(
                model=model_name,
                config=generate_content_config,
            )
    

call_model বাস্তবায়ন করুন

  1. # TODO: Get the existing chat session... এর অধীনে call_model ফাংশনে বিদ্যমান চ্যাট সেশনটি পান..., আমাদের নতুন get_chat সহায়ক ফাংশনে কল করুন।
            chat = get_chat(model_name)
    
  2. এরপর, # TODO: Send the message to the modelchat.send_message() পদ্ধতি ব্যবহার করে ব্যবহারকারীর বার্তা পাঠান।
                response = chat.send_message(message_content)
    
  3. # TODO: Call the appropriate function... এখানে আমরা পরীক্ষা করি যে মডেলটি কোন ফাংশনটি চায় এবং এটি কার্যকর করে।
                    if function_call.name == "get_current_temperature":
                      result = get_current_temperature(**function_call.args)
                    function_response_part = types.Part.from_function_response(
                        name=function_call.name,
                        response={"result": result},
                    )
                    message_content = [function_response_part]
  1. সবশেষে, # TODO: Return the model's final text response এবং রিটার্ন স্টেটমেন্টটি যোগ করুন।
            return response.text
    

get_chat ফাংশন আপডেট করা হয়েছে

আপডেট করা get_chat ফাংশনটি এখন এইরকম দেখাবে:

def get_chat(model_name: str):
    if f"chat-{model_name}" not in st.session_state:
        #Tools
        tools = types.Tool(function_declarations=[weather_function])

        # Initialize a confiburation object
        generate_content_config = types.GenerateContentConfig(
            system_instruction=[types.Part.from_text(text=system_instructions)],
            tools=[tools]
        )
        chat = client.chats.create(
            model=model_name,
            config=generate_content_config,
        )
        st.session_state[f"chat-{model_name}"] = chat
    return st.session_state[f"chat-{model_name}"]

call_model ফাংশন আপডেট করা হয়েছে

আপডেট করা call_model ফাংশনটি এখন এইরকম দেখাবে:

def call_model(prompt: str, model_name: str) -> str:
    try:
        chat = get_chat(model_name)
        message_content = prompt
        
        while True:
            response = chat.send_message(message_content)
            has_tool_calls = False
            for part in response.candidates[0].content.parts:
                if part.function_call:
                    has_tool_calls = True
                    function_call = part.function_call
                    logging.info(f"Function to call: {function_call.name}")
                    logging.info(f"Arguments: {function_call.args}")
                    if function_call.name == "get_current_temperature":
                        result = get_current_temperature(**function_call.args)
                        function_response_part = types.Part.from_function_response(
                            name=function_call.name,
                            response={"result": result},
                        )
                        message_content = [function_response_part]
                elif part.text:
                    logging.info("No function call found in the response.")
                    logging.info(response.text)

            if not has_tool_calls:
                break

        return response.text

    except Exception as e:
        return f"Error: {e}"

১৭. টুল-সক্ষম অ্যাপটি পরীক্ষা করুন

তোমার নতুন বৈশিষ্ট্যটি কীভাবে কাজে লাগবে তা দেখা যাক!

  1. টার্মিনালের মধ্যে, বর্তমানে চলমান প্রক্রিয়াটি বন্ধ করুন ( CTRL+C )
  2. Streamlit অ্যাপ্লিকেশনটি আবার শুরু করতে কমান্ডটি পুনরায় চালান।
    streamlit run app.py --browser.serverAddress=localhost --server.enableCORS=false --server.enableXsrfProtection=false --server.port 8080
    
  3. Streamlit অ্যাপ্লিকেশনটি রিফ্রেশ করুন। যদি Streamlit অ্যাপ্লিকেশনটি এখনও চলমান থাকে, তাহলে আপনি কেবল আপনার ব্রাউজারে ওয়েব প্রিভিউ পৃষ্ঠাটি রিফ্রেশ করতে পারেন।
  4. এখন, এমন একটি প্রশ্ন জিজ্ঞাসা করুন যা আপনার নতুন টুলটিকে ট্রিগার করবে, যেমন নিম্নলিখিত:
    I'm looking for something to do in New York today. What do you recommend? Would it be a good day to go to Ellis Island?
    
  5. ENTER টিপুন
    এই উত্তরটি আগের উত্তরগুলির সাথে তুলনা করুন। আলাদা কী?
    আপনার ফাংশনের তাপমাত্রা সহ একটি প্রতিক্রিয়া দেখতে পাবেন! আপনার ক্লাউড শেল টার্মিনালটিও পরীক্ষা করুন; আপনার পাইথন ফাংশনটি কার্যকর হয়েছে কিনা তা নিশ্চিত করে আপনি মুদ্রিত বিবৃতি দেখতে পাবেন।

১৮. প্যারামিটার দিয়ে মডেলের আউটপুট পরিমার্জন করুন

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

এখন যেহেতু আমরা আমাদের মডেল কী করতে পারে তা উন্নত করেছি, আসুন এটি কীভাবে প্রতিক্রিয়া দেখায় তা সূক্ষ্মভাবে সুরক্ষিত করি। মডেল প্যারামিটারগুলি আপনাকে LLM-এর তৈরি টেক্সটের স্টাইল এবং এলোমেলোতা নিয়ন্ত্রণ করতে দেয়। এই সেটিংসগুলি সামঞ্জস্য করে, আপনি বটের আউটপুটকে আরও কেন্দ্রীভূত এবং নির্ধারক বা আরও সৃজনশীল এবং বৈচিত্র্যময় করতে পারেন।

এই ল্যাবের জন্য, আমরা temperature এবং top_p এর উপর ফোকাস করব। (কনফিগারযোগ্য প্যারামিটারের সম্পূর্ণ তালিকা এবং তাদের বর্ণনার জন্য আমাদের API রেফারেন্সে GenerateContentConfig দেখুন।)

  • temperature : আউটপুটের এলোমেলোতা নিয়ন্ত্রণ করে। কম মান (০ এর কাছাকাছি) আউটপুটকে আরও নির্ধারক এবং কেন্দ্রীভূত করে তোলে, অন্যদিকে উচ্চ মান (২ এর কাছাকাছি) এলোমেলোতা এবং সৃজনশীলতা বৃদ্ধি করে। প্রশ্নোত্তর বা সহকারী বটের জন্য, আরও সামঞ্জস্যপূর্ণ এবং বাস্তবসম্মত উত্তরের জন্য সাধারণত কম তাপমাত্রা পছন্দ করা হয়।
  • top_p : নমুনা নেওয়ার সময় বিবেচনা করার জন্য টোকেনের সর্বাধিক ক্রমবর্ধমান সম্ভাব্যতা। টোকেনগুলিকে তাদের নির্ধারিত সম্ভাব্যতার উপর ভিত্তি করে সাজানো হয় যাতে শুধুমাত্র সবচেয়ে সম্ভাব্য টোকেনগুলি বিবেচনা করা হয়। মডেলটি সবচেয়ে সম্ভাব্য টোকেনগুলিকে বিবেচনা করে যার সম্ভাব্যতা top_p মানের সাথে মিলে যায়। একটি কম মান টোকেন পছন্দগুলিকে সীমাবদ্ধ করে, যার ফলে কম বৈচিত্র্যময় আউটপুট হয়।

কল প্যারামিটার

  1. app.py এর উপরে সংজ্ঞায়িত ভেরিয়েবল temperature এবং top_p খুঁজুন। লক্ষ্য করুন যে তাদের এখনও কোথাও ডাকা হয়নি।
  2. call_model ফাংশনে GenerateContentConfig মধ্যে সংজ্ঞায়িত প্যারামিটারগুলিতে temperature এবং top_p যোগ করুন।
            generate_content_config = types.GenerateContentConfig(
                temperature=temperature,
                top_p=top_p,
                system_instruction=[types.Part.from_text(text=system_instructions)],
                tools=[tools] # Pass the tool definition here
            )
    
    

get_chat ফাংশন আপডেট করা হয়েছে

get_chat অ্যাপটি এখন এরকম দেখাচ্ছে:

def get_chat(model_name: str):
    if f"chat-{model_name}" not in st.session_state:
        #Tools
        tools = types.Tool(function_declarations=[weather_function])

        # Initialize a confiburation object
        generate_content_config = types.GenerateContentConfig(
            temperature=temperature,
            top_p=top_p,
            system_instruction=[types.Part.from_text(text=system_instructions)],
            tools=[tools] 
        )
        chat = client.chats.create(
            model=model_name,
            config=generate_content_config,
        )
        st.session_state[f"chat-{model_name}"] = chat
    return st.session_state[f"chat-{model_name}"]

১৯. মডেল প্যারামিটার দিয়ে পরীক্ষা করুন

  1. টার্মিনালের মধ্যে, বর্তমানে চলমান প্রক্রিয়াটি বন্ধ করুন ( CTRL+C )
  2. Streamlit অ্যাপ্লিকেশনটি আবার শুরু করতে কমান্ডটি পুনরায় চালান।
    streamlit run app.py --browser.serverAddress=localhost --server.enableCORS=false --server.enableXsrfProtection=false --server.port 8080
    
  3. Streamlit অ্যাপ্লিকেশনটি রিফ্রেশ করুন। যদি Streamlit অ্যাপ্লিকেশনটি এখনও চলমান থাকে, তাহলে আপনি কেবল আপনার ব্রাউজারে ওয়েব প্রিভিউ পৃষ্ঠাটি রিফ্রেশ করতে পারেন।
  4. আগের মতো একই প্রশ্নটি চেষ্টা করে দেখুন,
    I'm looking for something to do in New York today. What do you recommend? Would it be a good day to go to Ellis Island?
    
  5. ENTER টিপুন
    এই উত্তরটি আগের উত্তরগুলির সাথে তুলনা করুন।

২০. অভিনন্দন!

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

অব্যাহত পরীক্ষা-নিরীক্ষা

আপনার প্রম্পটটি অপ্টিমাইজ করার জন্য অনেকগুলি বিকল্প রয়েছে। এখানে কিছু বিবেচনা করার জন্য রয়েছে:

  • temperature এবং top_p সামঞ্জস্য করুন এবং দেখুন কিভাবে এটি LLM দ্বারা প্রদত্ত প্রতিক্রিয়া পরিবর্তন করে।
  • কনফিগারযোগ্য প্যারামিটারের সম্পূর্ণ তালিকা এবং তাদের বর্ণনার জন্য আমাদের API রেফারেন্সে GenerateContentConfig দেখুন। আরও প্যারামিটার সংজ্ঞায়িত করার চেষ্টা করুন এবং কী ঘটে তা দেখার জন্য সেগুলি সামঞ্জস্য করার চেষ্টা করুন!

সংক্ষিপ্তসার

এই ল্যাবে, আপনি নিম্নলিখিত কাজগুলি করেছেন:

  • ডেভেলপমেন্টের জন্য ক্লাউড শেল এডিটর এবং টার্মিনাল ব্যবহার করা হয়েছে।
  • আপনার অ্যাপ্লিকেশনটিকে একটি জেমিনি মডেলের সাথে সংযুক্ত করতে Vertex AI Python SDK ব্যবহার করেছি।
  • LLM-এর প্রতিক্রিয়া পরিচালনার জন্য সিস্টেম নির্দেশাবলী এবং মডেল প্যারামিটার প্রয়োগ করা হয়েছে।
  • টুলিং ( ফাংশন কলিং ) এর ধারণা এবং এর সুবিধাগুলি শিখেছি।
  • একটি স্টেটফুল চ্যাট সেশন ব্যবহার করার জন্য আপনার কোডটি রিফ্যাক্টর করা হয়েছে, যা কথোপকথনমূলক AI এর জন্য একটি সেরা অনুশীলন।
  • একটি ফাংশন ঘোষণা ব্যবহার করে মডেলের জন্য একটি টুল সংজ্ঞায়িত করা হয়েছে।
  • টুলের লজিক প্রদানের জন্য পাইথন ফাংশন বাস্তবায়ন করা হয়েছে।
  • মডেলের ফাংশন কল অনুরোধগুলি পরিচালনা করার জন্য এবং ফলাফলগুলি ফেরত দেওয়ার জন্য কোডটি লিখেছিলেন।