۱. مقدمه
نمای کلی
این آزمایشگاه به شما میآموزد که چگونه سیستمهای پیچیده و چندعاملی را با استفاده از کیت توسعه عامل گوگل (Google ADK) هماهنگ کنید. شما از سلسله مراتب ساده عاملها به سمت ساخت گردشهای کاری خودکار و مشارکتی حرکت خواهید کرد.
آنچه خواهید ساخت
شما دو سیستم چندعاملی مجزا خواهید ساخت:
- یک نماینده ساده برنامهریزی سفر که یاد میگیرد مکالمات بین یک نماینده «طوفان فکری» و یک نماینده «برنامهریزی جاذبهها» را منتقل کند.
- یک مولد پیشرفتهتر ارائه فیلم که از یک «اتاق نویسنده» متشکل از عوامل خودکار (مانند محقق، فیلمنامهنویس و منتقد) برای همکاری در یک حلقه برای ایجاد یک طرح کامل فیلم استفاده میکند.
آنچه یاد خواهید گرفت
- نحوه ایجاد روابط والد و زیرعامل.
- نحوه نوشتن دادهها در
stateجلسه از یک ابزار. - چگونه با استفاده از قالببندی کلید (مثلاً
{my_key?}) ازstateبخوانیم؟ - نحوه استفاده از
SequentialAgentبرای گردشهای کاری گام به گام. - نحوه استفاده از
LoopAgentبرای ایجاد چرخههای اصلاح تکراری. - نحوه استفاده از
ParallelAgentبرای اجرای همزمان وظایف مستقل.
۲. سیستمهای چندعاملی
کیت توسعه عامل (ADK) به توسعهدهندگان این امکان را میدهد تا رفتارهای چند مرحلهای، پیچیدهتر و قابل اعتمادتری را از مدلهای مولد دریافت کنند. ADK به جای یک دستور پیچیده، به شما امکان میدهد جریانی از چندین عامل سادهتر ایجاد کنید که با تقسیم کار، روی یک مسئله همکاری میکنند.
این رویکرد نسبت به استفاده از یک اعلان تکی و یکپارچه چندین مزیت دارد:
- طراحی سادهتر: طراحی و سازماندهی جریانی از عوامل کوچک و متخصص، سادهتر از مهندسی یک فرآیند بزرگ و پیچیده است.
- قابلیت اطمینان: کارگزاران متخصص در انجام وظایف خاص خود، نسبت به یک کارگزار بزرگ و پیچیده، قابل اعتمادتر هستند.
- قابلیت نگهداری: اصلاح یا بهبود یک عامل کوچک و تخصصی بدون آسیب رساندن به سایر بخشهای سیستم، آسانتر است.
- ماژولار بودن: عاملهایی که برای یک گردش کار ساخته شدهاند، میتوانند به راحتی در گردشهای کاری دیگر نیز مورد استفاده مجدد قرار گیرند.
درخت سلسله مراتبی عاملها

در ADK، شما عاملها را در یک ساختار درختی سازماندهی میکنید. این سلسله مراتب کلید کنترل جریان مکالمه است، زیرا محدود میکند که کدام عامل میتواند مکالمه را به کدام عامل دیگر "ارسال" کند. این امر رفتار سیستم را قابل پیشبینیتر و اشکالزدایی را آسانتر میکند. مزایا عبارتند از:
- طراحی شهودی: ساختار از تیمهای دنیای واقعی الهام گرفته شده است و همین امر استدلال در مورد آن را آسانتر میکند.
- جریان کنترلشده: سلسلهمراتب به شما کنترل دقیقی بر واگذاری وظایف میدهد که به اشکالزدایی کمک میکند. برای مثال، ساختار درختی تضمین میکند که عامل گزارشنویسی صحیح فراخوانی شود، حتی اگر دو عامل با توضیحات مشابه داشته باشید.
کل ساختار با root_agent شروع میشود. این عامل به عنوان والد عمل میکند و میتواند یک یا چند زیرعامل داشته باشد که به نوبه خود میتوانند والد زیرعاملهای خود نیز باشند و درخت را تشکیل دهند.
۳. راهاندازی پروژه
حساب گوگل
اگر از قبل حساب گوگل شخصی ندارید، باید یک حساب گوگل ایجاد کنید .
به جای حساب کاری یا تحصیلی از حساب شخصی استفاده کنید .
ورود به کنسول ابری گوگل
با استفاده از یک حساب کاربری شخصی گوگل، وارد کنسول ابری گوگل شوید.
فعال کردن صورتحساب
استفاده از اعتبار ۵ دلاری گوگل کلود (اختیاری)
برای اجرای این کارگاه، به یک حساب صورتحساب با مقداری اعتبار نیاز دارید. اگر قصد دارید از صورتحساب خودتان استفاده کنید، میتوانید از این مرحله صرف نظر کنید.
- روی این لینک کلیک کنید و با یک حساب گوگل شخصی وارد شوید. چیزی شبیه به این خواهید دید:

