چرا AI Agentهای تولیدی در سیستم‌های واقعی شکست می‌خورند: معماری، Latency و Cost
مقاله حسین نریمانی ۱۴۰۵/۰۴/۰۱ AI & Intelligent Systems

چرا AI Agentهای تولیدی در سیستم‌های واقعی شکست می‌خورند: معماری، Latency و Cost

بیشتر پروژه‌های AI Agent در مرحله‌ی demo خوب کار می‌کنند. مشکل وقتی شروع می‌شود که آن‌ها را وارد یک سیستم واقعی می‌کنی. latency بالا می‌رود. هزینه‌ها از کنترل خارج می‌شوند. و معماری synchronous که در notebook زیبا به...

بیشتر پروژه‌های AI Agent در مرحله‌ی demo خوب کار می‌کنند. مشکل وقتی شروع می‌شود که آن‌ها را وارد یک سیستم واقعی می‌کنی.

latency بالا می‌رود. هزینه‌ها از کنترل خارج می‌شوند. و معماری synchronous که در notebook زیبا به نظر می‌رسید، زیر بار واقعی خم می‌شود.

این مقاله درباره‌ی چرایی این شکست است — نه از زاویه‌ی تئوری، بلکه از زاویه‌ی سیستمی که واقعاً به production رسیده.


مشکل اصلی: اکثر معماری‌های AI Agent برای demo طراحی شده‌اند

وقتی یک AI Agent (عامل هوش مصنوعی) را در یک notebook یا sandbox می‌سازی، همه چیز sequential است. مدل فکر می‌کند، ابزار صدا می‌زند، جواب می‌گیرد، دوباره فکر می‌کند. این جریان خطی در محیط ایزوله کار می‌کند.

اما در یک سیستم operational واقعی، چند واقعیت موازی وجود دارد: کاربران متعدد به صورت همزمان درخواست می‌دهند، API‌های خارجی latency متغیر دارند، و هزینه‌ی هر token واقعی است — نه یک عدد انتزاعی در یک spreadsheet.

معماری synchronous یعنی هر قدم باید صبر کند تا قدم قبلی تمام شود. این در دنیایی که یک LLM call ممکن است ۳ تا ۱۵ ثانیه طول بکشد، یعنی هر pipeline پیچیده می‌تواند به راحتی به ۴۰ تا ۶۰ ثانیه برسد.

چرا demo موفق است اما production شکست می‌خورد

در demo، یک request وجود دارد. یک کاربر. یک thread. latency ۳۰ ثانیه‌ای قابل قبول به نظر می‌رسد چون هیچ رقیب موازی‌ای وجود ندارد.

در production، ۵۰ کاربر همزمان دارند request می‌دهند. هر request ۵ ابزار صدا می‌زند. هر ابزار به یک API خارجی وابسته است. مجموع latency‌ها به صورت additive جمع می‌شوند، نه parallel.

نتیجه: سیستمی که در demo ۱۰ ثانیه طول کشید، در production زیر concurrent load به ۹۰ ثانیه می‌رسد — اگر اصلاً زنده بماند.


معماری Synchronous: چرا ناکام است

معماری synchronous (همزمان) در سیستم‌های AI Agent یک anti-pattern اساسی است که اکثر تیم‌ها تنها زمانی آن را می‌فهمند که سیستم‌شان در production زیر بار collapse کرده.

مشکل Blocking در LLM Call‌ها

یک LLM inference call (فراخوانی مدل زبانی) به طور ذاتی blocking است. وقتی یک request به GPT-4o یا Claude 3.5 می‌دهی، thread اجرا منتظر می‌ماند. در این فاصله هیچ کار مفیدی انجام نمی‌شود.

در یک agent pipeline ساده با ۳ قدم LLM:

  • قدم اول: ۴ ثانیه
  • قدم دوم: ۶ ثانیه
  • قدم سوم: ۵ ثانیه
  • مجموع: ۱۵ ثانیه — فقط برای LLM، بدون احتساب ابزارها

این عدد در isolation قابل تحمل است. اما وقتی ۲۰ کاربر همزمان این pipeline را اجرا می‌کنند و معماری synchronous دارد، server به سرعت به دیوار می‌خورد.

مشکل Tool Call Serialization

