ساخت عامل‌های شخصی‌سازی‌شده با ADK، MCP و بانک حافظه

۱. مقدمه

پشته عامل مدرن

ساخت یک عامل هوش مصنوعی در سطح تولید، به چیزی بیش از یک مدل زبان بزرگ (LLM) نیاز دارد. در حالی که یک LLM قابلیت‌های استدلال را فراهم می‌کند، یک عامل قوی باید با دنیای خارج تعامل داشته باشد، وضعیت مکالمه را مدیریت کند و ترجیحات کاربر را در طول زمان به خاطر بسپارد.

نسخه آزمایشی1نسخه آزمایشی2

در این کارگاه، شما یاد خواهید گرفت که چگونه با استفاده از سه فناوری بنیادی، یک سیستم جامع عامل‌گرا را معماری و بسازید:

  1. اتصال (MCP) : برای دسترسی نماینده شما به ابزارها و داده‌های محلی.
  2. هماهنگ‌سازی (ADK) : برای مدیریت حلقه استدلال و وضعیت عامل.
  3. حافظه (بانک حافظه) : برای فراهم کردن زمینه شخصی‌سازی‌شده و بلندمدت.

workshop_overview

مفاهیم اصلی

کامپوننت

عملکرد

پروتکل زمینه مدل (MCP)

یک استاندارد جهانی که مدل‌های هوش مصنوعی را بدون ادغام‌های سفارشی به سیستم‌های خارجی (پایگاه‌های داده، سیستم فایل‌ها، APIها) متصل می‌کند.

کیت توسعه عامل (ADK)

چارچوبی که محیط زمان اجرا را برای عامل‌ها فراهم می‌کند، حلقه رویداد، انتقال حالت‌ها و اجرای ابزار را مدیریت می‌کند.

سرویس جلسه

حافظه کوتاه‌مدت را مدیریت می‌کند. این حافظه، زمینه مکالمه فوری را حفظ می‌کند (مثلاً «کاربر همین الان چه پرسید؟») اما با پایان جلسه پاک می‌شود.

بانک حافظه هوش مصنوعی ورتکس

حافظه بلندمدت را مدیریت می‌کند. این حافظه، حقایق و ترجیحات خاص کاربر (مثلاً «کاربر پایتون را ترجیح می‌دهد») را به طور نامحدود ذخیره می‌کند و به عامل اجازه می‌دهد تعاملات آینده را شخصی‌سازی کند.

موتور عامل هوش مصنوعی ورتکس

سرویس زیرساخت مدیریت‌شده‌ای که منطق عامل و اجزای حافظه شما را در مقیاس بزرگ میزبانی می‌کند.

آنچه خواهید ساخت

برای نشان دادن این مفاهیم، ​​شما یک دستیار طراحی تعطیلات خواهید ساخت. این عامل قادر به دریافت درخواست‌های سطح بالای کاربر و هماهنگ‌سازی خودکار ابزارهای محلی پایتون برای تولید کد و تصاویر شخصی‌سازی‌شده خواهد بود.

شما در سه مرحله پیشرفت خواهید کرد:

  1. لایه ابزارسازی : یک سرور MCP ایجاد کنید تا توابع محلی پایتون را در اختیار هوش مصنوعی قرار دهد.
  2. لایه عامل : از ADK برای ساخت عاملی استفاده کنید که گردش‌های کاری چند مرحله‌ای را برنامه‌ریزی و اجرا می‌کند.
  3. لایه حافظه : یکپارچه‌سازی بانک حافظه برای فعال کردن عامل در یادگیری و به خاطر سپردن ترجیحات سبک کاربر.

۲. راه‌اندازی

برای توانمندسازی عوامل هوش مصنوعی خود، به دو چیز نیاز داریم: یک پروژه ابری گوگل برای فراهم کردن پایه و اساس.

بخش اول: فعال کردن حساب صورتحساب

  • برای فعال کردن حساب صورتحساب خود با اعتبار ۵ دلاری، به آن برای استقرار خود نیاز خواهید داشت. حتماً به حساب جیمیل خود وارد شوید.

بخش دوم: محیط باز

  1. 👉 برای دسترسی مستقیم به ویرایشگر Cloud Shell ، روی این لینک کلیک کنید
  2. 👉 اگر امروز در هر مرحله‌ای از شما خواسته شد که مجوز دهید، برای ادامه روی «مجوز دادن» کلیک کنید. برای تأیید Cloud Shell کلیک کنید
  3. 👉 اگر ترمینال در پایین صفحه نمایش داده نشد، آن را باز کنید:
    • روی مشاهده کلیک کنید
    • روی ترمینال کلیک کنید باز کردن ترمینال جدید در ویرایشگر Cloud Shell
  4. 👉💻 در ترمینال، با استفاده از دستور زیر تأیید کنید که از قبل احراز هویت شده‌اید و پروژه روی شناسه پروژه شما تنظیم شده است:
    gcloud auth list
    
  5. 👉💻 پروژه بوت‌استرپ را از گیت‌هاب کپی کنید:
    git clone https://github.com/cuppibla/holiday_workshop
    
  6. 👉💻 اسکریپت راه‌اندازی را از دایرکتوری پروژه اجرا کنید.
    cd ~/holiday_workshop
    ./init.sh
    
    اسکریپت بقیه مراحل راه‌اندازی را به‌طور خودکار انجام خواهد داد.
  7. 👉💻 شناسه پروژه مورد نیاز را تنظیم کنید:
    gcloud config set project $(cat ~/project_id.txt) --quiet
    

