Phase 14: Agent Engineering

हाइब्रिड मेमोरीः वेक्टर + ग्राफ + केवी

हाइब्रिड मेमोरी समानांतर में तीन स्टोर चलाती है वेक्टर के लिए अर्थिक समानता, KV के लिए त्वरित तथ्य खोज, इकाई-संबंध तर्क के लिए ग्राफ एक स्कोरिंग परत के साथ जो उन्हें पुनर्प्राप्त करने पर मिलाता है। यह बाहरी मेमोरी के लिए एक व्यापक रूप से उपयोग किया जाने वाला उत्पादन पैटर्न है; Mem0 (छिकारा एट अल, 2025) एक संदर्भ कार्यान्वयन है।

Type: Build

Languages: Python (stdlib)

Prerequisites: Phase 14 · 07 (MemGPT), Phase 14 · 08 (Letta Blocks)

Time: ~75 minutes

सीखने के लक्ष्य

  • बताएं कि एजेंट मेमोरी के लिए एक ही स्टोर (केवल वेक्टर, केवल ग्राफ, केवल KV) क्यों अपर्याप्त है।
  • Mem0 के तीन समानांतर स्टोर का नाम और प्रत्येक के लिए अनुकूलित क्या है।
  • Mem0 के संलयन स्कोरिंग का वर्णन करें प्रासंगिकता, महत्व, हालियाता और यह एक संलयन राशि क्यों है, न कि पदानुक्रम।
  • एक के साथ स्टडीलिब में एक खिलौना तीन-कक्ष स्मृति को लागू करें add()जो तीनों को लिखता है और एक search()जो परिणामों को मिलाता है।

समस्या

एक दुकान तीन प्रश्न वर्गों में से एक के लिए गलत हैः

  • Semantic similarity "हमने पिछले सप्ताह एजेंट ड्रीफ के बारे में क्या चर्चा की थी? " वेक्टर जीतता है; KV और ग्राफ मिस।
  • Fact lookup "उपयोगकर्ता का फ़ोन नंबर क्या है?" KV जीतता है; वेक्टर व्यर्थ है, ग्राफ ओवरकिल है।
  • Relationship reasoning "कौन से ग्राहक एक ही बिलिंग इकाई साझा करते हैं?" ग्राफ जीतता है; वेक्टर और KV जवाब नहीं दे सकते।

एक ही सत्र में तीनों को जारी करने वाले प्रोडक्शन एजेंट। एक एकल स्टोर मेमोरी हमेशा दो के लिए गलत होती है। Mem0 का योगदान एक ही के पीछे तीनों को तार कर रहा है।add/searchएक स्कोरिंग फ़ंक्शन के साथ सतह जो उन्हें मिलाता है।

अवधारणा

समानांतर में तीन दुकानें

Mem0 (arXiv:2504.19413, अप्रैल 2025) पर add(text, user_id, metadata):

  1. पाठ से उम्मीदवार तथ्यों को निकालें (एलएलएम-चालित कदम) ।
  2. अर्थपूर्ण खोज के लिए प्रत्येक तथ्य को वेक्टर स्टोर (इम्बेडिंग) में लिखें।
  3. प्रत्येक तथ्य को KV स्टोर में लिखें जो O(1) खोज के लिए (user_id, fact_type, entity) पर कुंजीबद्ध है।
  4. प्रत्येक तथ्य को रिलेशनशिप क्वेरी के लिए टाइप किए गए किनारों के रूप में ग्राफ स्टोर (Mem0g) में लिखें।

पर search(query, user_id):

  1. वेक्टर स्टोर कोसिन को एम्बेड करके शीर्ष-के वापस देता है।
  2. KV स्टोर क्वेरी-उत्पन्न (user_id, प्रकार, इकाई) पर कुंजीबद्ध प्रत्यक्ष हिट लौटाता है।
  3. ग्राफ स्टोर क्वेरी इकाई से सुलभ उपग्राफ लौटाता है।
  4. एक स्कोरिंग परत तीनों को मिला देती है।

फ्यूजन स्कोरिंग

score = w_relevance * relevance(q, record)
      + w_importance * importance(record)
      + w_recency * recency(record)
  • Relevance वेक्टर कॉसिन, केवी सटीक मेल, ग्राफ पथ वजन।
  • Importance लेखन के समय या सीखा गया (कुछ तथ्य अधिक मायने रखते हैंः नाम, आईडी, नीति) ।
  • Recency अंतिम लेखन या पढ़ने के बाद से समय के साथ तेजी से गिरावट।

वजन प्रति उत्पाद समायोजित किया जाता है।w_recencyचैट एजेंटों के लिए; उच्चतर w_importanceअनुपालन एजेंटों के लिए; उच्च w_relevanceनिकासी एजेंटों के लिए।

यादें और समय की तर्क

Mem0g एक संघर्ष डिटेक्टर जोड़ता है। जब एक नया तथ्य एक मौजूदा किनारे से विरोधाभास करता है, तो मौजूदा किनारे को अमान्य चिह्नित किया जाता है लेकिन हटाया नहीं जाता है। समय संबंधी प्रश्न ("मार्च में उपयोगकर्ता का शहर क्या था? ") वैध-समय पर उपग्राफ के माध्यम से गुजरते हैं।

यह अनुपालन-ग्रेड व्यवहार है Letta के अवैधता पैटर्न सामान्यीकरण करता है।

बेंचमार्क संख्याएँ

एमईएम0 पेपर रिपोर्ट (2025):

  • LoCoMo(लंबे समय तक बातचीत की स्मृति): 91.6
  • LongMemEval(लंबे क्षितिज पर एपिसोडिक मेमोरी): 93.4
  • BEAM 1M(1M-token memory benchmark): 64.1

तुलना बेसलाइन (पूर्ण संदर्भ 128k LLM, फ्लैट वेक्टर स्टोर, फ्लैट KV) सभी 10+ अंक खो देते हैं। बेंचमार्क अकेले विकल्प को सही नहीं बनाते हैं परिचालन आकार लेकिन संख्याएं दिखाती हैं कि विलय डिजाइन गोल करने की गलती नहीं है।

दायरा वर्गीकरण

Mem0 स्कोप द्वारा स्मृति को विभाजित करता हैः

  • User memory सत्रों के दौरान जारी रहता है, जो किण्वित होता है user_id. .
  • Session memory एक धागे के भीतर रहता है।
  • Agent memory प्रति एजेंट उदाहरण राज्य।

प्रत्येक लेखन एक दायरा चुनता है। प्रति दायरा वजन के साथ दायरे के पार पूछताछ कर सकते हैं। बिना सोचे-समझे दायरे को मिलाकर आप "सहायक ने एलिस को बॉब की परियोजना के बारे में बताया" घटनाओं को प्राप्त करते हैं।

जहां यह पैटर्न गलत हो जाता है

  • Embedding drift.वेक्टर परिणाम जो पहले सौ क्वेरी पर सही दिखते हैं, शरीर के बढ़ने के साथ घटते हैं। शीर्ष-एन-उपयुक्त रिकॉर्डों का आवधिक पुनः सम्मिलन जोड़ें।
  • KV schema creep. (user_id, type, entity)सरल लगता है जब तक प्रत्येक टीम अपने जोड़ता है type. तिमाही में एक प्रकार की जाँच करें।
  • Graph explosion.एक शोर निकालनेवाला संदेश प्रति 50 किनारे जोड़ता है। कैप ग्राफ प्रति लिखता हैaddकॉल; कम आत्मविश्वास के किनारे छोड़ दें।

इसे बनाओ

code/main.pystdlib में तीन मंजिला पैटर्न को लागू करता हैः

  • VectorStore एक एम्बेडिंग स्टैंड-इन के रूप में साफ़ टोकन ओवरलैप समानता।
  • KVStore dict keyed on पर(user_id, fact_type, entity). .
  • GraphStore टाइप किए गए किनारे (विषय, संबंध, वस्तु, मान्य) ।
  • Mem0 शीर्ष स्तर के सामने के साथ add(),search(), संलयन स्कोरिंग, और परिधि जागरूक निकासी.
  • एक बहु-उपयोगकर्ता, बहु-सत्र बातचीत पर एक काम कर निशान.

इसे चलाओः

python3 code/main.py

आउटपुट तीन अलग-अलग याद पथ दिखाता है प्लस फ्यूज शीर्ष-के.main()और रैंकिंग परिवर्तन को देखें।

इसका प्रयोग करें

  • Mem0 (Apache 2.0) उत्पादन के लिए तैयार। Postgres + Qdrant + Neo4j के साथ स्वयं होस्ट करें, या प्रबंधित क्लाउड का उपयोग करें।
  • Letta तीन स्तरीय कोर/रिटर्न/आर्काइव; अपने स्वयं के वेक्टर और ग्राफ बैकेंड लाएं।
  • Zep समय के साथ वाणिज्यिक विकल्प और तथ्य निष्कर्षण।
  • Custom builds जब आपको एक्सट्रैक्टर (अनुपालन) या फ़्यूजन वजन (आवाज एजेंट जहां हालियाता हावी है) पर सटीक नियंत्रण की आवश्यकता होती है।

इसे भेजें

outputs/skill-hybrid-memory.mdएक संलयन स्कोरर, स्कोप टैक्सोनोमी, और समय अमान्यता के साथ एक तीन-कक्ष स्मृति स्टफल्ड उत्पन्न करता है तारों में.

व्यायाम

  1. खिलौना वेक्टर समानता को वास्तविक एम्बेडिंग मॉडल (संवाद-ट्रांसफॉर्मर, ओल्मा, ओपनएआई एम्बेडिंग) के साथ प्रतिस्थापित करें। सिंथेटिक लंबी बातचीत पर recall@10 मापें। क्या रैंकिंग 1000 से अधिक लिखता है?
  2. एक समय क्वेरी जोड़ें: search(query, as_of=timestamp). . केवल उस समय या उससे पहले के वैध रिकॉर्ड लौटाएं. किस स्टोर को सबसे अधिक काम की आवश्यकता है?
  3. एक संघर्ष डिटेक्टर लागू करेंः यदि कोई आने वाला तथ्य ग्राफ के किनारे से विसंगत है, तो पुराने किनारे को अमान्य करें और दोनों को लॉग करें। "उपयोगकर्ता बर्लिन में रहता है" -> "उपयोगकर्ता लिस्बन में रहता है" पर परीक्षण करें।
  4. एक शामिल करने के लिए फ़्यूजन स्कोरर पोर्ट user_feedbackआयाम (बदला रिकॉर्ड पर अंगूठे ऊपर). आप गेमिंग को कैसे रोकते हैं (एजेंट केवल रिकॉर्ड लौटाता है जिसे वह पहले से ही पसंद करता है)?
  5. मेम0 डॉक्स को पढ़ें (docs.mem0.ai खेलौना को mem0ग्राहक कॉल. वही 20 परीक्षण क्वेरी पर पुनर्प्राप्ति गुणवत्ता की तुलना करें.

प्रमुख शर्तें

TermWhat people sayWhat it actually means
Hybrid memory"Vector plus graph plus KV"Three stores written in parallel, fused on retrieval
Fact extraction"Memory ingestion"LLM step that breaks text into (entity, relation, fact) tuples
Fusion scoring"Relevance ranking"Weighted sum of relevance, importance, recency
Scope"Memory namespace"user / session / agent — determines who sees what
Mem0g"Memory graph"Typed edges with temporal validity for relationship queries
Temporal invalidation"Soft delete"Mark contradicted edges invalid; never delete
Embedding drift"Retrieval rot"Vector quality degrades as corpus grows; re-embed periodically

आगे पढ़ना

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.