AizuDemy

Tutorial AI Agent Long-Term Memory: Integrasi Mem0, Ollama & FastHTML

Tutorial AI Agent Long-Term Memory: Integrasi Mem0, Ollama & FastHTML
๐ŸŽง
Dengarkan Artikel Ini
Suara AI Otomatis โ€ข 7 mnt baca baca
โšก TL;DR

Poin Kunci Artikel Ini:

  • Limitasi Stateless LLM & Arsitektur Memori Mem0Large Language Model (LLM) modern beroperasi secara stateless.
  • Setiap HTTP request atau eksekusi inferensi diperlakukan terisolasi tanpa pengetahuan riwayat interaksi terdahulu.
  • Arsitektur Transformer memproses token input secara independen.
๐Ÿ“‹ Daftar Isi Materi Tutup โ–ด

Limitasi Stateless LLM & Arsitektur Memori Mem0

Large Language Model (LLM) modern beroperasi secara stateless. Setiap HTTP request atau eksekusi inferensi diperlakukan terisolasi tanpa pengetahuan riwayat interaksi terdahulu. Arsitektur Transformer memproses token input secara independen. Untuk mempertahankan alur alur percakapan, pendekatan konvensional melakukan prompt stuffing: menempelkan seluruh riwayat obrolan ke dalam context window pada setiap request baru.

Pendekatan prompt stuffing menimbulkan empat kendala teknis krusial di lingkungan produksi:

  • Eksplosivitas Konsumsi Token: Ukuran prompt membengkak linier seiring durasi percakapan. Hal ini meningkatkan biaya komputasi GPU dan konsumsi bandwidth secara drastis.
  • Latensi Inferensi Tinggi: Kompleksitas perhitungan mekanisme self-attention pada Transformer bernilai $O(N^2)$ terhadap panjang urutan token. Semakin panjang konteks, semakin lambat respon Time-To-First-Token (TTFT).
  • Degradasi Akurasi (Lost in the Middle): Model cenderung gagal menangkap informasi kritis yang berada di tengah-tengah rentang konteks teks yang sangat panjang.
  • Batas Context Window Limit: Melampaui kapasitas token maksimum (misal 8k atau 32k) mengakibatkan error eksekusi atau pemotongan konteks secara paksa (context truncation).

Arsitektur sistem memori pada AI Agent membagi layer penyimpanan menjadi dua kategori utama:

  • Short-term Memory: Buffer memori sementara yang menyimpan teks mentah beberapa interaksi terakhir (sliding window context). Menggunakan RAM lokal atau Redis in-memory key-value store.
  • Long-term Memory: Sistem ekstraksi entitas terdistribusi yang memisahkan fakta mendasar dari transkrip obrolan mentah. Menggabungkan pencarian berbasis Vektor (Vector Database) dan Knowledge Graph untuk menyimpan preferensi, fakta pengguna, serta relasi entitas lintas sesi secara presisi.

Mem0 bertindak sebagai layer abstraksi pengelola long-term memory berkinerja tinggi. Mem0 secara otomatis mengekstrak entitas dan preferensi dari percakapan, mengindeks fakta ke dalam database vektor, dan memperbarui basis pengetahuan pengguna. Saat input baru masuk, Mem0 mengeksekusi siklus kerja internal berikut:

  1. Fact Extraction: Memompa input mentah pengguna ke model ekstraktor kecil guna mendeteksi informasi personal, preference kunci, dan pola aksi.
  2. Vector & Graph Indexing: Memetakan fakta terektraksi ke dalam ruang vektor (vector embeddings) dan node grafik relasional.
  3. Memory Search & Similarity Match: Menjalankan query cosine similarity search terhadap basis data vektor eksis untuk menemukan fakta relevan berdasarkan query terbaru.
  4. Atomic CRUD Operations: Mengeksekusi operasi basis data secara otomatis terhadap entitas memori: ADD (fakta baru), UPDATE (fakta diperbarui), DELETE (fakta kontradiktif dihapus), atau NOOP (tidak ada perubahan data).

Integrasi Mem0, Ollama Embeddings & Interface FastHTML

Sistem ini dirancang dengan pendekatan 100% privacy-first / local-first architecture. Semua inferensi LLM, ekstraksi embedding, pencarian vektor, dan antarmuka web berjalan penuh di infrastruktur lokal tanpa ketergantungan pada vendor SaaS pihak ketiga.

1. Persiapan Lingkungan Development

Unduh model inferensi LLM dan model penyemat teks (embeddings) melalui CLI Ollama:

ollama pull llama3.2
ollama pull nomic-embed-text

Pasang dependensi pustaka Python pendukung:

pip install mem0ai fasthtml ollama qdrant-client

2. Konfigurasi Mem0 Engine dengan Backend Ollama & Qdrant

Inisialisasi objek konfigurasi Mem0 untuk menggunakan Ollama sebagai penyedia inferensi sekaligus penyedia embedding. Qdrant digunakan sebagai mesin pencari basis data vektor lokal.

from mem0 import Memory

config = {
    "llm": {
        "provider": "ollama",
        "config": {
            "model": "llama3.2",
            "temperature": 0,
            "ollama_base_url": "http://localhost:11434"
        }
    },
    "embedder": {
        "provider": "ollama",
        "config": {
            "model": "nomic-embed-text",
            "ollama_base_url": "http://localhost:11434"
        }
    },
    "vector_store": {
        "provider": "qdrant",
        "config": {
            "host": "localhost",
            "port": 6333,
            "path": "./mem0_storage"
        }
    }
}

memory = Memory.from_config(config)

3. Pembuatan Interface Chat Interaktif Menggunakan FastHTML

FastHTML menyediakan kerangka kerja aplikasi web Python berperforma tinggi yang langsung merender komponen HTML/HTMX tanpa kompilasi build tools JavaScript.

from fasthtml.common import *
import ollama
from mem0 import Memory

# Inisialisasi aplikasi FastHTML dan Mem0 Engine
app, rt = fast_app()
USER_ID = "dev_user_01"

config = {
    "llm": {"provider": "ollama", "config": {"model": "llama3.2", "temperature": 0, "ollama_base_url": "http://localhost:11434"}},
    "embedder": {"provider": "ollama", "config": {"model": "nomic-embed-text", "ollama_base_url": "http://localhost:11434"}},
    "vector_store": {"provider": "qdrant", "config": {"host": "localhost", "port": 6333, "path": "./mem0_storage"}}
}
memory = Memory.from_config(config)

def fetch_user_context(query_text: str, user_id: str) -> str:
    # Pencarian memori terenkapsulasi berbasis cosine similarity
    search_results = memory.search(query=query_text, user_id=user_id)
    if not search_results or "results" not in search_results:
        return ""
    
    extracted_facts = [item["memory"] for item in search_results.get("results", [])]
    return "\n".join(f"- {fact}" for fact in extracted_facts)

@rt("/")
def get():
    return Titled("AI Agent Long-Term Memory Console",
        Div(id="chat-history", style="height: 450px; overflow-y: auto; border: 1px solid #ddd; padding: 15px; margin-bottom: 15px;"),
        Form(hx_post="/chat", hx_target="#chat-history", hx_swap="beforeend")(
            Div(style="display: flex; gap: 10px;")(
                Input(type="text", name="user_message", placeholder="Ketik instruksi atau fakta baru...", style="flex-grow: 1;"),
                Button("Kirim", type="submit")
            )
        )
    )

@rt("/chat")
def post(user_message: str):
    # 1. Ambil konteks memori spesifik pengguna dari Qdrant via Mem0
    context_str = fetch_user_context(user_message, USER_ID)
    
    # 2. Injeksi fakta memori ke System Prompt
    system_instruction = f"""Anda adalah AI Agent personal cerdas.
Fakta Jangka Panjang Pengguna:
{context_str}

Gunakan fakta di atas untuk memberikan jawaban personal, presisi, dan konsisten."""
    
    # 3. Eksekusi inferensi LLM lokal via Ollama API
    response = ollama.chat(model='llama3.2', messages=[
        {'role': 'system', 'content': system_instruction},
        {'role': 'user', 'content': user_message}
    ])
    agent_reply = response['message']['content']
    
    # 4. Simpan interaksi baru secara otomatis untuk ekstraksi entitas jangka panjang
    memory.add(messages=[{"role": "user", "content": user_message}], user_id=USER_ID)
    
    return Div(
        Div(Strong("User: "), P(user_message), style="background-color: #f0f4f8; padding: 8px; border-radius: 5px; margin-bottom: 5px;"),
        Div(Strong("Agent: "), P(agent_reply), style="background-color: #e8f5e9; padding: 8px; border-radius: 5px; margin-bottom: 15px;")
    )

serve()

Optimasi Dynamic Fact Extraction & Handling Vector Latency

Panggilan synchronous ke fungsi ekstraksi memori (memory.add) menyebabkan blocking pada siklus penanganan request HTTP server. Setiap penulisan fakta membutuhkan iterasi LLM ekstra yang menambah latensi sebesar 800ms hingga 2500ms.

Strategi Reduksi Latensi dan Manajemen State

Gunakan arsitektur penanganan latensi untuk menjaga HTTP Response Time di bawah 200ms:

  • Asynchronous Background Execution: Pisahkan alur eksekusi memory.add() dari response path utama. Manfaatkan event loop asyncio.create_task() di Python atau kirimkan tugas penulisan memori ke message broker (Redis / Celery task queue).
  • Vector Query Caching Layer: Tempatkan in-memory Cache (Redis) di depan engine pencarian vektor. Query identik dari pengguna yang sama akan mengambil konteks ter-cache tanpa mengeksekusi kalkulasi ulang embedding vektor.
  • Similarity Threshold Filtering: Terapkan filter ketat pada skor kemiripan kosinus (nilai threshold ≥ 0.78). Mencegah dimasukkannya memori yang irrelevant ke dalam system prompt, yang berisiko memicu rekurensi halusinasi pada respon LLM.

Multi-Tenant Schema & Metadata Scoping

Pada skala aplikasi besar, isolatesi data antar pengguna dan agen wajib diterapkan pada level eksekusi query. Mem0 mendukung pembatasan hirarkis melalui atribut metadata:

# Penulisan memori terisolasi berbasis user, agent, dan sesi
memory.add(
    messages=[{"role": "user", "content": "Saya sedang migrasi database ke PostgreSQL."}],
    user_id="user_prod_882",
    agent_id="agent_devops_backend",
    metadata={
        "environment": "production",
        "project_scope": "database_migration",
        "data_sensitivity": "internal"
    }
)

Saat melakukan query pencarian, terapkan filter metadata agar ruang pencarian terbatas pada domain spesifik yang relevan:

# Query pencarian terisolasi spesifik agent dan scope
relevant_memories = memory.search(
    query="Database pilihan proyek",
    user_id="user_prod_882",
    agent_id="agent_devops_backend"
)

Kesimpulan & Integrasi Pipeline Production

Mekanisme memori jangka panjang terstruktur (Long-Term Memory) mengubah LLM dari sekadar mesin pemroses teks statis menjadi AI Agent yang adaptif, personal, dan efisien secara sumber daya. Menggabungkan Mem0 untuk manajemen fakta dinamis, Ollama untuk inferensi lokal bebas biaya lisensi API, serta FastHTML untuk antarmuka web yang fleksibel menghasilkan fondasi aplikasi agentic berkelas enterprise.

Checklist Kesiapan Lingkungan Produksi (Production Readiness)

  • [ ] Persistensi Vector Store: Pastikan engine Vector DB (Qdrant, Milvus, atau PGVector) terkonfigurasi menggunakan volume penyimpanan persisten yang ter-backup secara berkala.
  • [ ] Context Window Budget Guardrail: Batasi jumlah entitas memori hasil pencarian (misal max top-k = 5) agar tidak melampaui alokasi token system prompt.
  • [ ] Asynchronous Job Isolation: Isolasi alur ekstraksi memori ke worker process terpisah menggunakan Celery, RQ, atau Drama. Jangan biarkan eksekusi I/O memori menghambat alur web server HTTP thread.
  • [ ] Sanitasi & Prompt Injection Mitigation: Lakukan validasi teks input sebelum proses penulisan fakta ke basis data memori guna mencegah serangan *Memory Injection* (penyusupan instruksi jahat yang tersimpan permanen di memori agent).
  • [ ] Privacy & Compliance Audit: Siapkan modul pembersihan data memori (Operasi Hard DELETE) sesuai regulasi perlindungan data pribadi (GDPR/UU PDP).

๐Ÿ“– Artikel Terkait