بخش سوم: تنظیم مجوز

  1. 👉💻 با استفاده از دستور زیر، APIهای مورد نیاز را فعال کنید. این کار ممکن است چند دقیقه طول بکشد.
    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        servicenetworking.googleapis.com \
        run.googleapis.com \
        aiplatform.googleapis.com \
        compute.googleapis.com
    
  2. 👉💻 با اجرای دستورات زیر در ترمینال، مجوزهای لازم را اعطا کنید:
    . ~/holiday_workshop/set_env.sh
    

توجه داشته باشید که یک فایل .env برای شما ایجاد شده است که اطلاعات پروژه شما را نشان می‌دهد.

۳. تقویت با MCP

لحظه «USB-C» برای هوش مصنوعی

تصور کنید هر بار که یک ماوس جدید می‌خریدید، مجبور بودید آن را به مادربرد خود لحیم کنید. وضعیت ابزارهای هوش مصنوعی تا همین اواخر همین بود. توسعه‌دهندگان مجبور بودند برای اتصال LLMها به پایگاه‌های داده، سیستم فایل‌ها یا APIها، «کد چسب» سفارشی بنویسند.

پروتکل زمینه مدل (MCP) را وارد کنید. MCP را به عنوان پورت USB-C برای برنامه‌های هوش مصنوعی در نظر بگیرید. این پروتکل یک روش استاندارد برای اتصال مدل‌های هوش مصنوعی به منابع داده و ابزارها فراهم می‌کند.

اگر یک بار یک سرور MCP برای ابزارهای خود بسازید، می‌توانید آن را بدون تغییر حتی یک خط کد به Gemini CLI، یک IDE یا هر کلاینت سازگار با MCP دیگر متصل کنید.

آنچه خواهید ساخت

سرور mcp

در این آزمایشگاه کد، شما یک دستیار طراحی تعطیلات خواهید ساخت که:

  1. با استفاده از MCP به محیط محلی شما (ابزارهای استودیویی) متصل می‌شود .
  2. با استفاده از کیت توسعه عامل (ADK)، زمینه مکالمه را به طور قابل اعتمادی مدیریت می‌کند .
  3. تنظیمات برگزیده شما (مثلاً «من کد پایتون را ترجیح می‌دهم») را در جلسات مختلف با استفاده از بانک حافظه هوش مصنوعی Vertex به خاطر می‌سپارد.

ساخت منطق سرور

ما محیط را آماده کرده‌ایم، اما منطق سرور ناقص است. ما باید چهار ابزار خاص را که نماینده ما در نهایت برای ساخت کارت تعطیلات ما استفاده خواهد کرد، پیاده‌سازی کنیم.

بخش اول: باز کردن اسکلت سرور

ما در دایرکتوری 01-MCP-Files-Testing/01-starter کار خواهیم کرد.

  1. در ترمینال Cloud Shell خود، مطمئن شوید که در دایرکتوری صحیح هستید:
    cd ~/holiday_workshop/01-MCP-Files-Testing/01-starter/
    
  2. با اجرای دستور زیر، فایل را در ویرایشگر Cloud Shell باز کنید:
    cloudshell edit ~/holiday_workshop/01-MCP-Files-Testing/01-starter/mcp_server.py
    

متوجه خواهید شد که کد اصلی (تنظیم سرور MCP، مدیریت اتصالات و مقداردهی اولیه کلاینت Vertex AI) از قبل انجام شده است. با این حال، چهار تابع اصلی در حال حاضر جای خالی دارند.

بخش دوم: پیاده‌سازی مولد صحنه تعطیلات

اول، ما به ابزاری نیاز داریم که علاقه کاربر (مثلاً «پرندگان») را جلب کند و آن را به یک پیام غنی و دقیق تبدیل کند که برای تولید تصویر بهینه شده باشد.

عبارت #REPLACE_GENERATE_HOLIDAY_SCENE درون تابع generate_holiday_scene پیدا کنید.

کل این خط را با کد زیر جایگزین کنید :

    prompt = (
        f"""
        Create a cozy, high-fidelity 3D render of a winter holiday scene.
        The scene should be warm and inviting with soft cinematic lighting.
        
        Seamlessly integrate the following specific theme/interest into the 
        holiday decor or landscape: {interest}.
        
        The style should be whimsical but detailed.
        Aspect Ratio: 16:9 Landscape.
        """
    )
    generate_image(prompt, "16:9", "static/generated_scene.png")
    return "Done! Saved at generated_scene.png"

بخش سوم: پیاده‌سازی نتیجه نهایی عکس

