nabuguidesبازگشت به همهٔ راهنماها ←
هوش مصنوعی · حافظه · لنگ‌گراف · کنترل

حافظهٔ ایجنت چیه و چرا نباید همه‌چی رو یادش بمونه؟

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

حدود ۹ دقیقه مطالعهاز خیلی ساده تا فنیبا مثال واقعی
بنر حافظهٔ ایجنت با دفتر گفتگو، کمد حافظه و گاوصندوق قوانین امنیتی
خلاصهٔ خیلی کوتاهحافظهٔ خوب یعنی ایجنت فقط چیز مفید و تأییدشده رو، برای آدم درست، تا زمان مشخص نگه داره. «همه‌چی رو یادت بمونه» طراحی خوب نیست؛ فقط انبارکردن بی‌حساب اطلاعاته.
بررسی‌شده با مستندات رسمی · ۳ سپتامبر ۲۰۲۶

اول یه مرور سی‌ثانیه‌ای

این مقاله روی چندتا چیزی که قبلاً ساختیم سوار می‌شه. اگر تازه رسیدی، لازم نیست همه رو یک‌جا بخونی؛ هرکدوم برات ناآشناست بازش کن.

حافظه یعنی مدل واقعاً تو رو «می‌شناسه»؟

نه دقیقاً. مدل مثل آدم خاطره رو داخل مغزش نگه نمی‌داره. اپلیکیشن یه سری اطلاعات رو جایی ذخیره می‌کنه و هر وقت لازم شد، بخش مرتبطش رو دوباره جلوی مدل می‌ذاره. مدل هم براساس همون چیزی که الان می‌بینه جواب می‌ده.

مثل میز کار و کمد بایگانی

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

انتخاب چند کارت مرتبط از کمد بزرگ حافظه و گذاشتن آن‌ها روی میز کوچک اطلاعات فعلی
کمد بزرگ، میز کوچک: همهٔ حافظه یک‌جا جلوی مدل نمیاد؛ فقط چند تکهٔ مرتبط باید وارد فضای کاری فعلی بشن.

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

این پنج‌تا رو با هم قاطی نکن

اسمبه زبان سادهچقدر می‌مونه؟مثال
پنجرهٔ اطلاعات مدل Context windowچیزی که مدل همین الان می‌بینهتا وقتی داخل ورودی همون اجراستپیام‌های اخیر و چند حافظهٔ بازیابی‌شده
وضعیت کار Stateدفتر وضعیت کار فعلیتا پایان همان روند کاریفهرست فایل‌ها، پیشنهاد مرتب‌سازی و جواب ابزار
نقطهٔ ذخیره Checkpointنسخهٔ ذخیره‌شده از وضعیت کاربسته به محل ذخیره‌سازیایجنت بعد از تأیید تو از همان مرحله ادامه بده
حافظهٔ بلندمدت Long-term memoryاطلاعات انتخاب‌شده بین چند گفتگوتا زمان حذف یا انقضاترجیح تو برای اسم‌گذاری پوشه‌ها
گزارش رویدادها Audit logمدرک اینکه چه اتفاقی افتادهطبق سیاست نگه‌داریچه پیشنهادی داده شد، کی تأیید کرد و نتیجه چی شد
گزارش رویدادها، حافظهٔ شخصی ایجنت نیست

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

توی لنگ‌گراف، حافظه معمولاً دو لایه داره

ذخیره‌کنندهٔ مرحله

حافظهٔ کوتاه‌مدتِ یک مسیر گفتگو

ذخیره‌کنندهٔ مرحله یا Checkpointer، وضعیت کار رو قدم‌به‌قدم نگه می‌داره. با شناسهٔ همان گفتگو که در کد thread_id نام دارد، می‌تونی کار نیمه‌تمام رو ادامه بدی. وقتی کار برای تصمیم یک آدم متوقف می‌شه، همین بخش یادش می‌مونه کجا ایستاده بود.

مخزن حافظه

حافظهٔ بلندمدت بین چند گفتگو

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

این حافظه چه فرقی با Vercel و دیتابیس داره؟

InMemorySaver و InMemoryStore فقط ابزارهای موقت خود لنگ‌گراف هستن. تا وقتی برنامه روشنه، وضعیت کار و اطلاعات ایجنت رو داخل حافظهٔ موقت دستگاه نگه می‌دارن؛ با خاموش یا دوباره اجراشدن برنامه هم پاک می‌شن.

اگر قبلاً برنامه‌ات رو روی Vercel ساخته باشی، احتمالاً این اسم‌ها رو ندیدی؛ چون Vercel محل اجرای برنامه‌ست، نه حافظهٔ ایجنت. معمولاً وضعیت کارها رو خودمون با بخش‌های مختلف برنامه و دیتابیس مدیریت می‌کنیم؛ درست مثل مسیری که در Jarvis ساختیم.

برای تمرین روی کامپیوتر خودت، InMemorySaver کافیه. برای ذخیرهٔ دائمی روی همان کامپیوتر می‌شه از SQLite استفاده کرد. برای یک برنامهٔ آنلاین هم معمولاً باید لنگ‌گراف رو به یک دیتابیس خارجی مثل Postgres یا Redis وصل کرد.

خلاصه: لنگ‌گراف این مسیر رو اختراع نمی‌کنه؛ فقط چیزی رو که قبلاً با چند بخش برنامه، شرط و دیتابیس می‌ساختیم، مرتب‌تر و استانداردتر مدیریت می‌کنه.

اگر هرکدوم از این اصطلاح‌ها هنوز برات گنگه، همون بخش رو کپی کن داخل هوش مصنوعی موردعلاقه‌ات و آخرش بنویس: «مثل یک بچهٔ پنج‌ساله برام توضیح بده؛ یک مثال روزمره هم بزن.» اسم کوتاه این مدل درخواست هم ELI5 است.

سه جور چیزی که ایجنت ممکنه یاد بگیره

حافظهٔ دانشی

واقعیت و سلیقه

مثلاً «کاربر جواب محاوره‌ای می‌خواد» یا «عکس‌های صفحه باید برن داخل پوشهٔ مخصوص خودشون». اسم فنی این نوع حافظه Semantic است.

حافظهٔ تجربه‌ها

تجربهٔ قبلی

مثلاً دفعهٔ قبل این روش مرتب‌سازی خوب جواب داد و کاربر بدون تغییر تأییدش کرد. اسم فنی‌اش Episodic است.

حافظهٔ روش‌ها

روش انجام کار

مثلاً قبل از جابه‌جایی فایل‌ها اول یک پیش‌نمایش بساز و هیچ‌وقت فایل رو پاک نکن. اسم فنی‌اش Procedural است.

این دسته‌بندی کمک می‌کنه بفهمی دقیقاً چی داری ذخیره می‌کنی. ولی هر سه یه سطح ریسک ندارن. سلیقهٔ رنگ پوشه حساس نیست؛ قانون اجرای تراکنش یا دستور امنیتی چرا.

قانون‌های اصلی رو داخل حافظه‌ای که ایجنت می‌تونه تغییر بده نذار

فرض کن قانون سیستم می‌گه ایجنت بیشتر از ۱۰ دلار حق خرج‌کردن نداره. اگر خود ایجنت بتونه این عدد رو در حافظه تغییر بده، خیلی راحت قانون امنیتی رو دور می‌زنه. پس قانون‌های اصلی باید نسخهٔ مشخص داشته باشن، محدود باشن و ایجنت اجازهٔ نوشتن یا تغییرشون رو نداشته باشه.

این اصطلاح‌ها یعنی چی؟
سلیقهٔ ذخیره‌شده Preference

چیزی مثل زبان، لحن یا پوشهٔ موردعلاقهٔ تو. تغییرش معمولاً خطر امنیتی نداره.

قانون امنیتی Policy

قانونی مثل سقف خرج یا فهرست مقصدهای مجاز. ایجنت باید ازش پیروی کنه و نباید بتونه خودش تغییرش بده.

دارای نسخهٔ مشخص Versioned

یعنی هر تغییر قانون شماره و تاریخ داشته باشه تا معلوم باشه چه کسی، چه زمانی و چرا تغییرش داده.

اجازهٔ نوشتن Write access

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

فرقشان در یک مثال

«جواب کوتاه دوست دارم» یک سلیقهٔ ذخیره‌شده است. «بیشتر از ۱۰ دلار خرج نکن» یک قانون امنیتی است. اولی می‌تونه در حافظه تغییر کنه؛ دومی باید بیرون از دسترس ایجنت بماند.

مثال واقعی: ایجنت مرتب‌کنندهٔ دسکتاپ

فرض کن همون ایجنت سادهٔ قبلی رو ارتقا دادیم. فایل‌ها رو می‌بینه، پیشنهاد می‌ده کجا برن و بعد از تأیید تو جابه‌جاشون می‌کنه. هر نوع اطلاعات باید جای درست خودش بره:

یک کار؛ چهار جای متفاوت برای اطلاعاتهر چیزی که ایجنت می‌بیند نباید تبدیل به حافظهٔ دائمی شود.
داخل وضعیت همین کار

فهرست فایل‌های همین اجرا، دسته‌بندی پیشنهادی و جواب «تأیید یا رد» تو.

داخل حافظهٔ بلندمدت

سلیقهٔ تأییدشدهٔ تو: عکس‌های صفحه برن داخل پوشهٔ مخصوص خودشون.

داخل گزارش رویدادها

چه فایل‌هایی واقعاً جابه‌جا شدن، چه کسی تأیید کرد و راه برگردوندن تغییرها کجاست.

هیچ‌جا ذخیره نشه

رمز فایل فشرده، کلید موقت، کد یک‌بارمصرف یا متن خصوصی‌ای که برای این کار لازم نیست.

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

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

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

ورودیحرف کاربر یا نتیجهٔ کار
←
پیشنهاد برای ذخیرهشاید ارزش نگه‌داشتن داشته باشه
←
بررسیمنبع و حساسیت
←
محدوده و زمانبرای کی و تا کی؟
←
ذخیرهدر محدودهٔ جدا
اطلاعات حساس یا تغییر مهم؟ قبل از ذخیره از آدم اجازه بگیر؛ حدس مدل را هم به‌عنوان واقعیت قطعی ثبت نکن.
فیلتر ورودی حافظه برای اطلاعات عادی، اطلاعات حساس و قوانین امنیتی
هر ورودی یک مسیر نداره: سلیقهٔ عادی می‌تونه ذخیره بشه، اطلاعات حساس به اجازه نیاز داره و قانون امنیتی باید بیرون از حافظهٔ قابل‌ویرایش ایجنت بمونه.
چی ذخیره می‌شه؟

واقعیت، سلیقه، تجربه یا دستور؟

مال کیه؟

همین کاربر، یک ایجنت یا کل سازمان؟

تا کی می‌مونه؟

یک ساعت، سی روز یا تا وقتی کاربر حذفش کنه؟

کی می‌تونه عوضش کنه؟

ایجنت، کاربر یا فقط مدیر سیستم و مسیر تغییر قانون‌ها؟

یک نمونهٔ خیلی کوچک در لنگ‌گراف

لازم نیست با دیدن کد پایین همهٔ خط‌ها رو بفهمی. اول فقط کاری که انجام می‌ده رو ببین؛ بعد اگر خواستی هر نمونه رو باز کن.

بدون کد، کل ماجرا این چهارتاست:

۱. یک دفتر برای همین گفتگویادش می‌مونه کار الان در چه مرحله‌ایه.
۲. یک کمد برای گفتگوهای بعدیچیزهای انتخاب‌شده مثل سلیقهٔ کاربر رو نگه می‌داره.
۳. هر دو رو به ایجنت وصل می‌کنیمتا ایجنت بدونه از کدوم اطلاعات کجا استفاده کنه.
۴. روی هر گفتگو برچسب می‌زنیمتا اطلاعات گفتگوهای مختلف با هم قاطی نشن.
نمونهٔ اول: وصل‌کردن دو نوع حافظهبرای دیدن کد و توضیح خط‌به‌خط کلیک کن
memory_setup.py
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.store.memory import InMemoryStore

checkpointer = InMemorySaver()
store = InMemoryStore()

graph = builder.compile(
    checkpointer=checkpointer,
    store=store,
)

config = {
    "configurable": {"thread_id": "desktop-001"}
}
ذخیره‌کنندهٔ مرحله وضعیت همین گفتگو رو نگه می‌داره؛ مخزن حافظه اطلاعاتی رو نگه می‌داره که باید در گفتگوهای بعدی هم پیدا بشن.
این خط‌ها به زبان ساده
  1. دو ابزار موقت حافظه رو از لنگ‌گراف می‌گیریم.
  2. یکی رو برای نگه‌داشتن مرحلهٔ فعلی و یکی رو برای اطلاعات ماندگارتر می‌سازیم.
  3. با compile هر دو رو به مسیر کار ایجنت وصل می‌کنیم.
  4. با thread_id روی این اجرای مشخص برچسب «desktop-001» می‌زنیم.
نمونهٔ دوم: ذخیره‌کردن یک سلیقهٔ کاربربرای دیدن کد و توضیح خط‌به‌خط کلیک کن
save_one_preference.py
user_id = "user-123"
namespace = (user_id, "desktop_preferences")

