একটি মাল্টি-এজেন্ট সিস্টেম তৈরি করা

1. ভূমিকা

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

এই ল্যাবে, আপনি সাধারণ চ্যাটবটের বাইরে গিয়ে একটি বিতরণযোগ্য মাল্টি-এজেন্ট সিস্টেম তৈরি করবেন।

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

আপনি একটি কোর্স তৈরির ব্যবস্থা তৈরি করবেন যার মধ্যে রয়েছে:

  1. গবেষক এজেন্ট : হালনাগাদ তথ্য খুঁজে পেতে google_search ব্যবহার করা।
  2. বিচারক এজেন্ট : গবেষণার মান এবং সম্পূর্ণতার জন্য সমালোচনা করা।
  3. কন্টেন্ট বিল্ডার এজেন্ট : গবেষণাকে একটি কাঠামোগত কোর্সে রূপান্তরিত করা।
  4. অর্কেস্ট্রেটর এজেন্ট : এই বিশেষজ্ঞদের মধ্যে কর্মপ্রবাহ এবং যোগাযোগ পরিচালনা করা।

পূর্বশর্ত

  • পাইথনের মৌলিক জ্ঞান।
  • গুগল ক্লাউড কনসোলের সাথে পরিচিতি।

তুমি কি করবে

  • ওয়েবে অনুসন্ধান করতে পারে এমন একটি টুল-ব্যবহারকারী এজেন্ট ( researcher ) সংজ্ঞায়িত করুন।
  • judge জন্য পাইড্যান্টিকের সাথে স্ট্রাকচার্ড আউটপুট বাস্তবায়ন করুন।
  • এজেন্ট-টু-এজেন্ট (A2A) প্রোটোকল ব্যবহার করে দূরবর্তী এজেন্টদের সাথে সংযোগ করুন।
  • গবেষক এবং বিচারকের মধ্যে একটি প্রতিক্রিয়া লুপ তৈরি করতে একটি LoopAgent তৈরি করুন।
  • ADK ব্যবহার করে স্থানীয়ভাবে বিতরণ ব্যবস্থা চালান।
  • গুগল ক্লাউড রানে মাল্টি-এজেন্ট সিস্টেম স্থাপন করুন।

স্থাপত্য ও অর্কেস্ট্রেশন নীতিমালা

কোড লেখার আগে, আসুন জেনে নিই কিভাবে এই এজেন্টরা একসাথে কাজ করে। আমরা একটি কোর্স তৈরির পাইপলাইন তৈরি করছি।

সিস্টেম ডিজাইন

স্থাপত্য চিত্র

এজেন্টদের সাথে সমন্বয় সাধন

স্ট্যান্ডার্ড এজেন্টরা (যেমন গবেষক) কাজ করে। অর্কেস্ট্রেটর এজেন্টরা (যেমন LoopAgent বা SequentialAgent ) অন্যান্য এজেন্টদের পরিচালনা করে। তাদের নিজস্ব কোন সরঞ্জাম নেই; তাদের "টুল" হল ডেলিগেশান।

  1. LoopAgent : এটি কোডে while লুপের মতো কাজ করে। এটি বারবার এজেন্টের একটি ক্রম চালায় যতক্ষণ না একটি শর্ত পূরণ হয় (অথবা সর্বোচ্চ পুনরাবৃত্তিতে পৌঁছায়)। আমরা এটি Research Loop এর জন্য ব্যবহার করি:
    • গবেষক তথ্য খুঁজে পান।
    • বিচারক এর সমালোচনা করেন।
    • যদি বিচারক "ব্যর্থ" বলেন, তাহলে EscalationChecker লুপটি চালিয়ে যেতে দেয়।
    • যদি বিচারক "পাস" বলেন, তাহলে EscalationChecker লুপটি ভেঙে দেয়।
  2. SequentialAgent : এটি একটি স্ট্যান্ডার্ড স্ক্রিপ্ট এক্সিকিউশনের মতো কাজ করে। এটি একের পর এক এজেন্ট চালায়। আমরা এটি হাই-লেভেল পাইপলাইনের জন্য ব্যবহার করি:
    • প্রথমে, রিসার্চ লুপটি চালান (যতক্ষণ না এটি ভালো ডেটা দিয়ে শেষ হয়)।
    • তারপর, কন্টেন্ট বিল্ডার চালান (কোর্সটি লেখার জন্য)।

এগুলো একত্রিত করে, আমরা একটি শক্তিশালী সিস্টেম তৈরি করি যা চূড়ান্ত আউটপুট তৈরি করার আগে নিজে নিজেই সংশোধন করতে পারে।

2. সেটআপ

পরিবেশ সেটআপ

ক্লাউড শেল খুলুন : একটি নতুন ট্যাব খুলুন এবং shell.cloud.google.com টাইপ করুন।

স্টার্টার কোড পান

  1. আপনার হোম ডিরেক্টরিতে স্টার্টার রিপোজিটরি ক্লোন করুন:
    cd ~
    git clone https://github.com/amitkmaraj/prai-roadshow-lab-1-starter.git
    cd prai-roadshow-lab-1-starter
    
  2. বিলিং-এর সাথে অনর‍্যাম্প ক্রেডিট যুক্ত করতে init স্ক্রিপ্টটি চালান।
    chmod +x ./init.sh
    ./init.sh
    
  3. আপনার এডিটরে এই ফোল্ডারটি খুলুন।

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

এখন আপনার একটি নতুন প্রকল্প আছে, প্রয়োজনীয় গুগল ক্লাউড পরিষেবাগুলি সক্ষম করতে নিম্নলিখিত কমান্ডটি চালান:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudbuild.googleapis.com \
    aiplatform.googleapis.com \
    compute.googleapis.com

এতে কয়েক সেকেন্ড সময় লাগতে পারে।

নির্ভরতা ইনস্টল করুন

আমরা দ্রুত নির্ভরতা ব্যবস্থাপনার জন্য uv ব্যবহার করি।

  1. প্রকল্পের নির্ভরতা ইনস্টল করুন:
    # Ensure you have uv installed: pip install uv
    uv sync
    
  2. আপনার Google Cloud Project আইডি সেট করুন।
    • টিপস : আপনি ক্লাউড কনসোল ড্যাশবোর্ডে অথবা gcloud config get-value project চালিয়ে আপনার প্রজেক্ট আইডি খুঁজে পেতে পারেন।
    export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
    
  3. অবশিষ্ট পরিবেশ ভেরিয়েবল সেট করুন:
    export GOOGLE_CLOUD_LOCATION=us-central1
    export GOOGLE_GENAI_USE_VERTEXAI=true
    
    সতর্কতা: নতুন টার্মিনাল সেশন জুড়ে পরিবেশগত ভেরিয়েবলগুলি স্থায়ী হয় না । যদি আপনি একটি নতুন টার্মিনাল ট্যাব খোলেন, তাহলে আপনাকে এই এক্সপোর্ট কমান্ডগুলি পুনরায় চালাতে হবে

৩. 🕵️ গবেষক এজেন্ট

গবেষক এজেন্ট

গবেষক একজন বিশেষজ্ঞ। তার একমাত্র কাজ হল তথ্য খুঁজে বের করা। এটি করার জন্য, তার একটি টুল অ্যাক্সেস করতে হবে: গুগল সার্চ।

গবেষককে আলাদা কেন?

ডিপ ডাইভ: কেন কেবল একজন এজেন্টকে সবকিছু করতে দেওয়া হবে না?

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

  1. আপনি যদি ক্লাউড শেলে কাজ করেন, তাহলে ক্লাউড শেল এডিটর খুলতে নিম্নলিখিত কমান্ডটি চালান:
    cloudshell workspace .
    
    আপনি যদি আপনার স্থানীয় পরিবেশে কাজ করেন, তাহলে আপনার পছন্দের IDE খুলুন।
  2. agents/researcher/agent.py খুলুন।
  3. তুমি একটি কঙ্কাল দেখতে পাবে যেখানে একটি করণীয় কাজ আছে।
  4. researcher এজেন্ট নির্ধারণ করতে নিম্নলিখিত কোডটি যোগ করুন:
    # ... existing imports ...
    
    # Define the Researcher Agent
    researcher = Agent(
        name="researcher",
        model=MODEL,
        description="Gathers information on a topic using Google Search.",
        instruction="""
        You are an expert researcher. Your goal is to find comprehensive and accurate information on the user's topic.
        Use the `google_search` tool to find relevant information.
        Summarize your findings clearly.
        If you receive feedback that your research is insufficient, use the feedback to refine your next search.
        """,
        tools=[google_search],
    )
    
    root_agent = researcher
    

মূল ধারণা: টুল ব্যবহার

