SSE দিয়ে AI ল্যাটেন্সি নিয়ন্ত্রণ করা
আমি একটি AI autocomplete ফিচার তৈরি করেছিলাম। ব্যবহারকারীরা এটি একদম পছন্দ করেনি।
প্রতিটি কি-স্ট্রোক (keystroke) একটি AI মডেলের কাছে রিকোয়েস্ট পাঠাত। ব্যবহারকারীদের একটি পূর্ণাঙ্গ উত্তরের জন্য ২ থেকে ৩ সেকেন্ড অপেক্ষা করতে হতো। UI-টি অকেজো মনে হচ্ছিল।
আমি debouncing করার চেষ্টা করেছি। caching করার চেষ্টা করেছি। loading spinners ব্যবহার করেছি। কিন্তু কোনোটিই কাজে আসেনি। মূল সমস্যাটি থেকেই গিয়েছিল। ব্যবহারকারীদের কোনো ডেটা দেখার আগে পুরো উত্তরের জন্য অপেক্ষা করতে হতো।
আমি Server-Sent Events (SSE) ব্যবহার করে এই সমস্যার সমাধান করেছি, যার মাধ্যমে রেসপন্সগুলোকে ছোট ছোট চাঙ্কে (chunk by chunk) স্ট্রিম করা সম্ভব।
মূল ধীরগতির প্রবাহ:
- ব্যবহারকারী অক্ষর টাইপ করেন
- 300ms debounce
- HTTP POST request
- সার্ভার AI API কল করে (১-২ সেকেন্ড)
- সার্ভার পূর্ণাঙ্গ রেসপন্স প্রদান করে
- ক্লায়েন্ট রেন্ডার করে
ব্যবহারকারী ২ সেকেন্ড পর্যন্ত কিছুই দেখতে পাচ্ছিলেন না।
আমি polling করার কথা ভেবেছিলাম, কিন্তু এতে অতিরিক্ত ওভারহেড (overhead) তৈরি হয়। WebSockets কাজ করে, কিন্তু ওয়ান-ওয়ে (one-way) স্ট্রিমের জন্য সেগুলো বেশ ভারী।
আমি SSE বেছে নিয়েছি। এটি একটি স্ট্যান্ডার্ড যেখানে সার্ভার একটি দীর্ঘ কানেকশনের মাধ্যমে টেক্সট ইভেন্ট পাঠায়।
কেন AI-এর জন্য SSE কার্যকর:
- এটি ওয়ান-ওয়ে (সার্ভার থেকে ক্লায়েন্ট)
- এটি টেক্সট-ভিত্তিক JSON চাঙ্ক ব্যবহার করে
- এটি স্বয়ংক্রিয়ভাবে রিকানেকশন হ্যান্ডেল করে
- আপনার অতিরিক্ত কোনো লাইব্রেরির প্রয়োজন নেই
ফলাফল ছিল তাৎক্ষণিক। প্রথম শব্দটি ৩০০ মিলিসেকেন্ডের কম সময়েই দেখা যাচ্ছিল। ব্যবহারকারীরা অক্ষর অনুযায়ী সাজেশন তৈরি হতে দেখতে পাচ্ছিলেন।
আমার মেট্রিক্স উন্নত হয়েছে:
- প্রথম ভিজ্যুয়াল রেসপন্সের সময়: ২.১ সেকেন্ড থেকে ০.৩ সেকেন্ড
- ইউজার এনগেজমেন্ট: ৪০% বৃদ্ধি পেয়েছে
- ব্যবহারকারীর অভিযোগ: শূন্য
স্ট্রিমিং হলো উপলব্ধির (perception) বিষয়। একটি ধীরগতির কিন্তু প্রগতিশীল (progressive) UI, একটি দ্রুতগতির কিন্তু স্থির (static) UI-এর চেয়ে অনেক ভালো। ব্যবহারকারীরা একটি বড় টেক্সট ব্লকের জন্য অপেক্ষা করার চেয়ে শব্দে শব্দে উত্তরটি আসতে দেখা বেশি পছন্দ করেন।
আপনার AI ফিচারটি যদি ধীরগতির মনে হয়, তবে প্রথমে স্ট্রিমিং করার চেষ্টা করুন।
ঐচ্ছিক লার্নিং কমিউনিটি: https://t.me/GyaanSetuAi