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 tất (autocomplete) bằng AI. Người dùng cực kỳ ghét nó.
Mỗi lần nhấn phím đều kích hoạt một yêu cầu AI. Người dùng phải đợi từ 2 đến 3 giây để nhận được toàn bộ phản hồi JSON. Giao diện (UI) có cảm giác như bị lỗi. Tôi đã thử dùng debouncing và caching, nhưng không có tác dụng gì. Vấn đề cốt lõi vẫn không đổi: người dùng không thấy gì cho đến khi toàn bộ câu trả lời được gửi đến.
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 nhỏ.
Luồng xử lý cũ trông như thế này:
- Người dùng nhập liệu
- Debounce 300ms
- Yêu cầu HTTP POST
- AI xử lý (1-2 giây)
- Server trả về toàn bộ phản hồi
- Client hiển thị
Người dùng phải nhìn màn hình trống trong vài giây. Ngay cả khi có biểu tượng đang tải (loading spinner), nó vẫn tạo cảm giác chậm chạp.
Tôi đã cân nhắc việc polling hoặc dùng WebSockets. Polling tạo ra quá nhiều chi phí xử lý (overhead). WebSockets thì quá nặng nề cho một luồng truyền dữ liệu một chiều.
Tôi chọn SSE vì:
- Nó hoạt động một chiều từ server đến client
- Nó sử dụng các đoạn văn bản và JSON đơn giản
- Nó tự động kết nối lại nếu kết nối bị ngắt
- Nó không yêu cầu thêm thư viện bổ sung nào trên server của bạn
Kết quả đã thay đổi mọi thứ:
- Thời gian phản hồi trực quan đầu tiên: giảm từ 2,1 giây xuống còn 0,3 giây
- Mức độ tương tác của người dùng: tăng 40%
- Khiếu nại của người dùng: không có
Streaming là về cảm nhận. Một giao diện tiến triển (progressive UI) mang lại cảm giác nhanh hơn một giao diện tĩnh. Người dùng thích nhìn thấy các từ xuất hiện lần lượt từng từ một hơn là phải chờ đợi cả một khối văn bản.
Nếu các phản hồi AI của bạn rất ngắn, hãy cứ dùng các yêu cầu tiêu chuẩn. Nếu bạn cần giao tiếp hai chiều, hãy dùng WebSockets. Nhưng đối với hầu hết các nhu cầu streaming AI, SSE là lựa chọn tốt nhất.
Bạn xử lý độ trễ AI trong các ứng dụng của mình như thế nào? Bạn sử dụng streaming hay đợi phản hồi đầy đủ?