Memory Agent Saya Disintesis Sekali Seminggu, Bukan Tiap Chat
Cron mingguan no-agent membaca digest pesan tujuh hari lalu mengusulkan kandidat pembaruan memory: kandidat dulu, ratifikasi kemudian, tanpa auto-write.
Ringkasan
Sistem memory kebanyakan cuma bisa nambah, entri usang tak pernah ditandai—OpenAI sendiri mengakuinya. Penulis membangun skrip sintesis mingguan berbasis cron yang membaca riwayat chat, lalu menghasilkan laporan kandidat: entri baru, kontradiksi, dan yang tak perlu dicatat. Masih report-only dengan ratifikasi manual, karena auto-write dinilai jebakan selama tingkat salahnya belum nol.
Minggu ini saya koreksi satu entri di memory agent saya. Doang? Soalnya entri sejenis itu balik lagi. Sistem memory yang saya pakai sederhana: satu file flat buat preferensi, fact store buat fakta project yang dicari secara semantic, session search buat transkrip lama. Semuanya kenal satu arah: nambah. Entri usang nggak pernah ditandai, koreksi lama nggak pernah dibuang, dan yang membersihkan cuma satu orang: saya, kalau kebetulan inget.
Ternyata keluhan ini diakui OpenAI sendiri. Di FAQ memory resmi mereka, sistem saved memories yang lama disebut "often became stale and relied on users to manually manage updates". Contoh kontradiksinya resmi juga: satu entri bilang "I am training for a marathon", entri lain bilang "I sprained my ankle" [1]. Dua-duanya pernah benar. Tapi sistemnya nggak pernah menandai mana yang sudah lewat.
Dugaan pertama saya keliru
Simpel kan, solusinya kelihatannya: tarik konteks relevan dari riwayat chat setiap kali user ngetik, alias RAG real-time, atau injeksi ulang riwayat ke tiap prompt. Saya sempat mau lewat jalur itu.
ChatGPT nggak ngelakuin hal semacam itu. Memory-nya disintesis out-of-band, alias diproses di luar sesi percakapan, lalu hasil sintesisnya disuntikkan statis ke sesi baru. Mereka pilih jalur periodik. Sistem yang baru juga update otomatis tanpa disuruh, menurut FAQ yang sama [1].
Yang bikin saya ngerasa di jalur yang benar: Letta, runtime agent yang dulu dikenal sebagai MemGPT, sekarang punya fitur resmi dengan pola yang persis sama. Namanya Dreaming: background subagent yang me-review percakapan terbaru, mengonsolidasi pelajaran yang berguna, lalu meng-update memory tanpa mengganggu kerja aktif. Pemicunya bisa setelah sejumlah agent steps, atau saat context window di-compact [2]. Lucunya, di dossier riset saya beberapa hari lalu, istilah "Dreaming" masih tercatat sebagai rumor komunitas tanpa sumber resmi, dan klaim itu dibuang dari temuan. Sekarang dia sudah ada di dokumentasi resminya.
Docs Mem0, layanan memory layer yang populer, malah jujur soal kebalikannya: behavior mereka ADD-only, memories accumulate [3]. Artinya housekeeping memang bukan default siapa pun. Semua orang sibuk bikin memory yang bisa nambah, belum banyak yang pikirin jadwal bersih-bersihnya.
Kenapa sintesis berkala masuk akal? Karena itu kerja batch yang murah. Retrieval dan konsolidasi itu kerja yang beda. Yang saya butuhkan bukan memory yang lebih cepat diambil, tapi memory yang lebih jarang salah. Nge-pause tiap percakapan buat evaluasi real-time itu mahal, dan hasilnya biasanya berlebihan.
Kandidat, bukan keputusan
Jadi saya bangun versi saya sendiri. Namanya sintesis-mingguan.py, 178 baris Python, jalan tiap Senin pagi lewat cron dengan mode no_agent, alias nol token LLM saat jadwalnya menyala. Alurnya begini: baca database sesi secara read-only, ambil pesan user tujuh hari terakhir dari sumber tui dan discord. Slash-command dibuang, pesan sistem yang menyusup sebagai role user juga dibuang. Tiap pesan dipotong 300 karakter, maksimal 25 pesan per sesi, total digest dibatasi sekitar 55 ribu karakter. Digest itu, lengkap dengan isi memory saat ini, dikirim ke Qwen lewat lane browser Camofox yang gratis, dengan preflight dulu biar yakin lane-nya hidup. Kontrak exit-nya mengikuti pola async yang sudah saya pakai di pipeline artikel: 42 berarti queued, jawabannya ditarik dengan polling.
Output-nya bukan memory jadi. Melainkan laporan kandidat, maksimal 12 entri, dalam tiga kategori: (A) fakta atau preferensi baru tahan-lama yang belum tercakup, (B) entri lama yang kini kontradiktif atau usang beserta alasannya, dan (C) yang nggak perlu dicatat, sebagai bukti bahwa si model beneran memilah, bukan mengulang.
Fase sekarang masih report-only. Nggak ada auto-write ke file memory. Laporan dibaca, kandidat diratifikasi manual, baru Hermes yang menulis.
Dan di titik ini saya tegas: auto-write memory itu jebakan. ChatGPT dan Letta berani auto, dan bukan karena teknologinya lebih hebat, tapi karena produk mereka siap menanggung salahnya. Saya belum. Satu entri ngarang yang nempel di memory bisa mengganggu semua jawaban setelahnya. Jadi saya pilih laporan dulu, ratifikasi kemudian. Kalau nanti tingkat salahnya nol beberapa minggu, saya pikir ulang. Belum sekarang.