در نهایت، می‌خواهیم مطمئن شویم که نورپردازی و سبک، واقع‌گرایانه و جشن‌گونه به نظر می‌رسند.

کامنت #REPLACE_GENERATE_FINAL_PHOTO را پیدا کنید.

برای انجام انتقال و رندر نهایی استایل، کل این خط را با کد زیر جایگزین کنید :

    prompt = (
        """
        Generate a photorealistic close-up shot of a rustic wooden fireplace mantle.
        
        Lighting: Warm, glowing ambient light from a fire below (out of frame).
        Background: Softly blurred (bokeh) pine garland and twinkling lights.
        
        Foreground Composition:
        1. A wooden picture frame containing the [attached selfie image]. 
           The face in the photo must be clearly visible.
        2. A folded holiday greeting card standing upright next to the frame. 
           The front of the card displays the [attached holiday scene image] as a print.
           
        Ensure the perspective is grounded and realistic, as if taken with a 50mm lens.
        """
    )
    generate_image(prompt, "16:9", "static/generated_final_photo.png", ["static/generated_selfie.png", "static/generated_scene.png"])
    return "Done! Saved at generated_final_photo.png"

تنظیمات محیط

حالا که کد آماده است، باید مطمئن شویم که وابستگی‌هایمان نصب شده‌اند. ما uv ، یک بسته سریع پایتون و یک مدیر پروژه، استفاده خواهیم کرد.

👉💻 در ترمینال خود، دستور زیر را اجرا کنید تا FastMCP به عنوان یک وابستگی به پروژه ما اضافه شود:

cd ~/holiday_workshop/01-MCP-Files-Testing/01-starter/
uv add fastmcp

خواهید دید که یک وابستگی جدید fastmcp>=2.13.3 به ~/holiday_workshop/01-MCP-Files-Testing/01-starter/pyproject.toml شما اضافه شده است.

۴. تست با Gemini CLI برای سرور MCP

حالا که کد سرور ما کامل شده است، چگونه آن را آزمایش کنیم؟

معمولاً، آزمایش یک سرور backend نیاز به ساخت یک رابط کاربری frontend یا نوشتن درخواست‌های پیچیده curl دارد. با این حال، در اینجا می‌توانیم از Gemini CLI استفاده کنیم.

این برای توسعه فوق‌العاده مفید است زیرا منطق را ایزوله می‌کند. می‌توانید قبل از اینکه نگران ساخت رابط وب یا چارچوب عامل باشید، تأیید کنید که مدل ابزارهای شما را درک می‌کند و آنها را به درستی فراخوانی می‌کند.

اتصال و اجرا

ما با استفاده از دستور mcp add به Gemini CLI می‌گوییم که سرور ما را مدیریت کند.

در ترمینال خود، دستور زیر را اجرا کنید:

gemini mcp add holidays uv run ~/holiday_workshop/01-MCP-Files-Testing/01-starter/mcp_server.py
  • add holidays : ما به سرور خود یک لقب ("تعطیلات") دادیم.
  • uv run ... : ما دستور صریحی برای شروع سرور پایتون که اخیراً تغییر داده‌ایم، ارائه دادیم.

بیایید جادو کنیم!

حالا، جلسه چت را شروع کنید:

gemini

برای بررسی اینکه آیا Gemini می‌تواند ابزارهای جدید شما را "ببیند"، از دستور زیر استفاده کنید. توجه داشته باشید که ممکن است لازم باشد به Gemini CLI اجازه دهید از ابزار تعطیلات ما استفاده کند.

  • 👉 کاربر:
    "I want to create a festive holiday photo. I like birds a lot."
    
  • جوزا:
    *Thinking...*
    *Calling tool: generate_holiday_scene(interest='birds')*
    
    Done! Saved at generated_scene.png
    
  • 👉 کاربر:
    "Great! Now generate a knitting pattern for a sweater with reindeer on it."
    
  • جوزا:
    *Thinking...*
    *Calling tool: generate_sweater_pattern(motif='reindeer')*
    
    Done! Saved at generated_pattern.png
    
    از آنجا که شما از MCP استفاده کرده‌اید، هوش مصنوعی دقیقاً فهمیده است که برای برآورده کردن درخواست شما، کدام تابع پایتون را باید فراخوانی کند!

تصویر را بررسی کنید

  • با فشردن Control+C رابط خط فرمان Gemini را خاتمه دهید.
  • تصویر تولید شده را در پوشه‌ی ~/holiday_workshop/01-MCP-Files-Testing/01-starter/static بررسی کنید.

عکس خود را اینجا بررسی کنید:

نتیجه‌گیری و مراحل بعدی

تبریک! شما با موفقیت یک سرور MCP کارآمد ساختید. اکنون مجموعه‌ای کاربردی از «ابزارهای هوش مصنوعی» دارید که می‌توانند الگوها، تصاویر ترکیبی و صحنه‌ها را تولید کنند.

با این حال، آیا در آزمون بالا متوجه چیزی شدید؟ شما باید فرآیند را پیش می‌بردید. باید صحنه را درخواست می‌کردید، سپس الگو را درخواست می‌کردید، و در نهایت درخواست ترکیب آنها را می‌کردید.

