Mengawal Latensi AI dengan SSE
Saya membina ciri melengkapkan automatik (autocomplete) AI. Pengguna tidak menyukainya.
Setiap tekanan kekunci menghantar permintaan ke model AI. Pengguna menunggu selama 2 hingga 3 saat untuk respons penuh. UI terasa rosak.
Saya cuba debouncing. Saya cuba caching. Saya cuba menggunakan loading spinners. Tiada apa yang berjaya. Masalah teras tetap sama. Pengguna perlu menunggu jawapan lengkap sebelum dapat melihat sebarang data.
Saya menyelesaikannya menggunakan Server-Sent Events (SSE) untuk melakukan penstriman (streaming) respons secara berperingkat (chunk by chunk).
Aliran perlahan yang asal:
- Pengguna menaip aksara
- 300ms debounce
- Permintaan HTTP POST
- Pelayan memanggil API AI (1-2 saat)
- Pelayan mengembalikan respons penuh
- Klien memaparkan (renders)
Pengguna tidak melihat apa-apa selama 2 saat.
Saya mempertimbangkan polling, tetapi ia menambah terlalu banyak beban (overhead). WebSockets berfungsi, tetapi ia terlalu berat untuk penstriman satu hala.
Saya memilih SSE. Ia adalah satu piawaian di mana pelayan menghantar acara teks melalui satu sambungan yang panjang.
Mengapa SSE berkesan untuk AI:
- Ia adalah satu hala (pelayan ke klien)
- Ia menggunakan cebisan (chunks) JSON berasaskan teks
- Ia mengendalikan penyambungan semula secara automatik
- Anda tidak memerlukan perpustakaan (libraries) tambahan
Keputusannya adalah serta-merta. Perkataan pertama muncul dalam masa kurang daripada 300ms. Pengguna melihat cadangan dibina huruf demi huruf.
Metrik saya bertambah baik:
- Masa untuk respons visual pertama: 2.1s kepada 0.3s
- Penglibatan pengguna: meningkat 40%
- Aduan pengguna: sifar
Penstriman adalah tentang persepsi. UI yang perlahan tetapi progresif adalah lebih baik daripada UI yang pantas tetapi statik. Pengguna lebih suka melihat jawapan muncul kata demi kata berbanding menunggu satu blok teks yang lengkap.
Jika ciri AI anda terasa lembap, cuba penstriman terlebih dahulu.
Komuniti pembelajaran pilihan: https://t.me/GyaanSetuAi