در اکثر پیاده‌سازی‌های ReAct یا Function Calling، agent ابزارها را به صورت serial فراخوانی می‌کند. حتی اگر سه ابزار کاملاً مستقل از هم باشند — مثلاً یک database query، یک API call، و یک cache lookup — به ترتیب اجرا می‌شوند.

این یعنی latency سه ابزار با هم جمع می‌شود، نه max آن‌ها. یک مشکل ساده که با parallel tool execution قابل حل است — اما اکثر frameworks به صورت پیش‌فرض آن را پیاده‌سازی نمی‌کنند.

مشکل Error Propagation در زنجیره‌های Synchronous

در یک زنجیره‌ی synchronous، یک شکست در هر نقطه کل pipeline را متوقف می‌کند. یک API timeout در قدم چهارم، به این معناست که همه‌ی کار قدم‌های اول تا سوم هدر رفته.

بدون checkpointing، بدون partial result caching، بدون graceful degradation — سیستم یا همه را برمی‌گرداند یا هیچ. این در production به معنای frustrated users و wasted compute است.


Latency Constraint‌های دنیای واقعی

latency در سیستم‌های AI Agent یک مشکل چند لایه است. لازم است هر لایه را جداگانه ببینیم تا بتوانیم آن را به درستی مدیریت کنیم.

Time to First Token در مقابل Total Completion Time

TTFT (زمان تا اولین توکن) و TCT (زمان تا تکمیل کامل) دو متریک کاملاً متفاوت هستند. اکثر benchmarkها TCT را اندازه می‌گیرند، اما از دیدگاه تجربه‌ی کاربری، TTFT اهمیت بیشتری دارد.

یک agent که streaming را پیاده‌سازی کرده و TTFT پایینی دارد، حتی با TCT بالاتر، برای کاربر بهتر به نظر می‌رسد. این یک design decision است که بسیاری از تیم‌ها در مرحله‌ی architecture آن را نادیده می‌گیرند.

Network Latency در Tool Call‌ها

هر tool call به یک سرویس خارجی، network roundtrip دارد. اگر agent در AWS us-east-1 است و ابزار به یک API در اروپا call می‌زند، ۸۰ تا ۱۲۰ میلی‌ثانیه latency فقط از شبکه اضافه می‌شود.

با ۱۰ tool call متوالی، این عدد به ۱ ثانیه اضافه‌ی خالص شبکه می‌رسد — چیزی که در هیچ benchmark آزمایشگاهی دیده نمی‌شود.

Context Window Inflation و Latency رابطه‌ی مستقیم دارند

هر چقدر context window بزرگ‌تر باشد، inference کندتر است. این یک رابطه‌ی فیزیکی است — attention mechanism با طول sequence به صورت quadratic مقیاس می‌شود.

agent‌هایی که به اشتباه همه‌ی conversation history و همه‌ی tool results را در context نگه می‌دارند، با هر قدم کندتر می‌شوند. بعد از ۱۰ قدم، همان مدل ممکن است ۳ برابر کندتر از قدم اول باشد.


Cost Constraint‌های دنیای واقعی

هزینه در سیستم‌های AI Agent از جایی می‌آید که اغلب در planning دیده نمی‌شود. token pricing مستقیم فقط یک بخش از تصویر است.

Hidden Cost‌های یک Agent Pipeline

منبع هزینه چرا معمولاً underestimate می‌شود تأثیر در production
System Prompt Repetition در هر call تکرار می‌شود ۱۰-۳۰٪ هزینه‌ی اضافه
Tool Result در Context نتایج ابزارها در prompt نگه داشته می‌شوند context inflation غیرخطی
Retry‌های Failed Call در benchmarkها شکست وجود ندارد ۵-۱۵٪ هزینه‌ی پنهان
Unnecessary Re-reasoning agent بدون نیاز دوباره فکر می‌کند token waste قابل توجه
Embedding Calls برای RAG معمولاً جداگانه حساب نمی‌شود در scale قابل توجه

مشکل Prompt Engineering در Production

هر بار که system prompt را بهینه می‌کنی تا رفتار agent را بهتر کنی، معمولاً طولانی‌ترش می‌کنی. یک system prompt که از ۵۰۰ token به ۲۰۰۰ token رسیده، هزینه‌ی هر call را ۴ برابر نمی‌کند — اما به طور قابل توجهی افزایش می‌دهد.

