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

১. ভূমিকা

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

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

আপনি যা করবেন

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

অ্যাপ্লিকেশনটিতে নিম্নলিখিত বিষয়গুলো থাকা উচিত:

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

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

আপনি যা শিখবেন

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

২. প্রজেক্ট সেটআপ

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

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

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

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

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

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

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

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

একটি ব্যক্তিগত বিলিং অ্যাকাউন্ট তৈরি করুন

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

একটি ব্যক্তিগত বিলিং অ্যাকাউন্ট তৈরি করতে, ক্লাউড কনসোলে বিলিং চালু করার জন্য এখানে যান

কিছু নোট:

  • এই ল্যাবটি সম্পন্ন করতে ক্লাউড রিসোর্সে ১ মার্কিন ডলারেরও কম খরচ হওয়া উচিত।
  • পরবর্তী চার্জ এড়াতে, এই ল্যাবের শেষে দেওয়া ধাপগুলো অনুসরণ করে আপনি রিসোর্সগুলো মুছে ফেলতে পারেন।
  • নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়ালের জন্য যোগ্য।

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

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

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

  1. সরাসরি ক্লাউড শেল এডিটর- এ যেতে এই লিঙ্কে ক্লিক করুন।
  2. আজ যেকোনো সময়ে অনুমোদনের জন্য অনুরোধ করা হলে, চালিয়ে যাওয়ার জন্য 'অনুমোদন করুন' (Authorize) বোতামে ক্লিক করুন। ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
  3. যদি স্ক্রিনের নিচে টার্মিনালটি দেখা না যায়, তাহলে এটি খুলুন:
    • ভিউ ক্লিক করুন
    • টার্মিনালে ক্লিক করুন ক্লাউড শেল এডিটরে নতুন টার্মিনাল খুলুন
  4. টার্মিনালে এই কমান্ডটি দিয়ে আপনার প্রজেক্ট সেট করুন:
    gcloud config set project [PROJECT_ID]
    
    • উদাহরণ:
      gcloud config set project lab-project-id-example
      
    • আপনি যদি আপনার প্রজেক্ট আইডি মনে রাখতে না পারেন, তাহলে নিম্নলিখিত উপায়ে আপনার সমস্ত প্রজেক্ট আইডি তালিকাভুক্ত করতে পারেন:
      gcloud projects list
      
      ক্লাউড শেল এডিটর টার্মিনালে প্রজেক্ট আইডি সেট করুন
  5. আপনি এই বার্তাটি দেখতে পাবেন:
    Updated property [core/project].
    

৪. এপিআই সক্রিয় করুন

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

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

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

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

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

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

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

  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 # TODO: 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. জমা দিতে এন্টার চাপুন

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

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

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

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

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

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

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

Vertex AI-তে উপলব্ধ মডেলগুলি অন্বেষণ করুন

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

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

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

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

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

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

আপডেট করা ভার্টেক্স এআই ক্লায়েন্ট প্রারম্ভিককরণ

এই পর্যায়ে, 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 ফাংশনটি কল করা হচ্ছে, সেই লাইনটি পরীক্ষা করুন। এখানে কী ঘটছে তা যদি আপনি বুঝতে না পারেন, তাহলে লাইনটি হাইলাইট করুন এবং Gemini Code Assist-কে ব্যাখ্যা করতে বলুন।

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. এন্টার চাপুন।

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

১২. সিস্টেম নির্দেশাবলীর সংজ্ঞা দাও।

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

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

কার্যকরী সিস্টেম নির্দেশাবলী তৈরি করতে আপনি 'আস্ক জেমিনি' ব্যবহার করবেন।

  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. এন্টার চাপুন।
    গতবারের তুলনায় এবার এটি কীভাবে সাড়া দেয় তা তুলনা করুন।

১৪. আবহাওয়া সরঞ্জামের সংজ্ঞা দাও।

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

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

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

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

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

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

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

  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) কল করুন।
    • তাপমাত্রা ও এককসহ একটি সাধারণ স্ট্রিং ফেরত দিন।
    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.
    
    
                    elif part.text:
                        logging.info("No function call found in the response.")
                        logging.info(response.text)
                # 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. get_chat ফাংশনের মধ্যে # TODO: Define the tools configuration... কমেন্টের অধীনে, আমাদের 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. call_model ফাংশনের মধ্যে # TODO: Get the existing chat session... অংশের অধীনে, আমাদের নতুন get_chat হেল্পার ফাংশনটি কল করুন।
            chat = get_chat(model_name)
    
  2. এরপরে, # TODO: Send the message to the model খুঁজুন। chat.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 configuration 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. এন্টার চাপুন
    এই উত্তরটিকে আগের উত্তরগুলোর সাথে তুলনা করুন। পার্থক্যটা কোথায়?
    আপনি এমন একটি প্রতিক্রিয়া দেখতে পাবেন যেখানে আপনার ফাংশন থেকে প্রাপ্ত তাপমাত্রা অন্তর্ভুক্ত থাকবে! আপনার ক্লাউড শেল টার্মিনালও পরীক্ষা করুন; সেখানে আপনি প্রিন্ট স্টেটমেন্ট দেখতে পাবেন যা নিশ্চিত করবে যে আপনার পাইথন ফাংশনটি কার্যকর হয়েছে।

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

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

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

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

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

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

  1. app.py শুরুতে সংজ্ঞায়িত temperature এবং top_p ভেরিয়েবলগুলো খুঁজুন। লক্ষ্য করুন যে, এগুলোকে এখনও কোথাও কল করা হয়নি।
  2. get_chat ফাংশনের মধ্যে 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 configuration 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. এন্টার চাপুন
    এই প্রতিক্রিয়াটিকে পূর্ববর্তী প্রতিক্রিয়াগুলোর সাথে তুলনা করুন।

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

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

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

আপনার প্রম্পটকে আরও উন্নত করার জন্য অনেকগুলো উপায় রয়েছে। এখানে কয়েকটি উল্লেখ করা হলো:

  • temperature এবং top_p সমন্বয় করে দেখুন, এতে LLM প্রদত্ত প্রতিক্রিয়া কীভাবে পরিবর্তিত হয়।
  • কনফিগারযোগ্য প্যারামিটার এবং তাদের বিবরণের সম্পূর্ণ তালিকার জন্য আমাদের এপিআই রেফারেন্সে থাকা GenerateContentConfig অংশটি দেখুন। আরও প্যারামিটার নির্ধারণ করে এবং সেগুলোকে সমন্বয় করে দেখুন কী ঘটে!

পুনরালোচনা

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

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