اگرچه Gemini هوشمند است، اما برای یک گردش کار پیچیده تولید - که در آن باید قبل از اینکه بتوانیم آن را روی ژاکت قرار دهیم، الگویی ایجاد کنیم و در صورت عدم موفقیت در تولید تصویر، خطاها را مدیریت کنیم - ما کنترل بیشتری می‌خواهیم. ما یک سیستم اختصاصی می‌خواهیم که بتواند برنامه‌ریزی کند، کار خود را نقد کند و وضعیت کارت تبریک ما را بدون اینکه ما در هر مرحله از آن دخالت کنیم، مدیریت کند.

در بخش بعدی، به این هرج و مرج خلاقانه نظم خواهیم بخشید. ما قصد داریم کیت توسعه عامل (ADK) را برای ساخت یک عامل ساختاریافته پیاده‌سازی کنیم که این ابزارهای MCP را در یک خط تولید بی‌نقص هماهنگ می‌کند.

۵. کدنویسی Vibe برای یک عامل ADK

ما یک مجموعه ابزار کاربردی (سرور MCP) داریم، اما در حال حاضر، ما کسانی هستیم که تمام کارهای سنگین را انجام می‌دهیم - به Gemini می‌گوییم دقیقاً کدام ابزار را و چه زمانی فراخوانی کند.

در این بخش، ما یک عامل هوش مصنوعی خواهیم ساخت: سیستمی که می‌تواند به صورت خودکار استدلال، برنامه‌ریزی و وظایف چند مرحله‌ای را اجرا کند. برای انجام این کار، از کیت توسعه عامل (ADK) استفاده خواهیم کرد.

agent_mcp

نماینده چیست؟

اگر ابزارهای MCP «دست‌ها» (که کار را انجام می‌دهند) باشند، عامل «مغز» است. یک عامل از یک LLM برای درک قصد کاربر («برای من یک کارت تبریک درست کن») استفاده می‌کند، آن را به مراحلی تقسیم می‌کند («اول به یک صحنه نیاز دارم، سپس یک الگو...») و تصمیم می‌گیرد که از کدام ابزارها برای رسیدن به هدف استفاده کند.

ADK چیست؟

کیت توسعه عامل (ADK) چارچوبی از گوگل است که ساخت این عامل‌ها را آسان می‌کند. این کیت، «لوله‌کشی» پیچیده، مانند مدیریت تاریخچه چت، اتصال به ابزارها و جابجایی بین مدل‌های مختلف را مدیریت می‌کند - بنابراین می‌توانید روی شخصیت و منطق برنامه خود تمرکز کنید.

کدگذاری ارتعاشی مبتنی بر متن

استفاده از یک اعلان واحد و عظیم برای تولید کد، الگوی رایجی است. با این حال، هنگام ساخت برنامه‌های پیچیده، اغلب بهتر است با هوش مصنوعی به عنوان شریکی رفتار کنید که در طول زمان، زمینه را حفظ می‌کند.

ما قبل از نوشتن حتی یک خط کد، از ویژگی‌های حافظه‌ی Gemini CLI برای آماده‌سازی مقدمات استفاده خواهیم کرد.

۱. محیط را آماده کنید

ترمینال خود را باز کنید و به دایرکتوری starter بروید:

cd ~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter

اجرای رابط خط فرمان Gemini:

gemini

۲. مدیریت زمینه و حافظه

هنگام کدنویسی ارتعاشی، هوش مصنوعی باید بداند که کیست و چه می‌داند. رابط خط فرمان Gemini به ما اجازه می‌دهد تا این را به صراحت مدیریت کنیم.

  • /memory show : این را تایپ کنید تا ببینید هوش مصنوعی در حال حاضر درباره پروژه و جلسه شما چه می‌داند.
  • /memory add : از این برای تزریق دانش بنیادی که هوش مصنوعی باید در طول مکالمه به خاطر بسپارد، استفاده کنید.

بیایید با تعریف شخصیت همکار کدنویسی خود شروع کنیم. دستور زیر را در Gemini CLI اجرا کنید:

/memory add "You are an expert Python developer specialized in the Google Agent Development Kit (ADK). You write clean, modular code and prefer using the latest ADK patterns."

جمینی اکنون نقش خود را درک می‌کند. این زمینه بر هر پاسخ بعدی تأثیر خواهد گذاشت و کد سازگار با ADK با کیفیت بالا را تضمین می‌کند.

۳. مرحله ۱: کدگذاری ارتعاشی عامل پایه

به جای تلاش برای ایجاد کل سیستم به طور همزمان، بیایید با اسکلت شروع کنیم. ما می‌خواهیم ساختار فایل و شخصیت اولیه عامل را ایجاد کنیم.

دستور زیر را در Gemini CLI وارد کنید:

Let's start by building the basic agent structure. 

Please create a file structure for a `root_agent`. 
1. Create `root_agent/__init__.py` that imports `agent`.
2. Create `root_agent/agent.py` by following exactly how this file is doing import and agent creation @~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter/agent_reference.py