লক্ষ্য করুন আমরা tools=[google_search] পাস করি। ADK এই টুলটি LLM-এর কাছে বর্ণনা করার জটিলতা পরিচালনা করে। যখন মডেল সিদ্ধান্ত নেয় যে এটির তথ্যের প্রয়োজন, তখন এটি একটি স্ট্রাকচার্ড টুল কল তৈরি করে, ADK Python ফাংশন google_search কার্যকর করে এবং ফলাফলটি মডেলে ফিরিয়ে দেয়।

৪. ⚖️ বিচারক এজেন্ট

বিচারক এজেন্ট

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

স্ট্রাকচার্ড আউটপুট

ডিপ ডাইভ: কর্মপ্রবাহ স্বয়ংক্রিয় করার জন্য, আমাদের পূর্বাভাসযোগ্য আউটপুট প্রয়োজন। একটি র‍্যাম্বলিং টেক্সট রিভিউ প্রোগ্রাম্যাটিকভাবে পার্স করা কঠিন। একটি JSON স্কিমা (Pydantic ব্যবহার করে) প্রয়োগ করে, আমরা নিশ্চিত করি যে বিচারক একটি বুলিয়ান pass বা fail ফেরত দেন যাতে আমাদের কোড নির্ভরযোগ্যভাবে কাজ করতে পারে।

  1. agents/judge/agent.py খুলুন।
  2. JudgeFeedback স্কিমা এবং judge এজেন্টের সংজ্ঞা দাও।
    # 1. Define the Schema
    class JudgeFeedback(BaseModel):
        """Structured feedback from the Judge agent."""
        status: Literal["pass", "fail"] = Field(
            description="Whether the research is sufficient ('pass') or needs more work ('fail')."
        )
        feedback: str = Field(
            description="Detailed feedback on what is missing. If 'pass', a brief confirmation."
        )
    
    # 2. Define the Agent
    judge = Agent(
        name="judge",
        model=MODEL,
        description="Evaluates research findings for completeness and accuracy.",
        instruction="""
        You are a strict editor.
        Evaluate the 'research_findings' against the user's original request.
        If the findings are missing key info, return status='fail'.
        If they are comprehensive, return status='pass'.
        """,
        output_schema=JudgeFeedback,
        # Disallow delegation because it should only output the schema
        disallow_transfer_to_parent=True,
        disallow_transfer_to_peers=True,
    )
    
    root_agent = judge
    

মূল ধারণা: এজেন্ট আচরণ সীমাবদ্ধ করা

আমরা disallow_transfer_to_parent=True এবং disallow_transfer_to_peers=True সেট করি। এটি বিচারককে কেবল কাঠামোগত JudgeFeedback ফেরত দিতে বাধ্য করে। এটি ব্যবহারকারীর সাথে "চ্যাট" করার বা অন্য এজেন্টকে অর্পণ করার সিদ্ধান্ত নিতে পারে না। এটি এটিকে আমাদের লজিক প্রবাহে একটি নির্ধারক উপাদান করে তোলে।

৫. 🧪 আইসোলেশনে পরীক্ষা

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

মূল ধারণা: ইন্টারেক্টিভ রানটাইম

adk run একটি হালকা পরিবেশ তৈরি করে যেখানে আপনি "ব্যবহারকারী"। এটি আপনাকে এজেন্টের নির্দেশাবলী এবং টুল ব্যবহার পৃথকভাবে পরীক্ষা করতে দেয়। যদি এজেন্ট এখানে ব্যর্থ হয় (যেমন, গুগল সার্চ ব্যবহার করতে না পারে), তবে এটি অবশ্যই অর্কেস্ট্রেশনে ব্যর্থ হবে।

  1. গবেষককে ইন্টারেক্টিভভাবে চালান। মনে রাখবেন আমরা নির্দিষ্ট এজেন্ট ডিরেক্টরির দিকে নির্দেশ করছি:
    # This runs the researcher agent in interactive mode
    uv run adk run agents/researcher
    
  2. চ্যাট প্রম্পটে, টাইপ করুন:
    Find the population of Tokyo in 2020
    
    এটি গুগল সার্চ টুল ব্যবহার করবে এবং উত্তরটি ফেরত দেবে। দ্রষ্টব্য: যদি আপনি একটি ত্রুটি দেখতে পান যেখানে বলা হয়েছে যে প্রকল্প, অবস্থান এবং ভার্টেক্সের ব্যবহার সেট করা নেই, তাহলে নিশ্চিত করুন যে আপনার প্রকল্প আইডি সেট করা আছে এবং নিম্নলিখিতগুলি কার্যকর করুন:
    export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
    export GOOGLE_CLOUD_LOCATION=us-central1
    export GOOGLE_GENAI_USE_VERTEXAI=true
    
  3. চ্যাট থেকে বেরিয়ে আসুন (Ctrl+C)।
  4. ইন্টারেক্টিভভাবে বিচারক চালান:
    uv run adk run agents/judge
    
  5. চ্যাট প্রম্পটে, ইনপুটটি অনুকরণ করুন:
    Topic: Tokyo. Findings: Tokyo is a city.
    
    এটি status='fail' ফেরত দেবে কারণ ফলাফলগুলি খুব সংক্ষিপ্ত।