- روی دکمه « برای دسترسی به اعتبارات خود اینجا کلیک کنید» کلیک کنید. این شما را به صفحهای میبرد که میتوانید نمایه صورتحساب خود را تنظیم کنید.

- روی تأیید کلیک کنید
اکنون به حساب پرداخت آزمایشی پلتفرم گوگل کلود متصل شدهاید.

یک حساب پرداخت شخصی تنظیم کنید
اگر صورتحساب را با استفاده از اعتبارهای Google Cloud تنظیم کردهاید، میتوانید از این مرحله صرف نظر کنید.
برای تنظیم یک حساب پرداخت شخصی، به اینجا بروید تا پرداخت را در کنسول ابری فعال کنید .
برخی نکات:
- تکمیل این آزمایشگاه باید کمتر از ۱ دلار آمریکا از طریق منابع ابری هزینه داشته باشد.
- شما میتوانید مراحل انتهای این آزمایش را برای حذف منابع دنبال کنید تا از هزینههای بیشتر جلوگیری شود.
- کاربران جدید واجد شرایط استفاده از دوره آزمایشی رایگان ۳۰۰ دلاری هستند.
ایجاد پروژه (اختیاری)
اگر پروژه فعلی ندارید که بخواهید برای این برچسب استفاده کنید، اینجا یک پروژه جدید ایجاد کنید .
۴. ویرایشگر Cloud Shell را باز کنید
- برای دسترسی مستقیم به ویرایشگر Cloud Shell، روی این لینک کلیک کنید.
- اگر امروز در هر مرحلهای از شما خواسته شد که مجوز دهید، برای ادامه روی تأیید کلیک کنید.

- اگر ترمینال در پایین صفحه نمایش داده نشد، آن را باز کنید:
- روی مشاهده کلیک کنید
- روی ترمینال کلیک کنید