In `agent.py`:
- Create an `Agent` named "root_agent" using the model "gemini-2.5-flash".
- The instruction string should define a "Holiday Magic Assistant". 
- The personality should be enthusiastic (`🎄✨`) and prefer "cute, kawaii, cartoon" styles for any visual tasks.

Gemini ساختار فایل و کد اولیه پایتون را تولید می‌کند. آن را بررسی کنید تا مطمئن شوید که درست به نظر می‌رسد، سپس تغییرات را اعمال/پذیرش کنید.

۴. مرحله ۲: اضافه کردن سرور MCP (ابزارها)

حالا که یک عامل پایه داریم، باید به آن «دست» بدهیم. باید عامل را به سرور MCP که در تمرین قبلی ساختیم متصل کنیم.

دستور زیر را در Gemini CLI وارد کنید:

Now, let's give the agent access to tools. Update `agent.py` to include our local MCP server. By following exactly how this agent is connecting to mcp tool @~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter/agent_reference.py

In `agent.py`:
- Import `McpToolset` to define our STDIO MCP server. as @~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter/agent_reference.py
- Connect to the python file located at `../mcp_server.py` relative to agent.py.

Gemini اکنون agent.py موجود شما را برای گنجاندن تعاریف ابزار و منطق اتصال، بازسازی می‌کند.

توجه: اگر می‌خواهید کار خود را بررسی کنید یا اگر کد تولید شده مطابق انتظار کار نمی‌کند، می‌توانید فایل‌های خود را با راه‌حل مرجع واقع در: ~/holiday_workshop/02-Vibe-Coding-ADK-Agent/solution مقایسه کنید.

۶. رابط وب عامل را اجرا کنید

ADK با یک رابط آزمایشی داخلی به نام adk web ارائه می‌شود. این رابط کاربری، یک رابط کاربری چت سبک را ایجاد می‌کند تا بتوانیم فوراً با اپراتور خود صحبت کنیم.

  1. اگر هنوز GeminiCLI باز است، برای بستن آن، control+C را فشار دهید. اکنون در ترمینال خود (این در پوشه solution است، می‌توانید با اجرای uv run adk web در پوشه starter ، به starter بروید تا کد خود را آزمایش کنید)، دستور زیر را اجرا کنید:
    cd ~/holiday_workshop/02-Vibe-Coding-ADK-Agent/02-solution
    uv run adk web --port 8000
    
  2. Cloud Shell به شما هشدار می‌دهد که یک سرویس روی پورت ۸۰۰۰ در حال اجرا است. روی «پیش‌نمایش وب» -> «پیش‌نمایش روی پورت ۸۰۰۰» کلیک کنید.

عامل را آزمایش کنید

اکنون باید یک رابط چت ببینید. بیایید ببینیم که آیا نماینده ما دستورالعمل‌های جدید خود را دنبال می‌کند و به درستی به ابزارهای MCP دسترسی پیدا می‌کند یا خیر.

این دستورالعمل‌ها را امتحان کنید:

  • «سلام! شما کی هستید؟»
    • (منتظر یک واکنش پرشور و شاد باشید.)
  • «برای کارت تبریک تعطیلاتم به یک پس‌زمینه نیاز دارم. یک روستای برفی برایش بساز.»
    • (عامل باید تابع generate_holiday_scene فراخوانی کند . توجه کنید که چگونه به طور خودکار سبک "cute/cartoon" تعریف شده در دستورالعمل‌های سیستم را اعمال می‌کند.)
  • «یک الگوی ژاکت با برش‌های کوچک پیتزا روی آن درست کن.»
    • (عامل باید generate_sweater_pattern فراخوانی کند ).

می‌توانید تصویر ایجاد شده را اینجا مشاهده کنید:

اگر تست را تمام کردید، برای خروج Control+C را فشار دهید.

نتیجه‌گیری و مراحل بعدی

شما اکنون با موفقیت یک عامل Google ADK را با استفاده از رویکرد آگاه از متن، "Vibe-Coded" کرده‌اید!

  • ما Context را ایجاد کردیم: ما از /memory add برای تعریف یک شخصیت متخصص استفاده کردیم.
  • ما به صورت تکراری ساختیم: ابتدا اسکلت را ایجاد کردیم، سپس اتصالات ابزار را اضافه کردیم.

پیش‌نمایش وب ADK داخلی برای آزمایش عالی است، اما برای محصول نهایی خود، یک تجربه سفارشی و برندسازی شده می‌خواهیم. در بخش بعدی، این Agent را در یک رابط کاربری وب سفارشی ادغام خواهیم کرد.

۷. اتصال ADK با رابط کاربری

معماری_بک‌اند

حالا که تعریف Agent را داریم، باید آن را اجرا کنیم. اینجاست که Runner و Session Service وارد عمل می‌شوند.

