این افسانه در مورد معماری بدون سرور (serverless) که «شما فقط برای میلی‌ثانیه‌هایی که کدتان اجرا می‌شود هزینه پرداخت می‌کنید» زمانی که سعی می‌کنید یک عامل هوش مصنوعی (AI agent) را روی AWS Lambda اجرا کنید، فرو می‌ریزد. در عمل، بزرگترین موارد هزینه‌ای، هزینه پردازش Lambda نیست، بلکه تأخیر شروع سرد (cold-start latency)، حلقه‌های تلاش مجدد (retry loops) و مصرف توکنی است که آن حلقه‌ها ایجاد می‌کنند.

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

اکثر توسعه‌دهندگان با یک تابع Lambda مانند یک محیط ایزوله (sandbox) برای پردازش خالص رفتار می‌کنند: هندلر (handler) را سریع نگه می‌دارند، اندازه حافظه را متوسط تنظیم می‌کنند و می‌بینند که صورت‌حساب ثابت می‌ماند. این روش برای نقاط انتهایی (endpoints) ساده HTTP جواب می‌دهد، اما عاملی که یک مدل زبانی را فراخوانی می‌کند، پاسخ را ارزیابی می‌کند و احتمالاً کل چرخه را دوباره امتحان می‌کند، با یک فراخوانی (invocation) واحد Lambda مطابقت ندارد. گردش کار داخلی عامل، تعداد فراخوانی‌های مدل را چندین برابر می‌کند و هر فراخوانی اضافی، هزینه توکنی را اضافه می‌کند که می‌تواند از هزینه پردازش بسیار فراتر رود.

شروع‌های سرد، هزینه پنهان هستند

وقتی یک کانتینر Lambda برای اولین بار آماده می‌شود، باید بسته استقرار (deployment package) را باز کند. عامل مورد نظر مجموعه‌ای بزرگ از کتابخانه‌های Python را فراخوانی می‌کند، بنابراین حجم تصویر (image) می‌تواند زیاد باشد. حذف ابزارهای مخصوص توسعه — مانند یک کتابخانه اتوماسیون مرورگر که فقط برای تست محلی استفاده می‌شود — حجم تصویر را کاهش می‌دهد که به نوبه خود زمان باز کردن بسته را کوتاه‌تر می‌کند. یک بسته سبک‌تر به این معنی است که تابع سریع‌تر آماده مدیریت یک درخواست می‌شود و زمان صرف شده برای گرم شدن کانتینر کاهش می‌یابد.

اهرم دوم، محل قرارگیری کد مقداردهی اولیه (initialization code) است. با ساختن گراف عامل در زمان وارد کردن ماژول (module import)، کارهای سنگین به جای هر درخواست، تنها یک بار در هر شروع کانتینر انجام می‌شود. فراخوانی‌های گرم (warm invocations) سپس از آن مرحله کاملاً عبور می‌کنند. این کار با کمی طولانی‌تر شدن شروع سرد، معاوضه می‌شود، اما پاداش آن، زمان آماده‌سازی تقریباً صفر برای هر درخواست پس از گرم شدن کانتینر است.

حافظه به عنوان اهرمی برای کنترل تأخیر عمل می‌کند

در Lambda، مقدار حافظه‌ای که اختصاص می‌دهید، سهم CPU که تابع دریافت می‌کند را نیز تعیین می‌کند. تنظیم تابع روی ۱ گیگابایت حافظه، یک هسته CPU مجازی کامل به آن اختصاص می‌دهد. CPU اضافی، وارد کردن کتابخانه‌ها و ایجاد گراف عامل را تسریع می‌کند و هم تأخیر شروع سرد و هم تأخیر گرم شدن را کاهش می‌دهد.

هزینه حلقه: تلاش‌های مجدد، مصرف توکن را چندین برابر می‌کنند

عامل از یک حلقه کارگر-ارزیاب (worker-evaluator loop) پیروی می‌کند. کارگر یک پاسخ تولید می‌کند، ارزیاب آن را بررسی می‌کند و اگر ارزیاب خطایی را شناسایی کند، وظیفه دوباره به کارگر بازگردانده می‌شود. این حلقه می‌تواند تا پنج بار قبل از تسلیم شدن تکرار شود. این بدان معناست که یک درخواست خارجی واحد می‌تواند باعث موارد زیر شود:

  • تا پنج فراخوانی برای مدل کارگر (worker model)
  • تا پنج فراخوانی برای مدل ارزیاب (evaluator model)
  • هر تعداد فراخوانی ابزار (tool calls) که عامل تصمیم به انجام آن بگیرد

صورت‌حساب Lambda قابل پیش‌بینی باقی می‌ماند زیرا AWS بر اساس میلی‌ثانیه اجرا هزینه می‌گیرد، اما صورت‌حساب توکن می‌تواند بسته به تعداد تلاش‌های مجدد مورد نیاز، به شدت نوسان کند.

تله‌ی زمان انتظار (timeout): API Gateway در مقابل Lambda

API Gateway یک محدودیت سخت‌گیرانه ۲۹ ثانیه‌ای برای درخواست‌های HTTP که مدیریت می‌کند، اعمال می‌کند. یک حلقه پنج مرحله‌ای عامل می‌تواند به راحتی از این محدودیت فراتر رود، حتی اگر تابع Lambda زیربنایی برای پنج دقیقه زمان اجرا تنظیم شده باشد. دور زدن API Gateway با استفاده از Lambda Function URLs، سقف ۲۹ ثانیه‌ای را برمی‌دارد و به تابع اجازه می‌دهد تا حلقه خود را بدون قطع شدن به پایان برساند.

توسعه‌دهندگان باید برای چه چیزهایی بودجه‌بندی کنند

درس ساده است: بودجه‌بندی برای یک عامل هوش مصنوعی بدون سرور، چیزی فراتر از جمع کردن میلی‌ثانیه‌های زمان اجرای Lambda است. شما باید این موارد را در نظر بگیرید:

  • اندازه بسته استقرار و تأخیر شروع سرد ناشی از آن
  • تنظیمات حافظه که CPU و در نتیجه سرعت وارد کردن (import) را تعیین می‌کند
  • تعداد مورد انتظار تلاش‌های مجدد در حلقه کارگر-ارزیاب، که مستقیماً مصرف توکن را هدایت می‌کند
  • انتخاب بخش جلویی (API Gateway در مقابل Function URL) برای جلوگیری از اتمام زودهنگام زمان انتظار (timeout)

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