MiddleAI Agent

Streaming câu trả lời của LLM hoạt động thế nào, và vì sao nó làm giao diện chat tốt hơn dù tổng thời gian không đổi?

Người phỏng vấn muốn biết bạn hiểu streaming là thay đổi về cách gửi dữ liệu và về cảm nhận của người dùng, chứ không phải cách làm mô hình nhanh hơn, và bạn biết những chỗ dễ sai khi tự làm.

Một mô hình sinh câu trả lời từng mảnh nhỏ (token). Không streaming thì server đợi mô hình sinh xong cả câu rồi mới trả một cục, nên người dùng nhìn khung chat trống cho tới lúc đó. Có streaming thì server đẩy từng mảnh về trình duyệt ngay khi mô hình vừa sinh ra, thường bằng Server-Sent Events (SSE): một kết nối HTTP được giữ mở và gửi các sự kiện nối nhau. Tổng thời gian gần như không đổi. Thứ giảm là thời gian tới chữ đầu tiên, và đó là khoảng lặng người dùng cảm nhận được.

Trong Next.js, Route Handler trả về một Response bọc một ReadableStream. Phía trình duyệt, nếu cần gửi POST thì dùng fetch rồi đọc response.body, vì EventSource chỉ gửi được GET.

Những chỗ hay sai: một chunk mạng có thể cắt giữa một sự kiện hoặc giữa một ký tự nhiều byte như chữ tiếng Việt, nên cần bộ đệm và TextDecoder với stream: true. Khi khách đóng tab thì server phải dừng việc gọi mô hình, nếu không bạn trả tiền cho chữ không ai đọc. Và proxy hay bộ nén có thể gom chữ lại, nên thường thêm header Cache-Control: no-cache, no-transform.

Điểm cộng: nhắc rằng nên đo thời gian tới token đầu tiên riêng với tổng thời gian, và nói được rằng khi agent gọi công cụ giữa chừng thì cần một sự kiện trạng thái để khách biết nó đang làm gì.