Saya mengadopsi LangGraph dengan harapan "manajemen state dan kontrol alur akan menjadi rapi", tetapi kode justru menjadi lebih kompleks.
Ini adalah catatan dan berbagi pengalaman setelah mengalami sendiri bahwa struktur bisa memburuk meski sudah mengadopsi framework.
Saat didiagnosis, kondisinya seperti ini:
- Hanya ada satu node di graph. Karena strukturnya current_step → END, tidak ada conditional edge maupun percabangan, dan graph.invoke() sama saja seperti memanggil fungsi secara langsung. Transisi Step ditentukan oleh kode service di luar graph.
- State yang sama disimpan di dua tempat. LangGraph MemorySaver (in-memory) dan PostgreSQL Checkpointer buatan sendiri menyimpan serta memulihkan sesi yang sama secara ganda, sehingga terjadi ketidaksesuaian.
- Duplikasi di 3 kode eksekusi LangGraph (Executor) sekitar 8.700 baris. Logika inti yang sebenarnya hanya sekitar "pemanggilan LLM + penyusunan prompt", sementara sebagian besar sisanya adalah manajemen state, percabangan kondisi, dan patch untuk edge case.
Di permukaan, masalahnya adalah mengadopsi framework hanya sebagai cangkang tanpa memakai fitur sebenarnya (conditional edge, checkpointer bawaan, Human-in-the-Loop). Namun setelah digali lebih dalam, penyebabnya ternyata berbeda.
- Sebagian besar dibuat dengan vibe coding, tetapi selama proses pembuatan tidak menelaah kode internal atau prinsip desain secara mendalam; setiap kali hanya merapikan kebutuhan dan maksud lalu melanjutkan implementasi.
- Masalahnya bukan vibe coding itu sendiri, melainkan proses tanpa verifikasi. Ia hanya mengoptimalkan fitur di depan mata, tetapi tidak menjaga batas tanggung jawab struktur secara keseluruhan. Double checkpointing, state yang tersebar, dan logika yang terduplikasi semuanya adalah akumulasi optimasi parsial.
- Penyebab sebenarnya bukan karena tidak ada perancang, melainkan karena memberi instruksi di atas framework tanpa cukup memahami apa yang dirancang untuk menjadi tanggung jawab framework tersebut.
Jadi saya berefleksi dan mengembalikannya seperti ini.
- Memisahkan sesi dengan topologi independen + isolasi thread_id
- Hanya menaruh metadata di State dan memindahkan isi utama ke Store
- Menggunakan tool_use native alih-alih parsing regex
- Memisahkan node agar bisa diuji
- Diri saya sendiri perlu pemahaman yang tepat tentang framework dan struktur pemanfaatannya
Ini adalah catatan/berbagi tentang "bagaimana salah memakainya", bukan "bagaimana memakainya".
2 komentar
Sepertinya semua kasus penggunaan LangChain dan LangGraph bisa digantikan dengan AI SDK.
Benar juga. Saya setuju. Mungkin akan muncul dependensi pada SDK, tetapi karena kurva belajarnya tinggi, sepertinya itu justru lebih baik.