مهار تأخیر (Latency) هوش مصنوعی با SSE

من یک قابلیت تکمیل خودکار (autocomplete) مبتنی بر هوش مصنوعی ساختم. کاربران از آن متنفر بودند.

با هر کلید زده شده، درخواستی به یک مدل هوش مصنوعی ارسال می‌شد. کاربران برای دریافت پاسخ کامل ۲ تا ۳ ثانیه منتظر می‌ماندند. رابط کاربری (UI) خراب و کند به نظر می‌رسید.

من از debouncing استفاده کردم. از caching استفاده کردم. از loading spinners استفاده کردم. هیچ‌کدام جواب نداد. مشکل اصلی همچنان باقی بود. کاربران باید منتظر می‌ماندند تا پاسخ کامل آماده شود و سپس هرگونه داده‌ای را مشاهده کنند.

من این مشکل را با استفاده از Server-Sent Events (SSE) برای ارسال پاسخ‌ها به صورت تکه‌تکه (chunk by chunk) حل کردم.

جریان کند اولیه:

  • کاربر کاراکترها را تایپ می‌کند
  • 300ms debounce
  • درخواست HTTP POST
  • سرور API هوش مصنوعی را فراخوانی می‌کند (1-2 ثانیه)
  • سرور پاسخ کامل را برمی‌گرداند
  • کلاینت رندر می‌کند

کاربر به مدت ۲ ثانیه هیچ‌چیز نمی‌دید.

من روش polling را بررسی کردم، اما بار اضافی (overhead) زیادی به سیستم تحمیل می‌کند. WebSockets هم کار می‌کنند، اما برای یک جریان یک‌طرفه (one-way stream) سنگین هستند.

من SSE را انتخاب کردم. SSE استانداردی است که در آن سرور رویدادهای متنی را از طریق یک اتصال طولانی ارسال می‌کند.

چرا SSE برای هوش مصنوعی مناسب است:

  • یک‌طرفه است (از سرور به کلاینت)
  • از تکه‌های JSON متنی استفاده می‌کند
  • اتصال مجدد (reconnection) را به‌طور خودکار مدیریت می‌کند
  • نیازی به کتابخانه‌های اضافی ندارید

نتایج فوری بود. اولین کلمه در کمتر از 300ms ظاهر شد. کاربران می‌دیدند که پیشنهادها حرف به حرف ساخته می‌شوند.

شاخص‌های من بهبود یافت:

  • زمان تا اولین پاسخ بصری: از 2.1s به 0.3s
  • تعامل کاربر: 40% افزایش یافت
  • شکایات کاربران: صفر

استریم کردن (Streaming) مربوط به درک کاربر است. یک رابط کاربری کند اما تدریجی، بر یک رابط کاربری سریع اما ایستا (static) برتری دارد. کاربران ترجیح می‌دهند دیدن اینکه پاسخ کلمه به کلمه ظاهر می‌شود را به انتظار برای یک بلوک کامل از متن ترجیح دهند.

اگر قابلیت هوش مصنوعی شما کند به نظر می‌رسد، ابتدا استریم کردن را امتحان کنید.

Source: https://dev.to/__c1b9e06dc90a7e0a676b/taming-ai-latency-streaming-responses-with-server-sent-events-42d5

Optional learning community: https://t.me/GyaanSetuAi