← Semua pembelajaran / AI Engineer Nol → Production
Fase 3 · AI Agents

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

JenisHidup selamaContoh isiTempat penyimpanan tipikal
Short-termSatu eksekusi agent / satu sesi percakapanRiwayat langkah tool use saat ini, konteks tugas berjalanArray messages di memori proses, dikirim ulang tiap panggilan API
Long-termLintas sesi, bisa selamanyaPreferensi pengguna, riwayat percakapan minggu lalu, fakta yang sudah dipelajari agent tentang penggunanyaDatabase, 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 tumbuhDampaknya
Mendekati/melebihi context windowRequest ditolak atau informasi penting di awal "terdorong keluar"
Biaya naik per langkahSetiap langkah baru membayar ulang token untuk seluruh riwayat sebelumnya (Fase 7 membahas prompt caching untuk meredam ini)
Latensi naikPrompt makin panjang = makin lama diproses

Strategi mengelola riwayat

  1. Sliding window — simpan hanya N langkah/pesan terakhir apa adanya, buang yang lebih lama. Sederhana, tapi bisa kehilangan konteks penting di awal.
  2. 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.
  3. 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.