پیاده‌سازی

  1. 👉 دستور زیر را در دستور خود تایپ کنید:
    cloudshell edit ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.py
    
    این فایل ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.py را در ویرایشگر شما باز می‌کند.
  2. عبارت # TODO: Create Session Service با کد زیر جایگزین کنید:
    from google.adk.sessions import InMemorySessionService
    from google.adk.memory import InMemoryMemoryService
    session_service = InMemorySessionService()
    memory_service = InMemoryMemoryService()
    
  3. دستور # TODO: Initialize Runner با دستور زیر جایگزین کنید:
    runner = Runner(
        app_name="agents",
        agent=christmas_agent,
        session_service=session_service,
        memory_service=memory_service,
    )
    
  1. خط ۱۵۸ را در ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.py ( نیازی به اقدام خاصی نیست ): اگر کنجکاو هستید که برنامه چگونه پاسخ نهایی را دریافت می‌کند، در زیر حلقه رویدادی را مشاهده می‌کنید که توسط runner اجرا می‌شود:
    async for event in runner.run_async(
        user_id=user_id,
        session_id=session_id,
        new_message=content
    )
    

بررسی عمیق: معماری و استقرار

ما از FastAPI برای سرویس‌دهی به این عامل استفاده می‌کنیم.

  • چرا FastAPI؟ : عامل‌ها اغلب مقید به ورودی/خروجی هستند (منتظر LLMها می‌مانند). ماهیت ناهمگام FastAPI این مشکل را به خوبی برطرف می‌کند.
  • بی‌حالتی : توجه داشته باشید که نقطه پایانی API ما بی‌حالت است. ما متغیرها را در محدوده سراسری ذخیره نمی‌کنیم. ما برای بازسازی حالت برای هر درخواست واحد، به session_id و SessionService متکی هستیم. این بدان معناست که می‌توانید این را در Cloud Run (بدون سرور) مستقر کنید و مقیاس آن را به صفر برسانید!

۸. برنامه را با جادوی عامل امتحان کنید

  1. 👉💻 دستور زیر را در دستور خود تایپ کنید:
    cd ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter
    ./start_app.sh
    
    این فایل ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.py را در ویرایشگر شما باز می‌کند.
  2. نتیجه را مانند زیر خواهید دید: پورترزولت 👉👉 مطمئن شوید که روی http://localhost:5173/ کلیک می‌کنید، یا یک پنجره جدید باز می‌کنید و http://localhost:5173/ را تایپ می‌کنید.
  3. سپس وب‌سایت با رابط چت را مشاهده خواهید کرد: وب‌سایت
  4. با آپلود یک تصویر (می‌تواند تصویر خودتان یا حیوان خانگی‌تان باشد) تست کنید آپلود
  5. 👉 سپس بپرسید
    Can you generate a picture my cat wearing snowflake pattern sweater?
    
    تصویر تولید شده را اینجا خواهید دید: گربه
  6. 👉💻 پس از اتمام آزمایش، برای پایان دادن به فرآیند، control+C را در ترمینال فشار دهید.

اگر می‌بینید که همه چیز طبق انتظار کار نمی‌کند، می‌توانید به ~/holiday_workshop/03-Connect-ADK-MCP-UI/02-solution بروید و ./start_app.sh را اجرا کنید، سپس همان مراحل بالا را انجام دهید.

۹. بانک حافظه هوش مصنوعی ورتکس

حافظه_عامل

حافظه کوتاه مدت در مقابل حافظه بلند مدت

  • زمینه کوتاه‌مدت : «من الان چی گفتم؟» (تاریخچه جلسه). این با بسته شدن پنجره چت از بین می‌رود.
  • حافظه بلندمدت : «زبان برنامه‌نویسی مورد علاقه من چیست؟» (ترجیحات کاربر). این باید برای همیشه باقی بماند.

بانک حافظه هوش مصنوعی ورتکس این ذخیره‌سازی بلندمدت را فراهم می‌کند. این بانک به عامل اجازه می‌دهد تا اطلاعات شخصی‌سازی‌شده در مورد کاربر را ذخیره و بازیابی کند.

جلسات در مقابل بانک حافظه

  • جلسات ( VertexAiSessionService ): این گزارش است. این گزارش، توالی خام و زمانی هر پیام، فراخوانی ابزار و رویداد ( AppendEvent ، ListEvents ) را ذخیره می‌کند. این گزارش، حقیقتِ آنچه اتفاق افتاده است را ارائه می‌دهد.
  • بانک حافظه ( VertexAiMemoryBankService ): این دانش است. این دانش، حقایق بلندمدت و ترکیبی ( GenerateMemories ، RetrieveMemories ) را ذخیره می‌کند. این بانک به یک user_id خاص محدود شده است و حریم خصوصی و انزوا را تضمین می‌کند.
  1. 👉💻 دستور زیر را در دستور خود تایپ کنید:
    cloudshell edit ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/main.py
    
    این دستور ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/main.py را در ویرایشگر شما باز می‌کند.
  2. # TODO: Create Vertex AI Session Service & Memory Bank Service پیدا کنید، کل خط را با موارد زیر جایگزین کنید:
        session_service = VertexAiSessionService(
            project=PROJECT_ID, location=LOCATION, agent_engine_id=AGENT_ENGINE_ID
        )
        memory_service = VertexAiMemoryBankService(
            project=PROJECT_ID, location=LOCATION, agent_engine_id=AGENT_ENGINE_ID
        )
    
    