- در ترمینال، پروژه خود را با این دستور تنظیم کنید:
gcloud config set project [PROJECT_ID]- مثال:
gcloud config set project lab-project-id-example - اگر نمیتوانید شناسه پروژه خود را به خاطر بیاورید، میتوانید تمام شناسههای پروژه خود را با استفاده از دستور زیر فهرست کنید:
gcloud projects list
- مثال:
- شما باید این پیام را ببینید:
Updated property [core/project].
۵. فعال کردن APIها
برای استفاده از Vertex AI API و تعامل با مدل Gemini، باید Vertex AI API را در پروژه Google Cloud خود فعال کنید.
- در ترمینال، API را فعال کنید:
gcloud services enable aiplatform.googleapis.com
بخشهای بهروزرسانیشده در اینجا آمده است که جایگزین ایجاد دستی فایل با دستورالعملهایی برای کلون کردن مخزن GitHub و نصب وابستگیها شده است.
مقدمهای بر Vertex AI SDK برای پایتون
برای تعامل با مدلهای میزبانیشده در Vertex AI از طریق برنامه پایتون خود، از Vertex AI SDK برای پایتون استفاده خواهید کرد. این SDK فرآیند ارسال اعلانها، تعیین پارامترهای مدل و دریافت پاسخها را بدون نیاز به مدیریت مستقیم پیچیدگیهای فراخوانیهای API زیربنایی، ساده میکند.
میتوانید مستندات جامع مربوط به Vertex AI SDK برای پایتون را اینجا پیدا کنید: مقدمهای بر Vertex AI SDK برای پایتون | Google Cloud .
۶. محیط پروژه را تنظیم کنید
مخزن را کلون کنید
- در ترمینال ، مخزن حاوی فایلهای آغازگر را کلون کنید.
پرچمgit clone --depth 1 https://github.com/GoogleCloudPlatform/devrel-demos.git--depth 1فقط آخرین نسخه را که سریعتر است، شبیهسازی میکند. - در ترمینال ، به دایرکتوری کاری صحیح برای این آزمایش بروید.
cd devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
فعال کردن یک محیط مجازی
- در ترمینال ، با استفاده از
uvیک محیط مجازی ایجاد و فعال کنید:uv venv source .venv/bin/activate - در ترمینال ،
google-adkو سایر وابستگیها را از فایلrequirements.txtنصب کنید:uv pip install -r requirements.txt
ساختار فایل خود را بررسی کنید
حالا که همه فایلهای شما ایجاد شدهاند، پوشه adk_multiagent_systems را در اکسپلورر باز کنید تا ساختار کامل آن را ببینید.
- در منوی ویرایشگر پوسته ابری، گزینه File > Open Folder... را انتخاب کنید.