৬. ✍️ কন্টেন্ট নির্মাতা এজেন্ট

কন্টেন্ট নির্মাতা

কন্টেন্ট বিল্ডার হলেন একজন সৃজনশীল লেখক। তিনি অনুমোদিত গবেষণা গ্রহণ করেন এবং এটিকে একটি কোর্সে রূপান্তরিত করেন।

  1. agents/content_builder/agent.py খুলুন।
  2. content_builder এজেন্ট সংজ্ঞায়িত করুন।
    content_builder = Agent(
        name="content_builder",
        model=MODEL,
        description="Transforms research findings into a structured course.",
        instruction="""
        You are an expert course creator.
        Take the approved 'research_findings' and transform them into a well-structured, engaging course module.
    
        **Formatting Rules:**
        1. Start with a main title using a single `#` (H1).
        2. Use `##` (H2) for main section headings.
        3. Use bullet points and clear paragraphs.
        4. Maintain a professional but engaging tone.
    
        Ensure the content directly addresses the user's original request.
        """,
    )
    root_agent = content_builder
    

মূল ধারণা: প্রসঙ্গ প্রচার

আপনি হয়তো ভাবতে পারেন: "কন্টেন্ট বিল্ডার কীভাবে জানবে যে গবেষক কী খুঁজে পেয়েছেন?" ADK-তে, একটি পাইপলাইনে এজেন্টরা একটি session.state ভাগ করে। পরে, অর্কেস্ট্রেটরে, আমরা গবেষক এবং বিচারককে তাদের আউটপুটগুলিকে এই ভাগ করা অবস্থায় সংরক্ষণ করার জন্য কনফিগার করব। কন্টেন্ট বিল্ডারের প্রম্পট কার্যকরভাবে এই ইতিহাসে অ্যাক্সেস করতে পারে।

৭. 🎻 অর্কেস্ট্রেটর

অর্কেস্ট্রেটর এজেন্ট

অর্কেস্ট্রেটর হলেন আমাদের মাল্টি-এজেন্ট টিমের ম্যানেজার। বিশেষজ্ঞ এজেন্টদের (গবেষক, বিচারক, কন্টেন্ট নির্মাতা) বিপরীতে যারা নির্দিষ্ট কাজ সম্পাদন করেন, অর্কেস্ট্রেটরের কাজ হল কর্মপ্রবাহের সমন্বয় সাধন করা এবং তাদের মধ্যে তথ্য সঠিকভাবে প্রবাহিত হয় তা নিশ্চিত করা।

🌐 স্থাপত্য: এজেন্ট-টু-এজেন্ট (A2A)

A2A আর্কিটেকচার

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

এটি সম্ভব করার জন্য, আমরা এজেন্ট-টু-এজেন্ট (A2A) প্রোটোকল ব্যবহার করি।

A2A প্রোটোকল

ডিপ ডাইভ: একটি প্রোডাকশন সিস্টেমে, এজেন্টরা বিভিন্ন সার্ভারে (অথবা এমনকি বিভিন্ন ক্লাউডে) চলে। A2A প্রোটোকল তাদের HTTP এর মাধ্যমে একে অপরকে আবিষ্কার এবং কথা বলার জন্য একটি আদর্শ উপায় তৈরি করে। RemoteA2aAgent হল এই প্রোটোকলের ADK ক্লায়েন্ট।

  1. agents/orchestrator/agent.py খুলুন।
  2. মন্তব্যটি খুঁজুন # TODO: Define Remote Agents অথবা দূরবর্তী এজেন্ট সংজ্ঞার বিভাগ।
  3. সংযোগগুলি সংজ্ঞায়িত করতে নিম্নলিখিত কোডটি যোগ করুন। আমদানির পরে এবং অন্য কোনও এজেন্ট সংজ্ঞার আগে এটি স্থাপন করতে ভুলবেন না।
    # ... existing code ...
    
    # Connect to the Researcher (Localhost port 8001)
    researcher_url = os.environ.get("RESEARCHER_AGENT_CARD_URL", "http://localhost:8001/a2a/agent/.well-known/agent-card.json")
    researcher = RemoteA2aAgent(
        name="researcher",
        agent_card=researcher_url,
        description="Gathers information using Google Search.",
        # IMPORTANT: Save the output to state for the Judge to see
        after_agent_callback=create_save_output_callback("research_findings"),
        # IMPORTANT: Use authenticated client for communication
        httpx_client=create_authenticated_client(researcher_url)
    )
    
    # Connect to the Judge (Localhost port 8002)
    judge_url = os.environ.get("JUDGE_AGENT_CARD_URL", "http://localhost:8002/a2a/agent/.well-known/agent-card.json")
    judge = RemoteA2aAgent(
        name="judge",
        agent_card=judge_url,
        description="Evaluates research.",
        after_agent_callback=create_save_output_callback("judge_feedback"),
        httpx_client=create_authenticated_client(judge_url)
    )
    
    # Content Builder (Localhost port 8003)
    content_builder_url = os.environ.get("CONTENT_BUILDER_AGENT_CARD_URL", "http://localhost:8003/a2a/agent/.well-known/agent-card.json")
    content_builder = RemoteA2aAgent(
        name="content_builder",
        agent_card=content_builder_url,
        description="Builds the course.",
        httpx_client=create_authenticated_client(content_builder_url)
    )
    

৮. 🛑 এস্কেলেশন চেকার

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

বেসএজেন্টের সাথে কাস্টম লজিক

ডিপ ডাইভ: সব এজেন্ট LLM ব্যবহার করে না। কখনও কখনও আপনার সহজ পাইথন লজিকের প্রয়োজন হয়। BaseAgent আপনাকে এমন একটি এজেন্ট সংজ্ঞায়িত করতে দেয় যা কেবল কোড চালায়। এই ক্ষেত্রে, আমরা সেশন স্টেট পরীক্ষা করি এবং LoopAgent থামার জন্য সংকেত দিতে EventActions(escalate=True) ব্যবহার করি।

  1. এখনও agents/orchestrator/agent.py তে আছে।
  2. EscalationChecker TODO প্লেসহোল্ডার খুঁজুন।
  3. নিম্নলিখিত বাস্তবায়ন দিয়ে এটি প্রতিস্থাপন করুন :
    class EscalationChecker(BaseAgent):
        """Checks the judge's feedback and escalates (breaks the loop) if it passed."""
    
        async def _run_async_impl(
            self, ctx: InvocationContext
        ) -> AsyncGenerator[Event, None]:
            # Retrieve the feedback saved by the Judge
            feedback = ctx.session.state.get("judge_feedback")
            print(f"[EscalationChecker] Feedback: {feedback}")
    
            # Check for 'pass' status
            is_pass = False
            if isinstance(feedback, dict) and feedback.get("status") == "pass":
                is_pass = True
            # Handle string fallback if JSON parsing failed
            elif isinstance(feedback, str) and '"status": "pass"' in feedback:
                is_pass = True
    
            if is_pass:
                # 'escalate=True' tells the parent LoopAgent to stop looping
                yield Event(author=self.name, actions=EventActions(escalate=True))
            else:
                # Continue the loop
                yield Event(author=self.name)
    
    escalation_checker = EscalationChecker(name="escalation_checker")
    

মূল ধারণা: ইভেন্টের মাধ্যমে প্রবাহ নিয়ন্ত্রণ করুন

এজেন্টরা কেবল টেক্সটের মাধ্যমেই নয়, Events এর মাধ্যমেও যোগাযোগ করে। escalate=True দিয়ে একটি ইভেন্ট প্রদান করে, এই এজেন্টটি তার প্যারেন্ট ( LoopAgent ) এর কাছে একটি সংকেত পাঠায়। LoopAgent এই সংকেত ধরার এবং লুপটি বন্ধ করার জন্য প্রোগ্রাম করা হয়েছে।

৯. 🔁 গবেষণা চক্র

গবেষণা লুপ

আমাদের একটি প্রতিক্রিয়া লুপ দরকার: গবেষণা -> বিচারক -> (ব্যর্থ) -> গবেষণা -> ...

  1. এখনও agents/orchestrator/agent.py তে আছে।
  2. research_loop সংজ্ঞা যোগ করুন। এটিকে EscalationChecker ক্লাস এবং escalation_checker ইনস্ট্যান্সের পরে রাখুন।
    research_loop = LoopAgent(
        name="research_loop",
        description="Iteratively researches and judges until quality standards are met.",
        sub_agents=[researcher, judge, escalation_checker],
        max_iterations=3,
    )
    

