Modern mode
Portfolio
Home | Notes
- Loading projects...
- Loading project content...
Modern mode
Home | Notes

WhatsApp RAG AI Assistant Platform
Tech stack: NestJS, Vue 3, Prisma, PostgreSQL, Qdrant, Evolution API, Apache Tika, Docker
Balesin adalah platform full-stack untuk membantu bisnis mengotomasi percakapan pelanggan di WhatsApp menggunakan pendekatan Retrieval-Augmented Generation (RAG).
Aplikasi ini memungkinkan admin menghubungkan WhatsApp melalui QR pairing, menerima pesan pelanggan lewat webhook, menyimpan histori percakapan, menjawab otomatis menggunakan AI berdasarkan knowledge yang dikelola dari dashboard web, serta melakukan manual takeover ketika percakapan perlu ditangani manusia.
Secara garis besar, Balesin menggabungkan:
Admin dapat membuat atau menghubungkan WhatsApp instance dari dashboard. Backend memanggil Evolution API untuk membuat instance, mengambil QR code, membaca connection state, dan menyimpan status ke database.
Status yang disimpan meliputi:
not_createdconnectingconnecteddisconnectederrorDashboard menampilkan status koneksi, nomor aktif, QR pairing, tombol connect/reconnect, disconnect, dan refresh.
Ketika pelanggan mengirim pesan WhatsApp, Evolution API mengirim webhook ke backend.
Backend melakukan beberapa proses:
processed_messages.RAG digunakan agar AI tidak menjawab hanya dari general knowledge, tetapi dari knowledge bisnis yang sudah dikelola admin.
Pipeline RAG:
Jika knowledge tidak ditemukan atau confidence rendah, sistem mengirim fallback reply dan mencatat pertanyaan ke unanswered_leads.
Admin dapat mengelola knowledge dari dashboard web. Knowledge ini menjadi sumber utama jawaban RAG.
Fitur knowledge:
pending, indexed, atau error.Knowledge disimpan di PostgreSQL sebagai structured content, lalu saat reindex akan dipecah menjadi chunks dan dimasukkan ke Qdrant sebagai vector points.
Dashboard menyediakan inbox untuk memantau conversation pelanggan.
Fitur inbox:
Manual takeover digunakan ketika admin ingin mengambil alih percakapan dari AI.
Flow takeover:
takeover.Selain itu, jika admin membalas langsung dari WhatsApp dan pesan terdeteksi sebagai outgoing manual message, sistem dapat mengaktifkan takeover otomatis agar AI tidak ikut membalas thread yang sedang dipegang admin.
Balesin mencatat pertanyaan yang tidak bisa dijawab dengan cukup yakin sebagai fallback lead.
Data yang disimpan:
no_match, low_confidence, llm_error, atau system_error.Dashboard menampilkan fallback terbaru agar admin bisa memperbaiki knowledge.
Sistem mendeteksi intent dari pesan pelanggan dan menaikkan lead score.
Contoh intent:
Lead score kemudian dipakai untuk menentukan stage:
newdiscoveryinterestedhothandoffJika lead sudah hot atau perlu admin, sistem dapat memberi sinyal handoff.
Dashboard menyediakan wizard untuk membantu admin mengatur perilaku AI tanpa harus masuk ke konfigurasi teknis.
Bagian utama AI training:
AI training ini membantu mengubah konfigurasi RAG dan assistant flow agar jawaban lebih sesuai dengan karakter bisnis.
Platform memiliki konsep assistant template.
Template dapat berisi:
Template dapat dibuat dan diedit oleh admin, lalu dipakai sebagai dasar konfigurasi assistant.
Project ini memiliki modul tenant dan user management.
Fitur tenant:
Fitur user:
Role user:
platform_admintenant_admintenant_staffDashboard overview menampilkan ringkasan operasional:
Customer WhatsApp
|
v
Evolution API
|
v
NestJS Webhook Handler
|
+--> PostgreSQL: conversations, messages, leads
|
+--> RAG Service
|
+--> Embedding API
|
+--> Qdrant Vector Search
|
+--> LLM Chat API
|
v
Generated Reply
|
v
Evolution API Send Message
|
v
Customer WhatsApp
Admin mengelola sistem melalui Vue dashboard:
Vue Dashboard
|
v
NestJS REST API
|
+--> PostgreSQL
+--> Qdrant
+--> Evolution API
instanceName, phone, messageId, dan isi pesan.tenantId dan messageId.conversation_messages.takeover.Beberapa table utama:
tenants: data bisnis/tenant.app_users: user dashboard dan role.wa_instances: status WhatsApp instance per tenant.conversations: thread percakapan pelanggan.conversation_messages: histori pesan user, assistant, admin, dan system.knowledge_sources: sumber knowledge yang dikelola admin.unanswered_leads: pertanyaan yang gagal dijawab AI.processed_messages: deduplication webhook.rag_configs: konfigurasi RAG per tenant.assistant_templates: template assistant global/custom.Deployment disiapkan menggunakan Docker Compose untuk Dokploy.
Service utama:
frontend: Vue dashboard yang diserve via Nginx.backend: NestJS API.postgres: database utama.redis: dependency cache untuk Evolution API.qdrant: vector database.evolution-api: WhatsApp gateway.Volume persisten:
postgres_dataredis_dataqdrant_dataevolution_instancesuploads_dataknowledge_dataEnvironment penting:
DATABASE_URLJWT_SECRETCOOKIE_SECRETEVOLUTION_API_KEYEVOLUTION_API_URLEVOLUTION_WEBHOOK_URLLLM_BASE_URLLLM_API_KEYCHAT_MODELEMBEDDING_BASE_URLEMBEDDING_API_KEYEMBEDDING_MODELQDRANT_URLQDRANT_COLLECTIONSaya menggunakan RAG karena chatbot customer support harus menjawab berdasarkan informasi bisnis yang bisa berubah, seperti harga, jadwal, syarat, alamat, atau prosedur. Dengan RAG, knowledge bisa diperbarui dari dashboard tanpa perlu retrain model.
Qdrant digunakan sebagai vector database untuk mencari knowledge yang paling relevan berdasarkan semantic similarity. Ini lebih fleksibel dibanding pencarian keyword biasa, terutama untuk pertanyaan pelanggan yang bahasanya tidak selalu sama dengan isi knowledge.
NestJS cocok untuk backend yang modular. Project ini punya banyak domain seperti auth, WhatsApp, webhook, conversation, knowledge, RAG, dashboard, tenant, dan user. Dengan NestJS, setiap domain bisa dipisah menjadi module, controller, dan service.
Setiap webhook message memiliki messageId. Backend menyimpan kombinasi tenantId dan messageId di table processed_messages. Jika webhook yang sama masuk lagi, insert akan gagal karena unique constraint, lalu request dianggap deduplicated.
Conversation memiliki field takeoverEnabled dan status. Jika takeover aktif, webhook tetap menyimpan pesan user, tetapi tidak menjalankan RAG auto-reply. Admin bisa membalas manual dari dashboard, lalu release takeover untuk mengaktifkan bot lagi.
Jika Qdrant tidak menemukan context yang cukup relevan atau LLM tidak menghasilkan jawaban valid, sistem mengirim fallback reply dan menyimpan pertanyaan ke unanswered_leads. Data ini ditampilkan di dashboard agar admin bisa memperbaiki knowledge.
Data utama seperti conversation, message, knowledge, lead, RAG config, dan WhatsApp instance memiliki tenantId. Query backend memfilter data berdasarkan tenant user yang sedang login, sehingga setiap tenant hanya mengakses data miliknya.
Bagian paling menantang adalah mengatur flow percakapan agar AI tetap natural tetapi tidak mengarang informasi. Untuk itu sistem memakai RAG, fallback handling, prompt rules, conversation history, lead context, dan manual takeover agar automation tetap bisa dikontrol admin.