Masalah Memory pada AI Agent
Salah satu tantangan terbesar dalam membangun AI Agent adalah membuatnya 'ingat' konteks percakapan sebelumnya. Tanpa memory management yang baik, AI Agent akan seperti amnesia setiap kali user mulai percakapan baru. Dari pengalaman saya di beberapa proyek di Bandung, ini benar-benar masalah nyata yang harus diselesaikan.
LLM memiliki context window yang terbatas - meskipun sekarang model-model terbaru sudah support hingga 128K tokens, tetap saja tidak praktis untuk menyimpan seluruh history percakapan. Solusinya adalah memory management yang efektif.
Jenis-Jenis Memory pada AI Agent
Ada tiga jenis utama memory yang saya implementasikan:
type MemoryType int
const (
ShortTerm MemoryType = iota // Percakapan saat ini
LongTerm // Fakta penting dari interaksi
Episodic // Pengalaman spesifik kejadian
)
type MemoryStore struct {
shortTerm []Message // In-memory, dibuang setelah session
longTerm *VectorDB // Persistent storage
episodic map[string][]Event // Per-user events
}Implementasi Short-Term Memory
Short-term memory adalah yang paling sederhana. Kita cukup simpan beberapa message terakhir dalam context window. Triknya adalah melakukan summarization untuk message yang sudah tua:
func (m *MemoryManager) ManageShortTerm(messages []Message) []Message {
if len(messages) <= m.maxMessages {
return messages
}
// Summarize old messages
oldMessages := messages[:len(messages)-m.maxMessages]
summary := m.summarize(oldMessages)
// Replace with summary + recent messages
return append([]Message{{
Role: "system",
Content: fmt.Sprintf("Ringkasan percakapan sebelumnya: %s", summary),
}}, messages[len(messages)-m.maxMessages:]...)
}Long-Term Memory dengan Vector Database
Untuk long-term memory, saya menggunakan vector database (biasanya Qdrant atau Chroma) untuk menyimpan informasi penting dari setiap interaksi. Setiap kali ada fakta baru yang disebutkan user, agent akan embed dan simpan ke vector DB. Saat user bertanya tentang sesuatu yang pernah dibahas, agent bisa retrieve konteks yang relevan menggunakan similarity search.
func (m *MemoryManager) StoreFact(ctx context.Context, fact string, userID string) error {
embedding, err := m.embedder.Embed(ctx, fact)
if err != nil {
return err
}
return m.vectorDB.Upsert(ctx, Point{
ID: uuid.New(),
Vector: embedding,
Payload: map[string]interface{}{
"fact": fact,
"user_id": userID,
"timestamp": time.Now(),
},
})
}Best Practices Memory Management
Dari beberapa proyek yang sudah saya handle, ada beberapa lessons learned yang berharga. Pertama, jangan simpan semua data - hanya simpan informasi yang benar-benar relevan. Kedua, implement expiry untuk memory yang sudah tidak relevan. Ketiga, selalu beri user kontrol untuk delete memory mereka. Privasi adalah hal yang sangat penting.
Dengan memory management yang tepat, AI Agent bisa menjadi assistant yang benar-benar personal dan helpful. Ini adalah salah satu aspek yang paling menarik dari AI Agent development menurut saya.