- در کادری که ظاهر میشود، اطلاعات پوشه زیر را بعد از نام کاربری خود اضافه کنید:
devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems/. روی تأیید کلیک کنید.
باید چیزی شبیه به این باشد:
- پنل اکسپلورر در سمت چپ رفرش میشود. اکنون باید ساختار کامل پروژه خود را به همراه زیرشاخههای
parent_and_subagentsوworkflow_agentsببینید که برای مراحل بعدی آماده هستند.
تنظیم متغیرهای محیطی
- شما در حال حاضر در دایرکتوری
adk_multiagent_systemsهستید. در ترمینال ، یک فایل.envبرای ذخیره متغیرهای محیطی خود ایجاد کنید:cloudshell edit .env - موارد زیر را در فایل
.envکه در ویرایشگر باز میشود، قرار دهید:GOOGLE_GENAI_USE_VERTEXAI=TRUE GOOGLE_CLOUD_PROJECT="[YOUR-PROJECT-ID]" GOOGLE_CLOUD_LOCATION=global MODEL="gemini-2.5-flash" - به جای
[YOUR-PROJECT-ID]، شناسه واقعی پروژه گوگل کلود خود را وارد کنید. (مثلاًPROJECT_ID = "google-cloud-labs")
اگر شناسه پروژه خود را به خاطر نمیآورید، دستور زیر را در ترمینال خود اجرا کنید. این دستور لیستی از تمام پروژههای شما و شناسههای آنها را به شما نشان میدهد.gcloud projects list - در ترمینال ، این فایل
.envرا در دایرکتوریهای sub-agent کپی کنید تا آنها نیز بتوانند به متغیرها دسترسی داشته باشند: ساختار فایل اکنون باید به این شکل باشد:cp .env parent_and_subagents/.env cp .env workflow_agents/.env
۷. بررسی انتقالها بین والد، زیرعامل و عاملهای همتا
مکالمه همیشه با root_agent شروع میشود. به طور پیشفرض، یک عامل والد description زیرعاملهای خود برای تصمیمگیری در مورد زمان انتقال مکالمه استفاده میکند. همچنین میتوانید این انتقالها را به طور صریح در instruction والد با استفاده از name زیرعاملها هدایت کنید.
بیایید این را آزمایش کنیم.
- در ویرایشگر Cloud Shell،
adk_multiagent_systems/parent_and_subagents/agent.pyرا باز کنید. به سه عامل موجود در فایلagent.pyتوجه کنید:-
root_agent(با نامsteering) : از کاربر سوالی میپرسد تا تصمیم بگیرد به کدام زیرعامل منتقل شود. در ابتدا، فقط بهdescriptionزیرعاملهای خود متکی است. -
travel_brainstormer: به کاربر کمک میکند تا در مورد مقاصد مختلف ایدهپردازی کند. -
attractions_planner: به کاربر کمک میکند تا کارهایی را که باید در یک کشور خاص انجام دهد، فهرست کند.
-
- با اضافه کردن خط زیر به فایل ایجاد شدهی
root_agentتوابعtravel_brainstormerوattractions_plannerرا به sub-agentهایroot_agentتبدیل کنید:sub_agents=[travel_brainstormer, attractions_planner] - در ترمینال ، با نماینده خود چت کنید:
cd ~/devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems adk run parent_and_subagents - در اعلان
[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?
- حالا، به اپراتور در ترمینال بگویید:
مثال خروجی (ممکن است خروجی شما کمی متفاوت باشد):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کنترل را فقط بر اساسdescriptionsub-agent منتقل میکند. - در اعلان
user:در ترمینال ،exitتایپ کنید و ENTER را فشار دهید تا مکالمه پایان یابد. - حالا بیایید واضحتر باشیم. در
agent.py، موارد زیر را بهinstructionroot_agentاضافه کنید: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'. - در ترمینال ، دوباره عامل را اجرا کنید:
adk run parent_and_subagents - در اعلان
[user]:در ترمینال ، تایپ کنید:hello - پاسخ با:
مثال خروجی (ممکن است خروجی شما کمی متفاوت باشد):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، طبق دستورالعملهای جدیدتان، توجه کنید. - حالا با این جمله پاسخ دهید:
مثال خروجی (ممکن است خروجی شما کمی متفاوت باشد):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منتقل شدهاید. این به طور پیشفرض مجاز است. - در اعلان کاربر، برای پایان دادن به جلسه
exitتایپ کنید.
خلاصه
در این بخش، اصول اولیه سلسله مراتب اپراتورها و جریان مکالمه را آموختید:
- مکالمه همیشه با
root_agentشروع میشود. - یک عامل اصلی میتواند به طور خودکار بر اساس
descriptionبه یک عامل فرعی منتقل شود. - شما میتوانید با دادن
instructionوالد برای انتقال به یک عامل فرعی باnameآن، این جریان را به صراحت کنترل کنید. - به طور پیشفرض، عاملها میتوانند به عاملهای
peer(خواهر و برادرها در سلسله مراتب) خود منتقل شوند.
۸. استفاده از session state برای ذخیره و بازیابی اطلاعات
هر مکالمه ADK یک Session دارد که شامل یک دیکشنری وضعیت جلسه است. این وضعیت برای همه عاملها قابل دسترسی است و آن را به راهی ایدهآل برای انتقال اطلاعات بین آنها یا نگهداری دادهها (مانند یک لیست) در طول مکالمه تبدیل میکند.
برای بررسی اضافه کردن به حالت و خواندن از آن:
- به فایل
adk_multiagent_systems/parent_and_subagents/agent.pyبرگردید - تعریف تابع زیر را بعد از سربرگ
# 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را دریافت میکند. این شیء، دروازه شما به جلسه (session) است. - خط
tool_context.state["attractions"] = ...مستقیماً از دیکشنری وضعیت جلسه میخواند و در آن مینویسد. ADK بقیه کارها را انجام میدهد.
- این تابع
- با اضافه کردن پارامتر
tools، ابزار را به agentattractions_plannerاضافه کنید:tools=[save_attractions_to_state] - نکات زیر را به
instructionموجود عاملattractions_plannerاضافه کنید:- 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. - رابط کاربری وب Agent Development Kit را با دستور زیر در ترمینال اجرا کنید:
خروجیadk webINFO: 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) - در ترمینال Cloud Shell، روی دکمهی «برای مشاهدهی رابط وب در یک برگهی جدید»، « پیشنمایش وب» کلیک کنید و «تغییر پورت» را انتخاب کنید.

