فاز 14 · درس 8

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

نوع
ساختنی
زمان
حدود 75 دقیقه
زبان‌ها
Python (stdlib)
پیش‌نیاز
فاز 14 · درس 07 (MemGPT)
یک قفسه چوبی با جعبه‌های مجزا و برچسب‌خورده در پیش‌زمینه و میز کاری خلوت در پس‌زمینه تاریک با نوری ملایم
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفهوم اصلی
  4. سه لایه
  5. بلوک‌های حافظه
  6. محاسبات زمان خواب
  7. استدلال بومی (Native Reasoning)
  8. خطاهای رایج در این الگو
  9. پیاده‌سازی از صفر
  10. استفاده از ابزارهای واقعی
  11. خروجی این درس
  12. تمرین‌ها
  13. اصطلاحات کلیدی
  14. برای مطالعه‌ی بیشتر

وقتی ایجنت‌های هوش مصنوعی وارد گفت‌وگوهای طولانی و محیط‌های عملیاتی می‌شوند، با دو چالش اساسی روبه‌رو می‌شوید: تاخیر ناشی از خلاصه‌سازی حافظه در حین پاسخ‌دهی به کاربر، و انباشته‌شدن فکت‌های متناقض و منسوخ. الگوی سنتی حافظه‌ی مجازی در 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) جریان کنترل حافظه‌ی مجازی را حل کرد؛ اما در محیط عملیاتی با سه چالش روبه‌رو شد:

  1. تاخیر. تمام عملیات حافظه در مسیر بحرانی قرار دارند. اگر ایجنت مجبور باشد حین انتظارِ کاربر هرس کند، خلاصه‌سازی انجام دهد یا مغایرت‌ها را برطرف کند، تاخیر در دنباله‌ی توزیع (tail latency) به‌شدت بالا می‌رود.
  2. پوسیدگی حافظه (Memory rot). نوشتن‌ها روی هم انباشته می‌شوند، فکت‌های نقض‌شده باقی می‌مانند و بازیابی در میان محتوای قدیمی و بی‌استفاده غرق می‌شود.
  3. از بین رفتن ساختار. یک حافظه‌ی آرشیویِ تخت و بدون لایه‌بندی نمی‌تواند چنین منطقی را پیاده کند: «بلوک انسان همیشه در پرامپت است؛ بلوک پرسونا همیشه در پرامپت است؛ اما بلوک وظیفه در هر نشست تعویض می‌شود».

پروژه‌ی اصلی 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 روی رابط زمان خواب نیز اعمال می‌شود.
بلوک‌های حافظهجابه‌جایی موارد صفحه‌بندی‌شده
MEMORY BLOCKSStructured agent memory splits a fixed core block that always sits in the context window from an unbounded archival store on disk. The agent reads and writes its own memory: when core fills, it summarizes or evicts the least relevant items into archival and pages others back in on demand. This is how an agent keeps an effectively limitless history inside a finite window.پنجره‌ی بافتارمشخصات پروژهیادداشت کلیدهای APIترجیحات کاربراسلات خالیمخزن آرشیو (نامحدود)پروژهapiکاربرگذشتهطراحیجلسهاسکیمااقدامانتقال به/از حافظه
حافظه‌ی ساختاریافته‌ی ایجنت، یک بلوک هسته‌ایِ ثابت که همواره در پنجره‌ی بافتار حضور دارد را از یک مخزن آرشیوی نامحدود روی دیسک جدا می‌کند. ایجنت حافظه‌ی خود را می‌خواند و می‌نویسد: وقتی هسته پر می‌شود، کم‌ارتباط‌ترین موارد را خلاصه یا به آرشیو منتقل می‌کند و بنا به نیاز، سایر موارد را دوباره فراخوانی می‌کند. بدین‌ترتیب ایجنت تاریخچه‌ای عملاً نامحدود را درون پنجره‌ای محدود نگه می‌دارد.

پیاده‌سازی از صفر

فایل 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) زمان خواب برای هر محیط اجرایی تولید می‌کند؛ این پیاده‌سازی شامل قوانین ایمنی و سازوکار ارجاع‌دهی نیز هست.

تمرین‌ها

  1. ابزار block_summarize را اضافه کنید تا وقتی near_limit مقدار true برمی‌گرداند، مقدار بلوک را با خلاصه‌ای تولیدشده توسط مدل جایگزین کند. چه آستانه‌ای هم تعداد فراخوانی‌های خلاصه‌سازی و هم سرریز بلوک را به کمترین حد می‌رساند؟
  2. قابلیت حذف تکرار در زمان خواب را روی داده‌های آرشیوی پیاده کنید: اگر بیش از 90% توکن‌های دو رکورد هم‌پوشانی داشتند، در یک رکورد ادغام شوند. این کار را فقط در پردازش زمان خواب انجام دهید و هرگز به مسیر بحرانی نیاورید.
  3. بلوک‌ها را نسخه‌بندی کنید. در هر نوشتن، مقدار قبلی و تفاوت‌ها (diff) را ثبت کنید. متد block_history(label) را اکسپوز کنید تا اپراتورها بتوانند علت «فراموش شدن موضوع X توسط ایجنت» را دیباگ کنند.
  4. با ایجنت‌های زمان خواب مانند نویسندگان غیرقابل‌اعتماد رفتار کنید. هرگاه سراغ بلوک Persona یا Safety رفتند، قبل از commit تایید یک ایجنت ثانویه را الزامی کنید.
  5. این نمونه را طوری پورت کنید که از API پلتفرم Letta‏ (letta_v1_agent) استفاده کند. چه تغییراتی در اسکیمای بلوک رخ می‌دهد و استدلال بومی چطور ساختار ردگیری محاسبات را تغییر می‌دهد؟

اصطلاحات کلیدی

اصطلاح در گفت‌وگوها مفهوم دقیق فنی
بلوک حافظه (Memory block) «بخش قابل ویرایش پرامپت» بخشی از حافظه‌ی اصلی؛ تایپ‌دار، پایدار و قابل ویرایش توسط LLM
بلوک انسان (Human block) «حافظه‌ی کاربر» فکت‌های مربوط به کاربر، سنجاق‌شده در حافظه‌ی اصلی
بلوک پرسونا (Persona block) «هویت ایجنت» خودانگاره، لحن و محدودیت‌ها؛ سنجاق‌شده در حافظه‌ی اصلی
محاسبات زمان خواب (Sleep-time compute) «کار ناهمگام روی حافظه» ایجنت ثانویه‌ای که یکپارچه‌سازی را خارج از مسیر بحرانی انجام می‌دهد
اصلی / بازخوانی / آرشیوی «لایه‌ها» تفکیک سه‌لایه‌ای حافظه: همیشه قابل‌مشاهده / گفت‌وگو / خارجی
سقف بلوک (Block limit) «محدودیت ظرفیت» سقف کاراکتر برای هر بلوک؛ عاملی برای اجبار به خلاصه‌سازی
استدلال بومی (Native reasoning) «کانال تفکر» خروجی استدلال در سطح ارائه‌دهنده‌ی مدل، نه قالب پرامپتیِ Thought:
بافتار آموخته‌شده (Learned context) «خروجی زمان خواب» فکت‌هایی که ایجنت زمان خواب در بلوک‌های مشترک می‌نویسد

برای مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسسه لایه‌ی حافظه در Letta کدامند؟
  2. پیش از درسمحاسبات زمان خواب (sleep-time compute) کدام چالش محیط پروداکشن را هدف قرار می‌دهد؟
  3. حین درسکدام ویژگی، فیلدی از بلوک حافظه در Letta نیست؟
  4. حین درسچرا ایجنت زمان خواب می‌تواند مدلی قوی‌تر از ایجنت اصلی اجرا کند؟
  5. حین درسبلوک‌های Human و Persona به چه الگویی تعمیم می‌یابند؟
  6. پس از درسانحراف پنهان (silent drift) در این الگو چیست؟
  7. پس از درسدر Letta V1 چه چیزی جایگزین توکن‌های درون‌خطی `Thought:` و الگوی send_message/heartbeat شد؟

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

محاسبات زمان خواب (Sleep-time compute) چیست و چه مزیتی دارد؟

روشی است که در آن یک ایجنت ثانویه در پس‌زمینه و خارج از مسیر بحرانی، خلاصه‌سازی و یکپارچه‌سازی حافظه را هنگام بیکاری ایجنت اصلی انجام می‌دهد تا کاربر معطل پردازش‌های حافظه نشود.

سه لایه‌ی حافظه در Letta کدامند؟

لایه‌ی اصلی (Core) که همواره در پرامپت است، لایه‌ی بازخوانی (Recall) که تاریخچه‌ی تعاملات را نگه می‌دارد، و لایه‌ی آرشیوی (Archival) که داده‌های متنی، برداری یا گرافی خارجی را ذخیره می‌کند.

چرا در پردازش زمان خواب می‌توان از مدلی قدرتمندتر استفاده کرد؟

چون کاربر منتظر پاسخ نمی‌ماند و محدودیت زمان پاسخ‌دهی (Latency) وجود ندارد؛ بنابراین استفاده از مدلی کندتر، دقیق‌تر و گران‌تر برای فشرده‌سازی اطلاعات توجیه‌پذیر است.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.