Contact Center Voice AI Realtime
ARIA, voice AI MII: jawaban dari knowledge base dan pengalihan ke petugas. Latensi interupsi ~2 ke ~0,2 detik pada A/B terkontrol (n=4 panggilan per jalur).
Hasil utama
~2 s to ~0.2 s
Latensi interupsi akses knowledge base, A/B terkontrol (n=4 panggilan per jalur)
2 of 2
Drill kehilangan node lulus; panggilan aktif tetap berjalan
6 vs 18
Jawaban halusinasi dalam perbandingan model offline; quality gate mempertahankan model realtime dengan hasil lebih baik
- Owner dan lead engineer, bertanggung jawab atas desain, arahan AI coding agent, review, dan rilis
- Mei 2026 hingga Okt 2026
- Proyek utama
- L3:voice-ai-contact-center
Situasi
Penelepon terjebak di menu telepon yang kaku. MII membutuhkan voice agent yang menjawab dari knowledge base perusahaan, dapat disela saat berbicara atau mencari informasi, serta dapat mengalihkan panggilan ke petugas lalu kembali ke agent dalam panggilan yang sama. Supervisor juga membutuhkan konsol live.
Peran dan keputusan utama
Memindahkan akses knowledge base keluar dari realtime loop
Alasan: Interupsi penelepon saat pencarian berlangsung harus langsung diproses. Karena itu, akses knowledge base saya jadikan task yang dapat dibatalkan dengan satu batas waktu bersama, sementara barge-in memperhitungkan audio yang masih diputar.
Mengganti layanan suara yang akan dihentikan dengan WebRTC self-hosted di VM zonal
Alasan: Layanan managed tersebut akan dihentikan. Saya mendokumentasikan keputusan penggantinya, lalu memverifikasi jalur baru melalui drill failover dengan mematikan VM secara paksa.
Membangun evaluation harness sebelum merilis perubahan
Alasan: Saya menggunakan media emulator, golden question, dan LLM judge terkalibrasi untuk mengevaluasi perubahan. Perubahan tanpa bukti pendukung tetap dinonaktifkan.
Hasil
~2 s to ~0.2 s
Latensi interupsi akses knowledge base, A/B terkontrol (n=4 panggilan per jalur)
2 of 2
Drill kehilangan node lulus; panggilan aktif tetap berjalan
6 vs 18
Jawaban halusinasi dalam perbandingan model offline; quality gate mempertahankan model realtime dengan hasil lebih baik
Migrated
Voice channel dimigrasikan dari layanan yang akan dihentikan; jalur lama dihapus
Pelajaran
Spec dan PR yang sudah di-merge bukan bukti bahwa sebuah perbaikan berhasil. Tetapkan kriteria pengujian lebih dulu, terima hasil negatif, dan hapus perubahan yang tidak didukung data.
Arsitektur
Detail teknis
Latency Budget
Latensi diukur dari sisi penelepon: harness memutar audio penelepon yang sudah direkam melalui jalur panggilan sebenarnya, lalu menggabungkan timeline-nya dengan telemetry backend per giliran, sehingga setiap tahap punya angkanya sendiri.
- Pada jalur WebRTC live, penelepon mendengar jawaban 1.204 ms setelah selesai berbicara pada P50 (P95 1.257 ms, n=6 giliran tanpa tool call). Tahap terbesar adalah waktu tunggu model untuk mendeteksi akhir giliran (sekitar 520 ms) dan waktu hingga audio pertama (408 ms); jalur media menambah sekitar 136 ms.
- Akses knowledge base berjalan sebagai task yang bisa dibatalkan dengan satu batas waktu 2,5 detik. Search dan embeddings masing-masing mendapat timeout 1,5 detik per percobaan, dan sisa deadline ikut dibawa ke setiap retry, sehingga tidak ada retry yang dimulai jika tidak sempat selesai.
- Memindahkan knowledge search ke geografi yang sama dengan backend memangkas P50 retrieval sebesar 1.351 ms pada A/B live, sehingga perubahan ini dipertahankan.
- Tuning yang penghematannya terlalu kecil ditolak berdasarkan ambang yang ditetapkan sebelum pengujian: reasoning model minimal hanya menghemat 39 ms dan jendela hening 500 ms di sisi server hanya menghemat 69 ms dari 84 panggilan. Model deteksi akhir giliran yang menambah 220 ms tetap dinonaktifkan.
Batasan yang diketahui: Sampelnya kecil dan berasal dari test run, bukan trafik produksi, dan tahap terbesar, yaitu waktu tunggu akhir giliran, terjadi di dalam layanan model.
Selengkapnya: Cara Kami Membuat Voice Agent Bisa Diinterupsi
Desain Failover
Setiap dependensi di jalur panggilan punya timeout per percobaan, retry hanya untuk panggilan idempotent, dan circuit breaker yang terbuka setelah 5 kegagalan dalam 60 detik lalu mencoba lagi setelah 30 detik. Status breaker terlihat di endpoint readiness.
- Media berjalan di dua node LiveKit self-hosted pada availability zone yang berbeda. Panggilan baru diarahkan ke node yang sehat, tidak sedang drain, dan memiliki room paling sedikit, dicek setiap 5 detik.
- Bridge panggilan berjalan di proses worker yang diawasi supervisor dengan heartbeat 2 detik. Saat sebuah worker mati, panggilannya bergabung kembali ke worker yang masih hidup, dan penelepon yang masih terhubung dialihkan ke petugas, bukan diputus.
- Chaos suite dengan model tiruan lolos 16 dari 17 mode kegagalan dalam 3 run berturut-turut (gangguan region tidak berlaku): write database yang gagal masuk ke dead-letter queue yang bisa di-replay, kegagalan search dan embedding beralih ke keyword search, dan saat admin API mati panggilan tetap dimulai dengan konfigurasi agent terakhir yang valid.
- Admission control menolak panggilan baru dengan 429 saat kapasitas penuh atau model terkena throttling, dan 503 saat breaker sebuah dependensi terbuka, sehingga panggilan yang sedang berjalan tetap mendapat kapasitasnya.
- Drill handover live dengan 44 panggilan menelusuri takeover yang gagal ke throttling model dan respons gagal yang dibuang bridge tanpa jejak. Kini respons yang gagal dicatat dan di-retry.
Batasan yang diketahui: Backend masih berjalan sebagai satu instance yang belum zone-redundant, belum ada deployment model cadangan atau region kedua, dan disaster recovery lintas region baru sebatas desain dan belum pernah di-drill.
Metode Evaluasi
Kriteria keputusan ditulis dan di-commit sebelum pengukuran apa pun, dan hanya hasil lulus yang boleh mengubah default. Perubahan tanpa bukti pendukung tetap dinonaktifkan.
- Harness menjalankan bridge panggilan yang sebenarnya dengan tiga cara: media emulator untuk run deterministik, endpoint realtime tiruan untuk run tanpa biaya, dan penelepon WebRTC headless untuk run live.
- Skenarionya mencakup giliran tenang, pertanyaan knowledge base, interupsi, eskalasi, jeda panjang, penelepon berbahasa Indonesia, kebisingan jalan pada 15 dB, dan kebisingan kantor dengan gema speakerphone.
- Kualitas jawaban diukur dengan 16 golden question dalam bahasa Inggris dan Indonesia, 2 run per model, dinilai 1 sampai 5 untuk groundedness, correctness, completeness, kesesuaian bahasa, dan keringkasan oleh LLM judge. Judge tersebut harus lebih dulu sesuai dengan 10 item yang dilabeli manual: 0,8 per item dan 1,0 untuk penanda halusinasi.
- Turn-taking dinilai dari tingkat salah deteksi akhir giliran, tingkat ucapan terpotong, dan event palsu per 100 ucapan, di samping latensi, terhadap batas yang ditetapkan sebelum setiap run.
- Retrieval regression gate memeriksa recall pada k=4 dengan set pertanyaan tetap (0,909 untuk bahasa Inggris, n=44), dan guard-nya menandai keempat chunk beracun yang terambil oleh probe injeksi.
Batasan yang diketahui: Evaluasi dijalankan sesuai kebutuhan, bukan di setiap pull request, sampelnya kecil, belum ada metrik word error rate atau containment dari trafik nyata, dan recall retrieval bahasa Indonesia pada set regresi masih rendah (0,182, n=11).
Keamanan dan Identitas
Setiap aplikasi berjalan dengan managed identity masing-masing dan role data-plane dengan hak akses minimum, dan akses berbasis key dinonaktifkan pada database, search, layanan AI, dan storage, sehingga tidak ada key data store di konfigurasi aplikasi.
- Panggilan antarlayanan memakai Entra app role ditambah actor context yang ditandatangani, tanpa key yang dibagi antaraplikasi.
- Operator masuk dengan Entra single sign-on, kontrol akses bersifat fail-closed dan memetakan grup Entra ke role, dan admin pertama hanya bisa diikat untuk tenant yang benar, akun member, dan email yang terverifikasi.
- Penelepon publik bersifat anonim, sehingga setiap panggilan mendapat token bertanda tangan dengan cakupan terbatas yang berlaku paling lama 45 menit. Token join media dibatasi per role, webhook ditandatangani dengan proteksi replay, dan secret setiap instalasi dibuat di dalam instalasi itu sendiri lalu disimpan di Key Vault.
- Setiap chunk dokumen yang di-ingest dipindai untuk prompt injection, dan chunk yang dikarantina disaring saat query, sehingga tidak menambah latensi panggilan.
- Audio panggilan tidak direkam. Transkrip dapat diredaksi PII-nya setelah panggilan, retensi diatur per kategori data, penghapusan data subjek didukung, dan pemberitahuan AI selalu diputar pertama di setiap panggilan tanpa tool dan tidak dapat dipotong.
Batasan yang diketahui: Identitas penelepon tidak diverifikasi, private endpoint sudah ada di template tetapi nonaktif secara default dan belum pernah di-deploy, dan penetration test eksternal direncanakan sebelum instalasi pelanggan pertama.
Galeri
Tech stack
Azure OpenAI Realtime
Azure AI Search
Azure Speech
Document Intelligence
Durable Functions
Cosmos DB
App Service
LiveKit
Azure VMs
Python
FastAPINext.js
Entra ID
OpenTelemetry
Application Insights
Bicep
GitHub Actions
Proyek AI Engineering lainnya
Technical Consultant, Software & AI, Metrodata (PT Mitra Integrasi Informatika)