- شماره پورت ۸۰۰۰ را وارد کنید و روی «تغییر و پیشنمایش» کلیک کنید. یک برگه مرورگر جدید با رابط کاربری ADK Dev باز خواهد شد.

- از منوی کشویی «انتخاب یک عامل» در سمت چپ، گزینهی
parent_and_subagentsرا انتخاب کنید. - مکالمه را با این جمله شروع کنید:
hello - بعد از اینکه مامور به شما سلام کرد، با این جملات پاسخ دهید:
شما باید بهI'd like to go to Egypt.attractions_plannerمنتقل شوید و لیستی از جاذبهها را دریافت کنید. - برای مثال، یک جاذبه گردشگری انتخاب کنید:
I'll go to the Sphinx - شما باید پاسخی مانند این دریافت کنید: بسیار خب، من ابوالهول را در لیست شما ذخیره کردم...
- برای مشاهده رویداد ایجاد شده از پاسخ ابزار، روی کادر ابزار پاسخ (که با علامت تیک مشخص شده است) کلیک کنید.
توجه کنید که شامل یک فیلد actions است که شاملstateDeltaاست که تغییرات در state را توصیف میکند. - با جاذبه دیگری از لیست آژانس پاسخ دهید.
- در منوی پیمایش سمت چپ، روی «X» کلیک کنید تا از تمرکز روی رویدادی که قبلاً بررسی کردهاید، خارج شوید.
- در نوار کناری سمت چپ، روی تب State کلیک کنید. اکنون میتوانید آرایه
attractionsرا در وضعیت session مشاهده کنید که باید شامل هر دو مورد انتخابی شما باشد.
- این پیام را برای نماینده ارسال کنید:
اکنون نماینده باید از ایالت بخواند و لیست شما را برگرداند.What is on my list? - وقتی آزمایش با عامل تمام شد، تب مرورگر وب را ببندید و CTRL + C را در ترمینال Cloud Shell فشار دهید تا سرور متوقف شود.
خلاصه بخش
در این بخش، یاد گرفتید که چگونه از Session state برای اشتراکگذاری دادهها استفاده کنید:
- برای نوشتن state : شما از درون یک ابزار، با استفاده از شیء
tool_context.state(مثلاًtool_context.state["my_list"] = [...]) در دیکشنری state مینویسید. - برای خواندن وضعیت : شما دادههای وضعیت را مستقیماً با استفاده از قالببندی کلید به
instructionعامل تزریق میکنید (مثلاً،Here is your list: {my_list?}). - برای بررسی وضعیت : میتوانید وضعیت جلسه را به صورت زنده در رابط کاربری ADK Dev با استفاده از تب State مشاهده کنید.
۹. عوامل گردش کار
تا اینجا، دیدید که چگونه یک عامل والد به یک عامل فرعی منتقل میشود و سپس منتظر کاربر میماند. عاملهای گردش کار متفاوت هستند: آنها عاملهای فرعی خود را یکی پس از دیگری در یک جریان خودکار، بدون انتظار برای ورودی کاربر، اجرا میکنند .
این برای کارهای خودکار و چند مرحلهای مانند «برنامهریزی و اجرا» یا «پیشنویس و اصلاح» عالی است. ADK سه عامل گردش کار داخلی برای مدیریت این موارد ارائه میدهد:
-
SequentialAgent -
LoopAgent -
ParallelAgent
ادامهی این آزمایش بر ساخت یک سیستم چندعاملی با استفاده از این سه عامل گردش کار تمرکز خواهد داشت.
شما یک نماینده خواهید ساخت که یک سند معرفی برای فیلم جدیدی درباره یک شخصیت تاریخی تهیه کند. نمایندگان شما تحقیقات، نگارش مکرر و تولید گزارش را انجام خواهند داد.
در نهایت، سیستم شما به شکل زیر خواهد بود:

شما این سیستم را قدم به قدم خواهید ساخت، و از سادهترین گردش کار شروع خواهید کرد.
۱۰. ساخت یک سیستم چندعامله با SequentialAgent
یک SequentialAgent یک عامل گردش کار است که زیرعاملهای خود را به صورت ساده و خطی اجرا میکند. هر عامل در لیست sub_agents خود، یکی پس از دیگری و به ترتیب اجرا میشود. این برای خطوط لولهای که در آنها وظایف باید به ترتیب خاصی انجام شوند، مانند عامل ارائه فیلم که اکنون خواهید ساخت، عالی است.
این نسخه اول به این شکل ساختاربندی خواهد شد:

- یک
root_agent(greeter) به کاربر خوشامد میگوید و موضوع فیلم را دریافت میکند. - سپس به یک
SequentialAgentبه نامfilm_concept_teamمنتقل میشود که:- یک عامل
researcherرا برای دریافت حقایق از ویکی پدیا اجرا کنید. - یک نماینده
screenwriterاستخدام کنید تا از آن حقایق برای نوشتن طرح داستان استفاده کند. - برای ذخیره نمودار نهایی در یک فایل، یک عامل
file_writerاجرا کنید.
- یک عامل
بیایید آن را اجرا کنیم.
- در ویرایشگر پوسته ابری ،
adk_multiagent_systems/workflow_agents/agent.pyرا باز کنید.
این فایل تعریف عامل را بخوانید. از آنجا که زیرعاملها باید قبل از اینکه به والد اختصاص داده شوند، تعریف شوند، برای خواندن فایل به ترتیب جریان مکالمه، میتوانید عاملها را از پایین فایل به بالا بخوانید. - به ابزار
append_to_stateتوجه کنید. این تابع کمکی به عاملها اجازه میدهد دادهها را به لیستی در session state اضافه کنند، که این نحوهی ارسال کارresearcherوscreenwriterاست. - عامل را امتحان کنید. در ترمینال ، رابط وب را با فعال کردن بارگذاری مجدد زنده اجرا کنید:
cd ~/devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems adk web --reload_agents - در ترمینال Cloud Shell، روی دکمهی «برای مشاهدهی رابط وب در یک برگهی جدید»، « پیشنمایش وب» کلیک کنید و «تغییر پورت» را انتخاب کنید.

- شماره پورت ۸۰۰۰ را وارد کنید و روی «تغییر و پیشنمایش» کلیک کنید. یک برگه مرورگر جدید با رابط کاربری ADK Dev باز خواهد شد.

