Kiểm soát độ trễ AI bằng SSE
Tôi đã xây dựng một tính năng tự động hoàn thiện (autocomplete) bằng AI. Người dùng ghét nó.
Mỗi lần nhấn phím đều gửi một yêu cầu đến mô hình AI. Người dùng phải đợi từ 2 đến 3 giây để nhận được phản hồi đầy đủ. Giao diện người dùng (UI) tạo cảm giác như bị lỗi.
Tôi đã thử dùng debouncing. Tôi đã thử caching. Tôi đã thử dùng loading spinners. Không gì hiệu quả cả. Vấn đề cốt lõi vẫn còn đó. Người dùng phải đợi toàn bộ câu trả lời trước khi thấy bất kỳ dữ liệu nào.
Tôi đã giải quyết vấn đề này bằng cách sử dụng Server-Sent Events (SSE) để truyền (stream) các phản hồi theo từng phần (chunk).
Luồng xử lý chậm ban đầu:
- Người dùng nhập ký tự
- Debounce 300ms
- Yêu cầu HTTP POST
- Server gọi AI API (1-2 giây)
- Server trả về phản hồi đầy đủ
- Client hiển thị (render)
Người dùng không thấy gì trong suốt 2 giây.
Tôi đã cân nhắc dùng polling, nhưng nó tạo ra quá nhiều chi phí xử lý (overhead). WebSockets cũng hoạt động được, nhưng chúng quá nặng nề cho một luồng truyền một chiều.
Tôi đã chọn SSE. Đây là một tiêu chuẩn mà server gửi các sự kiện văn bản qua một kết nối duy nhất kéo dài.
Tại sao SSE hiệu quả với AI:
- Nó hoạt động một chiều (từ server đến client)
- Nó sử dụng các phần JSON dạng văn bản
- Nó tự động xử lý việc kết nối lại
- Bạn không cần thêm các thư viện bổ sung
Kết quả có ngay lập tức. Từ đầu tiên xuất hiện trong chưa đầy 300ms. Người dùng thấy các gợi ý được xây dựng từng chữ cái một.
Các chỉ số của tôi đã cải thiện:
- Thời gian phản hồi trực quan đầu tiên: 2.1 giây xuống 0.3 giây
- Sự tương tác của người dùng: tăng 40%
- Khiếu nại của người dùng: bằng không
Streaming là về cảm nhận. Một giao diện chậm nhưng có tiến trình (progressive) sẽ tốt hơn một giao diện nhanh nhưng tĩnh. Người dùng thích thấy câu trả lời xuất hiện từng từ một hơn là phải chờ đợi một khối văn bản đầy đủ.
Nếu tính năng AI của bạn có cảm giác chậm chạp, hãy thử streaming trước.
Cộng đồng học tập tùy chọn: https://t.me/GyaanSetuAi