مقایسه حافظه

  1. 👉💻 دستور زیر را در دستور خود تایپ کنید:
    cloudshell edit ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/deploy_agent.py
    
    این ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/deploy_agent.py را در ویرایشگر شما باز می‌کند.
  2. عبارت # TODO: Set Up Configuration با کد زیر جایگزین کنید:
    # Basic configuration types
    MemoryBankConfig = types.ReasoningEngineContextSpecMemoryBankConfig
    SimilaritySearchConfig = (
        types.ReasoningEngineContextSpecMemoryBankConfigSimilaritySearchConfig
    )
    GenerationConfig = types.ReasoningEngineContextSpecMemoryBankConfigGenerationConfig
    
    # Advanced configuration types
    CustomizationConfig = types.MemoryBankCustomizationConfig
    MemoryTopic = types.MemoryBankCustomizationConfigMemoryTopic
    CustomMemoryTopic = types.MemoryBankCustomizationConfigMemoryTopicCustomMemoryTopic
    GenerateMemoriesExample = types.MemoryBankCustomizationConfigGenerateMemoriesExample
    ConversationSource = (
        types.MemoryBankCustomizationConfigGenerateMemoriesExampleConversationSource
    )
    ConversationSourceEvent = (
        types.MemoryBankCustomizationConfigGenerateMemoriesExampleConversationSourceEvent
    )
    ExampleGeneratedMemory = (
        types.MemoryBankCustomizationConfigGenerateMemoriesExampleGeneratedMemory
    )
    

پردازش_حافظه

  1. 👉 در همان فایل: 04-Adding-Memory-Bank/01-starter/backend/deploy_agent.py . به دنبال # TODO: Set up topic بگردید، کل خط را با کد زیر جایگزین کنید:
        custom_topics = [
            # Topic 1: Sweater Preference
            MemoryTopic(
                custom_memory_topic=CustomMemoryTopic(
                    label="sweater_preference",
                    description="""Extract the user's preferences for sweater styles, patterns, and designs. Include:
                    - Specific patterns (snowflake, reindeer, geometric, fair isle, solid, etc.)
                    - Style preferences (chunky knit, cardigan, pullover, turtleneck, oversized, fitted)
                    - Color preferences (red, green, navy, pastel, etc.)
                    - Material preferences if mentioned (wool, cotton, cashmere, itchy/soft)
                    - Themes (retro, modern, ugly christmas sweater, elegant)
    
                    Example: "User wants a retro style sweater with a pixelated reindeer pattern."
                    Example: "User prefers dark blue colors and hates itchy wool."
                    """,
                )
            ),
            # Topic 2: Personal Context
            MemoryTopic(
                custom_memory_topic=CustomMemoryTopic(
                    label="personal_context",
                    description="""Extract the user's personal context including hobbies, pets, interests, job, and preferred scenes. Include:
                    - Hobbies and activities (skiing, reading, gaming, cooking, etc.)
                    - Pets (type, breed, name, color)
                    - Job or profession if relevant to their style
                    - General interests (sci-fi, nature, vintage, tech)
                    - Preferred scenes or vibes (cozy fireplace, snowy mountain, cyberpunk city, beach)
    
                    Example: "User has a golden retriever named Max."
                    Example: "User loves skiing and wants a snowy mountain background."
                    Example: "User is a software engineer who likes cyberpunk aesthetics."
                    """,
                )
            )
        ]
    
  2. 👉 در همان فایل: 04-Adding-Memory-Bank/01-starter/backend/deploy_agent.py . به دنبال # TODO: Create Agent Engine بگردید، کل خط را با کد زیر جایگزین کنید:
        agent_engine = client.agent_engines.create(
            config={
                "display_name": AGENT_DISPLAY_NAME,
                "context_spec": {
                    "memory_bank_config": {
                        "generation_config": {
                            "model": f"projects/{PROJECT_ID}/locations/{LOCATION}/publishers/google/models/gemini-2.5-flash"
                        },
                        "customization_configs": [customization_config]
                    }
                },
            }
        )
    

چرا فقط از Prompt استفاده نمی‌کنیم؟

ممکن است بپرسید، «چرا فقط تاریخچه کاربر را در اعلان وارد نمی‌کنیم؟»

  • محدودیت‌های اندازه : پنجره‌های Context بزرگ هستند، اما بی‌نهایت نیستند. شما نمی‌توانید ۵ سال سابقه را در آنها جای دهید.
  • هزینه : پردازش ۱ میلیون توکن برای هر «سلام» فوق‌العاده گران است.
  • تمرکز : بانک حافظه به عنوان یک موتور جستجو برای نماینده شما عمل می‌کند. این بانک فقط حقایق مرتبط را بازیابی می‌کند.
  1. 👉💻 دستور زیر را در دستور خود تایپ کنید:
    cloudshell edit ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/agent.py
    
    این فایل ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/agent.py را در ویرایشگر شما باز می‌کند.
  2. در فایل: ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/agent.py عبارت # TODO: Add PreloadMemoryTool با عبارت زیر جایگزین کنید:
    if USE_MEMORY_BANK:
        agent_tools.append(PreloadMemoryTool())
    