- از منوی کشویی «انتخاب یک نماینده» ،
workflow_agentsانتخاب کنید. - مکالمه را با
helloشروع کنید. اپراتورgreeterپاسخ خواهد داد. - وقتی از شما خواسته شد، یک شخصیت تاریخی وارد کنید. میتوانید از یکی از اینها یا شخصیت خودتان استفاده کنید:
- ژانگ ژانگجینگ
- آدا لاولیس
- مارکوس اورلیوس
- اکنون
SequentialAgentکنترل را به دست میگیرد. هیچ پیام میانی مشاهده نخواهید کرد.researcher،screenwriterوfile_writerیکی پس از دیگری اجرا میشوند. agent فقط زمانی پاسخ میدهد که کل توالی کامل شده باشد.
اگر موفق نشدید، میتوانید روی + جلسه جدید در بالا سمت راست کلیک کنید و دوباره امتحان کنید. - پس از تأیید نوشته شدن فایل توسط عامل، فایل
.txtجدید را در دایرکتوریmovie_pitchesدر ویرایشگر Cloud Shell خود پیدا کرده و باز کنید تا خروجی را ببینید. - در رابط کاربری ADK Dev، روی آخرین آیکون اپراتور در تاریخچه چت کلیک کنید تا نمای رویداد باز شود.
- نمای رویداد، نموداری بصری از درخت عاملها را نشان میدهد. میتوانید ببینید که چگونه
greeter، تابعfilm_concept_teamرا فراخوانی کرده و سپس هر یک از زیرعاملهای آن را به ترتیب فراخوانی کرده است.
- شما میتوانید روی تبهای درخواست (Request) و پاسخ (Response) برای هر اپراتور در نمودار کلیک کنید تا دادههای دقیق ارسال شده، از جمله وضعیت جلسه (session state)، را بررسی کنید.
خلاصه بخش
در این بخش، نحوه استفاده از یک عامل گردش کار را آموختید:
- یک
SequentialAgentزیرعاملهای خود را یکی یکی و به ترتیب اجرا میکند، بدون اینکه منتظر ورودی کاربر بین مراحل باشد. - این یک «گردش کار» است زیرا کاربر با
root_agentصحبت میکند، که سپس کار را برای تکمیل بهSequentialAgentواگذار میکند. - زیرعاملها در این توالی از وضعیت جلسه (مثلاً
{ PLOT_OUTLINE? }) برای دسترسی به کار عاملهای قبلی استفاده میکنند. - شما میتوانید از نمودار رویداد در رابط کاربری Dev برای تجسم و اشکالزدایی کل گردش کار بین عاملها استفاده کنید.
۱۱. برای کارهای تکراری، یک LoopAgent اضافه کنید
LoopAgent یک عامل گردش کار است که زیرعاملهای خود را به ترتیب اجرا میکند و سپس از ابتدا تکرار میکند. این "حلقه" تا زمانی که یک شرط برآورده شود، مانند رسیدن به تعداد max_iterations یا فراخوانی ابزار exit_loop توسط زیرعامل، ادامه مییابد.
این برای کارهایی که نیاز به اصلاح مکرر دارند مفید است. شما این LoopAgent برای ایجاد یک "اتاق نویسنده" برای عامل ارائه فیلم خود اضافه خواهید کرد. این به یک researcher ، screenwriter و یک عامل critic جدید اجازه میدهد تا در یک حلقه کار کنند و طرح را با هر بار عبور بهبود بخشند تا زمانی که critic تصمیم بگیرد که آماده است. این همچنین به عامل کمک میکند تا با اجازه دادن به تحقیق و اصلاح یک ایده، ورودیهای مبهمتر کاربر (مانند "یک پزشک باستانی") را مدیریت کند.

برای ایجاد این تغییرات:
- در
adk_multiagent_systems/workflow_agents/agent.py، ایمپورتexit_loopرا اضافه کنید (نزدیک سایر ایمپورتهایgoogle.adk):from google.adk.tools import exit_loop - عامل
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] ) -
LoopAgentwriters_roomرا ایجاد کنید. این شامل سه عاملی خواهد بود که در حلقه کار خواهند کرد.
کد زیر را بالای تعریف عامل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, ) - تابع
film_concept_teamSequentialAgentرا بهروزرسانی کنید تا از حلقه جدیدwriters_roomاستفاده کند. به جای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 ], ) - به برگه ADK Dev UI برگردید و روی + New Session در بالا سمت راست کلیک کنید.
- شروع یک مکالمه جدید با:
hello - وقتی از شما خواسته شد، این بار موضوع کلیتری را به نماینده ارائه دهید. چند ایده:
- یک طراح صنعتی که محصولاتی را برای عموم مردم تولید میکرد
- نقشه بردار (نقشه کش)
- آن مردی که باعث شد محصولات کشاورزی غذای بیشتری به دست آورند
- وقتی حلقه کامل شد، عامل فایل را مینویسد. فایل تولید شده را در دایرکتوری
adk_multiagent_systems/movie_pitchesبررسی کنید. - برای مشاهده ساختار حلقه، نمودار رویداد را در رابط کاربری Dev بررسی کنید.
خلاصه بخش
در این بخش، نحوه استفاده از LoopAgent را آموختید:
- یک
LoopAgentیک عامل گردش کار است که توالی زیرعاملهای خود را تکرار میکند و یک "حلقه داخلی" برای وظایف تکراری ایجاد میکند. - عاملهای درون حلقه از وضعیت جلسه برای انتقال کار (مثلاً
PLOT_OUTLINE) و بازخورد (مثلاًCRITICAL_FEEDBACK) به یکدیگر در مراحل بعدی استفاده میکنند. - حلقه را میتوان با رسیدن به حد
max_iterationsیا با فراخوانی ابزارexit_loopتوسط عاملی، متوقف کرد.
۱۲. از یک ParallelAgent برای «جمعآوری و انتشار» استفاده کنید
ParallelAgent یک عامل گردش کار است که تمام زیرعاملهای خود را همزمان (به صورت همزمان) اجرا میکند. این برای وظایفی که میتوانند به زیروظایف مستقل تقسیم شوند، مانند اجرای دو کار تحقیقاتی مختلف، ارزشمند است.
شما از یک ParallelAgent برای ایجاد یک "تیم پیش تولید" که به صورت موازی کار میکند، استفاده خواهید کرد. یک نماینده پتانسیل فروش در گیشه را بررسی میکند در حالی که نماینده دیگر همزمان ایدههای بازیگری را طوفان فکری میکند. این اغلب الگوی "انتشار و جمعآوری" نامیده میشود: نماینده ParallelAgent کار را "انتشار" میکند و نماینده بعدی ( file_writer ما) نتایج را "جمعآوری" میکند.

