توسعهدهندگانی که برای ایجنتهای هوش مصنوعی حافظه میسازند، خیلی زود با یک بنبست روبهرو میشوند: پایگاه دادههای برداری برای پرسشهای معنایی عالی هستند اما در بازیابی فکتهای ساده مثل شماره تماس کاربر ضعف دارند؛ از طرفی پایگاههای کلید-مقدار در واکشی سریع فکتها بینقص عمل میکنند اما ارتباطات میان موجودیتها را درک نمیکنند. اتکا به یک مدل ذخیرهسازی، ایجنت را در بیشتر سناریوهای پروداکشن به خطا میاندازد.
الگوی حافظهی ترکیبی (Hybrid Memory) این مشکل را با اجرای همزمان سه ساختار برداری، گرافی و کلید-مقدار حل میکند. در این رویکرد، دادهها همزمان در هر سه پایگاه ذخیره میشوند و یک لایهی رتبهبندی تلفیقی با ترکیب سه مؤلفهی ارتباط، اهمیت و تازگی، بهترین کانتکست را در اختیار مدل قرار میدهد. این الگو پایهی اصلی ابزارهای مدرنی مانند Mem0 به شمار میرود.
اگر برای تست و پیادهسازی تمرینهای این درس به مدلهای امبدینگ یا مدلهای زبانی خارجی دسترسی مستقیم ندارید، کارتهای بانکی ایرانی قابلیت پرداخت ارزی برای سرویسهایی مثل OpenAI را ندارند و برخی ارائهدهندگان ابری نیز دسترسی کاربران با IP ایران را محدود کردهاند. برای حل این مشکل میتوانید از مدلهای سبکِ قابل اجرا روی سیستم محلی مانند Ollama استفاده کنید یا با استفاده از گیتویهای داخلی سازگار با فرمت APIهای استاندارد، مراحل استخراج فکت و ارزیابی را جلو ببرید.
حافظهی ترکیبی (Hybrid memory) سه پایگاه داده را بهصورت همزمان اجرا میکند: پایگاه برداری برای شباهت معنایی، پایگاه کلید-مقدار (KV) برای واکشی سریع فکتها، و پایگاه گرافی برای استدلال روی روابط میان موجودیتها؛ این ساختار با یک لایهی امتیازدهی همراه است که هنگام بازیابی، نتایج را با یکدیگر تلفیق میکند. این الگو برای حافظهی خارجی در محیطهای پروداکشن بسیار پرکاربرد است و Mem0 (چیکارا و همکاران، 2025) یکی از پیادهسازیهای مرجع آن به شمار میرود.
اهداف یادگیری
- توضیح دهید چرا استفاده از یک پایگاه دادهی تنها (فقط برداری، فقط گرافی یا فقط KV) برای حافظهی ایجنت کافی نیست.
- سه پایگاه دادهی موازی در Mem0 و هدف بهینهسازی هر کدام را نام ببرید.
- سازوکار امتیازدهی تلفیقی Mem0 (ارتباط، اهمیت و تازگی) و دلیل استفاده از مجموع وزنی بهجای ساختار سلسلهمراتبی را شرح دهید.
- یک حافظهی سه پایگاهی نمونه را با کتابخانهی استاندارد پایتون (stdlib) پیادهسازی کنید؛ بهطوریکه تابع
add()در هر سه پایگاه بنویسد و تابعsearch()نتایج آنها را تلفیق کند.
صورت مسئله
هر پایگاه داده تنها برای یکی از سه دستهی پرسوجو مناسب است:
- شباهت معنایی — «هفتهی پیش دربارهی انحراف ایجنت (agent drift) چه گفتوگویی داشتیم؟» پایگاه برداری برنده است؛ KV و گراف پاسخ درستی نمیدهند.
- جستجوی فکت — «شمارهتلفن کاربر چیست؟» پایگاه KV برنده است؛ پایگاه برداری منابع را هدر میدهد و گراف هم بیش از حد سنگین است.
- استدلال روی روابط — «کدام مشتریان طرف حساب مالیِ مشترکی دارند؟» پایگاه گرافی برنده است؛ پایگاههای برداری و KV توان پاسخگویی به آن را ندارند.
ایجنتها در محیط پروداکشن در طول یک نشست (session) هر سه نوع پرسوجو را صادر میکنند. حافظهای که فقط به یک پایگاه داده متکی باشد، در دو مورد از این سه سناریو همیشه شکست میخورد. دستاورد Mem0، قرار دادن هر سه پایگاه داده پشت یک رابط یکپارچهی add/search به همراه یک تابع امتیازدهی است که نتایج آنها را تلفیق میکند.
مفهوم
سه پایگاه داده بهصورت موازی
فرایند تابع add(text, user_id, metadata) در پلتفرم Mem0 (منبع arXiv:2504.19413، آوریل 2025):
- استخراج فکتهای کاندید از متن (مرحلهای با هدایت LLM).
- ثبت هر فکت در پایگاه برداری (امبدینگ) برای جستجوی معنایی.
- ثبت هر فکت در پایگاه KV با کلید (user_id, fact_type, entity) برای جستجوی .
- ثبت هر فکت در پایگاه گرافی (Mem0g) بهشکل یالهای نوعدار (typed edges) برای پرسوجوهای رابطهای.
فرایند تابع search(query, user_id):
- پایگاه برداری، k مورد برتر را بر اساس شباهت کسینوسی امبدینگ برمیگرداند.
- پایگاه KV، تطابقهای مستقیم را بر اساس سهگانهی استخراجشده از پرسوجو (user_id, type, entity) برمیگرداند.
- پایگاه گرافی، زیرگراف در دسترس از موجودیتهای پرسوجو را برمیگرداند.
- لایهی امتیازدهی، این سه نتیجه را تلفیق میکند.
امتیازدهی تلفیقی
score = w_relevance * relevance(q, record)
+ w_importance * importance(record)
+ w_recency * recency(record)
- ارتباط (Relevance) — شباهت کسینوسی بردار، تطابق دقیق در KV، وزن مسیر در گراف.
- اهمیت (Importance) — برچسبگذاریشده هنگام نوشتن یا یادگیریشده (برخی فکتها اهمیت بیشتری دارند: نامها، شناسهها، خطمشیها).
- تازگی (Recency) — کاهش نمایی (exponential decay) با گذشت زمان از آخرین خواندن یا نوشتن.
وزنها بر اساس نوع محصول تنظیم میشوند. برای ایجنتهای گفتوگویی، w_recency بالاتر؛ برای ایجنتهای انطباق با قوانین (compliance)، w_importance بالاتر؛ و برای ایجنتهای بازیابی، w_relevance بالاتری در نظر گرفته میشود.
Mem0g و استدلال زمانی
Mem0g مجهز به یک شناساگر ناسازگاری است. زمانی که فکت جدیدی با یک یال موجود تناقض داشته باشد، یال قبلی نامعتبر علامتگذاری میشود اما حذف نخواهد شد. پرسوجوهای زمانی («شهر محل سکونت کاربر در ماه مارس چه بود؟») زیرگرافی را پیمایش میکنند که در آن مقطع زمانی معتبر بوده است.
این همان رفتار سازگار با استانداردهای انطباق است که الگوی ابطال (invalidation pattern) در Letta آن را تعمیم میدهد.
ارقام بنچمارک
بر اساس گزارش مقالهی Mem0 (سال 2025):
- LoCoMo (حافظهی گفتوگوهای طولانی): 91.6
- LongMemEval (حافظهی رویدادی افقبلند): 93.4
- BEAM 1M (بنچمارک حافظه با 1M توکن): 64.1
خطوط مبنای مقایسهای (LLM با کانتکست کامل 128k، پایگاه برداری ساده، پایگاه KV ساده) همگی با بیش از 10 امتیاز اختلاف شکست میخورند. بنچمارکها بهتنهایی دلیل انتخاب یک ابزار نیستند — معماری عملیاتی نیز تعیینکننده است — اما این آمارها نشان میدهند که الگوی تلفیق، تفاوتی اساسی ایجاد میکند و حاصل خطای محاسباتی نیست.
دستهبندی دامنهها
Mem0 حافظه را بر اساس دامنه (scope) تفکیک میکند:
- حافظهی کاربر (User memory) — میان نشستها باقی میماند و بر اساس
user_idکلید میخورد. - حافظهی نشست (Session memory) — فقط درون یک رشتهگفتوگو (thread) ماندگار است.
- حافظهی ایجنت (Agent memory) — وضعیت اختصاصی هر نمونه از ایجنت.
در هر عملیات نوشتن، یک دامنه انتخاب میشود. سیستم بازیابی میتواند با در نظر گرفتن وزنهای اختصاصی هر دامنه، در میان آنها پرسوجو کند. ترکیب بیمحابای دامنهها همان خطایی است که حوادثی مثل «دستیار اطلاعات پروژهی باب را به آلیس گفت» به بار میآورد.
نقاط شکست این الگو
- انحراف امبدینگ (Embedding drift): نتایج پایگاه برداری که در صد پرسوجوی اول کاملاً درست به نظر میرسند، با بزرگتر شدن مجموعهی دادهها افت کیفیت پیدا میکنند. برای رفع این مشکل، امبدینگ N رکورد پرکاربرد را بهصورت دورهای دوباره تولید کنید.
- توسعهی بیرویهی اسکیمای KV (KV schema creep): ساختار
(user_id, type, entity)در ابتدا ساده به نظر میرسد، تا زمانی که هر تیمtypeاختصاصی خود را اضافه کند. مجموعهی این تایپها را بهصورت فصلی ممیزی کنید. - انفجار گراف (Graph explosion): یک ماژول استخراجکنندهی پر از نویز میتواند بهازای هر پیام 50 یال اضافه کند. تعداد نوشتنهای گراف را در هر فراخوانی
addمحدود کنید؛ همچنین یالهای با ضریب اطمینان پایین را نادیده بگیرید.
پیادهسازی عملی
فایل code/main.py الگوی سه پایگاهی را با کتابخانهی استاندارد پیادهسازی میکند:
VectorStore— شباهت ابتدایی بر پایهی همپوشانی توکنها بهعنوان جایگزین امبدینگ.KVStore— دیکشنری با کلید(user_id, fact_type, entity).GraphStore— یالهای نوعدار (فاعل، رابطه، مفعول، اعتبار).Mem0— اینترفیس سطح بالا با متدهایadd()وsearch()، امتیازدهی تلفیقی و بازیابی آگاه از دامنه.- ردگیری محاسبات روی یک گفتوگوی چندکاربره و چندنشستی.
اجرای برنامه:
python3 code/main.py
خروجی برنامه سه مسیر بازخوانی مجزا را همراه با k نتیجهی برترِ تلفیقشده نمایش میدهد. وزنهای امتیازدهی را در بالای تابع main() تغییر دهید تا تغییر رتبهبندی را مستقیماً ببینید.
استفاده در عمل
- Mem0 (مجوز Apache 2.0) — آمادهی استفاده در محیط پروداکشن. میتوانید آن را با ترکیبی از Postgres + Qdrant + Neo4j روی سرورهای خود میزبانی کنید، یا سراغ سرویس ابری مدیریتشدهی آن بروید.
- Letta — ساختار سه لایهی هسته/بازخوانی/آرشیو؛ با قابلیت اتصال پایگاههای دادهی برداری و گرافی دلخواه.
- Zep — جایگزین تجاری همراه با گراف دانش زمانی و ماژول استخراج فکت.
- پیادهسازیهای اختصاصی — مناسب زمانی که نیازمند کنترل دقیق روی ماژول استخراج (برای الزامات انطباق) یا وزنهای تلفیقی هستید (مثل ایجنتهای صوتی که در آنها مؤلفهی تازگی حاکم است).
تحویل نهایی
فایل outputs/skill-hybrid-memory.md ساختار اولیهی یک حافظهی سه پایگاهی را همراه با امتیازدهندهی تلفیقی، دستهبندی دامنهها و سیستم ابطال زمانی تولید میکند.
تمرینها
- شباهت برداری سادهی این درس را با یک مدل امبدینگ واقعی (مانند sentence-transformers، Ollama یا OpenAI embeddings) جایگزین کنید. شاخص recall@10 را روی یک گفتوگوی طولانیِ ساختگی بسنجید. آیا پس از 1000 عملیات نوشتن، رتبهبندی دچار انحراف میشود؟
- یک پرسوجوی زمانی به سیستم اضافه کنید:
search(query, as_of=timestamp). فقط رکوردهایی را برگردانید که در زمان مشخصشده یا قبل از آن معتبر بودهاند. پیادهسازی این ویژگی در کدام پایگاه داده نیازمند تغییرات بیشتری است؟ - یک شناساگر ناسازگاری پیادهسازی کنید: اگر فکت ورودی با یالی در گراف تناقض داشت، یال قبلی را باطل کرده و هر دو را ثبت کنید. این سناریو را تست کنید: «کاربر در برلین زندگی میکند» -> «کاربر در لیسبون زندگی میکند».
- تابع امتیازدهی تلفیقی را طوری بازنویسی کنید که بُعد
user_feedback(لایک یا بازخورد مثبت کاربر به رکوردهای بازیابیشده) را هم شامل شود. چطور مانع از سوءاستفادهی سیستم میشوید (اینکه ایجنت فقط رکوردهایی را بازگرداند که قبلاً لایک گرفتهاند)؟ - مستندات Mem0 را بخوانید (
docs.mem0.ai). این پیادهسازی نمونه را با فراخوانیهای کلاینتmem0بازنویسی کنید. کیفیت بازیابی هر دو را روی 20 پرسوجوی آزمایشیِ یکسان مقایسه کنید.
اصطلاحات کلیدی
| اصطلاح | در گفتوگوها چه میگویند | در عمل واقعاً چیست |
|---|---|---|
| حافظهی ترکیبی (Hybrid memory) | «بردار بهعلاوهی گراف بهعلاوهی KV» | سه پایگاه داده که موازی نوشته و هنگام بازیابی تلفیق میشوند |
| استخراج فکت (Fact extraction) | «ورود داده به حافظه» | مرحلهای در LLM که متن را به تاپلهای (موجودیت، رابطه، فکت) خرد میکند |
| امتیازدهی تلفیقی (Fusion scoring) | «رتبهبندی ارتباط» | مجموع وزنیِ ارتباط، اهمیت و تازگی |
| دامنه (Scope) | «فضای نام حافظه» | کاربر / نشست / ایجنت — مشخص میکند چه کسی چه چیزی را ببیند |
| Mem0g | «گراف حافظه» | یالهای نوعدار با اعتبار زمانی مشخص برای پرسوجوهای رابطهای |
| ابطال زمانی (Temporal invalidation) | «حذف نرم (Soft delete)» | علامتگذاری یالهای متناقض بهعنوان نامعتبر؛ بدون حذف واقعی آنها |
| انحراف امبدینگ (Embedding drift) | «فرسایش بازیابی» | افت کیفیت نتایج برداری با رشد مجموعهی دادهها؛ نیازمند بازتولید دورهای امبدینگها |
برای مطالعهی بیشتر
- Chhikara et al., Mem0 (arXiv:2504.19413) — مقالهی اصلی
- مستندات Mem0 — رابط برنامهنویسی پروداکشن، SDKها و فضای ابری مدیریتشده
- Packer et al., MemGPT (arXiv:2310.08560) — ایدهی پیشین بر پایهی کانتکست مجازی
- پست وبلاگی بلوکهای حافظه در Letta — معماری همخانواده با طراحی سه سطحی
