تصور کنید یک برنامهنویس در حال توسعهٔ عاملی است که در میانهٔ یک عملیات پیچیده، بهدلیل قطع اتصال یا کرش کردن سیستم، تمام پیشرفتهایش را از دست میدهد. اگر هنوز وضعیت (State) عامل را در حافظهٔ موقت محیط اجرا نگه میدارید، در واقع در حال ساخت سیستمی هستید که در مقیاس واقعی شکست میخورد.
بر اساس تحلیل فنی دقیقی که در ۳۰ ژوئن ۲۰۲۶ در وبسایت dev.to منتشر شد، تنها بخشی از یک عامل (Agent) که برای پایداری در محیط تولید اهمیت دارد، «لاگ رویداد ماندگار» است. اکثر توسعهدهندگان بهاشتباه مدل یا حلقهٔ اجرای فعلی را به عنوان «عامل» میشناسند، در حالی که اینها صرفاً تفسیرگرهایی هستند که دادهها را از یک جریان زیربنایی میخوانند و به آن مینویسند. طبق این گزارش، اگر لاگ را به عنوان تنها هویت عامل در نظر بگیریم، میتوانmost پایدارترین شکستها در جریانهای کاری عاملی را حل کرد. این رویکرد نشان میدهد که مشکل اصلی در بسیاری از موارد، ساختار سیستم است و نه کیفیت مدل؛ چرا که حتی مدلهای قدرتمندتر نیز نمیتوانند لایههای معیوب معماری را در عاملهای هوش مصنوعی جبران کنند.
در توسعهٔ مدرن، عاملها با مشکل «شکنندگی» روبهرو هستند. برای مثال، اگر فرآیندی هنگام انتظار برای تأیید کاربر متوقف شود، تمام وضعیت جلسه معمولاً نابود میشود. دلیل این اتفاق این است که وضعیت در حافظهٔ محیط اجرا (Runtime Memory) گیر کرده است، نه در یک رکورد ماندگار. با انتقال منبع حقیقت به یک لاگ «فقط-افزودنی» (Append-only)، عامل به قطعهای از داده تبدیل میشود که هر اجراکنندهای میتواند در هر لحظه آن را بردارد و از نقطه توقف ادامه دهد. همانطور که در تحلیل قبلی ما دربارهی امنیت مدلهای بازمتن اشاره کردیم، جداسازی لایه داده از لایه اجرا، اولین قدم برای کنترلپذیری سیستمهای پیچیده است.
تعریف عامل به عنوان یک لاگ
در هستهٔ این معماری، لاگ شامل هر ورودی کاربر، خروجی مدل، فراخوانی ابزار و نتیجهٔ ابزار است. این سابقهٔ تاریخی در واقع رکوردی «فقط-افزودنی» از هر اتفاقی است که در حین کار عامل رخ داده است. این سابقهٔ تاریخی با یک «تعریف جلسه» — شامل پرامپت سیستمی (System Prompt)، شرح ابزارها و مهارتها — جفت میشود. تعریف جلسه به عنوان یک ثابت نسخهبندی شده (Versioned Constant) عمل میکند. چون تعریف جلسه از هر نوبت به نوبت دیگر تغییر نمیکند، چارچوبی ثابت فراهم میکند که عامل تحت آن عمل کند.
در مجموع، این عناصر وضعیت کامل عامل را تشکیل میدهند. هیچ چیزی از آنچه عامل «هست»، در محیط اجرا، مدل یا ابزارها زندگی نمیکند. در عوض، این اجزا به عنوان تفسیرگرها (Interpreters) و افزودنیها (Appenders) عمل میکنند. آنها وضعیت ماندگار را میخوانند، بر روی آن عمل میکنند و رویداد بعدی را به لاگ مینویسند. این ساختار به توسعهدهنده اجازه میدهد تا همان لاگ را به یک اجراکنندهٔ تازه تحویل دهد و آن اجراکننده دقیقاً بازسازی کند که عامل در کجا بود و از همانجا ادامه دهد. لاگ به تنهایی برای بازگرداندن عامل کافی است.
در این مدل، محیط اجرا (Runtime)، مدل و ابزارها صرفاً «افزودنی» هستند. این معماری دقیقاً مشابه نحوه عملکرد پایگاههای داده است که سالهاست از لاگها استفاده میکنند: جداول و ایندکسها صرفاً «تصویری» (Projections) از یک لاگ تغییرات زیربنایی هستند. هر عملیاتی روی عامل — خواه تولید اکشن بعدی توسط مدل باشد، یا افزودن نتیجه توسط اجرای ابزار، و یا رندر کردن یک تایملاین در رابط کاربری — صرفاً خواندن، افزودن به یا رندر کردن نمایی از لاگ است. این الگو در بررسیهای @dexhorthy درباره «عاملهای ۱۲-فاکتوره» بازتر شده است.

