← Kembali ke Blog

Kasih Memori ke AI Agent Kamu dengan Mem0

Chatbot kamu nanya nama kamu setiap sesi. Padahal kemarin udah nanya, minggu lalu juga. Bukan karena modelnya sombong, tapi karena nggak ada yang nyangkut antar percakapan. Setiap request mulai dari nol, dan semua yang agent udah pelajari tentang user ilang begitu chat-nya ditutup. Ini masalah yang dibenerin sama memory layer.

Mem0 itu proyek open source yang dibuat persis buat ini: memori jangka panjang buat AI agent. Repository-nya nyebut dirinya "universal memory layer for AI Agents". Per 18 Agustus 2026 dia punya 63.485 stars, lisensinya Apache-2.0, dan lahir dari batch S24 Y Combinator. Kamu bisa pake dalam tiga cara: sebagai library Python atau TypeScript, sebagai server Docker self-hosted, atau sebagai platform kelolaan. Semua contoh di artikel ini dicek ke mem0ai 2.0.18.

Cara kerjanya sederhana. Pas percakapan terjadi, Mem0 narik fakta yang stabil, embed, lalu simpen di vector database. Nanti kamu tanya "apa yang aku tau soal user ini?" dan dia ngembaliin memori yang relevan sebagai teks biasa, tinggal kamu tempel ke system prompt.

Satu hal yang perlu kamu tau sebelum mulai: sejak April 2026, tahap ekstraksinya cuma satu panggilan LLM yang cuma nambah fakta. Retrieval-nya gabungin semantic search, pencocokan keyword BM25, dan kecocokan entitas, plus ranking yang sadar waktu. Timnya nulis skor LoCoMo 92.5 dan LongMemEval 94.4 di platform kelolaan, dengan catatan di README-nya bahwa pengguna open source harusnya dapet angka yang arahnya mirip tapi nggak identik. Framework evaluasinya dibuka biar siapa pun bisa reproduce sendiri.

Prasyarat

  • Python 3.10+
  • pip
  • API key OpenAI buat setup default, atau Ollama terinstall kalau kamu langsung lompat ke Langkah 4

Langkah 1: Install dan simpen memori pertama

export OPENAI_API_KEY="sk-..."
pip install mem0ai

Lalu simpen satu memori:

from mem0 import Memory

m = Memory()

messages = [
    {"role": "user", "content": "Hi, I'm Alex. I love basketball and gaming."},
    {"role": "assistant", "content": "Hey Alex! Nice to meet you."},
]
m.add(messages, user_id="alex")

API-nya cuma segitu: messages masuk, memori keluar. Constructor-nya langsung ngecek API key, jadi set dulu OPENAI_API_KEY sebelum bikin Memory, kalau nggak dia bakal lempar OpenAIError. Defaultnya udah wajar buat percobaan pertama: gpt-5-mini sebagai LLM, text-embedding-3-small buat embedding, Qdrant lokal di /tmp/qdrant, dan history SQLite di ~/.mem0/history.db.

Langkah 2: Cari memori yang udah disimpen

result = m.search("What do I know about Alex?", filters={"user_id": "alex"})
for item in result["results"]:
    print(item["memory"], item["score"])

Query-nya di-embed lalu dicocokin sama memori yang tersimpan. Tiap hasil berisi teks memori, skor relevansi, dan metadata. Perhatiin argumen filters: memori itu di-scope per user_id, dan search tanpa filter bisa narik memori semua user yang ada di store.

Langkah 3: Sambungin ke loop agent

Polanya: search dulu sebelum jawab, add setelah jawab. Ini loop lengkapnya, diadaptasi dari contoh di README:

from openai import OpenAI
from mem0 import Memory

client = OpenAI()
memory = Memory()

def chat(message: str, user_id: str = "default") -> str:
    relevant = memory.search(query=message, filters={"user_id": user_id})
    memories = "\n".join(f"- {item['memory']}" for item in relevant["results"])

    system = f"You are a helpful assistant.\nUser memories:\n{memories}"
    messages = [
        {"role": "system", "content": system},
        {"role": "user", "content": message},
    ]
    answer = client.chat.completions.create(
        model="gpt-5-mini", messages=messages
    ).choices[0].message.content

    messages.append({"role": "assistant", "content": answer})
    memory.add(messages, user_id=user_id)
    return answer

Tiap turn jadi nambah dua panggilan di luar panggilan chat: satu search, satu add. Add ini baca ulang percakapan, ekstrak faktanya, lalu simpen, jadi turn berikutnya bisa nemuin lagi. Kalau kebanyakan turn kamu isinya sepele, skip add di turn itu. Jaga messages yang kamu kasih ke add tetap kecil, nggak ada gunanya bayar LLM buat ekstrak fakta dari tumpukan log.

Langkah 4: Full lokal pake Ollama dan Chroma

Seluruh stack bisa jalan tanpa satu pun panggilan cloud: Ollama nyediain LLM sekaligus embedding, Chroma nyimpen vektor di disk.

curl -fsSL https://ollama.com/install.sh | sh
ollama pull qwen2.5:7b
ollama pull mxbai-embed-large
pip install mem0ai ollama chromadb

Lalu bikin Memory dari config, bukan dari default:

from mem0 import Memory

config = {
    "vector_store": {
        "provider": "chroma",
        "config": {"collection_name": "memories", "path": "./mem0_chroma"},
    },
    "llm": {
        "provider": "ollama",
        "config": {"model": "qwen2.5:7b", "temperature": 0.1, "max_tokens": 2000},
    },
    "embedder": {
        "provider": "ollama",
        "config": {"model": "mxbai-embed-large"},
    },
}

m = Memory.from_config(config)

Panggilan add dan search dari Langkah 1 dan 2 jalan apa adanya abis ini. Dua jebakan di jalur ini, dan dua-duanya kena pas saya nyoba setup-nya buat artikel ini. Pertama, package provider itu dependency opsional, jadi chromadb dan client Ollama harus diinstall terpisah, padahal kebanyakan contoh cuma nunjukin mem0ai. Kedua, embedder-nya ngecek server Ollama di localhost:11434 pas start, jadi Ollama harus udah jalan dan dua modelnya udah ke-pull sebelum panggilan pertama.

Langkah 5: Catatan buat production

  • Satu user_id per orang, di setiap add dan setiap search. Ini inti cerita multi-tenant, dan bagian yang paling gampang salah.
  • Jaga temperature ekstraksi tetap rendah. Docs-nya nyaranin di bawah 0.2 biar fakta yang tersimpan tetap deterministik, dan naikin cuma kalau kamu ngeh ada fakta yang kelewat.
  • Persempit hasil search. top_k default-nya 20. Kalau kamu nyalain reranker, docs-nya nyaranin antara 10 dan 20, karena hasil kebanyakan cuma nambah latency tanpa keuntungan yang berarti.
  • Tag fakta pake metadata. m.add nerima dict metadata, dan daftar fiturnya termasuk metadata filter buat retrieval.
  • Memori bisa kedaluwarsa. Panggilan add nerima expiration_date kalau kamu mau fakta-fakta tertentu ilang dengan sendirinya.
  • Buat tim, skip library dan self-host varian server-nya. Stack docker compose lengkap dengan dashboard dan API key per-user lebih masuk akal daripada nyuruh semua orang nulis Python.

Kapan pake Mem0, kapan pake alternatif

  • Riwayat chat polos di database: paling murah dibikin, tapi tiap turn baca lagi atau re-embed semuanya, dan nggak ada ekstraksi, nggak ada entity linking, nggak ada ranking sadar waktu.
  • Memory buffer LangChain: oke buat jaga jendela percakapan terakhir dalam satu sesi, tapi itu buffer, bukan memori jangka panjang. Nggak ada yang nyangkut antar sesi dengan sendirinya.
  • MemGPT atau Letta: runtime agent penuh yang mindahin memori masuk-keluar context. Kuat, tapi jauh lebih banyak mesin daripada sekadar memory layer.
  • Bikin sendiri di atas vector database: bisa, tapi ujung-ujungnya kamu nulis sendiri logika ekstraksi, scoping, dan update, dan itu justru inti dari library ini.
  • Verdict: pake library kalau kamu udah punya loop agent dan cuma butuh "inget user ini" dalam dua panggilan. Pake server self-hosted atau platform kelolaan kalau kamu butuh auth, dashboard, dan isolasi data per user tanpa bikin dari nol.

Jebakan yang sering muncul

  1. API key nggak keset. Memory() lempar OpenAIError kalau OPENAI_API_KEY nggak ada. Export dulu sebelum bikin instance.
  2. Lupa filter user_id. Search tanpa filter bisa ngembaliin memori semua user. Scope setiap panggilan.
  3. Package provider kelewat. chromadb dan client Ollama itu dependency opsional, import bakal gagal sama ModuleNotFoundError sampai dua-duanya diinstall.
  4. Dimensi embedding beda. Ganti ke model embedding dengan dimensi beda bakal lempar ValueError kayak "shapes (0,1536) and (768,) not aligned". Docs-nya nyaranin nambah "embedding_model_dims": 768 ke config vector store.
  5. Ollama nggak jalan. Setup lokal gagal pas bikin embedder dengan error koneksi ke localhost:11434. Jalanin server dan pull modelnya dulu.

Langkah berikutnya

  • Baca docs konfigurasi dulu sebelum naruh data production, terutama bagian vector store dan reranker.
  • Cek panduan integrasi LangGraph dan CrewAI kalau kamu bikin agent pake framework itu.
  • Intip cookbook buat pola yang udah jadi: companion chatbot, support agent, dan research tool.
  • Baca paper-nya di arXiv (2504.19413) kalau mau detail algoritma memori di belakangnya.

Referensi

Butuh Bantuan Implementasi?

Saya membantu tim mendesain dan membangun infrastruktur cloud scalable, pipeline DevOps, dan sistem production-grade.

Konsultasi Gratis