# Praktik Terbaik Memori Bagaimana Anda menstrukturkan memori menentukan seberapa berguna memori tersebut. Panduan ini mencakup pola untuk mengkategorikan, menandai, dan memprioritaskan memori sehingga LLM dapat recall informasi yang tepat pada waktu yang tepat. ## Kategori: Pilih yang Paling Spesifik | Kategori | Gunakan Untuk | Contoh | |----------|---------|---------| | `identity` | Nama pengguna, peran, info kontak | `"user_name": "Michael Schäfer"` | | `preference` | Suka, tidak suka, gaya kerja | `"communication": "Prefers concise responses"` | | `fact` | Fakta yang dapat diverifikasi | `"office_location": "Berlin, Germany"` | | `project` | Status proyek, keputusan | `"project_synapse": "v1.5.0 deployed"` | | `skill` | Keahlian pengguna | `"skill_python": "Advanced, 10+ years"` | | `mistake` | Error masa lalu yang harus dihindari | `"mistake_npm_version": "Always bump version"` | | `context` | Konteks yang relevan dengan sesi | `"current_focus": "Working on docs system"` | | `note` | Catatan lain-lain | `"note_idea": "Try Redis for caching"` | > [!TIP] > Jika ragu, gunakan `fact` untuk info yang dapat diverifikasi dan `note` untuk > yang lainnya. Jangan berlebihan mengkategorikan — lebih baik memiliki `fact` > yang jelas daripada `context` yang membingungkan. ## Key: Identifier Bermakna Field `key` adalah identifier memori. Gunakan key yang bermakna dan stabil: **Key yang baik:** - `user_name` - `project_synapse_status` - `preference_communication_style` - `mistake_npm_version_bump` **Key yang buruk:** - `mem_001` (tidak bermakna) - `temp` (tidak deskriptif) - `2026-06-27-note` (tanggal tidak membantu recall) ### Konvensi penamaan key - `snake_case` (huruf kecil dengan garis bawah) - Awali dengan kategori: `preference_*`, `project_*`, `mistake_*` - Gunakan kata benda deskriptif, bukan kata kerja - Jaga di bawah 50 karakter ## Tag: Untuk Pencarian dan Pemfilteran Tag memungkinkan pemfilteran dan pencarian cepat. Tambahkan 2-5 tag per memori: ```json { "category": "project", "key": "project_synapse_status", "content": "Synapse v1.5.0 deployed. Next: v1.6.0 with docs system.", "tags": ["synapse", "deployment", "status", "v1.5.0"] } ``` ### Pola tag - **Nama proyek**: `synapse`, `synapse-mcp`, `synapse-chat` - **Topik**: `deployment`, `ci`, `database`, `auth` - **Status**: `active`, `completed`, `blocked` - **Indikator prioritas**: `urgent`, `long-term` > [!NOTE] > Tag tidak case-sensitive. Gunakan huruf kecil untuk konsistensi. ## Prioritas: Realistis | Prioritas | Gunakan Untuk | % Memori | |----------|---------|---------------| | `critical` | Identitas pengguna, info hukum, keputusan ireversibel | ~5% | | `high` | Proyek aktif, preferensi penting | ~20% | | `normal` | Sebagian besar fakta, catatan, konteks | ~65% | | `low` | Efemeral, bagus untuk diketahui | ~10% | > [!WARNING] > Jangan tandai semuanya `critical`. Jika semuanya critical, tidak ada yang critical. > Simpan `critical` untuk hal-hal yang akan menyebabkan kerugian nyata jika dilupakan. ## Kapan Menyimpan vs Tidak Menyimpan ### Selalu simpan - Identitas pengguna (nama, email, peran) - Preferensi jangka panjang - Keputusan proyek dan rasional - Kesalahan masa lalu dan pelajaran yang dipetik - Komitmen yang dibuat kepada pengguna ### Jangan simpan - State sementara (gunakan variabel sebagai gantinya) - Riwayat percakapan verbatim (sistem chat menangani ini) - Data sensitif (kata sandi, API key) - Fakta yang mudah diturunkan (tanggal saat ini, konten file) - Konteks efemeral (gunakan kategori `context` dengan prioritas rendah) ## Memperbarui Memori POST `/memory` dengan `category` + `key` yang sama memperbarui memori yang ada: ```python # Initial store store("project", "project_synapse_status", "v1.4.0 deployed", priority="high") # Later: update with same key store("project", "project_synapse_status", "v1.5.0 deployed. CI green.", priority="high") ``` > [!TIP] > Gunakan key yang stabil sehingga Anda dapat memperbarui tanpa membuat duplikat. > LLM harus POST ulang key yang sama saat info berubah, bukan membuat memori baru. ## Siklus Hidup Memori ``` Create → Active → Stale → Archive → Delete ``` - **Create**: POST /memory dengan konteks penuh - **Active**: Recall sering, perbarui sesuai kebutuhan - **Stale**: Masih relevan tetapi tidak aktif digunakan (prioritas lebih rendah?) - **Archive**: Tetapkan prioritas ke `low`, simpan untuk referensi historis - **Delete**: DELETE /memory/:id saat tidak lagi relevan ### Pembersihan berkala ```python # Find memories not updated in 90 days old_memories = requests.get( f"{URL}/memory/search?q=*", headers={"Authorization": f"Bearer {KEY}"} ) for mem in old_memories["results"]: if is_stale(mem, days=90): # Either delete or lower priority if is_obsolete(mem): delete_memory(mem["id"]) else: update_memory(mem["id"], priority="low") ``` ## Pola: Warisan Memori Untuk konteks hierarkis (proyek → subproyek → tugas): ```python # Parent project store("project", "project_synapse", "Main Synapse project", tags=["synapse", "parent"], priority="high") # Sub-project (tags link to parent) store("project", "project_synapse_docs", "Docs system for Synapse", tags=["synapse", "docs", "synapse-parent"], priority="high") # Specific task (tags link to sub-project) store("project", "task_docs_loader", "Implement docs-loader.ts", tags=["synapse", "docs", "task"], priority="normal") ``` LLM kemudian dapat mencari `q=synapse+docs` untuk menemukan semua memori terkait. ## Pola: Log Keputusan Simpan keputusan dengan rasional sehingga LLM tidak membahasnya ulang: ```python store("fact", "decision_postgres_over_sqlite", "Chose PostgreSQL over SQLite for production. Reason: concurrent writes, " "FTS5 native support, better backup story. Date: 2026-06-15. Decided by: Michael.", tags=["decision", "database", "postgres", "sqlite"], priority="high") ``` ## Pola: Penghindaran Kesalahan Simpan kesalahan dengan instruksi penghindaran spesifik: ```python store("mistake", "mistake_forget_version_bump", "Forgot to bump package.json version after changes. npm publish failed. " "FIX: Always run `npm version patch` before pushing. " "CI fails with 'version already exists' if you forget.", tags=["npm", "ci", "publish", "version"], priority="high") ``` ## Anti-Pola yang Harus Dihindari > [!WARNING] > - **Menyimpan log percakapan** — sistem chat menangani ini > - **Menyimpan seluruh file** — gunakan penyimpanan skrip atau penyimpanan eksternal > - **Menyimpan state efemeral** — gunakan variabel > - **Menyimpan rahasia** — gunakan variabel lingkungan > - **Menduplikasi memori** — gunakan key yang stabil > - **Tag berlebihan** — 2-5 tag per memori adalah ideal > - **Semuanya critical** — realistis dengan prioritas ## Langkah Berikutnya - [Memory API](/docs/api/memory) - [Agen LLM Persisten](/docs/guides/persistent-llm-agent) - [Strategi Penandaan Memori](/docs/llm-cookbook/memory-tagging-strategy)