ADK দিয়ে মাল্টি-এজেন্ট সিস্টেম তৈরি করুন

১. ভূমিকা

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

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

আপনি যা তৈরি করবেন

আপনি দুটি স্বতন্ত্র মাল্টি-এজেন্ট সিস্টেম তৈরি করবেন:

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

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

  • প্যারেন্ট এবং সাব-এজেন্ট সম্পর্ক কীভাবে তৈরি করবেন
  • একটি টুল থেকে সেশন state কীভাবে ডেটা লিখতে হয়।
  • কী টেমপ্লেটিং (যেমন, {my_key?} ) ব্যবহার করে state থেকে কীভাবে ডেটা পড়তে হয়।
  • ধাপে ধাপে ওয়ার্কফ্লোর জন্য কীভাবে একটি SequentialAgent ব্যবহার করবেন।
  • পুনরাবৃত্তিমূলক পরিমার্জন চক্র তৈরি করতে কীভাবে LoopAgent ব্যবহার করবেন
  • ParallelAgent ব্যবহার করে কীভাবে স্বাধীন কাজগুলো একযোগে চালানো যায়।

২. বহু-এজেন্ট সিস্টেম

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

একটি একক, অখণ্ড প্রম্পট ব্যবহার করার তুলনায় এই পদ্ধতির বেশ কিছু সুবিধা রয়েছে:

  • সরলতর নকশা: একটি বড় ও জটিল নির্দেশ তৈরি করার চেয়ে ছোট ছোট ও বিশেষায়িত এজেন্টের একটি প্রবাহ নকশা ও সংগঠিত করা সহজতর।
  • নির্ভরযোগ্যতা: একটি বৃহৎ ও জটিল এজেন্টের তুলনায় বিশেষায়িত এজেন্টরা তাদের নির্দিষ্ট কাজে অধিক নির্ভরযোগ্য।
  • রক্ষণাবেক্ষণযোগ্যতা: সিস্টেমের অন্যান্য অংশ নষ্ট না করে একটি ছোট, বিশেষায়িত এজেন্টকে ঠিক করা বা উন্নত করা সহজ।
  • মডুলারিটি: একটি ওয়ার্কফ্লোর জন্য তৈরি এজেন্টগুলো অন্যগুলোতে সহজেই পুনরায় ব্যবহার করা যায়।

শ্রেণিবদ্ধ এজেন্ট ট্রি

শ্রেণিবদ্ধ এজেন্টদের দেখানো বৃক্ষ কাঠামো

ADK-তে, আপনি এজেন্টদের একটি ট্রি স্ট্রাকচারে সাজান। এই ক্রমবিন্যাসটি কথোপকথনের প্রবাহ নিয়ন্ত্রণের জন্য অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি নির্ধারণ করে দেয় কোন এজেন্ট অন্য কোন এজেন্টের কাছে কথোপকথনটি "পাঠাতে" পারবে। এর ফলে সিস্টেমের আচরণ আরও অনুমানযোগ্য হয় এবং ডিবাগ করা সহজ হয়। এর সুবিধাগুলোর মধ্যে রয়েছে:

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

সম্পূর্ণ কাঠামোটি root_agent দিয়ে শুরু হয়। এই এজেন্টটি প্যারেন্ট হিসেবে কাজ করে এবং এর এক বা একাধিক সাব-এজেন্ট থাকতে পারে, যারা আবার তাদের নিজেদের সাব-এজেন্টদের প্যারেন্ট হতে পারে এবং এভাবেই ট্রি বা বৃক্ষটি গঠিত হয়।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

কিছু নোট:

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

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

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

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

  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 API ব্যবহার করতে এবং Gemini মডেলের সাথে ইন্টারঅ্যাক্ট করতে, আপনাকে আপনার Google Cloud প্রজেক্টে Vertex AI API এনাবল করতে হবে।

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

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

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

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

৬. প্রকল্পের পরিবেশ তৈরি করুন

রিপোটি ক্লোন করুন

  1. টার্মিনালে , স্টার্টার ফাইলগুলো থাকা রিপোজিটরিটি ক্লোন করুন।
    git clone --depth 1 https://github.com/GoogleCloudPlatform/devrel-demos.git devrel-demos-multiagent-lab
    
    --depth 1 ফ্ল্যাগটি শুধুমাত্র সর্বশেষ সংস্করণটি ক্লোন করে, যা দ্রুততর।
  2. টার্মিনালে , ল্যাব-নির্দিষ্ট ফোল্ডারটি আপনার হোম ডিরেক্টরিতে সরান এবং ল্যাবের প্রত্যাশিত কাঠামোর সাথে মিলিয়ে এটির নাম পরিবর্তন করুন।
    mv devrel-demos-multiagent-lab/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems ~
    
  3. টার্মিনালে , এই ল্যাবের জন্য সঠিক ওয়ার্কিং ডিরেক্টরিতে ( adk_multiagent_systems ) যান।
    cd ~/adk_multiagent_systems
    

আপনার ফাইল কাঠামো পর্যালোচনা করুন

এখন যেহেতু আপনার সমস্ত ফাইল তৈরি হয়ে গেছে, সম্পূর্ণ কাঠামোটি দেখতে এক্সপ্লোরারে adk_multiagent_systems ফোল্ডারটি খুলুন।

  1. ক্লাউড শেল এডিটর মেনুতে, ফাইল > ওপেন ফোল্ডার... নির্বাচন করুন।
    ক্লাউড শেল এডিটর ফাইল মেনু, ওপেন ফোল্ডার নির্বাচিত অবস্থায়
  2. যে বক্সটি পপ-আপ হবে, সেখানে আপনার ইউজারনেমের পরে adk_multiagent_systems/ এই ফোল্ডারের তথ্যটি যোগ করুন। OK- তে ক্লিক করুন।
    এটা দেখতে অনেকটা এইরকম হওয়া উচিত:
    প্রজেক্ট পাথ সহ ফোল্ডার ডায়ালগ বক্স খুলুন
  3. বাম দিকের এক্সপ্লোরার প্যানেলটি রিফ্রেশ হবে। এখন আপনি আপনার সম্পূর্ণ প্রোজেক্ট কাঠামো দেখতে পাবেন, যেখানে parent_and_subagents এবং workflow_agents সাব-ডিরেক্টরিগুলো পরবর্তী ধাপগুলোর জন্য প্রস্তুত থাকবে।
    এক্সপ্লোরার প্যানেলে খোলা adk_multiagent_systems ফোল্ডারটি দেখা যাচ্ছে।

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

  1. টার্মিনালে , uv ব্যবহার করে একটি ভার্চুয়াল এনভায়রনমেন্ট তৈরি ও সক্রিয় করুন। এটি নিশ্চিত করে যে আপনার প্রোজেক্টের ডিপেন্ডেন্সিগুলো সিস্টেম পাইথন বা অন্যান্য প্রোজেক্টের সাথে সাংঘর্ষিক হবে না।
    uv venv
    source .venv/bin/activate
    
  2. টার্মিনালে , requirements.txt ফাইল থেকে google-adk এবং অন্যান্য ডিপেন্ডেন্সিগুলো ইনস্টল করুন:
    uv pip install -r requirements.txt
    

পরিবেশ ভেরিয়েবল সেট আপ করুন

  1. আপনি ইতিমধ্যে adk_multiagent_systems ডিরেক্টরিতে আছেন। টার্মিনালে , আপনার এনভায়রনমেন্ট ভেরিয়েবলগুলো সংরক্ষণের জন্য একটি .env ফাইল তৈরি করুন:
    cloudshell edit .env
    
  2. এডিটরে খোলা .env ফাইলটিতে নিম্নলিখিতটি পেস্ট করুন:
    GOOGLE_GENAI_USE_VERTEXAI=TRUE
    GOOGLE_CLOUD_PROJECT="[YOUR-PROJECT-ID]"
    GOOGLE_CLOUD_LOCATION=global
    MODEL="gemini-2.5-flash"
    
  3. [YOUR-PROJECT-ID] এর জায়গায় আপনার আসল গুগল ক্লাউড প্রজেক্ট আইডি বসান। (যেমন PROJECT_ID = "google-cloud-labs" )
    আপনি যদি আপনার প্রজেক্ট আইডি মনে করতে না পারেন, তাহলে আপনার টার্মিনালে নিম্নলিখিত কমান্ডটি চালান। এটি আপনাকে আপনার সমস্ত প্রজেক্ট এবং তাদের আইডিগুলির একটি তালিকা দেখাবে।
    gcloud projects list
    
  4. টার্মিনালে , এই .env ফাইলটি সাব-এজেন্ট ডিরেক্টরিগুলোতে কপি করুন, যাতে তারাও ভেরিয়েবলগুলো অ্যাক্সেস করতে পারে:
    cp .env parent_and_subagents/.env
    cp .env workflow_agents/.env
    
    ফাইল কাঠামোটি এখন দেখতে এইরকম হবে:
    এক্সপ্লোরার প্যানেলে খোলা adk_multiagent_systems ফোল্ডারটি দেখা যাচ্ছে।

৭. প্যারেন্ট, সাব-এজেন্ট এবং পিয়ার এজেন্টদের মধ্যে স্থানান্তর অন্বেষণ করুন।

কথোপকথন সর্বদা root_agent দিয়ে শুরু হয়। ডিফল্টরূপে, একটি প্যারেন্ট এজেন্ট তার সাব-এজেন্টদের description ব্যবহার করে সিদ্ধান্ত নেয় কখন কথোপকথনটি স্থানান্তর করতে হবে। আপনি সাব-এজেন্টদের name ব্যবহার করে প্যারেন্টের instruction এই স্থানান্তরগুলিকে স্পষ্টভাবে নির্দেশও দিতে পারেন।

চলুন এটা পরীক্ষা করে দেখি।

  1. ক্লাউড শেল এডিটরে, adk_multiagent_systems/parent_and_subagents/agent.py খুলুন। agent.py ফাইলে থাকা তিনটি এজেন্ট লক্ষ্য করুন:
    • root_agent (যার নাম steering ) : কোন সাব-এজেন্টে স্থানান্তর করা হবে তা নির্ধারণ করার জন্য ব্যবহারকারীকে একটি প্রশ্ন জিজ্ঞাসা করে। প্রাথমিকভাবে, এটি শুধুমাত্র তার সাব-এজেন্টদের description উপর নির্ভর করে।
    • travel_brainstormer : ব্যবহারকারীকে গন্তব্যস্থল নিয়ে চিন্তাভাবনা করতে সাহায্য করে।
    • attractions_planner : ব্যবহারকারীকে একটি নির্দিষ্ট দেশে করণীয় বিষয়গুলির তালিকা তৈরি করতে সাহায্য করে।
  2. root_agent তৈরির সময় নিম্নলিখিত লাইনটি যোগ করে travel_brainstormer এবং attractions_planner root_agent এর সাব-এজেন্ট হিসেবে তৈরি করুন:
        sub_agents=[travel_brainstormer, attractions_planner]
    
  3. টার্মিনালে আপনার এজেন্টের সাথে চ্যাট করুন:
    cd ~/adk_multiagent_systems
    adk run parent_and_subagents
    
  4. টার্মিনালের [user]: প্রম্পটে টাইপ করুন:
    hello
    
    উদাহরণ আউটপুট (আপনারটি কিছুটা ভিন্ন হতে পারে):
    [steering]: Hi there! Do you already have a country in mind for your trip, or would you like some help deciding where to go?
    
  5. এখন, টার্মিনালে এজেন্টকে বলুন:
    I could use some help deciding.
    
    উদাহরণ আউটপুট (আপনারটি কিছুটা ভিন্ন হতে পারে):
    [travel_brainstormer]: Okay! To give you the best recommendations, I need to understand what you're looking for in a trip.
    ...
    
    [travel_brainstormer] ট্যাগটি লক্ষ্য করুন। root_agent শুধুমাত্র সাব-এজেন্টের description উপর ভিত্তি করে নিয়ন্ত্রণ হস্তান্তর করেছে।
  6. টার্মিনালের user: প্রম্পটে exit টাইপ করুন এবং কথোপকথনটি শেষ করতে ENTER চাপুন।
  7. এবার বিষয়টি আরও স্পষ্ট করা যাক। agent.py ফাইলে, root_agent এর instruction নিম্নলিখিতটি যোগ করুন:
            If they need help deciding, send them to 'travel_brainstormer'.
            If they know what country they'd like to visit, send them to the 'attractions_planner'.
    
  8. টার্মিনালে এজেন্টটি আবার চালান:
    adk run parent_and_subagents
    
  9. টার্মিনালের [user]: প্রম্পটে টাইপ করুন:
    hello
    
  10. উত্তরে বলুন:
    I would like to go to Japan.
    
    উদাহরণ আউটপুট (আপনারটি কিছুটা ভিন্ন হতে পারে):
    [attractions_planner]: Okay, I can help you with that! Here are some popular attractions in Japan:
    ...
    
    আপনার নতুন নির্দেশনা অনুযায়ী attractions_planner এ স্থানান্তরটি লক্ষ্য করুন।
  11. এখন উত্তর দিন:
    Actually I don't know what country to visit.
    
    উদাহরণ আউটপুট (আপনারটি কিছুটা ভিন্ন হতে পারে):
    [travel_brainstormer]: Okay! I can help you brainstorm some countries for travel...
    
    লক্ষ্য করুন যে আপনাকে travel_brainstormer এ স্থানান্তর করা হয়েছে, যা attractions_planner এর একটি সমকক্ষ । এটি ডিফল্টরূপে অনুমোদিত।
  12. সেশনটি শেষ করতে ইউজার প্রম্পটে exit টাইপ করুন।

পুনরালোচনা

এই অংশে, আপনি এজেন্ট স্তরবিন্যাস এবং কথোপকথন প্রবাহের মূল বিষয়গুলো শিখেছেন:

  • কথোপকথন সর্বদা root_agent দিয়ে শুরু হয়।
  • একটি প্যারেন্ট এজেন্ট তার description উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে একটি সাব-এজেন্টে স্থানান্তরিত হতে পারে।
  • আপনি প্যারেন্টকে তার name ধরে সাব-এজেন্টের কাছে স্থানান্তরের instruction দিয়ে এই প্রবাহকে স্পষ্টভাবে নিয়ন্ত্রণ করতে পারেন।
  • ডিফল্টরূপে, এজেন্টরা তাদের peer এজেন্টদের (পদানুক্রমিক শ্রেণিবিন্যাসে থাকা সহোদর) কাছে স্থানান্তরিত হতে পারে।

৮. তথ্য সংরক্ষণ ও পুনরুদ্ধার করতে সেশন স্টেট ব্যবহার করুন।

প্রতিটি ADK কথোপকথনের একটি Session থাকে, যার মধ্যে একটি সেশন স্টেট ডিকশনারি অন্তর্ভুক্ত থাকে। এই স্টেটটি সমস্ত এজেন্টের কাছে অ্যাক্সেসযোগ্য, যা তাদের মধ্যে তথ্য আদান-প্রদান করতে বা কথোপকথন জুড়ে ডেটা (যেমন একটি তালিকা) বজায় রাখার জন্য এটিকে একটি নিখুঁত উপায় করে তোলে।

রাজ্যের সাথে সংযোজন এবং রাজ্য থেকে পাঠ অন্বেষণ করতে:

  1. adk_multiagent_systems/parent_and_subagents/agent.py ফাইলে ফিরে যান
  2. # Tools হেডারের পরে নিম্নলিখিত ফাংশন সংজ্ঞাটি পেস্ট করুন:
    def save_attractions_to_state(
    tool_context: ToolContext,
    attractions: List[str]
    ) -> dict[str, str]:
        """Saves the list of attractions to state["attractions"].
    
        Args:
            attractions [str]: a list of strings to add to the list of attractions
    
        Returns:
            None
        """
        # Load existing attractions from state. If none exist, start an empty list
        existing_attractions = tool_context.state.get("attractions", [])
    
        # Update the 'attractions' key with a combo of old and new lists.
        # When the tool is run, ADK will create an event and make
        # corresponding updates in the session's state.
        tool_context.state["attractions"] = existing_attractions + attractions
    
        # A best practice for tools is to return a status message in a return dict
        return {"status": "success"}
    
    এই কোডে, লক্ষ্য করুন:
    • ফাংশনটি tool_context: ToolContext গ্রহণ করে। এই অবজেক্টটি আপনার সেশনে প্রবেশের প্রবেশদ্বার।
    • tool_context.state["attractions"] = ... লাইনটি সরাসরি সেশনের স্টেট ডিকশনারি থেকে ডেটা পড়ে এবং তাতে লেখে। বাকিটা ADK সামলে নেয়।
  3. tools প্যারামিটারটি যোগ করে attractions_planner এজেন্টে টুলটি যুক্ত করুন:
        tools=[save_attractions_to_state]
    
  4. attractions_planner এজেন্টের বিদ্যমান instruction নিম্নলিখিত বুলেট পয়েন্টগুলো যোগ করুন:
            - When they reply, use your tool to save their selected attraction and then provide more possible attractions.
            - If they ask to view the list, provide a bulleted list of { attractions? } and then suggest some more.
    
  5. টার্মিনালে নিম্নলিখিত কমান্ডটি ব্যবহার করে এজেন্ট ডেভেলপমেন্ট কিট ওয়েব UI চালু করুন :
    adk web
    
    আউটপুট
    INFO:     Started server process [2434]
    INFO:     Waiting for application startup.
    +-------------------------------------------------------+
    | ADK Web Server started                                |
    |                                                       |
    | For local testing, access at http://localhost:8000.   |
    +-------------------------------------------------------+
    
    INFO:     Application startup complete.
    INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
    
  6. ক্লাউড শেল টার্মিনালে, একটি নতুন ট্যাবে ওয়েব ইন্টারফেসটি দেখতে, ওয়েব প্রিভিউ বোতামে ক্লিক করুন এবং চেঞ্জ পোর্ট নির্বাচন করুন।
    ওয়েব প্রিভিউ মেনু
  7. পোর্ট নম্বর ৮০০০ ইনপুট করুন এবং 'Change and Preview'- এ ক্লিক করুন। ADK Dev UI সহ একটি নতুন ব্রাউজার ট্যাব খুলবে।
    টেক্সট বক্সে 8000 প্রবেশ করালে পোর্ট পরিবর্তনের পপ-আপ বক্স আসবে।
  8. বামদিকের 'Select an agent' ড্রপডাউন থেকে parent_and_subagents নির্বাচন করুন।
  9. কথোপকথন শুরু করুন: hello দিয়ে
  10. এজেন্ট আপনাকে অভিবাদন জানানোর পর, উত্তরে বলুন:
    I'd like to go to Egypt.
    
    আপনাকে attractions_planner -এ স্থানান্তরিত করা হবে এবং আকর্ষণীয় স্থানগুলোর একটি তালিকা প্রদান করা হবে।
  11. উদাহরণস্বরূপ, একটি আকর্ষণীয় স্থান বেছে নিন:
    I'll go to the Sphinx
    
  12. আপনি এইরকম একটি উত্তর পাবেন: ঠিক আছে, আমি আপনার তালিকায় ‘দ্য স্ফিঙ্কস’ যোগ করে দিয়েছি...
  13. টুলের প্রতিক্রিয়া থেকে তৈরি ইভেন্টটি দেখতে, রেসপন্স টুল বক্সটিতে (চেক মার্ক দিয়ে চিহ্নিত) ক্লিক করুন।
    লক্ষ্য করুন যে এতে একটি 'অ্যাকশনস' ফিল্ড রয়েছে, যার মধ্যে stateDelta অন্তর্ভুক্ত আছে, যা অবস্থার পরিবর্তনগুলো বর্ণনা করে।
  14. এজেন্টের তালিকা থেকে আরেকটি আকর্ষণীয় স্থানের নাম উল্লেখ করে উত্তর দিন।
  15. বাম দিকের নেভিগেশন মেনুতে, পূর্বে পরিদর্শন করা ইভেন্টটি থেকে ফোকাস বের করতে "X"-এ ক্লিক করুন।
  16. বাম পাশের সাইডবারে, ' State' ট্যাবে ক্লিক করুন। এখন আপনি সেশনের স্টেটে ' attractions ' অ্যারেটি দেখতে পাবেন, যেটিতে আপনার নির্বাচিত দুটি আইটেমই থাকা উচিত। ওয়েব UI-তে সেশন অবস্থার প্রিভিউ
  17. এজেন্টের কাছে এই বার্তাটি পাঠান:
    What is on my list?
    
    এজেন্ট এখন স্টেট থেকে ডেটা পড়ে আপনার তালিকাটি ফেরত দেবে।
  18. এজেন্টটি নিয়ে আপনার পরীক্ষা-নিরীক্ষা শেষ হলে, ওয়েব ব্রাউজার ট্যাবটি বন্ধ করুন এবং সার্ভারটি বন্ধ করতে ক্লাউড শেল টার্মিনালে CTRL + C চাপুন।

অধ্যায়ের সারসংক্ষেপ

এই অংশে, আপনি শিখেছেন কীভাবে ডেটা শেয়ার করার জন্য Session স্টেট ব্যবহার করতে হয়:

  • স্টেট লিখতে : আপনি একটি টুলের ভেতর থেকে tool_context.state অবজেক্টটি ব্যবহার করে স্টেট ডিকশনারিতে লেখেন (যেমন, tool_context.state["my_list"] = [...] )।
  • স্টেট পড়তে : আপনি কী টেমপ্লেটিং ব্যবহার করে সরাসরি এজেন্টের instruction স্টেট ডেটা যুক্ত করেন (যেমন, Here is your list: {my_list?} )।
  • অবস্থা পর্যবেক্ষণ করতে : আপনি ADK Dev UI-এর State ট্যাব ব্যবহার করে সেশনের অবস্থা সরাসরি পর্যবেক্ষণ করতে পারেন।

৯. ওয়ার্কফ্লো এজেন্ট

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

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

  • SequentialAgent
  • LoopAgent
  • ParallelAgent

এই ল্যাবের বাকি অংশে এই তিনটি ওয়ার্কফ্লো এজেন্ট ব্যবহার করে একটি মাল্টি-এজেন্ট সিস্টেম তৈরির উপর মনোযোগ দেওয়া হবে।

আপনি এমন একজন এজেন্ট তৈরি করবেন যিনি কোনো ঐতিহাসিক চরিত্রকে নিয়ে একটি নতুন সিনেমার জন্য প্রস্তাবনা নথি প্রস্তুত করবেন। আপনার এজেন্টরা গবেষণা, পুনরাবৃত্তিমূলক লিখন এবং প্রতিবেদন তৈরির দায়িত্ব পালন করবেন।

অবশেষে, আপনার সিস্টেমটি দেখতে এইরকম হবে:

একটি চলচ্চিত্র ধারণা দল বহু-এজেন্ট সিস্টেমের ডায়াগ্রাম

আপনি সবচেয়ে সহজ কর্মপ্রবাহটি দিয়ে শুরু করে, ধাপে ধাপে এই সিস্টেমটি তৈরি করবেন।

১০. একটি SequentialAgent ব্যবহার করে একটি মাল্টি-এজেন্ট সিস্টেম তৈরি করুন।

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

এই প্রথম সংস্করণটির গঠন হবে নিম্নরূপ:

ফিল্ম_কনসেপ্ট_টিম মাল্টি-এজেন্ট সিস্টেম ধাপ ১

  • একজন root_agent ( greeter ) ব্যবহারকারীকে স্বাগত জানাবে এবং চলচ্চিত্রের বিষয়বস্তু সংগ্রহ করবে।
  • এরপর এটি film_concept_team নামের একটি SequentialAgent এর কাছে স্থানান্তরিত হবে, যেটি:
    1. উইকিপিডিয়া থেকে তথ্য পেতে একটি researcher এজেন্ট চালান।
    2. ওই তথ্যগুলো ব্যবহার করে একটি কাহিনি লেখার জন্য একজন screenwriter এজেন্ট নিয়োগ করুন।
    3. চূড়ান্ত প্লটটি একটি ফাইলে সংরক্ষণ করতে একটি file_writer এজেন্ট চালান।

চলুন এটা চালানো যাক।

  1. ক্লাউড শেল এডিটর-adk_multiagent_systems/workflow_agents/agent.py খুলুন।
    এই এজেন্ট ডেফিনিশন ফাইলটি ভালোভাবে পড়ুন। যেহেতু কোনো সাব-এজেন্টকে প্যারেন্টের কাছে অ্যাসাইন করার আগে অবশ্যই সংজ্ঞায়িত করতে হয়, তাই কথোপকথনের প্রবাহ অনুযায়ী ফাইলটি পড়ার জন্য, আপনি ফাইলের নিচ থেকে উপরের দিকে এজেন্টগুলো পড়তে পারেন।
  2. ` append_to_state টুলটি লক্ষ্য করুন। এই হেল্পার ফাংশনটি এজেন্টদের সেশন স্টেটের একটি লিস্টে ডেটা যুক্ত করতে দেয়, আর এভাবেই researcherscreenwriter তাদের কাজ জমা দেবেন।
  3. এজেন্টটি পরীক্ষা করে দেখুন। টার্মিনালে , লাইভ-রিলোডিং সক্রিয় করে ওয়েব ইন্টারফেসটি চালু করুন:
    cd ~/adk_multiagent_systems
    adk web --reload_agents
    
  4. ক্লাউড শেল টার্মিনালে, একটি নতুন ট্যাবে ওয়েব ইন্টারফেসটি দেখতে, ওয়েব প্রিভিউ বোতামে ক্লিক করুন এবং চেঞ্জ পোর্ট নির্বাচন করুন।
    ওয়েব প্রিভিউ মেনু
  5. পোর্ট নম্বর ৮০০০ ইনপুট করুন এবং 'Change and Preview'- এ ক্লিক করুন। ADK Dev UI সহ একটি নতুন ব্রাউজার ট্যাব খুলবে।
    টেক্সট বক্সে 8000 প্রবেশ করালে পোর্ট পরিবর্তনের পপ-আপ বক্স আসবে।
  6. 'Select an agent' ড্রপডাউন থেকে workflow_agents ' নির্বাচন করুন।
  7. hello বলে কথোপকথন শুরু করুন। greeter এজেন্ট উত্তর দেবেন।
  8. নির্দেশিত হলে, একজন ঐতিহাসিক ব্যক্তিত্বের নাম লিখুন। আপনি এদের মধ্যে থেকে কাউকে অথবা আপনার নিজের নাম ব্যবহার করতে পারেন:
    • ঝাং ঝংজিং
    • অ্যাডা লাভলেস
    • মার্কাস অরেলিয়াস
  9. এখন SequentialAgent দায়িত্ব গ্রহণ করবে। আপনি কোনো মধ্যবর্তী বার্তা দেখতে পাবেন না। researcher , screenwriter এবং file_writer একের পর এক চলবে। সম্পূর্ণ অনুক্রমটি শেষ হলেই এজেন্ট সাড়া দেবে।
    যদি এটি ব্যর্থ হয়, আপনি উপরের ডানদিকে থাকা ‘+ নতুন সেশন’ বোতামে ক্লিক করে আবার চেষ্টা করতে পারেন।
  10. এজেন্ট ফাইলটি লেখা হয়েছে বলে নিশ্চিত করলে, আউটপুট দেখার জন্য আপনার ক্লাউড শেল এডিটরে movie_pitches ডিরেক্টরিতে থাকা নতুন .txt ফাইলটি খুঁজুন এবং খুলুন।
  11. ADK Dev UI-তে, ইভেন্ট ভিউ খোলার জন্য চ্যাট হিস্ট্রিতে থাকা শেষ এজেন্ট আইকনটিতে ক্লিক করুন
  12. ইভেন্ট ভিউতে এজেন্ট ট্রি-এর একটি ভিজ্যুয়াল গ্রাফ দেখা যায়। আপনি দেখতে পারেন কীভাবে greeter film_concept_team কে কল করেছিল, এবং সেই টিমটি ক্রমানুসারে তার প্রতিটি সাব-এজেন্টকে কল করে। এডিকে ওয়েব গ্রাফ
  13. গ্রাফের যেকোনো এজেন্টের জন্য রিকোয়েস্ট এবং রেসপন্স ট্যাবে ক্লিক করে আপনি সেশন স্টেট সহ প্রেরিত সঠিক ডেটা পরীক্ষা করতে পারেন।

অধ্যায়ের সারসংক্ষেপ

এই অংশে, আপনি শিখেছেন কীভাবে একটি ওয়ার্কফ্লো এজেন্ট ব্যবহার করতে হয়:

  • একটি SequentialAgent ধাপগুলোর মধ্যে ব্যবহারকারীর ইনপুটের জন্য অপেক্ষা না করে, তার অধীনস্থ এজেন্টগুলোকে ক্রমানুসারে একের পর এক কার্যকর করে।
  • এটি একটি 'ওয়ার্কফ্লো', কারণ ব্যবহারকারী root_agent এর সাথে যোগাযোগ করে, যা কাজটি সম্পন্ন করার জন্য SequentialAgent কাছে হস্তান্তর করে।
  • অনুক্রমের উপ-এজেন্টরা পূর্ববর্তী এজেন্টদের কাজ অ্যাক্সেস করার জন্য সেশন স্টেট (যেমন, { PLOT_OUTLINE? } ) ব্যবহার করে।
  • আপনি ডেভ ইউআই-তে থাকা ইভেন্ট গ্রাফ ব্যবহার করে সম্পূর্ণ এজেন্ট-টু-এজেন্ট ওয়ার্কফ্লোটি দেখতে ও ডিবাগ করতে পারেন।

১১. পুনরাবৃত্তিমূলক কাজের জন্য একটি LoopAgent যোগ করুন।

LoopAgent হলো একটি ওয়ার্কফ্লো এজেন্ট যা তার সাব-এজেন্টগুলোকে একটি নির্দিষ্ট ক্রমে চালায় এবং তারপর আবার শুরু থেকে পুনরাবৃত্তি করে। এই "লুপ" ততক্ষণ চলতে থাকে যতক্ষণ না কোনো শর্ত পূরণ হয়, যেমন max_iterations সংখ্যায় পৌঁছানো অথবা কোনো সাব-এজেন্ট দ্বারা বিল্ট-ইন exit_loop টুলটি কল করা।

এটি এমন সব কাজের জন্য উপযোগী যেখানে বারবার পরিমার্জনের প্রয়োজন হয়। আপনার মুভি পিচ এজেন্টের জন্য একটি "রাইটার্স রুম" তৈরি করতে আপনি এই LoopAgent যোগ করবেন। এটি একজন researcher , screenwriter এবং একজন নতুন critic এজেন্টকে একটি চক্রের মধ্যে কাজ করার সুযোগ দেয়, যার ফলে critic মতে প্রস্তুত না হওয়া পর্যন্ত প্রতিটি ধাপে কাহিনি আরও উন্নত হতে থাকে। এটি এজেন্টকে কোনো ধারণা নিয়ে গবেষণা ও পরিমার্জন করার সুযোগ দিয়ে ব্যবহারকারীর দেওয়া অস্পষ্ট ইনপুট (যেমন "একজন প্রাচীন ডাক্তার") সামলাতেও সাহায্য করে।

ফিল্ম_কনসেপ্ট_টিম মাল্টি-এজেন্ট সিস্টেম ধাপ ২

এই পরিবর্তনগুলো করতে:

  1. adk_multiagent_systems/workflow_agents/agent.py ফাইলে, exit_loop জন্য ইম্পোর্টটি যোগ করুন (অন্যান্য google.adk ইম্পোর্টগুলোর কাছে):
    from google.adk.tools import exit_loop
    
  2. নতুন critic এজেন্টটি যোগ করুন। এই এজেন্টটি প্লটটি পর্যালোচনা করবে। যদি এটি ভালো হয়, তবে এটি exit_loop কল করবে। আর যদি ভালো না হয়, তবে এটি পরবর্তী লুপের জন্য স্টেটে ফিডব্যাক যোগ করবে।
    নিম্নলিখিত এজেন্ট সংজ্ঞাটি # Agents বিভাগের অধীনে পেস্ট করুন:
    critic = Agent(
        name="critic",
        model=model_name,
        description="Reviews the outline so that it can be improved.",
        instruction="""
        INSTRUCTIONS:
        Consider these questions about the PLOT_OUTLINE:
        - Does it meet a satisfying three-act cinematic structure?
        - Do the characters' struggles seem engaging?
        - Does it feel grounded in a real time period in history?
        - Does it sufficiently incorporate historical details from the RESEARCH?
    
        If the PLOT_OUTLINE does a good job with these questions, exit the writing loop with your 'exit_loop' tool.
        If significant improvements can be made, use the 'append_to_state' tool to add your feedback to the field 'CRITICAL_FEEDBACK'.
        Explain your decision and briefly summarize the feedback you have provided.
    
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        RESEARCH:
        { research? }
        """,
        before_model_callback=log_query_to_model,
        after_model_callback=log_model_response,
        tools=[append_to_state, exit_loop]
    )
    
  3. writers_room LoopAgent তৈরি করুন। এতে তিনটি এজেন্ট থাকবে যারা লুপের মধ্যে কাজ করবে।
    film_concept_team এজেন্ট ডেফিনিশনের উপরে নিম্নলিখিত কোডটি পেস্ট করুন:
    writers_room = LoopAgent(
        name="writers_room",
        description="Iterates through research and writing to improve a movie plot outline.",
        sub_agents=[
            researcher,
            screenwriter,
            critic
        ],
        max_iterations=5,
    )
    
  4. নতুন writers_room লুপ ব্যবহার করার জন্য film_concept_team SequentialAgent আপডেট করুন। researcher এবং screenwriter একক writers_room এজেন্ট দিয়ে প্রতিস্থাপন করুন। আপনার বিদ্যমান film_concept_team ডেফিনিশনটি এটি দিয়ে প্রতিস্থাপন করুন:
    film_concept_team = SequentialAgent(
        name="film_concept_team",
        description="Write a film plot outline and save it as a text file.",
        sub_agents=[
            writers_room,
            file_writer
        ],
    )
    
  5. ADK Dev UI ট্যাবে ফিরে যান এবং উপরের ডানদিকে থাকা + New Session-এ ক্লিক করুন।
  6. নতুন কথোপকথন শুরু করুন: hello
  7. জিজ্ঞাসা করা হলে, এবার এজেন্টকে আরও বিস্তৃত একটি বিষয় দিন। কয়েকটি ধারণা নিচে দেওয়া হলো:
    • একজন শিল্প ডিজাইনার যিনি সাধারণ মানুষের জন্য পণ্য তৈরি করতেন
    • মানচিত্রকার (মানচিত্র প্রস্তুতকারী)
    • সেই লোকটি যে ফসলকে আরও বেশি খাদ্য উৎপাদনে সক্ষম করেছিল
    এজেন্টটি এখন লুপের মধ্যে কাজ করবে। ADK Dev UI-তে, এজেন্টগুলো একাধিকবার চলার সময় আপনি লগগুলো দেখতে পাবেন (যেমন, "[researcher]", "[screenwriter]", "[critic]", "[researcher]", "[screenwriter]", "[critic]...")।
  8. লুপটি সম্পূর্ণ হলে, এজেন্ট ফাইলটি লিখবে। adk_multiagent_systems/movie_pitches ডিরেক্টরিতে তৈরি হওয়া ফাইলটি পর্যালোচনা করুন।
  9. লুপের গঠন দেখতে ডেভ UI-তে ইভেন্ট গ্রাফটি পরিদর্শন করুন।

অধ্যায়ের সারসংক্ষেপ

এই অংশে, আপনি LoopAgent কীভাবে ব্যবহার করতে হয় তা শিখেছেন:

  • LoopAgent হলো একটি ওয়ার্কফ্লো এজেন্ট যা তার সাব-এজেন্টগুলোর ক্রমকে পুনরাবৃত্তি করে, এবং পুনরাবৃত্তিমূলক কাজের জন্য একটি "অভ্যন্তরীণ লুপ" তৈরি করে।
  • লুপের ভেতরের এজেন্টরা পরবর্তী ধাপগুলোতে একে অপরের কাছে কাজ (যেমন, PLOT_OUTLINE ) এবং মতামত (যেমন, CRITICAL_FEEDBACK ) পাঠানোর জন্য সেশন স্টেট ব্যবহার করে।
  • max_iterations সীমায় পৌঁছালে অথবা কোনো এজেন্ট exit_loop টুলটি কল করলে লুপটি বন্ধ করা যেতে পারে।

১২. 'ফ্যান আউট অ্যান্ড গ্যাদার'-এর জন্য একটি প্যারালালএজেন্ট ব্যবহার করুন।

ParallelAgent হলো একটি ওয়ার্কফ্লো এজেন্ট যা তার সমস্ত সাব-এজেন্টকে একই সময়ে (একযোগে) কার্যকর করে। যেসব কাজকে স্বাধীন উপ-কাজে ভাগ করা যায়, যেমন দুটি ভিন্ন গবেষণার কাজ চালানো, সেগুলোর জন্য এটি মূল্যবান।

আপনি একটি "প্রিপ্রোডাকশন টিম" তৈরি করতে একটি ParallelAgent ব্যবহার করবেন যা সমান্তরালভাবে কাজ করবে। একজন এজেন্ট বক্স অফিসের সম্ভাবনা নিয়ে গবেষণা করবে, আর একই সময়ে অন্য একজন এজেন্ট কাস্টিংয়ের ধারণা নিয়ে ব্রেইনস্টর্মিং করবে। এটিকে প্রায়শই "ফ্যান আউট অ্যান্ড গ্যাদার" প্যাটার্ন বলা হয়: ParallelAgent কাজটি "ছড়িয়ে দেয়", এবং পরবর্তী একজন এজেন্ট (আমাদের file_writer ) সেই ফলাফলগুলো "সংগ্রহ" করে।

ফিল্ম_কনসেপ্ট_টিম মাল্টি-এজেন্ট সিস্টেম ধাপ ৩

আপনার চূড়ান্ত এজেন্ট প্রবাহ হবে:

  1. greeter (রুট) চ্যাট শুরু করে।
  2. এটি film_concept_team ( SequentialAgent )-এর কাছে স্থানান্তরিত হয়, যা চালায়:
    • কাহিনীবিন্যাস তৈরির জন্য writers_room ( LoopAgent )।
    • নতুন preproduction_team ( ParallelAgent ) একই সাথে বক্স অফিস ও কাস্টিং নিয়ে গবেষণা করবে।
    • file_writer সমস্ত ফলাফল সংগ্রহ করে ফাইলটি সংরক্ষণ করে।

এই পরিবর্তনগুলো করতে:

  1. adk_multiagent_systems/workflow_agents/agent.py ফাইলে, নতুন ParallelAgent এবং এর সাব-এজেন্টগুলোকে # Agents হেডারের অধীনে পেস্ট করুন।
    box_office_researcher = Agent(
        name="box_office_researcher",
        model=model_name,
        description="Considers the box office potential of this film",
        instruction="""
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        INSTRUCTIONS:
        Write a report on the box office potential of a movie like that described in PLOT_OUTLINE based on the reported box office performance of other recent films.
        """,
        output_key="box_office_report"
    )
    
    casting_agent = Agent(
        name="casting_agent",
        model=model_name,
        description="Generates casting ideas for this film",
        instruction="""
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        INSTRUCTIONS:
        Generate ideas for casting for the characters described in PLOT_OUTLINE
        by suggesting actors who have received positive feedback from critics and/or
        fans when they have played similar roles.
        """,
        output_key="casting_report"
    )
    
    preproduction_team = ParallelAgent(
        name="preproduction_team",
        sub_agents=[
            box_office_researcher,
            casting_agent
        ]
    )
    
  2. film_concept_team SequentialAgent এর sub_agents তালিকাটি আপডেট করে নতুন preproduction_team ( writers_room এবং file_writer মধ্যে) অন্তর্ভুক্ত করুন। আপনার বিদ্যমান film_concept_team সংজ্ঞাটি এটি দিয়ে প্রতিস্থাপন করুন:
    film_concept_team = SequentialAgent(
        name="film_concept_team",
        description="Write a film plot outline and save it as a text file.",
        sub_agents=[
            writers_room,
            preproduction_team,
            file_writer
        ],
    )
    
  3. file_writer এজেন্টের instruction আপডেট করুন, যাতে এটি রাজ্য থেকে নতুন রিপোর্টগুলো "সংগ্রহ" করে এবং সেগুলোকে ফাইলে যুক্ত করে।
    file_writer এর জন্য instruction স্ট্রিংটি এটি দিয়ে প্রতিস্থাপন করুন:
        instruction="""
        INSTRUCTIONS:
        - Create a marketable, contemporary movie title suggestion for the movie described in the PLOT_OUTLINE.
        If a title has been suggested in PLOT_OUTLINE, you can use it, or replace it with a better one.
        - Use your 'write_file' tool to create a new txt file with the following arguments:
        - for a filename, use the movie title
        - Write to the 'movie_pitches' directory.
        - For the 'content' to write, include:
        - The PLOT_OUTLINE
        - The BOX_OFFICE_REPORT
        - The CASTING_REPORT
    
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        BOX_OFFICE_REPORT:
        { box_office_report? }
    
        CASTING_REPORT:
        { casting_report? }
        """,
    
  4. ADK Dev UI ট্যাবে ফিরে যান এবং + নতুন সেশন-এ ক্লিক করুন।
  5. কথোপকথন শুরু করতে hello লিখুন।
  6. নির্দেশিত হলে, একটি নতুন চরিত্রের ধারণা লিখুন। কয়েকটি ধারণা নিচে দেওয়া হলো:
    • সেই অভিনেত্রী যিনি ওয়াইফাই প্রযুক্তি আবিষ্কার করেছিলেন
    • একজন উত্তেজনাপূর্ণ শেফ
    • বিশ্ব মেলা প্রদর্শনীতে প্রধান খেলোয়াড়রা
  7. এজেন্ট তার কাজ শেষ করলে, adk_multiagent_systems/movie_pitches ডিরেক্টরিতে থাকা চূড়ান্ত ফাইলটি পরীক্ষা করুন। এতে এখন কাহিনী, বক্স অফিস রিপোর্ট এবং কাস্টিং রিপোর্ট—সবগুলোই একটি ডকুমেন্টে থাকার কথা।

অধ্যায়ের সারসংক্ষেপ

এই অংশে, আপনি ParallelAgent কীভাবে ব্যবহার করতে হয় তা শিখেছেন:

  • একটি ParallelAgent তার সমস্ত সাব-এজেন্টকে ক্রমানুসারে না চালিয়ে, বরং একই সময়ে কাজ ছড়িয়ে দেয়।
  • যেসব কাজ একে অপরের উপর নির্ভরশীল নয় (যেমন দুটি ভিন্ন বিষয় নিয়ে গবেষণা করা), সেগুলোর জন্য এটি অত্যন্ত কার্যকর।
  • প্যারালাল এজেন্টগুলোর কাজের ফলাফল পরবর্তী কোনো এজেন্ট দ্বারা 'সংগ্রহ' করা হয়। এটি করা হয় প্যারালাল এজেন্টগুলোকে তাদের কাজ সেশন স্টেটে ( output_key ব্যবহার করে) সংরক্ষণ করতে দিয়ে, এবং একটি চূড়ান্ত এজেন্টকে (যেমন file_writer ) সেই কীগুলো পড়তে দিয়ে।

১৩. কাস্টম ওয়ার্কফ্লো এজেন্ট

যখন SequentialAgent , LoopAgent , এবং ParallelAgent এর মতো পূর্ব-নির্ধারিত ওয়ার্কফ্লো এজেন্টগুলো আপনার প্রয়োজনের জন্য অপর্যাপ্ত হয়, তখন CustomAgent নতুন ওয়ার্কফ্লো লজিক প্রয়োগ করার নমনীয়তা প্রদান করে।

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

CustomAgent তৈরি করা এই ল্যাবের আওতার বাইরে, কিন্তু প্রয়োজনে এটির অস্তিত্ব রয়েছে তা জেনে রাখা ভালো!

১৪. অভিনন্দন!

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

পুনরালোচনা

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

  • প্যারেন্ট ও সাব-এজেন্ট সম্পর্কযুক্ত একটি হায়ারার্কিক্যাল ট্রি -তে এজেন্টসমূহকে সংগঠিত করা হয়।
  • নিয়ন্ত্রিত এজেন্ট-থেকে-এজেন্ট স্থানান্তর , যা স্বয়ংক্রিয়ভাবে ( description ব্যবহার করে) এবং সুস্পষ্টভাবে ( instruction ব্যবহার করে) উভয়ভাবেই করা যায়।
  • tool_context.state ডিকশনারিতে ডেটা লেখার জন্য একটি টুল ব্যবহার করা হয়েছে।
  • সেশন স্টেট থেকে তথ্য পড়তে এবং এজেন্টের প্রম্পটকে নির্দেশিত করতে কী টেমপ্লেটিং (যেমন, { PLOT_OUTLINE? } ) ব্যবহার করা হয়েছে।
  • একটি সহজ, ধাপে ধাপে কার্যপ্রবাহ (গবেষণা -> লেখা -> সংরক্ষণ) তৈরি করতে একটি SequentialAgent প্রয়োগ করা হয়েছে।
  • একটি পুনরাবৃত্তিমূলক পরিমার্জন চক্র তৈরি করতে critic এজেন্ট এবং exit_loop টুল সহ একটি LoopAgent ব্যবহার করা হয়েছে।
  • কাস্টিং এবং বক্স অফিস গবেষণার মতো স্বতন্ত্র কাজগুলোকে একযোগে চালানোর জন্য একটি ParallelAgent ব্যবহার করা হয়েছে।

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

আপনি যা শিখেছেন তার উপর ভিত্তি করে আরও এগিয়ে যাওয়ার অনেক উপায় আছে। এখানে কয়েকটি ধারণা দেওয়া হলো:

  • আরও এজেন্ট যোগ করুন: আপনার preproduction_team ParallelAgent এ একজন নতুন এজেন্ট যোগ করার চেষ্টা করুন। উদাহরণস্বরূপ, আপনি একজন marketing_agent তৈরি করতে পারেন যিনি PLOT_OUTLINE উপর ভিত্তি করে সিনেমার জন্য একটি ট্যাগলাইন লিখবেন।
  • আরও টুল যোগ করুন: আপনার researcher এজেন্টকে আরও টুল দিন। আপনি এমন একটি টুল তৈরি করতে পারেন যা গুগল সার্চ এপিআই ব্যবহার করে উইকিপিডিয়ায় নেই এমন তথ্য খুঁজে বের করে।
  • CustomAgent অন্বেষণ করুন : ল্যাবে এমন ওয়ার্কফ্লোগুলির জন্য CustomAgent উল্লেখ করা হয়েছে যা স্ট্যান্ডার্ড টেমপ্লেটের সাথে মেলে না। এমন একটি তৈরি করার চেষ্টা করুন যা, উদাহরণস্বরূপ, সেশন স্টেটে একটি নির্দিষ্ট কী বিদ্যমান থাকলেই কেবল শর্তসাপেক্ষে একটি এজেন্ট চালায়।