جلسه ۶ از ۱۱، بخش ۱: طراحی ایجنت

حافظه و قابلیت اطمینان ایجنت

متنی ۳۵ دقیقه به‌روز شده در ۱۰ آبان ۱۴۰۵

در این جلسه
  1. حافظه چیست؟
  2. خط لوله‌ی حافظه
  3. مالک حافظه کیست؟
  4. خرابی‌های حافظه
  5. قابلیت اطمینان: چرا خطاها جمع می‌شوند
  6. خطا از کجا می‌آید؟ پنج لایه
  7. طراحی برای خرابی: خلاصه
  8. پرسش‌هایی برای فکر کردن
  9. منابع

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

حافظه چیست؟#

حافظه حالت پایداری است که بیرون از پنجره‌ی کانتکست نگه داشته می‌شود.

کاربر با هارنس حرف می‌زند و هارنس با LLM. هارنس دو جا برای نگه داشتن اطلاعات دارد:

هارنس
┤── پنجره‌ی کانتکست: حالت کاری موقت
┘── مخزن حافظه: حالت پایدار بین تعامل‌ها

در جلسه‌ی ۲ ساده‌ترین شکلش را دیدیم: فایل‌های CLAUDE.md. اما طراحی حافظه در واقع مجموعه‌ای از تصمیم‌های سیاستی است، هر کدام برای یک مرحله.

خط لوله‌ی حافظه#

اسلاید این تصمیم‌ها را در شش محور و یک پرسش هفتم خلاصه می‌کند:

محور سؤال سیاستی عمل
تصمیم آیا ارزش نگه داشتن دارد؟ بنویس یا رد کن (WRITE / SKIP)
شکل به چه چیزی تبدیل شود؟ رمزگذاری و سازمان‌دهی (ENCODE / ORGANIZE)
پشتیبان کجا نگه داشته شود؟ ذخیره (STORE)
کار آیا این کار به آن نیاز دارد؟ بازیابی (RETRIEVE)
درس چه درس کلی‌تری از آن می‌آید؟ بازتاب و تعمیم (REFLECT / GENERALIZE)
وضعیت هنوز معتبر است؟ نگه دار، به‌روز کن یا پاک کن (KEEP / UPDATE / DELETE)

و پرسش هفتم که جدا از این خط لوله است: مالک حافظه کیست؟ (پایین‌تر به آن می‌رسیم.)

بقیه‌ی این بخش همین محورها را به ترتیب باز می‌کند.

کی چیزی حافظه شود؟#

یک طیف داریم: از «همه‌چیز را بنویس» (یادآوری بالا، نویز زیاد) تا «انتخابی بنویس» (دقت بالا). راه‌های انتخابی نوشتن، از صریح به ضمنی:

  1. درخواست صریح کاربر: «این را یادت بماند»
  2. قواعد قطعی، مثلاً هر وقت کاربر اشتباهی را اصلاح کرد
  3. یک دسته‌بند کوچک
  4. بازبینی دوره‌ای با LLM

به چه شکلی؟#

یک واقعیت واحد را در چهار شکل ببینید: «سرو مدل را از vLLM به SGLang بردیم».

شکل نمونه مزیت عیب
رویداد خام «سرو را از vLLM به SGLang بردیم» وفاداری کامل حجیم و تکراری
خلاصه‌ی بدون ساختار «از SGLang برای سرو استفاده می‌کند» فشرده کانتکست از دست می‌رود
حالت ساخت‌یافته {"serving_engine": "SGLang"} قابل کوئری شِما محدودش می‌کند
گراف دانش Project ─USES→ SGLang رابطه‌ها و تغییر در زمان پیچیدگی

کجا؟#

ذخیره‌ساز نمونه مناسب برای
فایل ساده CLAUDE.md، یادداشت بازبینی، diff و جستجوی آسان
کلید-مقدار یا رابطه‌ای Redis، SQLite، Postgres JSONB جستجوی دقیق، فیلتر، تراکنش
پایگاه داده‌ی برداری pgvector، Chroma، Pinecone جستجوی شباهت معنایی
پایگاه داده‌ی گراف Neo4j، FalkorDB رابطه‌ها و پیمایش چندمرحله‌ای

کی از حافظه استفاده شود؟#

  • خودکار: در هر نوبت جستجو و افزودن. قابل پیش‌بینی، اما تأخیر و کانتکست نامربوط اضافه می‌کند.
  • کنترل با runtime: هارنس با قاعده تصمیم می‌گیرد. انتخابی و کارا، اما قاعده یا دسته‌بند لازم دارد.
  • کنترل با مدل: مدل ابزارهای search_memory، add_memory، update_memory و forget_memory را صدا می‌زند. بر اساس نیاز است، اما ممکن است خواندن یا نوشتن مفیدی را از قلم بیندازد.

بیشتر سیستم‌ها ترکیبی‌اند و سیاست خواندن و نوشتن را جدا تعیین می‌کنند.

بازیابی فقط شباهت معنایی نیست#

خط لوله‌ی ساده این است: کوئری ← جستجوی برداری ← k مورد برتر ← پرامپت. اما شباهت فقط یکی از سیگنال‌هاست:

  • دامنه: همان کاربر، پروژه یا کار؟
  • اهمیت: نبودنش چقدر هزینه دارد؟
  • اعتبار: الان و برای این کار هنوز درست است؟
  • منشأ: از کجا آمده و چقدر قابل اعتماد است؟

زمان اعتبار و منشأ#

آوریل ۲۰۲۶: «پروژه با vLLM سرو می‌شود»   → جایگزین شده
ژوئن  ۲۰۲۶: «پروژه با SGLang سرو می‌شود»  → فعلی (منبع: رویداد ۲۸)

همین را در گراف دانش این‌طور می‌نویسند؛ یال هم زمان اعتبار دارد و هم منبع:

Project ──SERVES_WITH──► vLLM     valid: Apr 2026 → Jun 2026 (superseded)
Project ──SERVES_WITH──► SGLang   valid: Jun 2026 → present
                                   source: Episode 28
                                   "We moved serving from vLLM to SGLang."

بدون زمان اعتبار نمی‌دانید کدام واقعیت جدیدتر است. بدون منشأ نمی‌دانید به آن اعتماد کنید یا نه. حافظه‌ی خوب هر دو را ثبت می‌کند.

فراموشی یک عمل اصلی است#

دلیل‌های فراموش کردن: اطلاعات کهنه، نادرست یا متناقض، حریم خصوصی و امنیت، و هزینه‌ی ذخیره و بازیابی. ابزارهایش: علامت‌گذاری «نامعتبر»، پاک کردن دائمی، انقضا با TTL، و لایه‌بندی که حافظه‌ی کم‌استفاده را از حافظه‌ی فعال بیرون می‌برد.

تعمیم و یکپارچه‌سازی#

اگر کاربر بارها درباره‌ی vLLM، SGLang، TRT-LLM و زمان‌بندی LLM پرسیده، می‌شود این تعمیم را ساخت: «علاقه‌ی مکرر به سیستم‌های استنتاج LLM (اطمینان: متوسط)». کی این کار را بکنیم؟ بعد از جمع شدن شواهد کافی، وقتی واقعیت‌ها تکرار یا تناقض دارند، و تا جای ممکن در یک کار پس‌زمینه.

مالک حافظه کیست؟#

  • حافظه‌ی متعلق به ایجنت: فایل‌هایی که هارنس روی دیسک نگه می‌دارد (CLAUDE.md، یادداشت‌ها). ساده و شفاف.
  • سیستم حافظه‌ی اختصاصی: یک سرویس که ایجنت صدا می‌زند و بین ایجنت‌ها و نشست‌ها مشترک است:
سیستم مدل ذهنی ورودی بازیابی نمونه‌ی حافظه
Mem0 محور واقعیت پیام‌ها، با دامنه‌ی کاربر، ایجنت یا اجرا جستجوی برداری با فیلتر؛ حافظه‌ی گرافی اختیاری «Uses SGLang for model serving.»
Graphiti گراف دانش زمانی رویدادهایی (episode) که از آن‌ها موجودیت و واقعیت زمان‌دار درمی‌آید ترکیبی: معنایی، کلیدواژه‌ای و گرافی uses → SGLang، معتبر از آوریل ۲۰۲۶ تا حالا
supermemory پروفایل، حافظه و سند گفتگوها، همراه با منبع و زمان جستجو در پروفایل، حافظه و اسناد پروفایل کاربر کنار حافظه و اسناد نگه داشته می‌شود

تفاوت دو مدل مالکیت در یک جمله: در اولی هارنس حافظه را روی دیسک می‌نویسد، در دومی حافظه یک API است که بین ایجنت‌ها و نشست‌ها مشترک است.

MemGPT یکی از ایده‌های پایه‌ی این حوزه است: از حافظه‌ی مجازی سیستم‌عامل الهام گرفت. پنجره‌ی کانتکست حکم RAM را دارد و حافظه‌ی بیرونی حکم دیسک. خود مدل با فراخوانی تابع، اطلاعات را بین این دو جابه‌جا می‌کند، مثل page in و page out.

خرابی‌های حافظه#

خرابی نمونه
بازیابی ناموفق حافظه‌ی مربوط هست ولی پیدا نمی‌شود
آلودگی کانتکست حافظه‌های نامربوط زیادی وارد کانتکست می‌شوند
توهم حافظه یک استنباط به‌عنوان واقعیت ذخیره می‌شود: «در هاروارد درس می‌خواند» به «دانشجوی مهمان هاروارد» تبدیل می‌شود
کهنگی واقعیت قدیمی اطلاعات جدید را لغو می‌کند
شکست ایزوله‌سازی حافظه از مرز کاربران عبور می‌کند
تعمیم بیش از حد یک رویداد به یک ترجیح دائمی تبدیل می‌شود
تزریق پرامپت ماندگار محتوای نامطمئن بعدها به‌عنوان دستور برمی‌گردد
رشد بی‌حد هزینه و کیفیت بازیابی با انباشت حافظه بدتر می‌شود

مورد «تزریق ماندگار» خطرناک‌ترین است، چون یک حمله‌ی یک‌باره را دائمی می‌کند. در جلسه‌ی ۹ به آن برمی‌گردیم.

ارزیابی حافظه#

  • نوشتن و به‌روزرسانی: دقت، یادآوری، نرخ حافظه‌ی کهنه
  • بازیابی: دقت و یادآوری
  • سیستم: تأخیر، سربار توکن، رشد حجم
  • حاکمیت: رعایت حذف، ایزوله بودن دامنه‌ها

بنچمارک‌های رایج: LoCoMo (ACL 2024؛ ۱۵۴۰ سؤال روی ۱۰ گفتگوی طولانی) و نسخه‌ی پالایش‌شده‌اش LoCoMo-Refined، LongMemEval (ICLR 2025؛ ۵۰۰ سؤال برای ۵ توانایی حافظه) و BEAM (ICLR 2026؛ ۲۰۰۰ سؤال با کانتکست تا ۱۰ میلیون توکن). این‌ها بیشتر یادآوری و استدلال روی تاریخچه‌ی گفتگو را می‌سنجند: استدلال زمانی، به‌روزرسانی، ترجیحات و اینکه مدل بداند کی نباید جواب بدهد.

پشته‌ی حافظه‌ی ایجنت#

دو چیدمان رایج:

لایه‌ی حافظه‌ی جدا حافظه درون هارنس
runtime ایجنت Claude Code، Letta، Codex Claude Code، Letta، Codex
مدیریت حافظه Mem0، سیستم داخلی Letta، یا سیستم اختصاصی خود runtime
ذخیره‌ساز برداری، SQL، گراف یا object store فایل‌های markdown

چیدمان اول حافظه را بین ایجنت‌ها و نشست‌ها قابل اشتراک می‌کند و چیدمان دوم ساده‌تر و شفاف‌تر است.

چک‌لیست طراحی حافظه#

هر مرحله یک تصمیم سیاستی است:

Observe
  └─ Select              Is this worth remembering?
  └─ Encode / organize   What representation preserves the needed meaning?
  └─ Store               Where should it live? File, database?
  └─ Retrieve            What is useful for the current task?
  └─ Reflect/consolidate Does this update or contradict an old memory?
  └─ Forget              When is information stale or irrelevant?
  • انتخاب: ارزش به خاطر سپردن دارد؟
  • رمزگذاری و سازمان‌دهی: کدام شکل معنای لازم را حفظ می‌کند؟
  • ذخیره: کجا، فایل یا پایگاه داده؟
  • بازیابی: چه چیزی برای کار فعلی مفید است؟
  • بازتاب و یکپارچه‌سازی: این حافظه‌ی قبلی را به‌روز می‌کند یا با آن تناقض دارد؟
  • فراموشی: کی کهنه یا نامربوط می‌شود؟

قابلیت اطمینان: چرا خطاها جمع می‌شوند#

یک اجرا فقط وقتی موفق است که همه‌ی قدم‌ها موفق باشند. اگر هر قدم ۹۵٪ احتمال موفقیت داشته باشد:

تعداد قدم احتمال اجرای بی‌خطا
۱ ۹۵٪
۵ ۷۷٪
۱۰ ۶۰٪
۲۰ ۳۶٪
۵۰ ۸٪ (حدود ۱ از ۱۳)
>>> [round(0.95 ** n, 2) for n in (1, 5, 10, 20, 50)]
[0.95, 0.77, 0.6, 0.36, 0.08]

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

خطا از کجا می‌آید؟ پنج لایه#

اسلاید خطا را بر اساس لایه‌ای که از آن شروع شده دسته‌بندی می‌کند. هر لایه یک پرسش تشخیصی دارد:

لایه چه چیزی را بررسی کنید نوع خرابی
کاربر و تعریف کار آیا هدف بی‌ابهام بود؟ خرابی تعریف
هارنس کانتکست، حلقه، زمان‌بندی خرابی هارنس
LLM استدلال و برنامه‌ریزی خرابی مدل
لایه‌ی ابزار shell، مرورگر، APIها خرابی ابزار
محیط مخزن کد، سیستم‌عامل، وب، سرویس‌ها خرابی محیط

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

۱. تعریف کار#

خرابی نمونه راه‌حل
هدف مبهم «باگ لاگین را درست کن» و از سه باگ، باگ اشتباه درست شد فایل، علامت و روش بازتولید را بگویید
هدف نیابتی «کاری کن تست‌ها پاس شوند» و تست شکسته حذف شد ویرایش تست را ممنوع کنید و diff را بازبینی کنید
قید ناگفته «جستجو را سریع کن» و API عمومی شکست بگویید چه چیزی نباید عوض شود
بدون تعریف «تمام شد» «parser را تمیز کن» و refactor هرگز تمام نشد تست پایان و قاعده‌ی توقف بدهید
اهداف متعارض «کمترین diff و همه‌ی حالت‌های لبه» و حالت‌ها بی‌صدا حذف شدند اولویت‌ها را صریح رتبه‌بندی کنید

۲. هارنس#

خرابی نمونه راه‌حل
برش کانتکست نوبت‌های قدیمی حذف شد و قاعده‌ی «API را نگه دار» فراموش شد قواعد کلیدی را بیرون از پنجره سنجاق کنید
خطای حافظه یادداشت کهنه به‌عنوان واقعیت؛ فایلی که جابه‌جا شده بود ویرایش شد حافظه را تاریخ بزنید و پیش از استفاده دوباره بررسی کنید
خرابی حالت ویرایش نیمه‌کاره ماند و قدم‌های بعد روی فایل خراب ساخته شدند checkpoint و بازگشت
حلقه‌ی کنترل بدون بودجه، ۲۰۰ قدم بدون پیشرفت سقف قدم، هزینه و زمان
انتظار برای همه یک زیرایجنت کند کل اجرا را متوقف کرد timeout و استفاده از نتیجه‌ی جزئی

۳. مدل#

خرابی نمونه راه‌حل
توهم تابعی صدا زده شد که وجود ندارد فراخوانی‌ها را با مستند واقعی بررسی کنید
نقض دستور امضای تابعی که باید ثابت می‌ماند عوض شد قیدها را تکرار و diff را بررسی کنید
استدلال غلط «timeout یعنی شبکه قطع است» و به یک deadlock تلاش مجدد اضافه شد پیش از اصلاح، فرضیه را آزمایش کنید
ناهمخوانی گفتار و عمل گفت فقط parser.py را تغییر می‌دهد ولی سه فایل دیگر را بازنویسی کرد هر عمل را با برنامه مقایسه کنید
موفقیت تأییدنشده «تست‌ها احتمالاً پاس می‌شوند» بدون اجرا خروجی تست را به‌عنوان مدرک بخواهید
افت در مسیر طولانی اصلاح قدم ۱۲ را خودش برگرداند وضعیت را دوباره بخوانید و کار را کوتاه کنید

۴. ابزار#

خرابی نمونه راه‌حل
خروجی بریده فقط ۱۰۰ خط اول لاگ دیده شد و خطای خط ۴۰۰۰ از دست رفت خطاها را اول برگردانید و صفحه‌بندی بدهید
شکست بی‌صدا کد خروج ۰ با نتیجه‌ی خالی به معنای «موردی پیدا نشد» خوانده شد «خالی» را از «شکست» جدا کنید
شِمای مبهم تاریخ بدون منطقه‌ی زمانی و کاری که ۸ ساعت جابه‌جا اجرا شد شِمای صریح و نوع‌دار
فراخوانی ناپایدار با اولین timeout، سرویس مرده اعلام شد تلاش مجدد با backoff پیش از قضاوت
خطای گمراه‌کننده «Permission denied» برای یک غلط تایپی، و تلاش دوباره با sudo خطای دقیق و قابل اقدام

۵. محیط#

خرابی نمونه راه‌حل
حالت کهنه build کش‌شده‌ی دیروز، تست‌ها را روی کد قدیمی پاس کرد build تمیز از کش تازه
ناهمخوانی نسخه پایتون 3.8 به جای 3.12 و کدی که در تولید از کار افتاد نسخه‌ها را در lockfile ثابت کنید
خرابی تصادفی به خاطر سال کبیسه شکست خورد اجرای دوباره و قرنطینه‌ی تست‌های ناپایدار
تغییر صفحه‌ی وب صفحه‌ی پرداخت بازطراحی شد و دکمه‌ی اشتباه زده شد پیش از عمل صفحه را دوباره بخوانید
محدودیت نرخ HTTP 429 بعد از ۵۰ فراخوانی و مهاجرتی که نیمه‌کاره ماند throttle و checkpoint برای کارهای طولانی

طراحی برای خرابی: خلاصه#

لایه اصل در عمل
تعریف کار «تمام شد» را به تست تبدیل کنید تست پذیرش از اول؛ فهرست چیزهایی که نباید عوض شوند
هارنس هر اجرا را محدود کنید سقف قدم، هزینه و زمان؛ checkpoint و بازگشت
مدل مدرک بخواهید تأیید خروجی؛ مدل قوی‌تر برای قدم‌های سخت
ابزار بلند شکست بخورید شِمای نوع‌دار؛ خطای جدا از نتیجه‌ی خالی
محیط ثابت و ایزوله کنید sandbox تازه با نسخه‌های ثابت؛ تلاش دوباره پیش از قضاوت

جمله‌ی پایانی اسلایدهای این جلسه صادقانه است: ما هنوز ایجنت‌ها را در مقیاس بزرگ درک نکرده‌ایم و بهترین روش‌های رسمی کمی وجود دارد. این جدول‌ها نقطه‌ی شروع‌اند، نه پایان.

پرسش‌هایی برای فکر کردن#

  • اگر بتوانید احتمال موفقیت هر قدم را از ۹۵٪ به ۹۹٪ برسانید، احتمال موفقیت یک اجرای ۵۰ قدمی چقدر می‌شود؟ کدام کار ارزان‌تر است: بهبود هر قدم یا کم کردن تعداد قدم‌ها؟
  • کدام خرابی‌های حافظه را در ایجنتی که خودتان استفاده می‌کنید دیده‌اید؟

منابع#