মূল ধারণা: লুপএজেন্ট

LoopAgent তার sub_agents মধ্য দিয়ে ক্রমানুসারে চক্রাকারে ঘুরপাক খায়।

  1. researcher : তথ্য খুঁজে বের করে।
  2. judge : তথ্য মূল্যায়ন করে।
  3. escalation_checker : yield Event(escalate=True) কিনা তা নির্ধারণ করে। যদি escalate=True ঘটে, তাহলে লুপটি তাড়াতাড়ি ভেঙে যায়। অন্যথায়, এটি গবেষকের কাছে পুনরায় চালু হয় ( max_iterations পর্যন্ত)।

১০. 🔗 চূড়ান্ত পাইপলাইন

চূড়ান্ত পাইপলাইন

অবশেষে, সবকিছু একসাথে সেলাই করুন।

  1. এখনও agents/orchestrator/agent.py তে আছে।
  2. ফাইলের নীচে root_agent সংজ্ঞায়িত করুন। নিশ্চিত করুন যে এটি যেকোনো বিদ্যমান root_agent = None প্লেসহোল্ডার প্রতিস্থাপন করে।
    root_agent = SequentialAgent(
        name="course_creation_pipeline",
        description="A pipeline that researches a topic and then builds a course from it.",
        sub_agents=[research_loop, content_builder],
    )
    

মূল ধারণা: শ্রেণিবদ্ধ রচনা

লক্ষ্য করুন যে research_loop নিজেই একটি এজেন্ট (একটি LoopAgent )। আমরা এটিকে SequentialAgent এর অন্যান্য সাব-এজেন্টের মতোই ব্যবহার করি। এই কম্পোজিবিলিটি আপনাকে সহজ প্যাটার্ন (সিকোয়েন্সের ভিতরে লুপ, রাউটারের ভিতরে সিকোয়েন্স ইত্যাদি) নেস্ট করে জটিল লজিক তৈরি করতে দেয়।

১১. 💻 স্থানীয়ভাবে চালান

সবকিছু চালানোর আগে, আসুন দেখি কিভাবে ADK স্থানীয়ভাবে বিতরণকৃত পরিবেশকে অনুকরণ করে।

গভীর ডুব: স্থানীয় উন্নয়ন কীভাবে কাজ করে

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

এই স্ক্রিপ্টটি রিসার্চার (পোর্ট 8001), জাজ (8002), এবং কন্টেন্ট বিল্ডার (8003) এর জন্য uvicorn প্রক্রিয়া শুরু করে। এটি RESEARCHER_AGENT_CARD_URL এর মতো পরিবেশগত ভেরিয়েবল সেট করে এবং সেগুলিকে অর্কেস্ট্রেটর (পোর্ট 8004) এ পাঠায়। আমরা পরে ক্লাউডে এটি ঠিক এভাবেই কনফিগার করব!

অ্যাপ চলমান

  1. অর্কেস্ট্রেশন স্ক্রিপ্টটি চালান:
    ./run_local.sh
    
    এটি ৪টি পৃথক প্রক্রিয়া শুরু করে।
  2. পরীক্ষা করে দেখুন:
    • যদি ক্লাউড শেল ব্যবহার করেন: ওয়েব প্রিভিউ বোতামে ক্লিক করুন (টার্মিনালের উপরের ডানদিকে) -> পোর্ট 8080-এ প্রিভিউ করুন -> পোর্ট 8000 এ পরিবর্তন করুন।
    • যদি স্থানীয়ভাবে চলমান থাকে: আপনার ব্রাউজারে http://localhost:8000 খুলুন।
    • প্রম্পট: "কফির ইতিহাস সম্পর্কে একটি কোর্স তৈরি করুন।"
    • লক্ষ্য করুন: অর্কেস্ট্রেটর গবেষককে ডাকবেন। আউটপুট বিচারকের কাছে যাবে। যদি বিচারক এটি ব্যর্থ করেন, তাহলে লুপ চলতেই থাকবে!
    সমস্যা সমাধান:
    • "অভ্যন্তরীণ সার্ভার ত্রুটি" / প্রমাণীকরণ ত্রুটি: যদি আপনি প্রমাণীকরণ ত্রুটি দেখতে পান (যেমন, google-auth সম্পর্কিত), তাহলে নিশ্চিত করুন যে আপনি স্থানীয় মেশিনে চলমান থাকলে gcloud auth application-default login চালাচ্ছেন। ক্লাউড শেলে, নিশ্চিত করুন যে আপনার GOOGLE_CLOUD_PROJECT পরিবেশ পরিবর্তনশীল সঠিকভাবে সেট করা আছে।
    • টার্মিনাল ত্রুটি: যদি কমান্ডটি নতুন টার্মিনাল উইন্ডোতে ব্যর্থ হয়, তাহলে আপনার পরিবেশ ভেরিয়েবলগুলি ( GOOGLE_CLOUD_PROJECT , ইত্যাদি) পুনরায় রপ্তানি করতে ভুলবেন না।
  3. আইসোলেশনে টেস্টিং এজেন্ট: সম্পূর্ণ সিস্টেম চালু থাকা সত্ত্বেও, আপনি নির্দিষ্ট এজেন্টদের পোর্টগুলিকে সরাসরি টার্গেট করে পরীক্ষা করতে পারেন। এটি সম্পূর্ণ চেইনটি ট্রিগার না করেই একটি নির্দিষ্ট উপাদান ডিবাগ করার জন্য কার্যকর।
    • শুধুমাত্র গবেষক (পোর্ট 8001): http://localhost:8001
    • শুধুমাত্র বিচারক (পোর্ট 8002): http://localhost:8002
    • শুধুমাত্র কন্টেন্ট বিল্ডার (পোর্ট 8003): http://localhost:8003
    • অর্কেস্ট্রেটর (পোর্ট ৮০০৪): http://localhost:8004 (অর্কেস্ট্রেটর লজিকের সরাসরি অ্যাক্সেস)