PreloadMemoryTool و add_session_to_memory

در agent.py ، دو جزء کلیدی را مشاهده خواهید کرد:

  • PreloadMemoryTool ): این ابزاری است که به عامل اجازه می‌دهد تا «خودش را در گوگل جستجو کند.» اگر کاربر سوال مبهمی مانند «قهوه همیشگی‌ام را برایم بیاور» بپرسد، عامل می‌تواند قبل از پاسخ دادن، از این ابزار برای پرس‌وجو از بانک حافظه در مورد «ترجیحات قهوه» استفاده کند.
  • add_session_to_memory : این یک فراخوانی پس‌زمینه است.
    • چرا ناهمگام؟ ذخیره حافظه زمان می‌برد (خلاصه کردن چت، استخراج حقایق). ما نمی‌خواهیم کاربر منتظر این بماند. ما آن را در پس‌زمینه ( add_session_to_memory ) با استفاده after_agent_callback اجرا می‌کنیم.

۱۰. بانک حافظه در عمل

  1. 👉💻 دستور زیر را در دستور خود تایپ کنید:
    cd ~/holiday_workshop/04-Adding-Memory-Bank/01-starter
    ./use_memory_bank.sh
    
    نتیجه را به صورت زیر مشاهده خواهید کرد: deploy_agent_result فایل ~/holiday_workshop/.env را بررسی کنید، خواهید دید ( نیازی به انجام کاری نیست )
    USE_MEMORY_BANK=TRUE
    AGENT_ENGINE_ID={agent_engine_id}
    
  2. 👉💻 حافظه را با رابط کاربری برنامه آزمایش کنید. دستور زیر را در دستور خود تایپ کنید:
    cd ~/holiday_workshop/04-Adding-Memory-Bank/01-starter
    ./start_app.sh
    
    مطمئن شوید که روی http://localhost:5173/ کلیک می‌کنید، یا یک پنجره جدید باز کنید و http://localhost:5173/ را تایپ کنید. توجه داشته باشید که Uvicorn running on http://0.0.0.0:8000 ، فقط سرور backend است، نه لینک واقعی که می‌خواهیم روی آن کلیک کنیم. اکنون رابط چت در وب‌سایت به عامل شخصی‌سازی‌شده شما تبدیل شده است! وب‌سایت
  3. 👉 تست حافظه. اگر در رابط کاربری تایپ کنید:
    I want a sweater that matches my dog. He's a golden retriever.
    
    I'm a programmer, so I want something geeky. Maybe a matrix style?
    
    I like snowflake sweater pattern
    

عامل این را به عنوان یک ترجیح شناسایی کرده و آن را در بانک حافظه ذخیره می‌کند.

هفته‌ی بعد (یا هر زمان که برنامه را با Control+C و ./start_app.sh مجدداً راه‌اندازی کنید)، اگر بپرسید:

what is my preference on sweater pattern?

عامل، بانک حافظه را بررسی می‌کند، ترجیح شما را می‌بیند و بدون اینکه از او خواسته شود، الگوی ژاکت را تولید می‌کند. ۱۰-نتیجه

  1. با مراجعه به Google Cloud Console Agent Engine ، در Vertex AI Agent Engine تأیید کنید
    • مطمئن شوید که پروژه را از انتخابگر پروژه در بالا سمت چپ انتخاب می‌کنید: انتخابگر پروژه
    • و موتور عاملی که از دستور قبلی use_memory_bank.sh مستقر کرده‌اید را تأیید کنید. موتور عامل روی موتور عاملی که تازه ایجاد کرده‌اید کلیک کنید.
  2. روی برگه Memories در این عامل مستقر کلیک کنید، می‌توانید تمام حافظه را در اینجا مشاهده کنید. مشاهده حافظه

تبریک می‌گویم! شما همین الان بانک حافظه را به دستگاه خود متصل کردید!

۱۱. نتیجه‌گیری

خلاصه

شما با موفقیت یک سیستم عامل کامل را معماری و ساخته‌اید.

  • اتصال : شما از MCP برای استانداردسازی نحوه دسترسی عامل خود به ابزارهای محلی استفاده کردید.
  • ارکستراسیون : شما از ADK برای مدیریت حلقه استدلال پیچیده مورد نیاز برای وظایف چند مرحله‌ای استفاده کردید.
  • شخصی‌سازی : شما از بانک حافظه برای ایجاد یک لایه پایدار و یادگیرنده که زمینه کاربر را به خاطر می‌سپارد، استفاده کردید.

مراحل بعدی

  • سرور MCP خودتان را بسازید : یک سرور برای API یا پایگاه داده داخلی خود ایجاد کنید.
  • الگوهای ADK را بررسی کنید : در مستندات ADK درباره «حلقه‌های استدلال» و «ارکستراسیون» اطلاعات کسب کنید.
  • استقرار : عامل خود را از یک اسکریپت محلی به یک سرویس تولید در Cloud Run ببرید.