مهار تأخیر هوش مصنوعی با SSE
من یک قابلیت تکمیل خودکار (autocomplete) مبتنی بر هوش مصنوعی ساختم. کاربران از آن متنفر بودند.
هر کلید زده شده یک درخواست هوش مصنوعی را فعال میکرد. کاربران برای دریافت یک پاسخ کامل JSON، ۲ تا ۳ ثانیه منتظر میماندند. رابط کاربری (UI) خراب به نظر میرسید. من از debouncing و caching استفاده کردم، اما هیچکدام جواب نداد. مشکل اصلی همچنان پابرجا بود: کاربران تا زمانی که کل پاسخ نمیرسید، هیچچیز نمیدیدند.
من این مشکل را با استفاده از Server-Sent Events (SSE) برای استریم کردن (stream) تکهتکه پاسخها حل کردم.
جریان قدیمی به این صورت بود:
- کاربر تایپ میکند
- ۳۰۰ میلیثانیه debounce
- درخواست HTTP POST
- پردازش توسط هوش مصنوعی (۱ تا ۲ ثانیه)
- سرور پاسخ کامل را برمیگرداند
- کلاینت رندر میکند
کاربران برای چند ثانیه با یک صفحه خالی مواجه میشدند. حتی با وجود یک نشانگر بارگذاری (loading spinner)، باز هم کند به نظر میرسید.
من به polling یا WebSockets فکر کردم. polling سربار (overhead) زیادی ایجاد میکند. WebSockets هم برای یک جریان یکطرفه (one-way stream) بسیار سنگین هستند.
من SSE را انتخاب کردم چون:
- به صورت یکطرفه از سرور به کلاینت کار میکند
- از متن ساده و تکههای (chunks) JSON استفاده میکند
- در صورت قطع شدن اتصال، بهطور خودکار دوباره متصل میشود
- به کتابخانه اضافی در سرور شما نیاز ندارد
نتایج همه چیز را تغییر داد:
- زمان رسیدن به اولین پاسخ بصری: از ۲.۱ ثانیه به ۰.۳ ثانیه کاهش یافت
- تعامل کاربران: ۴۰٪ افزایش یافت
- شکایات کاربران: صفر
استریم کردن (Streaming) مربوط به درک کاربر است. یک رابط کاربری پیشرونده (progressive UI) سریعتر از یک رابط کاربری ایستا (static) به نظر میرسد. کاربران ترجیح میدهند ظاهر شدن کلمات را یکییکی ببینند تا اینکه منتظر یک بلوک متنی بمانند.
اگر پاسخهای هوش مصنوعی شما بسیار کوتاه هستند، از همان درخواستهای استاندارد استفاده کنید. اگر به ارتباط دوطرفه نیاز دارید، از WebSockets استفاده کنید. اما برای اکثر نیازهای استریم هوش مصنوعی، SSE بهترین انتخاب است.
شما چگونه تأخیر هوش مصنوعی را در اپلیکیشنهای خود مدیریت میکنید؟ آیا از استریم استفاده میکنید یا منتظر پاسخهای کامل میمانید؟