در یک سیستم با ۱۰۰۰ call روزانه، تفاوت ۱۵۰۰ token در system prompt می‌تواند ماهانه به صدها دلار هزینه‌ی اضافه تبدیل شود — هزینه‌ای که هیچ‌کس در ابتدا حساب نکرده بود.

Model Selection به عنوان یک Cost-Latency Tradeoff

استفاده از مدل قوی‌ترین برای هر قدم یک اشتباه رایج است. در بسیاری از agent pipeline‌ها، برخی قدم‌ها به reasoning پیچیده نیاز ندارند — آن‌ها فقط باید output یک tool call را parse کنند یا یک decision ساده بگیرند.

استفاده از GPT-4o یا Claude 3.5 Sonnet برای routing یا simple classification، مثل استفاده از یک جرثقیل برای بلند کردن یک قلم است. GPT-4o-mini یا Claude Haiku در اکثر این موارد کافی‌اند — با یک‌دهم هزینه و نصف latency.


چه چیزی واقعاً در Production کار می‌کند

اینجاست که از تئوری فاصله می‌گیریم و به چیزی می‌رسیم که در سیستم‌های واقعی جواب داده.

Async-First Architecture به جای Synchronous

معماری async-first (غیرهمزمان از پایه) به این معناست که هیچ قدمی بدون دلیل blocking نیست. LLM call‌ها، tool call‌ها، و database query‌ها همه async اجرا می‌شوند.

در Python، این یعنی استفاده از asyncio و async/await به صورت جدی — نه فقط برای ظاهر. در سیستم‌های پیچیده‌تر، یعنی message queue هایی مثل Redis Streams یا RabbitMQ برای decoupling قدم‌های مختلف pipeline.

نتیجه‌ی عملی: همان pipeline که synchronous آن ۳۰ ثانیه طول می‌کشید، با async درست می‌تواند به ۸ تا ۱۲ ثانیه برسد — بدون تغییر در مدل یا logic.

Parallel Tool Execution

هر جا که tool call‌ها به هم وابسته نیستند، باید parallel اجرا شوند. این یک تصمیم architecture است که باید از ابتدا در طراحی agent گنجانده شود، نه یک optimization بعدی.

OpenAI Function Calling از parallel tool calls پشتیبانی می‌کند — اما تنها اگر agent را درست طراحی کنی تا از آن استفاده کند. اکثر پیاده‌سازی‌های رایج این capability را به طور پیش‌فرض فعال نمی‌کنند.

Tiered Model Selection

یک سیستم هوشمند از مدل‌های مختلف برای وظایف مختلف استفاده می‌کند:

  • Tier 1 — Complex Reasoning: GPT-4o, Claude 3.5 Sonnet — فقط برای قدم‌هایی که واقعاً به آن نیاز دارند
  • Tier 2 — Standard Tasks: GPT-4o-mini, Claude Haiku — routing، classification، parsing
  • Tier 3 — Simple Operations: Local models یا rule-based logic — کارهایی که اصلاً به LLM نیاز ندارند

این tiering ساده می‌تواند هزینه‌ی کلی را ۴۰ تا ۶۰٪ کاهش دهد بدون اینکه کیفیت خروجی نهایی به طور محسوسی تغییر کند.

Context Window Management به عنوان یک First-Class Concern

هر agent باید یک استراتژی صریح برای مدیریت context داشته باشد. این شامل می‌شود:

  • Summarization ابزارهای tool result‌های طولانی قبل از افزودن به context
  • Rolling window برای conversation history به جای نگه داشتن همه‌ی تاریخچه
  • Selective retrieval از long-term memory به جای load کردن همه‌چیز
  • Context budget tracking — دانستن اینکه چند token استفاده شده در هر قدم

Checkpointing و Partial Result Caching

در یک pipeline طولانی، هیچ‌چیز نباید دو بار محاسبه شود. نتایج قدم‌های intermediate باید cache شوند — چه در Redis، چه در یک simple key-value store.

اگر یک agent در قدم هشتم از ده شکست خورد، باید از قدم هشتم restart کند، نه از صفر. این یک الزام ساده است که در اکثر پیاده‌سازی‌های اولیه وجود ندارد.


Failure Mode‌های رایج در Production AI Agent

تجربه‌ی کار با این سیستم‌ها نشان می‌دهد که چند الگوی شکست تکرار می‌شوند.

Failure Mode 1: Runaway Loops

agent بدون یک termination condition صریح می‌تواند در یک حلقه‌ی بی‌پایان گیر کند — به خصوص وقتی ابزارها نتایج غیرمنتظره برمی‌گردانند. هر iteration هزینه و latency اضافه می‌کند. بدون یک hard limit روی تعداد step‌ها، یک request می‌تواند ۱۰۰ دلار هزینه داشته باشد.

Failure Mode 2: Tool Hallucination در Scale

LLM‌ها گاهی tool‌هایی را فراخوانی می‌کنند که وجود ندارند یا با parameter‌های اشتباه. در production با تعداد بالای request، این خطاها به سرعت انباشته می‌شوند. بدون logging دقیق و validation قوی برای tool call‌ها، debugging این مشکلات می‌تواند هفته‌ها طول بکشد.

Failure Mode 3: Cascading Timeout‌ها

یک API خارجی کُند می‌شود. agent صبر می‌کند. timeout می‌زند. retry می‌کند. دوباره timeout. اگر circuit breaker پیاده‌سازی نشده باشد، این cascade می‌تواند کل سیستم را block کند.

Failure Mode 4: Context Poisoning

یک tool نتیجه‌ی اشتباه یا گمراه‌کننده برمی‌گرداند. این نتیجه وارد context می‌شود. تمام قدم‌های بعدی بر اساس این اطلاعات غلط تصمیم می‌گیرند. خروجی نهایی کاملاً اشتباه است — و trace کردن آن به ریشه دشوار است.


چه چیزهایی را باید اندازه بگیری

یک سیستم AI Agent بدون observability مناسب یک black box است. این متریک‌ها minimum چیزی هستند که باید track کنی:

  • p50، p95، p99 latency برای هر قدم agent، نه فقط end-to-end
  • Token usage per step — برای شناسایی قدم‌هایی که context را inflate می‌کنند
  • Tool call success rate — جداگانه برای هر ابزار
  • Retry rate — اگر بالاتر از ۵٪ است، یک مشکل structural وجود دارد
  • Cost per successful completion — نه فقط cost per call
  • Step count distribution — agent‌هایی که بیشتر از انتظار loop می‌زنند را شناسایی کن

یک مثال واقعی: وقتی Synchronous Pipeline هزینه را ۸ برابر کرد

یک سیستم document analysis را تصور کن که باید ۵۰ سند را پردازش کند. معماری اولیه synchronous بود: هر سند یک pipeline داشت که ۴ LLM call متوالی داشت. میانگین زمان پردازش هر سند ۲۵ ثانیه بود. برای ۵۰ سند: ۲۰ دقیقه.

مشکل بزرگ‌تر هزینه بود. چون pipeline synchronous بود، context هر LLM call شامل تمام نتایج call‌های قبلی بود — حتی وقتی نیازی نداشت. این context inflation هزینه‌ی هر سند را از تخمین اولیه ۰.۰۳ دلار به ۰.۲۴ دلار رساند.

با سه تغییر:

  1. Async pipeline با parallel processing برای سندهای مستقل
  2. Context pruning — فقط نتایج relevant به قدم بعدی منتقل می‌شد
  3. Tiered model — دو قدم از چهار قدم به GPT-4o-mini منتقل شدند

نتیجه: زمان پردازش ۵۰ سند از ۲۰ دقیقه به ۴ دقیقه رسید. هزینه‌ی هر سند از ۰.۲۴ دلار به ۰.۰۵ دلار کاهش یافت. نه با تغییر مدل اصلی، نه با کاهش کیفیت — فقط با طراحی معماری درست.


نتیجه‌گیری: Agent‌های تولیدی به معماری Production-Grade نیاز دارند

AI Agent ساختن آسان است. AI Agent ساختن که در production پایدار بماند، مقیاس‌پذیر باشد، و هزینه‌اش قابل پیش‌بینی باشد — این یک مسئله‌ی سیستمی است.

مشکل اصلی این نیست که LLM‌ها کافی نیستند یا که agent‌ها ذاتاً unreliable هستند. مشکل این است که معماری‌هایی که برای demo کار می‌کنند، برای production طراحی نشده‌اند.