store.put(
    namespace,
    "sorting_rules",
    {
        "screenshots_folder": "Screenshots",
        "never_move": ["Invoices"],
    },
)
محدودهٔ جدا جلوی قاطی‌شدن حافظهٔ کاربرها رو می‌گیره؛ البته فقط وقتی شناسهٔ کاربر رو از یک منبع قابل‌اعتماد بگیری، نه از چیزی که داخل درخواست نوشته شده.
این خط‌ها به زبان ساده
  1. به کاربر یک شناسه می‌دیم تا حافظه‌اش با بقیه قاطی نشه.
  2. یک کشوی جدا برای سلیقه‌های مرتب‌سازی دسکتاپش می‌سازیم.
  3. داخل آن می‌نویسیم عکس‌های صفحه کجا برن و پوشهٔ فاکتورها هیچ‌وقت جابه‌جا نشه.
  4. این فقط یک سلیقهٔ ذخیره‌شده است؛ هنوز اجازهٔ جابه‌جایی فایل‌ها رو به ایجنت نمی‌ده.
اگر کد هنوز برات ترسناکه

هیچ اشکالی نداره. اول فقط چهار کارت بالا رو بفهم. بعد یکی از نمونه‌ها رو همراه توضیحش داخل هوش مصنوعی کپی کن و بگو: «این کد رو خط‌به‌خط و با مثال دفتر و کمد برام توضیح بده.»

شش اشتباه رایج که حافظه رو خراب می‌کنه

این کارها دردسر می‌سازن

  • کل گفتگوها رو بدون انتخاب نگه داری
  • حافظهٔ چند کاربر رو توی یک محدوده بریزی
  • حدس مدل رو واقعیت قطعی حساب کنی
  • هیچ راهی برای دیدن و حذف حافظه ندی
  • همهٔ حافظه‌ها رو هر بار جلوی مدل بریزی
  • قانون امنیتی رو به حافظهٔ قابل‌ویرایش بسپری

طراحی بهتر این شکلیه

  • فقط چیز لازم و تأییدشده رو ذخیره کن
  • برای هر کاربر و هر برنامه محدودهٔ جدا داشته باش
  • منبع، زمان و میزان اطمینان رو کنار حافظه نگه دار
  • زمان نگه‌داری و گزینهٔ اصلاح یا حذف مشخص کن
  • فقط چند حافظهٔ مرتبط رو دوباره جلوی مدل بیار
  • مجوز و قانون‌های امنیتی رو بیرون از حافظه نگه دار
چرخهٔ ورود، ذخیره، بازیابی، اصلاح و حذف اطلاعات از حافظهٔ ایجنت
حافظه فقط ذخیره‌کردن نیست: اطلاعات وارد می‌شن، در زمان مناسب برمی‌گردن، اصلاح می‌شن و وقتی قدیمی یا بی‌استفاده شدن باید حذف بشن.
مسموم‌کردن حافظه یعنی چی؟

گاهی یک ورودی خراب باعث می‌شه اطلاعات یا دستور اشتباه وارد حافظه بشه و بعداً دوباره روی تصمیم ایجنت اثر بذاره. اسم فنی این حمله Memory poisoning است. به همین دلیل اطلاعاتی که از حافظه برمی‌گردن باید «اطلاعات زمینه‌ایِ قابل‌بررسی» حساب بشن، نه حقیقت مقدس.

حافظه به ایجنت اختیار نمی‌ده

این مهم‌ترین بخش مقاله‌ست. ایجنت ممکنه یادش باشه که تو معمولاً جواب کوتاه دوست داری؛ مشکلی نیست. ولی جمله‌ای مثل «کاربر قبلاً اجازهٔ خرج نامحدود داده» نباید از حافظه تبدیل به مجوز واقعی بشه.

اطلاعاتحافظه می‌تونه کمک کنه؟اختیار نهایی باید کجا باشه؟
لحن و زبان موردعلاقهبله، یک سلیقهٔ معمولیهخود کاربر هر وقت خواست تغییرش بده
پوشهٔ پیشنهادی فایل‌هابله، برای پیشنهاد بهتراجازهٔ دسترسی به فایل‌های کامپیوتر و تأیید عملیات، بیرون از ایجنت
سقف هزینه یا فهرست مقصدهای مجازفقط برای نمایش و توضیحقانونی مستقل، محدود و دارای نسخهٔ مشخص
امضای تراکنشنباید کلید یا عبارت بازیابی رو نگه داردانسان و سخت‌افزار امن
همون قانون قبلی هنوز سر جاشه

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

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

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

حافظهٔ بهتر یعنی انتخاب بهتر؛ نه ذخیرهٔ بیشتر

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

منابع رسمی و به‌روز

ذخیرهٔ وضعیت و حافظه در لنگ‌گراف ↗اضافه‌کردن حافظهٔ کوتاه‌مدت و بلندمدت ↗اطلاعاتی که هنگام اجرا در اختیار مدل قرار می‌گیرد ↗انواع حافظه: دانشی، تجربه‌ها و روش‌ها ↗

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