جریان نهایی شما به صورت زیر خواهد بود:
-
greeter(ریشه) چت را شروع میکند. - به
film_concept_team(SequentialAgent) منتقل میشود که اجرا میشود:-
writers_room(LoopAgent) برای ایجاد طرح داستان. - تیم جدید
preproduction_team(ParallelAgent) برای تحقیق در مورد گیشه و انتخاب بازیگران به طور همزمان . -
file_writerبرای جمعآوری تمام نتایج و ذخیره فایل.
-
برای ایجاد این تغییرات:
- در
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 ] ) - لیست
sub_agentsfilm_concept_teamدرSequentialAgentرا بهروزرسانی کنید تا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 ], ) -
instructionعاملfile_writerرا بهروزرسانی کنید تا گزارشهای جدید را از وضعیت «جمعآوری» کرده و به فایل اضافه کند.
رشتهinstructionمربوط بهfile_writerرا با این جایگزین کنید: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? } """, - به برگه ADK Dev UI برگردید و روی +New Session کلیک کنید.
- برای شروع مکالمه،
helloوارد کنید. - وقتی از شما خواسته شد، ایدهای برای شخصیت جدید وارد کنید. چند ایده:
- آن بازیگر زنی که فناوری وای فای را اختراع کرد
- یک سرآشپز هیجانانگیز
- بازیگران کلیدی در نمایشگاههای جهانی
- وقتی نماینده کارش را تمام کرد، فایل نهایی را در دایرکتوری
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برای ایجاد یک گردش کار ساده و گام به گام (تحقیق -> نوشتن -> ذخیره) پیادهسازی شد. - از یک
LoopAgentبه همراه یک عاملcriticو ابزارexit_loopبرای ایجاد یک چرخه اصلاح تکراری استفاده شد. - از یک
ParallelAgentبرای «پخش» وظایف مستقل (مانند انتخاب بازیگر و تحقیق در مورد گیشه) به صورت همزمان استفاده کردم.
آزمایشهای مداوم
راههای زیادی برای تقویت آموختههایتان وجود دارد. در اینجا چند ایده ارائه شده است:
- افزودن عوامل بیشتر: سعی کنید یک عامل جدید به
ParallelAgentpreproduction_teamخود اضافه کنید. برای مثال، میتوانید یکmarketing_agentایجاد کنید که بر اساسPLOT_OUTLINEیک شعار برای فیلم مینویسد. - ابزارهای بیشتری اضافه کنید: به
researcherخود ابزارهای بیشتری بدهید. میتوانید ابزاری ایجاد کنید که از API جستجوی گوگل برای یافتن اطلاعاتی که در ویکیپدیا نیست استفاده کند. - بررسی
CustomAgent: در این آزمایشگاه بهCustomAgentبرای گردشهای کاری که با قالبهای استاندارد مطابقت ندارند، اشاره شد. سعی کنید گردش کاری بسازید که مثلاً فقط در صورت وجود یک کلید خاص در حالت جلسه، یک عامل را به صورت مشروط اجرا کند.