১২. 🚀 ক্লাউড রানে স্থাপন করুন

চূড়ান্ত যাচাইকরণ ক্লাউডে চলছে। আমরা প্রতিটি এজেন্টকে আলাদা পরিষেবা হিসেবে মোতায়েন করব।

ডিপ্লয়মেন্ট কনফিগারেশন বোঝা

ক্লাউড রানে এজেন্ট স্থাপন করার সময়, আমরা তাদের আচরণ এবং সংযোগ কনফিগার করার জন্য বেশ কয়েকটি পরিবেশ ভেরিয়েবল পাস করি:

  • GOOGLE_CLOUD_PROJECT : লগিং এবং Vertex AI কলের জন্য এজেন্ট সঠিক Google ক্লাউড প্রকল্প ব্যবহার করছে কিনা তা নিশ্চিত করে।
  • GOOGLE_GENAI_USE_VERTEXAI : এজেন্ট ফ্রেমওয়ার্ক (ADK) কে সরাসরি জেমিনি API কল করার পরিবর্তে মডেল ইনফারেন্সের জন্য Vertex AI ব্যবহার করতে বলে।
  • [AGENT]_AGENT_CARD_URL : এটি অর্কেস্ট্রেটরের জন্য অত্যন্ত গুরুত্বপূর্ণ। এটি অর্কেস্ট্রেটরকে দূরবর্তী এজেন্টদের কোথায় খুঁজে পেতে হবে তা বলে দেয়। এটিকে ডিপ্লয় করা ক্লাউড রান URL (বিশেষ করে এজেন্ট কার্ড পাথ) এ সেট করে, আমরা অর্কেস্ট্রেটরকে ইন্টারনেটের মাধ্যমে গবেষক, বিচারক এবং কন্টেন্ট নির্মাতাকে আবিষ্কার এবং তাদের সাথে যোগাযোগ করতে সক্ষম করি।
  1. গবেষককে নিয়োগ করুন:
    gcloud run deploy researcher \
      --source agents/researcher/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    URL ক্যাপচার করুন:
    RESEARCHER_URL=$(gcloud run services describe researcher --region us-central1 --format='value(status.url)')
    echo $RESEARCHER_URL
    
  2. বিচারককে নিয়োগ করুন:
    gcloud run deploy judge \
      --source agents/judge/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    URL ক্যাপচার করুন:
    JUDGE_URL=$(gcloud run services describe judge --region us-central1 --format='value(status.url)')
    echo $JUDGE_URL
    
  3. কন্টেন্ট বিল্ডার স্থাপন করুন:
    gcloud run deploy content-builder \
      --source agents/content_builder/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    URL ক্যাপচার করুন:
    CONTENT_BUILDER_URL=$(gcloud run services describe content-builder --region us-central1 --format='value(status.url)')
    echo $CONTENT_BUILDER_URL
    
  4. অর্কেস্ট্রেটর স্থাপন করুন: অর্কেস্ট্রেটর কনফিগার করতে ক্যাপচার করা পরিবেশ ভেরিয়েবল ব্যবহার করুন।
    gcloud run deploy orchestrator \
      --source agents/orchestrator/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars RESEARCHER_AGENT_CARD_URL=$RESEARCHER_URL/a2a/agent/.well-known/agent-card.json \
      --set-env-vars JUDGE_AGENT_CARD_URL=$JUDGE_URL/a2a/agent/.well-known/agent-card.json \
      --set-env-vars CONTENT_BUILDER_AGENT_CARD_URL=$CONTENT_BUILDER_URL/a2a/agent/.well-known/agent-card.json \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    URL ক্যাপচার করুন:
    ORCHESTRATOR_URL=$(gcloud run services describe orchestrator --region us-central1 --format='value(status.url)')
    echo $ORCHESTRATOR_URL
    
  5. ফ্রন্টএন্ড স্থাপন করুন:
    gcloud run deploy course-creator \
        --source app \
        --region us-central1 \
        --allow-unauthenticated \
        --labels dev-tutorial=prod-ready-1 \
        --set-env-vars AGENT_SERVER_URL=$ORCHESTRATOR_URL \
        --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT
    
  6. রিমোট ডিপ্লয়মেন্ট পরীক্ষা করুন: আপনার ডিপ্লয় করা অর্কেস্ট্রেটরের URL খুলুন। এটি এখন সম্পূর্ণরূপে ক্লাউডে চলছে, আপনার এজেন্টদের স্কেল করার জন্য Google এর সার্ভারলেস অবকাঠামো ব্যবহার করছে! ইঙ্গিত : আপনি ক্লাউড রান ইন্টারফেসে সমস্ত মাইক্রো-সার্ভিস এবং তাদের URL গুলি পাবেন।

