Memory & state pada agent
'Memory' pada agent bukan database ajaib — ia soal apa yang dimasukkan ke context window di setiap langkah, dan apa yang sengaja dibuang supaya tetap muat.
Intisari
- Short-term memory = riwayat langkah dalam satu eksekusi agent (messages yang terus bertambah tiap loop tool use) — hidup dan mati bersama satu tugas.
- Long-term memory = informasi yang perlu bertahan lintas sesi/eksekusi — preferensi pengguna, riwayat percakapan sebelumnya — biasanya disimpan eksternal (database, vector store) dan diambil ulang saat dibutuhkan.
- Riwayat yang terus ditambahkan tanpa dibatasi akan menabrak context window dan menaikkan biaya token linear — perlu strategi pemangkasan atau ringkasan.
- Pola umum: ringkas langkah-langkah lama jadi satu ringkasan singkat begitu riwayat mulai panjang, sambil tetap menyimpan beberapa langkah terakhir apa adanya.
- State agent (langkah ke berapa, tool apa saja yang sudah dipanggil) berbeda dari memory — state perlu untuk melanjutkan eksekusi yang terhenti (mis. agent yang jalan di background, bisa di-resume).
Dua rentang waktu memory
| Jenis | Hidup selama | Contoh isi | Tempat penyimpanan tipikal |
|---|---|---|---|
| Short-term | Satu eksekusi agent / satu sesi percakapan | Riwayat langkah tool use saat ini, konteks tugas berjalan | Array messages di memori proses, dikirim ulang tiap panggilan API |
| Long-term | Lintas sesi, bisa selamanya | Preferensi pengguna, riwayat percakapan minggu lalu, fakta yang sudah dipelajari agent tentang penggunanya | Database, vector store (Fase 4) — diambil kembali saat relevan |
Model tidak "mengingat" apa pun di antara panggilan API — ini prinsip yang sama dari Fase 0. Yang disebut "memory" pada agent, di level teknis, selalu berujung pada satu hal: apa yang kamu masukkan ke context window di panggilan berikutnya. Long-term memory hanyalah short-term memory yang diambil dari penyimpanan eksternal dan disuntikkan lagi ke prompt saat dibutuhkan.
Masalah nyata: riwayat yang terus tumbuh
Kode agent di materi sebelumnya menambah messages setiap putaran loop. Untuk tugas dengan
banyak langkah, riwayat ini bisa membengkak — setiap tool call dan hasilnya ikut terbawa di setiap
panggilan API berikutnya (LLM tidak stateful, jadi seluruh riwayat harus dikirim ulang tiap kali).
| Akibat riwayat yang terus tumbuh | Dampaknya |
|---|---|
| Mendekati/melebihi context window | Request ditolak atau informasi penting di awal "terdorong keluar" |
| Biaya naik per langkah | Setiap langkah baru membayar ulang token untuk seluruh riwayat sebelumnya (Fase 7 membahas prompt caching untuk meredam ini) |
| Latensi naik | Prompt makin panjang = makin lama diproses |
Strategi mengelola riwayat
- Sliding window — simpan hanya N langkah/pesan terakhir apa adanya, buang yang lebih lama. Sederhana, tapi bisa kehilangan konteks penting di awal.
- Ringkasan berkala — begitu riwayat melewati ambang tertentu, minta model merangkum langkah-langkah lama jadi beberapa kalimat, ganti detail penuhnya dengan ringkasan itu, lanjutkan dari sana.
- Pisahkan hasil tool yang besar — hasil tool call yang panjang (mis. isi dokumen penuh) disimpan di luar (file/database), dan yang masuk ke riwayat cuma referensinya — diambil penuh lagi hanya saat benar-benar dibutuhkan.
def ringkas_jika_perlu(messages, batas_pesan=20):
if len(messages) <= batas_pesan:
return messages
lama, baru = messages[:-6], messages[-6:] # simpan 6 pesan terakhir apa adanya
ringkasan = client.messages.create(
model="claude-sonnet-4-5", max_tokens=300,
messages=[{"role": "user", "content": f"Ringkas langkah-langkah ini dalam 3 kalimat: {lama}"}],
).content[0].text
return [{"role": "user", "content": f"[Ringkasan langkah sebelumnya] {ringkasan}"}] + baru
State: melanjutkan eksekusi yang terhenti
Berbeda dari memory (isi konteks), state adalah "sedang di langkah mana" sebuah eksekusi agent — penting untuk agent yang berjalan lama di background dan mungkin perlu di-resume setelah proses restart atau setelah menunggu input manusia. Untuk kasus ini, riwayat langkah + status terakhir biasanya disimpan persisten (database), bukan cuma di memori proses.
Latihan: tambahkan fungsi ringkas_jika_perlu di atas ke loop agent dari materi
sebelumnya, panggil di setiap akhir iterasi. Jalankan agent dengan tugas yang sengaja butuh banyak langkah
(mis. "cek stok 5 produk berbeda satu per satu") dan amati kapan ringkasan mulai terpicu.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.