وقتی ایجنتهای هوش مصنوعی وارد گفتوگوهای طولانی و محیطهای عملیاتی میشوند، با دو چالش اساسی روبهرو میشوید: تاخیر ناشی از خلاصهسازی حافظه در حین پاسخدهی به کاربر، و انباشتهشدن فکتهای متناقض و منسوخ. الگوی سنتی حافظهی مجازی در MemGPT اگرچه ایدهی جذابی بود، اما تمام بار پردازشی را روی مسیر بحرانی (Critical Path) قرار میداد و کاربر را معطل نگهمیداشت.
فریمورک Letta با معرفی دو مفهوم «بلوکهای حافظه» (Memory Blocks) و «محاسبات زمان خواب» (Sleep-Time Compute) این مسئله را برطرف میکند. بلوکهای حافظه بخشهای ساختاریافته و دارای تایپ مشخصی هستند که مستقیماً در پرامپت قرار میگیرند، در حالی که ایجنت زمان خواب بهصورت ناهمگام در پسزمینه و هنگام بیکاری سیستم، دادهها را پالایش و یکپارچه میکند.
اگر برای دسترسی به مدلهای تجاری با محدودیت کارتهای بانکی مواجهید، میتوانید این الگو را با مدلهای متنباز سبک بهصورت محلی اجرا کنید یا از گیتویهای سازگار با API بهره ببرید، زیرا منطق تفکیک حافظه کاملاً وابسته به معماری برنامه است و به مدل خاصی محدود نمیشود.
بلوکهای حافظهی کاربردی و مجزا که مدل میتواند مستقیماً ویرایششان کند، در کنار یک ایجنت زمان خواب (sleep-time agent) که وقتی ایجنت اصلی بیکار است حافظه را بهصورت ناهمگام یکپارچه میکند. با همین دو ایده حافظه را فراتر از یک گفتوگو مقیاسپذیر میکنید.
اهداف یادگیری
- نام بردن از سه لایهی حافظه در Letta (اصلی، بازخوانی، آرشیوی) و نقش هر کدام.
- توضیح الگوی بلوک حافظه: بلوک انسان (Human block)، بلوک پرسونا (Persona block) و بلوکهای تعریفشده توسط کاربر بهشکل آبجکتهای دارای تایپ و درجهیک.
- شرح مفهوم محاسبات زمان خواب (sleep-time compute)، چرایی خروج آن از مسیر بحرانی (critical path) و امکان استفاده از مدلی قویتر نسبت به ایجنت اصلی در آن.
- پیادهسازی یک حلقهی دوایجنتِ اسکریپتشده که در آن ایجنت اصلی به پاسخها سرویس میدهد و ایجنت زمان خواب بین نوبتهای گفتوگو بلوکها را یکپارچه میکند.
صورت مسئله
پروژهی MemGPT (درس 07) جریان کنترل حافظهی مجازی را حل کرد؛ اما در محیط عملیاتی با سه چالش روبهرو شد:
- تاخیر. تمام عملیات حافظه در مسیر بحرانی قرار دارند. اگر ایجنت مجبور باشد حین انتظارِ کاربر هرس کند، خلاصهسازی انجام دهد یا مغایرتها را برطرف کند، تاخیر در دنبالهی توزیع (tail latency) بهشدت بالا میرود.
- پوسیدگی حافظه (Memory rot). نوشتنها روی هم انباشته میشوند، فکتهای نقضشده باقی میمانند و بازیابی در میان محتوای قدیمی و بیاستفاده غرق میشود.
- از بین رفتن ساختار. یک حافظهی آرشیویِ تخت و بدون لایهبندی نمیتواند چنین منطقی را پیاده کند: «بلوک انسان همیشه در پرامپت است؛ بلوک پرسونا همیشه در پرامپت است؛ اما بلوک وظیفه در هر نشست تعویض میشود».
پروژهی اصلی MemGPT در سال 2024 نام پلتفرم خود را به Letta (letta.com) تغییر داد — الگوی مقاله همچنان نام MemGPT را حفظ کرده است — و بازنویسی Letta V1 در سال 2026 گام بعدی و مجزایی بهشمار میرود. بلوکهای حافظه ساختار را شفاف میکنند؛ محاسبات زمان خواب هم فرآیند یکپارچهسازی را از مسیر بحرانی بیرون میکشد.
مفهوم اصلی
سه لایه
| لایه | دامنه | محل قرارگیری | نویسنده |
|---|---|---|---|
| اصلی (Core) | همیشه قابلمشاهده | داخل پرامپت اصلی | فراخوانی ابزار توسط ایجنت + بازنویسیهای زمان خواب |
| بازخوانی (Recall) | تاریخچهی گفتوگو | قابلبازیابی | ثبت خودکار نوبت گفتوگو |
| آرشیوی (Archival) | فکتهای دلخواه | برداری + کلید-مقدار + گراف | فراخوانی ابزار توسط ایجنت + پردازش و ورود اطلاعات در زمان خواب |
لایهی اصلی همان هستهی MemGPT است. بازخوانی، بافر گفتوگو بههمراه دنبالهی خارجشده از آن است. لایهی آرشیوی نیز حافظهی خارجی محسوب میشود. این تفکیک، بار بیشازحد روی دو لایهی MemGPT را برطرف میکند.
بلوکهای حافظه
بلوک، بخشی دارای تایپ، پایدار و قابلویرایش از لایهی اصلی است. مقالهی اصلی MemGPT دو بلوک تعریف کرد:
- بلوک انسان (Human block) — فکتهای مربوط به کاربر (نام، نقش، ترجیحات، اهداف).
- بلوک پرسونا (Persona block) — خودانگارهی ایجنت (هویت، لحن، محدودیتها).
پلتفرم Letta این ساختار را به بلوکهای دلخواه کاربر تعمیم میدهد: بلوک Task برای هدف فعلی، بلوک Project برای فکتهای مربوط به کدبیس، و بلوک Safety برای محدودیتهای قطعی. هر بلوک دارای فیلدهای id، label، value، limit (سقف کاراکتر) و description است (تا مدل بداند چه زمانی باید آن را ویرایش کند).
بلوکها از طریق این ابزارها ویرایشپذیرند:
block_append(label, text)block_replace(label, old, new)block_read(label)block_summarize(label)— فشردهسازی بلوکی که به سقف ظرفیت خود نزدیک شده است.
محاسبات زمان خواب
قابلیت اضافهشده در Letta در سال 2025: اجرای ایجنت دوم در پسزمینه و خارج از مسیر بحرانی. ایجنتهای زمان خواب، متن پیادهشدهی گفتوگوها و بافتار کدبیس را پردازش میکنند، مقادیر learned_context را در بلوکهای مشترک مینویسند و رکوردهای آرشیوی را یکپارچه یا ابطال میکنند.
مزایایی که بهدست میآید:
- بدون هزینهی تاخیر. پاسخهای اصلی معطل عملیات حافظه نمیمانند.
- امکان استفاده از مدلی قویتر. ایجنت زمان خواب میتواند مدلی گرانتر و کندتر باشد؛ چون محدودیت تاخیر ندارد.
- پنجرهی طبیعی برای یکپارچهسازی. حذف دادههای تکراری، خلاصهسازی و ابطال فکتهای متناقض دقیقاً زمانی رخ میدهد که کاربر منتظر نمانده است.
این ساختار کاملاً شبیه سازوکار انسان است: کار را انجام میدهید، شب روی آن میخوابید و حافظهی بلندمدت شبانه تثبیت میشود.
استدلال بومی (Native Reasoning)
نسخهی Letta V1 (letta_v1_agent، محصول 2026) ابزارهای send_message/heartbeat و توکنهای درونمتنیِ Thought: را کنار گذاشته و از استدلال بومی استفاده میکند. سرویس Responses API (در OpenAI) و Messages API با تفکر تعمیمیافته (extended thinking در Anthropic) خروجی استدلال را روی کانالی جداگانه ارسال میکنند که بین نوبتهای گفتوگو دستبهدست میشود (در محیط پروداکشن، این تبادل بین ارائهدهندگان مختلف رمزگذاری میشود). حلقهی کنترل همچنان ReAct است؛ اما ردگیری فکر ساختاری است و دیگر در قالب پرامپت نوشته نمیشود.
خطاهای رایج در این الگو
- باد کردن بلوک (Block bloat). اجرای مداوم
block_appendخیلی سریع به سقف ظرفیت میرسد. پیش از نوشتنِ دادهای که از سقف عبور میکند، یک خلاصهساز بلوک متصل کنید. - انحراف بیصدا (Silent drift). ایجنت زمان خواب بلوکی را بازنویسی میکند و ایجنت اصلی هرگز متوجه نمیشود. برای بلوکها نسخهبندی بگذارید و تفاوتها (diff) را در ردگیری محاسبات نمایش دهید.
- یکپارچهسازی آلوده (Poisoned consolidation). ایجنت زمان خواب محتوای در دسترس مهاجم را پردازش کرده و وارد لایهی اصلی میکند. درس 27 روی رابط زمان خواب نیز اعمال میشود.
پیادهسازی از صفر
فایل code/main.py این موارد را پیاده میکند:
Block— شناسه، برچسب، مقدار، سقف و توضیحات.BlockStore— عملیات CRUD بههمراه ابزار کمکیnear_limit(label).- دو ایجنت اسکریپتشده —
PrimaryAgentکه به هر نوبت گفتوگو پاسخ میدهد، وSleepTimeAgentکه بین نوبتها کار یکپارچهسازی را انجام میدهد. - ردگیری محاسباتی که گفتوگویی سهنوبته را با نوشتن روی بلوکها نشان میدهد؛ بههمراه یک دور پردازش زمان خواب که بلوکی را خلاصه کرده و فکتی منسوخ را باطل میکند.
اجرای آن:
python3 code/main.py
خروجی گفتوگو تفکیک کارها را نشان میدهد: نوبتهای اصلی سریع هستند و نوشتههای خام تولید میکنند؛ پردازش زمان خواب کار فشردهسازی و پاکسازی را بر عهده دارد.
استفاده از ابزارهای واقعی
- Letta (letta.com) برای پیادهسازی مرجع؛ بهصورت سلفهاست یا کلود مدیریتشده.
- مهارتهای Claude Agent SDK بهشکل دانش مبتنی بر بلوک — مهارت، بلوکی نامدار، نسخهبندیشده و قابلبازیابی از دستورالعملها است که ایجنت بنا بر تقاضا بارگذاری میکند.
- پیادهسازیهای سفارشی برای تیمهایی که کنترل کامل روی لایهی ذخیرهسازی میخواهند. از قرارداد API در Letta استفاده کنید تا بعداً بتوانید مهاجرت کنید.
خروجی این درس
فایل outputs/skill-memory-blocks.md یک سیستم بلوکی شبیه Letta بههمراه قلابهای (hooks) زمان خواب برای هر محیط اجرایی تولید میکند؛ این پیادهسازی شامل قوانین ایمنی و سازوکار ارجاعدهی نیز هست.
تمرینها
- ابزار
block_summarizeرا اضافه کنید تا وقتیnear_limitمقدار true برمیگرداند، مقدار بلوک را با خلاصهای تولیدشده توسط مدل جایگزین کند. چه آستانهای هم تعداد فراخوانیهای خلاصهسازی و هم سرریز بلوک را به کمترین حد میرساند؟ - قابلیت حذف تکرار در زمان خواب را روی دادههای آرشیوی پیاده کنید: اگر بیش از 90% توکنهای دو رکورد همپوشانی داشتند، در یک رکورد ادغام شوند. این کار را فقط در پردازش زمان خواب انجام دهید و هرگز به مسیر بحرانی نیاورید.
- بلوکها را نسخهبندی کنید. در هر نوشتن، مقدار قبلی و تفاوتها (diff) را ثبت کنید. متد
block_history(label)را اکسپوز کنید تا اپراتورها بتوانند علت «فراموش شدن موضوع X توسط ایجنت» را دیباگ کنند. - با ایجنتهای زمان خواب مانند نویسندگان غیرقابلاعتماد رفتار کنید. هرگاه سراغ بلوک Persona یا Safety رفتند، قبل از commit تایید یک ایجنت ثانویه را الزامی کنید.
- این نمونه را طوری پورت کنید که از API پلتفرم Letta (
letta_v1_agent) استفاده کند. چه تغییراتی در اسکیمای بلوک رخ میدهد و استدلال بومی چطور ساختار ردگیری محاسبات را تغییر میدهد؟
اصطلاحات کلیدی
| اصطلاح | در گفتوگوها | مفهوم دقیق فنی |
|---|---|---|
| بلوک حافظه (Memory block) | «بخش قابل ویرایش پرامپت» | بخشی از حافظهی اصلی؛ تایپدار، پایدار و قابل ویرایش توسط LLM |
| بلوک انسان (Human block) | «حافظهی کاربر» | فکتهای مربوط به کاربر، سنجاقشده در حافظهی اصلی |
| بلوک پرسونا (Persona block) | «هویت ایجنت» | خودانگاره، لحن و محدودیتها؛ سنجاقشده در حافظهی اصلی |
| محاسبات زمان خواب (Sleep-time compute) | «کار ناهمگام روی حافظه» | ایجنت ثانویهای که یکپارچهسازی را خارج از مسیر بحرانی انجام میدهد |
| اصلی / بازخوانی / آرشیوی | «لایهها» | تفکیک سهلایهای حافظه: همیشه قابلمشاهده / گفتوگو / خارجی |
| سقف بلوک (Block limit) | «محدودیت ظرفیت» | سقف کاراکتر برای هر بلوک؛ عاملی برای اجبار به خلاصهسازی |
| استدلال بومی (Native reasoning) | «کانال تفکر» | خروجی استدلال در سطح ارائهدهندهی مدل، نه قالب پرامپتیِ Thought: |
| بافتار آموختهشده (Learned context) | «خروجی زمان خواب» | فکتهایی که ایجنت زمان خواب در بلوکهای مشترک مینویسد |
برای مطالعهی بیشتر
- وبلاگ Letta، Memory Blocks — الگوی بلوک
- وبلاگ Letta، Sleep-time Compute — یکپارچهسازی ناهمگام
- وبلاگ Letta، بازطراحی حلقهی ایجنت (Rearchitecting the Agent Loop) — بازنویسی به کمک استدلال بومی
- Packer et al., MemGPT (arXiv:2310.08560) — مبدا ایده