حلقهٔ اجرا در عمل
در یک پیادهسازی سادهٔ حلقه، هر گذر (Pass) یک «اجاره موقت» (Temporary Lease) میگیرد. اجراکننده لاگ را میخواند، یک گام به جلو میرود و نتیجه را بازمیگرداند. این مکانیسم سیستمی ایجاد میکند که هم «تکرارپذیر» (Idempotent) و هم مقاوم در برابر خطا است. تا زمانی که هر انتقال وضعیت معنادار بهصورت ماندگار نوشته شود، هر اجراکنندهای میتواند جلسه را بردارد و بدون از دست دادن پیوستگی، مسیر را ادامه دهد.
مدیریت زمینه و وضعیت
از آنجا که پنجرهٔ زمینه (Context Window) مدلهای زبانی بزرگ محدود است، نمیتوان کل لاگ خام را در هر فراخوانی به مدل داد. سیستم این مشکل را از طریق «فشردهسازی» (Compaction) حل میکند؛ یعنی ایجاد یک خلاصهٔ تقریبی (Lossy Summary) از رویدادهای قبلی که جایگزین دادههای قدیمیتر میشود تا در پنجرهٔ محدود مدل جای بگیرد.
برای حفظ یکپارچگی هویت عامل، تفکیک حیاتی بین «رکورد» و «تصویر» وجود دارد:
- لاگ خام (Raw Log): رکورد تغییرناپذیر و کامل از هر آنچه اتفاق افتاده است. این تنها منبع حقیقت است.
- فشردهسازی (Compaction): یک تصویر خاص و تقریبی که برای گنجاندن در پنجره مدل استفاده میشود. این بخش بیشتر شبیه به یک «نمای متریالایز شده» (Materialized View) است تا خودِ پایگاه داده.
- بازیابی وضعیت (State Restoration): چون لاگ خام حفظ شده است، اگر منطق فشردهسازی تغییر کند، سیستم همیشه میتواند تصاویر جدید و بهتری تولید کند.
این تفکیک از گم شدن هویت عامل جلوگیری میکند. دور ریختن لاگ خام به نفع یک خلاصه، به معنای از دست دادن بخشی از هویت عامل است. تمیزترین رویکرد این است که با فشردهسازی به عنوان یک «شاخهبندی تقریبی» (Lossy Fork) برخورد شود؛ به گونهای که لاگ کامل جلسه به یک مکعب فشردهتر جریان یابد و در این مسیر جزئیات را حذف کند.
مواجهه با وضعیت دنیای خارجی
برخی منتقدان استدلال میکنند که عاملهایی که با دنیای واقعی تعامل دارند — مثلاً ویرایش یک فایل، باز کردن یک Issue در گیتهاب یا ارسال ایمیل — وضعیتی خارج از لاگ ایجاد میکنند. اما این موضوع رویکرد لاگ-محور را باطل نمیکند، زیرا شما وضعیت عامل را از «لاگ» مشتق میکنید، نه از «دنیا».
اگر عاملی پس از اینکه فایلی که ویرایش کرده بود توسط کاربر دیگری تغییر کرد، از روی لاگ بازیابی شود، عامل صرفاً جهانبینی خود را هنگام فعالسازی مجدد بهروز میکند. لاگ باعث نمیشود دنیا قطعی (Deterministic) یا بازگشتپذیر شود؛ اگر ایمیلی ارسال شده باشد، بازگشت به یک شاخه قبلی در لاگ، آن ایمیل را «لغو ارسال» نمیکند. در عوض، لاگ سابقهٔ صادقانه و قابل بازیابی از آنچه عامل انجام داد و دید را نگه میدارد. در اینجا باید توجه داشت که تکیه بر ساختار دادهای درست، راهکاری برای پایداری است؛ چرا که نظارت انسانی به تنهایی نمیتواند جلوی خطاهای سیستمی و رفتاری عاملها را بگیرد.
این موضوع شبیه به یک فایل ذخیره (Save File) در بازیهای ویدئویی است. یک فایل ذخیره شامل موتور بازی Skyrim یا نقشه جهان نیست؛ بلکه فقط وضعیت خاص بازیکن را دارد تا کاربر را دوباره به بازی بازگرداند. اگر دنیا از زمان آخرین ذخیره تغییر کرده باشد، شخصیت بازی هنگام تعامل با محیط، جهانبینی خود را بهروز میکند.
مزایای مهندسی
بازتعریف عاملها به عنوان «داده» چندین ویژگی حیاتی سیستمی را فعال میکند که همگی از یک فرض ساده (اینکه لاگ همان عامل است) نشأت میگیرند:
- پایداری (Reliability): ابزارهایی مانند Claude Code را در نظر بگیرید. اگر یک فرآیند هنگام درخواست مجوز (Permission Prompt) متوقف شود، یک سیستم استاندارد ممکن است آن درخواست را گم کند. اما وقتی لاگ همان عامل باشد، یک ورکر جدید جلسه را برمیدارد، وضعیت را بازسازی میکند و درخواست مجوز دقیقاً در همان نقطه قرار میگیرد. فرآیند مُرد، اما عامل زنده ماند.
- مقیاسپذیری (Scalability): اکثر چارچوبها یک فرآیند را به یک عامل گره میزنند. با استفاده از لاگ، یک فرآیند واحد میتواند هزاران عامل را پیش ببرد و در هر نوبت وضعیت هر یک را بازسازی کند. این کار جلسات «چسبانی» (Sticky Sessions)، مهاجرت وضعیت و سربارهای هماهنگ-سازی را حذف کرده و Failover را بسیار ساده میکند.
- شاخهبندی (Forking): توسعهدهندگان میتوانند لاگ را برای بررسی استراتژیهای مختلف شاخه بزنند. یک شاخه میتواند روی Claude، دیگری روی GPT و سومی روی مدل محلی Qwen اجرا شود، در حالی که هر کدام از ابزارها و محیطهای ایزوله (Sandbox) متفاوتی استفاده میکنند.
- چندنفره شدن (Multiplayer): اشتراکگذاری یک عامل دیگر کپی کردن متن گفتگو در Slack نیست (که شبیه به اشتراکگذاری اسکرینشات از یک دیتابیس است). در عوض، اشتراکگذاری یعنی granting دسترسی به یک تاریخچه ماندگار که دیگران بتوانند آن را بازرسی کنند، از سر بگیرند یا گسترش دهند.
- مهاجرت (Migration): جابهجایی بین ارائهدهندگان مدل تنها به یک مشکل «آداپتور» تبدیل میشود. اگرچه مدلهای مختلف ممکن است به تصاویر (Projections) متفاوتی نیاز داشته باشند، اما لاگ تداوم هویت را فراهم میکند.
این تغییر معماری، عاملها را از فرآیندهای شکننده به ساختارهای دادهای مقاوم تبدیل میکند و «عامل» را از یک حلقه اجرای موقت به یک دارایی دائمی و قابل انتقال تبدیل مینماید.
گام بعدی شما
- اگر در حال طراحی عامل هستید، وضعیت (State) را از حافظهٔ RAM خارج کرده و به یک پایگاهداده Append-only منتقل کنید.
- استراتژیهای «فشردهسازی زمینه» را برای جلوگیری از گم شدن جزئیات در لاگهای طولانی پیاده کنید.
- برای تست مدلهای مختلف، یک سیستم «شاخهبندی لاگ» طراحی کنید تا خروجیهای مدلهای رقیب را روی یک تاریخچه یکسان بسنجید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو