Mem0: Memory Layer untuk Aplikasi AI yang Personalized

# Mem0: Memory Layer untuk Aplikasi AI yang Personalized Salah satu tantangan terbesar dalam membangun aplikasi AI adalah kemampuan untuk **mengingat** konteks dan preferensi pengguna lintas sesi. Se...

By Ruby Abdullah · · tutorial
Mem0AI MemoryLLMPersonalizationPython

Mem0: Memory Layer untuk Aplikasi AI yang Personalized

Salah satu tantangan terbesar dalam membangun aplikasi AI adalah kemampuan untuk mengingat konteks dan preferensi pengguna lintas sesi. Secara default, LLM seperti GPT atau Claude tidak memiliki memori persisten. Setiap percakapan dimulai dari nol. Di sinilah Mem0 hadir sebagai solusi.

Mem0 adalah memory layer open-source yang memungkinkan aplikasi AI Anda menyimpan, mengambil, dan mengelola memori secara cerdas. Dengan Mem0, chatbot Anda bisa mengingat preferensi pengguna, riwayat interaksi, dan konteks penting lainnya.

Mengapa Mem0?

Bayangkan Anda membangun AI assistant untuk customer service. Tanpa memory layer, setiap kali pelanggan menghubungi, AI harus menanyakan ulang informasi dasar. Dengan Mem0:

  • AI mengingat nama, preferensi, dan riwayat pelanggan
  • Respons menjadi lebih personal dan kontekstual
  • Pengalaman pengguna meningkat drastis
  • Efisiensi operasional meningkat

Mem0 menggunakan semantic search untuk menemukan memori yang relevan, bukan sekadar keyword matching. Ini berarti AI bisa memahami konteks dan mengambil informasi yang benar-benar relevan.

Instalasi

Pertama, install Mem0 menggunakan pip:

pip install mem0ai

Untuk menggunakan fitur lengkap dengan vector database, install juga dependensi opsional:

pip install mem0ai[qdrant]

Anda juga memerlukan API key dari OpenAI (default) atau provider LLM lainnya:

export OPENAIAPIKEY="sk-your-api-key-here"

Inisialisasi Mem0

Ada dua cara menggunakan Mem0: versi in-memory untuk development dan versi persistent untuk production.

Setup Dasar (In-Memory)

from mem0 import Memory

Inisialisasi dengan konfigurasi default

m = Memory()

Setup dengan Qdrant (Persistent)

from mem0 import Memory

config = {

"vectorstore": {

"provider": "qdrant",

"config": {

"host": "localhost",

"port": 6333,

"collectionname": "mem0memories"

}

},

"llm": {

"provider": "openai",

"config": {

"model": "gpt-4o-mini",

"temperature": 0.1

}

},

"embedder": {

"provider": "openai",

"config": {

"model": "text-embedding-3-small"

}

}

}

m = Memory.fromconfig(config)

Operasi Memori Dasar

Mem0 menyediakan empat operasi utama: add, get, search, dan delete.

Menambahkan Memori (Add)

# Menambahkan memori untuk user tertentu

result = m.add(

"Saya suka kopi hitam tanpa gula dan biasanya minum di pagi hari",

userid="user123"

)

print(result)

Output: {'results': [{'id': '...', 'memory': 'Suka kopi hitam tanpa gula', 'event': 'ADD'}]}

Mem0 secara otomatis mengekstrak informasi penting dari teks yang diberikan. Perhatikan bahwa Mem0 tidak menyimpan teks mentah, melainkan mengekstrak fakta dari teks tersebut.

Mengambil Semua Memori (Get)

# Mengambil semua memori untuk user tertentu

memories = m.getall(userid="user123")

for memory in memories:

print(f"ID: {memory['id']}")

print(f"Memory: {memory['memory']}")

print(f"Created: {memory['createdat']}")

print("---")

# Semantic search - mencari memori yang relevan

results = m.search(

"Apa minuman favorit user ini?",

userid="user123"

)

for result in results:

print(f"Memory: {result['memory']}")

print(f"Score: {result['score']}")

Search menggunakan semantic similarity, sehingga query "minuman favorit" akan menemukan memori tentang "kopi hitam" meskipun kata-katanya berbeda.

Menghapus Memori (Delete)

# Menghapus memori spesifik berdasarkan ID

m.delete(memoryid="memoryidhere")

Menghapus semua memori user

m.deleteall(userid="user123")

Tipe-Tipe Memori

Mem0 mendukung tiga level memori yang berbeda, masing-masing untuk use case yang berbeda.

1. User-Level Memory

Memori yang terkait dengan pengguna tertentu dan persisten lintas semua sesi:

# Menyimpan preferensi user

m.add("Saya alergi kacang dan tidak suka makanan pedas", userid="user123")

m.add("Saya tinggal di Jakarta Selatan", userid="user123")

m.add("Bahasa pemrograman favorit saya adalah Python", userid="user123")

Mengambil memori user

usermemories = m.getall(userid="user123")

2. Session Memory

Memori yang terkait dengan sesi percakapan tertentu:

# Menyimpan konteks sesi

sessionid = "session20260513001"

m.add(

"User sedang menanyakan tentang cara deploy model ML ke production",

userid="user123",

metadata={"sessionid": sessionid}

)

m.add(

"User sudah mencoba menggunakan Flask tapi mengalami masalah scaling",

userid="user123",

metadata={"sessionid": sessionid}

)

3. Agent Memory

Memori yang terkait dengan AI agent tertentu, berguna saat Anda memiliki multiple agents:

# Agent-specific memory

m.add(

"Customer service agent harus selalu menyapa dengan nama pelanggan",

agentid="csagent01"

)

m.add(

"Technical support agent harus selalu menanyakan versi software",

agentid="techagent01"

)

Mengambil memori agent

agentmemories = m.getall(agentid="csagent01")

Kategori Memori

Anda bisa mengorganisir memori dengan metadata dan kategori:

# Menambahkan memori dengan metadata kategori

m.add(

"User memiliki subscription plan Enterprise",

userid="user123",

metadata={

"category": "account",

"priority": "high"

}

)

m.add(

"User prefer komunikasi via email dibanding telepon",

userid="user123",

metadata={

"category": "preference",

"priority": "medium"

}

)

m.add(

"User menggunakan macOS dengan Python 3.11",

userid="user123",

metadata={

"category": "technical",

"priority": "low"

}

)

Integrasi dengan OpenAI

Mem0 dapat diintegrasikan langsung dengan OpenAI untuk membuat chatbot dengan memori:

from openai import OpenAI

from mem0 import Memory

client = OpenAI()

memory = Memory()

def chatwithmemory(usermessage: str, userid: str) -> str:

# Cari memori yang relevan

relevantmemories = memory.search(usermessage, userid=userid)

# Bangun konteks dari memori

memorycontext = ""

if relevantmemories:

memorycontext = "Informasi yang diketahui tentang user:\n"

for mem in relevantmemories:

memorycontext += f"- {mem['memory']}\n"

# Buat system prompt dengan konteks memori

systemprompt = f"""Kamu adalah AI assistant yang helpful dan personal.

Gunakan informasi berikut tentang user untuk memberikan respons yang personal:

{memorycontext}

Jika user memberikan informasi baru tentang dirinya, catat dalam responsmu."""

# Panggil OpenAI

response = client.chat.completions.create(

model="gpt-4o-mini",

messages=[

{"role": "system", "content": systemprompt},

{"role": "user", "content": usermessage}

]

)

assistantmessage = response.choices[0].message.content

# Simpan memori baru dari percakapan

conversation = f"User: {usermessage}\nAssistant: {assistantmessage}"

memory.add(conversation, userid=userid)

return assistantmessage

Contoh penggunaan

print(chatwithmemory("Hai, nama saya Budi. Saya seorang data scientist.", "user456"))

print(chatwithmemory("Rekomendasikan tools untuk data visualization dong", "user456"))

Integrasi dengan Anthropic Claude

Mem0 juga dapat digunakan dengan Anthropic Claude:

import anthropic

from mem0 import Memory

client = anthropic.Anthropic()

memory = Memory()

def chatwithclaude(usermessage: str, userid: str) -> str:

# Ambil memori relevan

relevantmemories = memory.search(usermessage, userid=userid)

memorycontext = ""

if relevantmemories:

memorylines = [mem['memory'] for mem in relevantmemories]

memorycontext = "Known information about the user:\n" + "\n".join(

f"- {line}" for line in memorylines

)

systemprompt = f"""You are a helpful, personalized AI assistant.

Use the following context to personalize your responses:

{memorycontext}"""

response = client.messages.create(

model="claude-sonnet-4-20250514",

maxtokens=1024,

system=systemprompt,

messages=[

{"role": "user", "content": usermessage}

]

)

assistantmessage = response.content[0].text

# Simpan memori

conversation = f"User: {usermessage}\nAssistant: {assistantmessage}"

memory.add(conversation, userid=userid)

return assistantmessage

Semantic Search Over Memories

Kekuatan utama Mem0 adalah kemampuan semantic search-nya. Berbeda dengan pencarian keyword biasa, semantic search memahami makna dari query:

# Menambahkan berbagai memori

m.add("Saya bekerja sebagai machine learning engineer di startup fintech", userid="user789")

m.add("Saya baru saja menyelesaikan kursus deep learning di Coursera", userid="user789")

m.add("Proyek terakhir saya adalah membangun fraud detection system", userid="user789")

m.add("Saya tertarik dengan NLP dan computer vision", userid="user789")

m.add("Weekend biasanya saya habiskan untuk hiking dan fotografi", userid="user789")

Semantic search - query tidak perlu exact match

results = m.search("Apa background profesional user ini?", userid="user789")

Akan menemukan memori tentang pekerjaan, kursus, dan proyek

results = m.search("Apa hobi user ini?", userid="user789")

Akan menemukan memori tentang hiking dan fotografi

Search dengan limit

results = m.search(

"keahlian teknis",

userid="user789",

limit=3

)

Memory Conflict Resolution

Ketika informasi baru bertentangan dengan memori yang sudah ada, Mem0 menanganinya secara otomatis:

# Memori awal

m.add("Saya tinggal di Jakarta", userid="user100")

Update informasi - Mem0 akan mendeteksi konflik

m.add("Saya baru pindah ke Bandung bulan lalu", userid="user100")

Mem0 akan mengupdate memori, bukan membuat duplikat

memories = m.getall(userid="user100")

Memori akan menunjukkan bahwa user tinggal di Bandung (informasi terbaru)

Mem0 menggunakan LLM untuk mendeteksi apakah informasi baru merupakan:

  • UPDATE: Memperbarui fakta yang sudah ada
  • ADD: Informasi baru yang belum ada
  • DELETE: Menghapus informasi yang tidak lagi relevan
  • NOOP: Tidak ada perubahan yang diperlukan

# Contoh berbagai jenis update

m.add("Email saya budi@example.com", userid="user100")

Event: ADD

m.add("Email saya berubah menjadi budi@newcompany.com", userid="user100")

Event: UPDATE - email lama diperbarui

m.add("Saya sudah tidak menggunakan Twitter lagi", userid="user100")

Event: DELETE - jika ada memori tentang Twitter

Contoh Praktis: AI Assistant dengan Personalized Memory

Mari bangun AI assistant lengkap yang mengingat preferensi pengguna lintas sesi:

from mem0 import Memory

from openai import OpenAI

from datetime import datetime

class PersonalizedAssistant:

def init(self):

self.client = OpenAI()

self.memory = Memory()

self.conversationhistory = []

def getmemorycontext(self, userid: str, query: str) -> str:

"""Ambil memori relevan dan format sebagai konteks."""

memories = self.memory.search(query, userid=userid, limit=10)

if not memories:

return "Belum ada informasi yang diketahui tentang user ini."

contextlines = []

for mem in memories:

contextlines.append(f"- {mem['memory']}")

return "Informasi yang diketahui tentang user:\n" + "\n".join(contextlines)

def chat(self, usermessage: str, userid: str) -> str:

"""Kirim pesan dan dapatkan respons yang dipersonalisasi."""

# Ambil konteks memori

memorycontext = self.getmemorycontext(userid, usermessage)

# System prompt