১৩. সারাংশ

অভিনন্দন! আপনি সফলভাবে একটি উৎপাদন-প্রস্তুত, বিতরণযোগ্য মাল্টি-এজেন্ট সিস্টেম তৈরি এবং স্থাপন করেছেন।

আমরা যা অর্জন করেছি

  • জটিল কাজটি পচে গেছে : একটি বিশাল প্রম্পটের পরিবর্তে, আমরা কাজটিকে বিশেষ ভূমিকায় (গবেষক, বিচারক, বিষয়বস্তু নির্মাতা) ভাগ করেছি।
  • বাস্তবায়িত মান নিয়ন্ত্রণ : কেবলমাত্র উচ্চমানের তথ্যই চূড়ান্ত পর্যায়ে পৌঁছায় তা নিশ্চিত করার জন্য আমরা একটি LoopAgent এবং একটি কাঠামোগত Judge ব্যবহার করেছি।
  • উৎপাদনের জন্য তৈরি : এজেন্ট-টু-এজেন্ট (A2A) প্রোটোকল এবং ক্লাউড রান ব্যবহার করে, আমরা এমন একটি সিস্টেম তৈরি করেছি যেখানে প্রতিটি এজেন্ট একটি স্বাধীন, স্কেলেবল মাইক্রোসার্ভিস। এটি একটি একক পাইথন স্ক্রিপ্টে সবকিছু চালানোর চেয়ে অনেক বেশি শক্তিশালী।
  • অর্কেস্ট্রেশন : আমরা স্পষ্ট নিয়ন্ত্রণ প্রবাহের ধরণ নির্ধারণ করতে SequentialAgent এবং LoopAgent ব্যবহার করেছি।

পরবর্তী পদক্ষেপ

এখন যেহেতু আপনার ভিত্তি তৈরি হয়ে গেছে, আপনি এই সিস্টেমটি প্রসারিত করতে পারেন:

  • আরও টুল যোগ করুন : গবেষককে অভ্যন্তরীণ নথি বা API-তে অ্যাক্সেস দিন।
  • বিচারক উন্নত করুন : আরও নির্দিষ্ট মানদণ্ড যোগ করুন অথবা এমনকি "মানুষের লুপে" ধাপটিও যোগ করুন।
  • অদলবদল মডেল : বিভিন্ন এজেন্টের জন্য বিভিন্ন মডেল ব্যবহার করার চেষ্টা করুন (যেমন, বিচারকের জন্য একটি দ্রুত মডেল, কন্টেন্ট রাইটারের জন্য একটি শক্তিশালী মডেল)।

আপনি এখন গুগল ক্লাউডে জটিল, নির্ভরযোগ্য এজেন্টিক ওয়ার্কফ্লো তৈরি করতে প্রস্তুত!