synchronous pipeline، context inflation، model selection بدون در نظر گرفتن cost، و observability ضعیف — این‌ها مشکلاتی هستند که با design choices درست قابل حل‌اند، نه با انتظار برای مدل‌های بهتر.

هر سیستم AI Agent که قرار است به production برود باید از روز اول با این سؤال‌ها طراحی شود: اگر ۱۰۰۰ request همزمان بیاید چه اتفاقی می‌افتد؟ اگر یک ابزار timeout بزند چه می‌شود؟ هزینه‌ی هر successful completion چقدر است؟

اگر نمی‌توانی به این سؤال‌ها پاسخ دهی، سیستمت آماده‌ی production نیست — صرف‌نظر از اینکه در demo چقدر خوب کار می‌کند.


نکات کلیدی

  • معماری synchronous در production زیر concurrent load collapse می‌کند — async-first از روز اول ضروری است
  • هزینه‌ی واقعی AI Agent اغلب ۳ تا ۸ برابر تخمین اولیه است — به دلیل context inflation، retry‌ها، و system prompt repetition
  • parallel tool execution می‌تواند latency را بدون تغییر در logic، ۵۰ تا ۷۰٪ کاهش دهد
  • tiered model selection معمولاً ۴۰ تا ۶۰٪ صرفه‌جویی در هزینه دارد بدون کاهش محسوس کیفیت
  • context window management یک first-class architectural concern است، نه یک optimization بعدی
  • observability در سطح step — نه فقط end-to-end — برای debugging و cost optimization ضروری است
  • checkpointing و partial result caching از هدر رفتن compute در صورت شکست جلوگیری می‌کند

سؤالات متداول

چرا AI Agent‌ها در production شکست می‌خورند؟

اکثر AI Agent‌ها با معماری synchronous ساخته می‌شوند که برای demo کافی است اما زیر concurrent load واقعی، به دلیل blocking LLM call‌ها، serial tool execution، و context inflation، latency و هزینه‌شان به شدت افزایش می‌یابد.

چطور latency یک AI Agent را در production کاهش دهیم؟

سه اقدام اصلی: اول، معماری async-first برای حذف blocking غیرضروری. دوم، parallel execution برای tool call‌های مستقل. سوم، context window management برای جلوگیری از context inflation که inference را کند می‌کند.

هزینه‌ی واقعی یک AI Agent در production چقدر است؟

هزینه‌ی واقعی معمولاً ۳ تا ۸ برابر token pricing ساده است، به دلیل system prompt repetition در هر call، tool result accumulation در context، retry‌های failed call‌ها، و unnecessary re-reasoning در قدم‌های مختلف.

آیا باید همیشه از قوی‌ترین مدل در agent pipeline استفاده کنم؟

خیر. tiered model selection یکی از مؤثرترین راه‌های کاهش هزینه است. بسیاری از قدم‌های agent — routing، parsing، simple classification — به قوی‌ترین مدل نیاز ندارند. استفاده از GPT-4o-mini یا Claude Haiku در این موارد می‌تواند هزینه را ۴۰ تا ۶۰٪ کاهش دهد.

چطور یک AI Agent را برای production مقیاس‌پذیر کنیم؟

از async-first architecture شروع کن، parallel tool execution را پیاده‌سازی کن، checkpointing برای long-running pipeline‌ها اضافه کن، observability در سطح step داشته باش، و از circuit breaker برای external API call‌ها استفاده کن.

تفاوت بین TTFT و TCT در AI Agent‌ها چیست؟

TTFT یا Time to First Token زمانی است که اولین بخش از جواب به کاربر می‌رسد. TCT یا Total Completion Time زمان کل تا پایان جواب است. در سیستم‌های interactive، TTFT از دیدگاه تجربه‌ی کاربری اهمیت بیشتری دارد — streaming را پیاده‌سازی کن تا حتی با TCT بالا، تجربه‌ی کاربری قابل قبول باشد.

چطور هزینه‌ی AI Agent را در production پیش‌بینی کنیم؟

به جای حساب کردن token pricing ساده، باید average context size در هر قدم را اندازه بگیری، retry rate را حساب کنی، step count distribution را بررسی کنی، و cost per successful completion را به عنوان متریک اصلی track کنی — نه cost per call.

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

نظرات (0)

اولین نفری باشید که نظر می‌دهد.

برای ثبت نظر باید وارد حساب کاربری خود شوید.

ورود / ثبت‌نام