systemprompt = f"""Kamu adalah AI assistant pribadi yang cerdas dan ramah.

Kamu mengingat informasi tentang setiap user dan menggunakannya untuk

memberikan respons yang personal dan relevan.

{memorycontext}

Panduan:

  • Gunakan informasi yang sudah diketahui untuk mempersonalisasi respons
  • Jika user memberikan informasi baru, akui dan ingat
  • Berikan rekomendasi berdasarkan preferensi yang sudah diketahui
  • Bersikap natural, jangan terlalu formal
  • Waktu sekarang: {datetime.now().strftime('%Y-%m-%d %H:%M')}"""

    # Tambahkan ke conversation history

    self.conversationhistory.append({

    "role": "user",

    "content": usermessage

    })

    # Panggil LLM

    messages = [{"role": "system", "content": systemprompt}]

    messages.extend(self.conversationhistory[-10:]) # Keep last 10 messages

    response = self.client.chat.completions.create(

    model="gpt-4o-mini",

    messages=messages,

    temperature=0.7

    )

    assistantmessage = response.choices[0].message.content

    # Tambahkan respons ke history

    self.conversationhistory.append({

    "role": "assistant",

    "content": assistantmessage

    })

    # Simpan memori dari percakapan ini

    self.memory.add(

    f"User: {usermessage}\nAssistant: {assistantmessage}",

    userid=userid,

    metadata={

    "timestamp": datetime.now().isoformat(),

    "type": "conversation"

    }

    )

    return assistantmessage

    def getuserprofile(self, userid: str) -> dict:

    """Dapatkan profil user berdasarkan memori yang tersimpan."""

    allmemories = self.memory.getall(userid=userid)

    return {

    "userid": userid,

    "totalmemories": len(allmemories),

    "memories": [mem['memory'] for mem in allmemories]

    }

    def resetuser(self, userid: str):

    """Hapus semua memori untuk user tertentu."""

    self.memory.deleteall(userid=userid)

    print(f"Semua memori untuk {userid} telah dihapus.")

    Simulasi penggunaan

    def main():

    assistant = PersonalizedAssistant()

    userid = "demouser001"

    # Sesi 1: Perkenalan

    print("=== Sesi 1: Perkenalan ===")

    response = assistant.chat(

    "Hai! Nama saya Rina. Saya seorang data analyst di perusahaan e-commerce.",

    userid

    )

    print(f"Assistant: {response}\n")

    response = assistant.chat(

    "Saya sedang belajar Python dan tertarik dengan machine learning. "

    "Biasanya saya pakai Excel dan SQL untuk analisis data.",

    userid

    )

    print(f"Assistant: {response}\n")

    # Sesi 2: Kunjungan kembali (simulasi sesi baru)

    assistant.conversationhistory = [] # Reset conversation history

    print("\n=== Sesi 2: Kunjungan Kembali ===")

    response = assistant.chat(

    "Hai lagi! Bisa rekomendasikan library Python untuk data visualization?",

    userid

    )

    print(f"Assistant: {response}\n")

    # Lihat profil user

    profile = assistant.getuserprofile(userid)

    print(f"\n=== Profil User ===")

    print(f"Total memori: {profile['totalmemories']}")

    for mem in profile['memories']:

    print(f" - {mem}")

    if name == "main":

    main()

    Tips dan Best Practices

    1. Kelola Ukuran Memori

    # Batasi jumlah memori per user
    

    memories = m.getall(userid="user123")

    if len(memories) > 100:

    # Hapus memori lama yang kurang relevan

    oldmemories = sorted(memories, key=lambda x: x['createdat'])

    for mem in oldmemories[:20]: # Hapus 20 memori terlama

    m.delete(memoryid=mem['id'])

    2. Gunakan Metadata untuk Filtering

    # Tambahkan metadata yang berguna
    

    m.add(

    "User memiliki budget $5000 untuk project ini",

    userid="user123",

    metadata={

    "category": "project",

    "projectid": "proj001",

    "importance": "high",

    "expiresat": "2026-06-30"

    }

    )

    3. Pisahkan Memori Berdasarkan Konteks

    # Gunakan userid yang berbeda untuk konteks berbeda
    

    m.add("Preferensi untuk project A", userid="user123projecta")

    m.add("Preferensi untuk project B", userid="user123projectb")

    4. Handle Error dengan Graceful

    def safememorysearch(memory, query, userid, fallback=""):
    

    try:

    results = memory.search(query, userid=userid)

    return results

    except Exception as e:

    print(f"Memory search failed: {e}")

    return []

    Kesimpulan

    Mem0 adalah tool yang powerful untuk menambahkan kemampuan memori ke aplikasi AI Anda. Dengan fitur semantic search, conflict resolution otomatis, dan dukungan untuk multiple memory levels, Mem0 memudahkan Anda membangun aplikasi AI yang benar-benar personal.

    Kunci keberhasilan menggunakan Mem0:

    • Mulai dengan setup sederhana, lalu tingkatkan sesuai kebutuhan
    • Gunakan metadata untuk mengorganisir memori
    • Implementasikan memory cleanup untuk performa optimal
    • Manfaatkan semantic search untuk pengambilan memori yang akurat
    • Selalu handle error untuk pengalaman pengguna yang baik

    Dengan menggabungkan Mem0 dengan LLM pilihan Anda (OpenAI, Anthropic, dll.), Anda bisa membangun AI assistant yang benar-benar mengingat dan memahami setiap pengguna secara unik.

    Artikel Terkait

    DSPy: Berhenti Ngoprek Prompt Manual, Biarkan Compiler yang Optimasi

    DSPy: Berhenti Ngoprek Prompt Manual, Biarkan Compiler yang Optimasi Halo temen-temen, kali ini aku mau ngenalin satu li...

    Inspect AI: Framework Evaluasi LLM dari UK AI Safety Institute

    Inspect AI: Framework Evaluasi LLM dari UK AI Safety Institute yang Wajib Kamu Coba Temen-temen, kalau kamu udah mulai s...

    Tutorial Lengkap Braintrust: Evaluasi, Testing, dan Improve Aplikasi LLM

    Tutorial Lengkap Braintrust: Evaluasi, Testing, dan Improve Aplikasi LLM Halo temen-temen, di tutorial kali ini aku mau ...

    OpenRouter: Satu API untuk Ratusan LLM (OpenAI, Anthropic, Google, Meta, Mistral)

    OpenRouter: Satu API untuk Ratusan LLM (OpenAI, Anthropic, Google, Meta, Mistral) Halo temen-temen, ketemu lagi sama aku...