فاز 14 · درس 9

حافظه ترکیبی در ایجنت‌ها: تلفیق بردار، گراف و کلید-مقدار با Mem0

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

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

الگوی حافظه‌ی ترکیبی (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):

  1. استخراج فکت‌های کاندید از متن (مرحله‌ای با هدایت LLM).
  2. ثبت هر فکت در پایگاه برداری (امبدینگ) برای جستجوی معنایی.
  3. ثبت هر فکت در پایگاه KV با کلید (user_id, fact_type, entity) برای جستجوی O(1)O(1).
  4. ثبت هر فکت در پایگاه گرافی (Mem0g) به‌شکل یال‌های نوع‌دار (typed edges) برای پرس‌وجوهای رابطه‌ای.

فرایند تابع search(query, user_id):

  1. پایگاه برداری، k مورد برتر را بر اساس شباهت کسینوسی امبدینگ برمی‌گرداند.
  2. پایگاه KV، تطابق‌های مستقیم را بر اساس سه‌گانه‌ی استخراج‌شده از پرس‌وجو (user_id, type, entity) برمی‌گرداند.
  3. پایگاه گرافی، زیرگراف در دسترس از موجودیت‌های پرس‌وجو را برمی‌گرداند.
  4. لایه‌ی امتیازدهی، این سه نتیجه را تلفیق می‌کند.

امتیازدهی تلفیقی

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 محدود کنید؛ همچنین یال‌های با ضریب اطمینان پایین را نادیده بگیرید.
حافظه ترکیبی (Hybrid)یک پرس‌وجو، سه مخزن داده
HYBRID MEMORYMem0 writes every memory to three stores at once and fuses them on retrieval. Vector answers semantic similarity, KV answers fact lookup, graph answers relationship reasoning. A weighted score over relevance, importance, and recency blends the three, so the single add/search surface is never wrong for two of three query classes the way one store always is.queryVECTORمعناییw 0.50KVجستجوی فکتw 0.30GRAPHروابطw 0.20ادغامscore = relevance + importance + recency, weighted sum
Mem0 هر حافظه را هم‌زمان در سه مخزن ذخیره کرده و هنگام بازیابی با یکدیگر ترکیب می‌کند. مخزن برداری به شباهت معنایی پاسخ می‌دهد، KV برای جستجوی واقعیت‌هاست و گراف استدلال رابطه‌ای را مدیریت می‌کند. امتیازی وزن‌دار روی مرتبط‌بودن، اهمیت و تازگی، این سه را با هم ترکیب می‌کند؛ بنابراین این رابط یکپارچه add/search برخلاف سیستم‌های تک‌مخزنی هیچ‌گاه در دو دسته از سه نوع پرس‌وجو اشتباه نمی‌کند.

پیاده‌سازی عملی

فایل 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 ساختار اولیه‌ی یک حافظه‌ی سه پایگاهی را همراه با امتیازدهنده‌ی تلفیقی، دسته‌بندی دامنه‌ها و سیستم ابطال زمانی تولید می‌کند.

تمرین‌ها

  1. شباهت برداری ساده‌ی این درس را با یک مدل امبدینگ واقعی (مانند sentence-transformers، Ollama یا OpenAI embeddings) جایگزین کنید. شاخص recall@10 را روی یک گفت‌وگوی طولانیِ ساختگی بسنجید. آیا پس از 1000 عملیات نوشتن، رتبه‌بندی دچار انحراف می‌شود؟
  2. یک پرس‌وجوی زمانی به سیستم اضافه کنید: search(query, as_of=timestamp). فقط رکوردهایی را برگردانید که در زمان مشخص‌شده یا قبل از آن معتبر بوده‌اند. پیاده‌سازی این ویژگی در کدام پایگاه داده نیازمند تغییرات بیشتری است؟
  3. یک شناساگر ناسازگاری پیاده‌سازی کنید: اگر فکت ورودی با یالی در گراف تناقض داشت، یال قبلی را باطل کرده و هر دو را ثبت کنید. این سناریو را تست کنید: «کاربر در برلین زندگی می‌کند» -> «کاربر در لیسبون زندگی می‌کند».
  4. تابع امتیازدهی تلفیقی را طوری بازنویسی کنید که بُعد user_feedback (لایک یا بازخورد مثبت کاربر به رکوردهای بازیابی‌شده) را هم شامل شود. چطور مانع از سوءاستفاده‌ی سیستم می‌شوید (اینکه ایجنت فقط رکوردهایی را بازگرداند که قبلاً لایک گرفته‌اند)؟
  5. مستندات Mem0 را بخوانید (docs.mem0.ai). این پیاده‌سازی نمونه را با فراخوانی‌های کلاینت mem0 بازنویسی کنید. کیفیت بازیابی هر دو را روی 20 پرس‌وجوی آزمایشیِ یکسان مقایسه کنید.

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

اصطلاح در گفت‌وگوها چه می‌گویند در عمل واقعاً چیست
حافظه‌ی ترکیبی (Hybrid memory) «بردار به‌علاوه‌ی گراف به‌علاوه‌ی KV» سه پایگاه داده که موازی نوشته و هنگام بازیابی تلفیق می‌شوند
استخراج فکت (Fact extraction) «ورود داده به حافظه» مرحله‌ای در LLM که متن را به تاپل‌های (موجودیت، رابطه، فکت) خرد می‌کند
امتیازدهی تلفیقی (Fusion scoring) «رتبه‌بندی ارتباط» مجموع وزنیِ ارتباط، اهمیت و تازگی
دامنه (Scope) «فضای نام حافظه» کاربر / نشست / ایجنت — مشخص می‌کند چه کسی چه چیزی را ببیند
Mem0g «گراف حافظه» یال‌های نوع‌دار با اعتبار زمانی مشخص برای پرس‌وجوهای رابطه‌ای
ابطال زمانی (Temporal invalidation) «حذف نرم (Soft delete)» علامت‌گذاری یال‌های متناقض به‌عنوان نامعتبر؛ بدون حذف واقعی آن‌ها
انحراف امبدینگ (Embedding drift) «فرسایش بازیابی» افت کیفیت نتایج برداری با رشد مجموعه‌ی داده‌ها؛ نیازمند بازتولید دوره‌ای امبدینگ‌ها

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

خودآزمایی

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

  1. پیش از درسیک مخزن KV کدام دسته از پرس‌وجوها را به بهترین شکل پاسخ می‌دهد؟
  2. پیش از درسسه مخزنی که Mem0 در هر فراخوانی add() به‌طور موازی در آن‌ها می‌نویسد کدامند؟
  3. حین درسکدام سه بعد ورودیِ امتیاز ادغام (fusion score) در Mem0 هستند؟
  4. حین درسوقتی یک واقعیت ورودی با یک یال موجود در Mem0g مغایرت دارد، چه اتفاقی می‌افتد؟
  5. حین درسچرا این درس توصیه می‌کند وزن‌های ادغام را بر اساس محصول تنظیم کنید؟
  6. پس از درسطبقه‌بندی دامنه‌ها (scopes) در Mem0 به چه صورت است؟
  7. پس از درسرانش امبدینگ (embedding drift) در این الگو چیست و این درس چه راهکاری برای کاهش اثر آن پیشنهاد می‌دهد؟

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

چرا استفاده از پایگاه داده برداری به تنهایی برای حافظه ایجنت کافی نیست؟

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

امتیازدهی تلفیقی (Fusion Scoring) در حافظه ترکیبی چگونه کار می‌کند؟

این لایه مجموع وزنی سه فاکتور را محاسبه می‌کند: ارتباط معنایی یا تطابق دقیق (Relevance)، اهمیت از پیش تعیین‌شده یا یادگیری‌شده‌ی فکت (Importance)، و میزان تازگی اطلاعات با کاهش نمایی در طول زمان (Recency).

منظور از ابطال زمانی (Temporal Invalidation) در Mem0g چیست؟

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

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

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