اگر امروز یک نمونه اولیه از عامل هوش مصنوعی ساختهاید، احتمالاً در محیط عملیاتی با شکست مواجه شده است. این شکستها معمولاً نه به دلیل ضعف مدل زبانی، بلکه به دلیل فروپاشی سیستمی است که مدل را در بر گرفته است. یک راهنمای فنی عمیق از tamiz.pro که در ۳ اکتبر ۲۰۲۶ منتشر شد، فاش کرد که این شکستها معمولاً ناشی از توهم در فراخوانی ابزارها (Tool-call Hallucinations)، انفجار حجم دادهها در پنجره متنی (Context Window Blowouts) و شکستهای خاموش (Silent Failures) هستند.
برای عبور از این بنبست، باید از اسکریپتهای ساده به سمت یک محیط اجرای (Runtime) مستحکم حرکت کرد. این تغییر حیاتی است چون عاملها در دنیای واقعی با ورودیهای غیرقابلپیشبینی و APIهای ناپایدار روبرو میشوند که هرگز در محیطهای آزمایشگاهی یا نوتبوکهای Jupyter دیده نمیشوند. تصور کنید یک عامل مانند یک مدیرعامل است؛ مدل زبانی بزرگ (LLM) — مثل کتابخانهداری که میلیاردها صفحه را خوانده و حالا با همان لحن کتابها جواب میدهد — مغز این مدیر است، اما معماری سیستم، کل زیرساخت شرکتی است که اجازه میدهد آن مغز واقعاً دستورات را اجرا کند.
زیربنای MCP
همانطور که در تحلیلهای پیشین ما دربارهی امنیت مدلهای بازمتن اشاره کردیم، جداسازی لایههای دسترسی کلید پایداری است. در همین راستا، پروتکل زمینهٔ مدل (Model Context Protocol یا MCP) به عنوان یک لایه انتقال مبتنی بر JSON-RPC 2.0 عمل میکند. این پروتکل تعریف ابزار را از اجرای آن جدا میکند؛ به این معنا که سرور MCP مالک وضعیت (State) و طرحها (Schemas) است و محیط اجرای عامل، برنامهریزی، جمعآوری زمینه و استنتاج (Inference) — لحظهای که مدل واقعاً جواب تولید میکند، شبیه خودِ آشپزی و نه دورهی آموزش آشپز — را مدیریت میکند.
بر اساس مستندات tamiz.pro، یک عامل عملیاتی معمولاً به ۳ تا ۱۵ سرور تخصصی MCP متصل است که سه قابلیت اصلی را فراهم میکنند:
- ابزارها (Tools): عملیاتهای وضعیتدار مانند CRUD، فراخوانی API یا عملیات روی فایلها که مدل زبانی میتواند آنها را فراخوانی کند.
- منابع (Resources): زمینههای فقط-خواندنی مانند فایلها، پایگاههای داده یا پایگاههای دانش که در اختیار کلاینت قرار میگیرند.
- پرامپتها (Prompts): قالبهای تعاملی پیشفرض که به گردشکارهای چندمرحلهای ساختار میدهند.
معماری هسته: جداسازی کلاینت و سرور
محیط اجرای عامل به عنوان مغز عمل کرده و مالک اتصال به LLM، وضعیت گفتگو و مسیریابی ابزارها است. در محیط عملیاتی، این یک سرویس طولانیمدت است که به عنوان یک واحد محاسباتی بدون-وضعیت (Stateless) ساخته شده و توسط یک ذخیرهساز جلسه پایدار پشتیبانی میشود.
در استقرار عملیاتی، از توپولوژی «مرکز و پره» (Hub-and-Spoke) استفاده میشود که در آن هر سرور MCP یک میکروسرویس مجزا است. تصمیمات کلیدی در این طراحی عبارتند از:
- انتقال (Transport): استفاده از HTTP جریانپذیر (Streamable HTTP) به جای stdio برای پشتیبانی از مقیاسپذیری افقی و بقا در برابر ریاستارتها.
- احراز هویت (Auth): پیادهسازی کلیدهای API مجزا برای هر سرور و استفاده از mTLS برای محدود کردن اثر تخریبی (Blast Radius) در صورت نفوذ.
- وضعیت (State): نگهداری وضعیت در سمت سرور با زمان انقضا (TTL) برای بدون-وضعیت نگه داشتن کلاینت.
- استقرار (Deployment): استفاده از کوبرنتیز (K8s) با مدل «هر پاد یک سرور» برای مقیاسپذیری مستقل و امکان بازگشت (Rollback) سریع.
الگوهای ارکستراسیون و اجرا
برای جلوگیری از تأخیر و خطا، توسعهدهندگان باید الگوهای ارکستراسیون خاصی را پیاده کنند. زنجیرهسازی متوالی (Sequential Chaining) حالت پیشفرض است که در آن LLM هر بار یک فراخوانی ابزار را تصمیم میگیرد و نتایج به زمینه بازمیگردند. این روش برای ۸۰٪ موارد، بهویژه زمانی که وابستگی دادهای وجود دارد (مثلاً خروجی ابزار A ورودی ابزار B است)، پاسخگو است.
اما برای کارهای مستقل، الگوی «توزیع موازی» (Parallel Fan-Out) ضروری است تا تأخیر کاهش یابد. این کار شامل تقسیم فراخوانیهای ابزار به گروههای مستقل با استفاده از مرتبسازی توپولوژیک (مانند الگوریتم کان) است تا فراخوانیهای غیروابسته به صورت همزمان از طریق Promise.allSettled اجرا شوند.
وقتی طرح ابزارها بیش از ۴۰٪ از پنجرهٔ زمینه (Context Window) — میزان متنی که مدل همزمان در ذهن نگه میدارد، شبیه میز کاری که جا برای چند ورق دارد — را اشغال میکند، الگوی «مسیریاب-توزیعکننده» (Router-Dispatcher) لازم است. در این حالت، یک مدل کوچک و سریع مانند Claude 3 Haiku ابتدا قصد کاربر را طبقهبندی کرده (مثلاً: پایگاه داده، API، فایلها، جستجو، محاسبات) و تنها زیرمجموعه مرتبط از سرورهای MCP را فعال میکند. این کار حدود ۲۰۰ میلیثانیه تأخیر اضافه میکند اما توکنهای طرح را ۶۰ تا ۸۰ درصد کاهش میدهد.
مدیریت بودجه زمینه
اتمام ظرفیت زمینه، اصلیترین دلیل شکست عاملهاست. راهکار پیشنهادی، یک «چارچوب بودجه توکن» (Token Budget Framework) است که با زمینه به عنوان یک منبع محدود با حسابداری صریح برخورد میکند. این بودجه بین پرامپت سیستمی، طرحهای ابزار پویا، تاریخچه گفتگو، نتایج ابزارها و یک ذخیره اجباری برای خروجی (معمولاً ۴۰۹۶ توکن یا ۵٪ از پنجره) تقسیم میشود.
به جای پنجره لغزنده ساده — که باعث میشود عامل تصمیمات قبلی را فراموش کرده و فراخوانیهای ابزار را تکرار کند — توسعهدهندگان باید از «فشردهسازی پیشرونده» در آستانه ۸۵٪ استفاده کنند.
استراتژیهای فشردهسازی عبارتند از:
- خلاصهسازی (Summarization): استفاده از مدلی مانند Claude 3 Haiku برای تلخیص پیامهای قدیمی در حالی که حقایق و تصمیمات کلیدی حفظ شوند.
- برش (Truncation): کوتاه کردن نتایج ابزارهایی که بیش از ۲۰۰۰ توکن هستند و افزودن یک خلاصه به آنها.
- هرس کردن (Pruning): حذف طرح ابزارهایی که در چند دور اخیر استفاده نشدهاند.
تابآوری و خودترمیمی
سیستمهای عملیاتی باید فرض کنند ابزارها شکست میخورند. پیادهسازی الگوی «قطعکننده» (Circuit Breaker) مانع از آن میشود که شکست یک سرور MCP کل حلقه عامل را متوقف کند. این قطعکننده تعداد شکستها را ردیابی کرده و بین وضعیتهای CLOSED، OPEN و HALF_OPEN جابجا میشود. اگر سروری به حد نصاب شکست (مثلاً ۵ مورد) رسید، مدار برای یک زمان بازنشانی (مثلاً ۳۰ ثانیه) باز میشود.
معیارهای تلاش مجدد (Retry) باید از «بازگشت نمایی با لرزش کامل» (Exponential Backoff with Full Jitter) استفاده کنند تا از مشکل «گله تندرهای» (Thundering Herd) جلوگیری شود. همه خطاها قابل تلاش مجدد نیستند؛ در حالی که خطاهای 5xx و Timeouts قابل تلاش هستند، خطاهای 4xx (احراز هویت یا اعتبارسنجی) باید بلافاصله باعث باز شدن مدار شوند.
عامل نباید هنگام شکست ابزار متوقف شود، بلکه باید خطا را به صورت ساختاریافته به مدل بازگرداند، شامل:
- پیام خطا و نام ابزار.
- یک پرچم بازیابی (recoverable: true/false).
- یک پیشنهاد خاص (مثلاً: «آرگومانها نامعتبر بودند؛ طرح را بررسی کرده و دوباره تلاش کنید»).
این قابلیت «خودترمیمی» است که به عامل اجازه میدهد با پارامترهای متفاوت تلاش کند یا ابزاری جایگزین بیابد.
امنیت و سندباکسینگ
عاملهای خودمختار با قابلیت اجرای کد خطرناک هستند. معماری باید سه لایه حفاظتی داشته باشد:
لایه ۱: مجوز در سطح ابزار: هر سرور MCP مجوزهای خود را با توکنهای محدود شده (Scoped Tokens) اعمال میکند. این توکنها دسترسیها (خواندنی، نوشتنی، حذفی) و فیلترهای منابع (مثلاً محدود کردن کوئری دیتابیس به یک userId خاص) را تعریف میکنند.
لایه ۲: سندباکس اجرا: ابزارهای اجرای کد (پایتون یا شل) هرگز نباید در همان فرآیند محیط اجرای عامل باشند. آنها باید در کانتینرهایی با محدودیتهای سختگیرانه ایزوله شوند: ۲۵۶ مگابایت رم، ۰.۵ هسته CPU و تایماوت ۳۰ ثانیهای. دسترسی به شبکه و سیستم فایل باید بر اساس محدوده ابزار، صراحتاً در لیست سفید (Whitelist) قرار گیرند.
لایه ۳: فیلترینگ ورودی/خروجی: پاکسازی خروجیها برای جلوگیری از تزریق پرامپت (Prompt Injection) با حذف توکنهای سیستمی یا عباراتی مانند «دستورات قبلی را نادیده بگیر». این چالشها نشان میدهند که پروتکل MCP در واقع به یک مرز امنیتی جدید تبدیل شده است که مدیریت دقیق آن برای جلوگیری از نفوذ ضروری است. همزمان، فیلترهای خروجی برای شناسایی الگوهای حساس (مانند Regex کارتهای اعتباری یا شماره ملی) اسکن میکنند تا از خروج غیرمجاز دادهها جلوگیری شود.
مشاهدهپذیری و عیبیابی
عیبیابی عاملهای غیرقطعی نیازمند ردیابی (Tracing) تخصصی است. هر نقطه تصمیم — از تولید LLM تا اجرای ابزار — باید با استفاده از ابزارهایی مانند OpenTelemetry در بازههای زمانی (Spans) پوشش داده شود. این بازهها باید توکنهای ورودی/خروجی، وضعیت ابزار و اندازه نتایج را ردیابی کنند.
لاگگذاری رویدادهای ساختاریافته یک ریسمان نجات برای عیبیابی است. هر رویداد tool_call ،tool_result و compaction باید با یک شناسه جلسه (Session ID) و شماره تکرار ثبت شود.
یکی از قدرتمندترین الگوها، «بازپخش عیبیابی» (Debug Replay) است. با ضبط تمام جفتهای درخواست و پاسخ LLM (شامل دما و نسخه مدل)، توسعهدهندگان میتوانند LLM زنده را با یک ReplayLLMProvider جایگزین کنند. این کار اجازه میدهد یک اجرای خاص را به صورت قطعی در محیط تست بازسازی کرد که برای CI/CD و تست رگرسیون حیاتی است.
مقیاسپذیری به توپولوژیهای چند-عاملی
با افزایش پیچیدگی، عاملهای تکمغزه به سقف توانایی خود میرسند. راهکار، توپولوژی «ارکستراتور-کارگر» است که در آن یک مدل استدلالی قوی (مانند Claude 3 Opus) درخواست را به یک برنامه اجرایی ساختاریافته تبدیل کرده و زیر-وظایف را به عاملهای کارگر تخصصی میسپارد.
توپولوژیهای پیشرفته میتوانند عاملها را مستقیماً از طریق MCP متصل کنند، جایی که یک عامل خود را به عنوان یک سرور MCP برای عامل دیگر معرفی میکند و ابزاری مانند worker_agent.execute را فراهم میکند.
برای بهینهسازی هزینه، باید از «مسیریابی مدل بر اساس هزینه» (CostAwareModelRouter) استفاده کرد:
- Claude 3 Haiku: برای طبقهبندی و خلاصهسازی (۰.۲۵ دلار به ازای هر میلیون توکن).
- Claude 3 Sonnet: برای اجرای عمومی (۳ دلار).
- Claude 3 Opus: فقط برای استدلالهای بسیار پیچیده (۱۵ دلار).
این رویکرد لایهای معمولاً هزینههای عملیاتی را ۶۰ تا ۸۰ درصد کاهش میدهد.
مدیریت چرخه حیات و وضعیت
سرورهای MCP باید به عنوان نمونههای محدود به جلسه (Session-scoped) مدیریت شوند تا نشت وضعیت رخ ندهد. یک MCPServerPool با استفاده از asynccontextmanager تضمین میکند که فرآیندهای سرور حتی در صورت انتشار استثناها پاکسازی شوند تا از نشت منابع جلوگیری شود.
سیستمهای عملیاتی همچنین به بررسی سلامت فعال نیاز دارند. یک پوشش ResilientMCPServer باید ضربان قلب (Heartbeats) و شکستهای متوالی را مانیتور کند و در صورت قدیمی شدن جلسه (مثلاً ۱۲۰ ثانیه بدون ضربان قلب)، به طور خودکار متصل شود.
پیادهسازی الگوی «نقطه بازرسی» (Checkpointing) اجازه میدهد عامل وضعیت خود را در ذخیرهسازهایی مانند Redis ذخیره کند. با ذخیره گام فعلی، اقدامات تکمیل شده و یک tool_results_cache ،عامل میتواند پس از یک کرش، بدون تکرار فراخوانیهای گرانقیمت یا تکراری، اجرا را از سر بگیرد.
استقرار و تلههای رایج
در کوبرنتیز، سرور MCP معمولاً به صورت Sidecar یا پاد مجزا اجرا میشود. مقیاسدهندههای افقی پاد (HPA) باید بر اساس هر دو معیار استفاده از CPU (۷۰٪) و یک متریک سفارشی مانند mcp_active_sessions (مثلاً ۵۰ جلسه در هر پاد) پیکربندی شوند.
توسعهدهندگان باید از دو تله دوری کنند:
۱. حلقههای بینهایت عامل: پیادهسازی یک LoopDetector که تاریخچه اقدامات را ردیابی کرده و اگر توالی اقدامات بیش از ۳ بار تکرار شد، سریعاً شکست بخورد.
۲. انحراف آرگومانهای ابزار: مدلها ممکن است نام آرگومانها را توهم بزنند. باید توجه داشت که حتی با وجود MCP، این پروتکل بهتنهایی نمیتواند تمام توهمات عاملهای تجاری را حذف کند و نیاز به لایههای اعتبارسنجی دارد. همیشه آرگومانها را پیش از اجرا با طرح JSON ابزار اعتبارسنجی کنید تا از کرشهای سمت سرور جلوگیری شود.
جزئیات پیشرفته عملیاتی
برای سختتر کردن سیستم، مکانیسمهای زیر توصیه میشود:
مدیریت اتصال و منابع:
- ایزولاسیون جلسه: استفاده از
MCPSessionPoolبرای حفظ ایزولاسیون مستاجر (Tenant Isolation) در استقرارهای چند-مستاجری جهت جلوگیری از آلودگی زمینه بین کاربران مختلف. - مدیریت سرریز: وقتی استخر (Pool) پر شد، سیستم باید جلسات سرریز موقت ایجاد کند تا در دسترس بودن حفظ شود.
- محدودیت منابع: اعمال محدودیتهای سختگیرانه داکر برای سرورهای سندباکس، شامل سیستم فایل
--read-onlyو--cap-drop=ALLبرای به حداقل رساندن سطح حمله.
مانیتورینگ و SLOها:
- ردیابی تأخیر: مانیتور کردن تأخیر p99 برای ابزارهای خاص. p99 بیش از ۱۰ ثانیه معمولاً نشاندهنده یک شکست سیستمی است.
- کارایی توکن: ردیابی
mcp_tokens_per_successful_call. افزایش ناگهانی در اینجا نشان میدهد مدل با فرمت خروجی ابزار مشکل دارد. - متریکهای سلامت: ارائه Gaugeهای Prometheus برای
mcp_circuit_breaker_openوmcp_server_connections_activeبرای فعالسازی هشارهای لحظهای.
انسان در حلقه (HITL):
- درگاههای تأیید: برای عملیاتهای پرخطر یا حیاتی، یک مکانیسم توقف پیاده کنید. عامل باید منتظر یک
ApprovalDecisionانسانی (تأیید، رد یا تایماوت) از طریق وبهوک یا UI بماند. - طبقهبندی ریسک: اختصاص سطوح ریسک (کم، متوسط، زیاد، بحرانی) به ابزارها برای تعیین اینکه کدام عملیاتها نیاز به دخالت دستی دارند.
اعتبارسنجی ابزار و امنیت:
- پاکسازی آرگومانها: استفاده از اعتبارسنجی سبک Pydantic برای جلوگیری از پیمایش مسیر (Path Traversal) (مثلاً مسدود کردن
..در مسیر فایلها) و اعمال محدودیت اندازه محتوا (مثلاً حداکثر ۱ مگابایت برای نوشتن فایل). - لیست سفید: نگهداری یک
ToolPermissionPolicyسختگیرانه که فقط اجازه فراخوانی ابزارهای ثبت شده را میدهد و برای هر تلاش غیرمجاز خطایToolPermissionDeniedصادر میکند. - سختسازی کانتینر: اجرای سرورهای MCP غیرقابل اعتماد در داکر با
--security-opt=no-new-privilegesو دسترسی شبکه محدود (--network=none) مگر در موارد ضروری.
پایداری وضعیت و بازیابی:
- نقطه بازرسی: ذخیره اشیاء
AgentCheckpointشامل گام فعلی، اقدامات تکمیل شده و اقدامات در انتظار در Redis با TTL ۲۴ ساعته. - اجرای اول-کش (Cache-First): بررسی
tool_results_cacheپیش از اجرای فراخوانی ابزار. آرگومانهای یکسان باید نتایج کش شده را برگردانند که مصرف توکن LLM را ۳۰ تا ۵۰ درصد کاهش میدهد. - منطق ازسرگیری: هنگام بازگشت از یک نقطه بازرسی، کش و اقدامات تکمیل شده را بازیابی کنید تا از فراخوانیهای API تکراری و چرخههای حلقه جلوگیری شود.
این رویکرد جامع، یک عامل هوش مصنوعی را از یک دموی شکننده به یک نرمافزار تابآور تبدیل میکند که قادر است در مواجهه با کاربران دنیای واقعی دوام بیاورد.
گام بعدی شما
- اگر از عاملهای ساده استفاده میکنید، معماری خود را به سمت جداسازی سرور ابزار و محیط اجرا (Runtime) تغییر دهید.
- برای کاهش هزینه و افزایش سرعت، یک مدل کوچک (مانند Haiku) را به عنوان مسیریاب برای انتخاب ابزارها قرار دهید.
- سیستم مانیتورینگ خود را با OpenTelemetry تجهیز کنید تا نقاط شکست در زنجیره استدلال را شناسایی کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو