پاسخ جریانی؛ از اولین توکن تا تجربه بهتر
جریان داده، سرعت کل پاسخ را بیشتر نمیکند؛ فقط کاربر زودتر بخشی از نتیجه را میبیند. برای اینکه این مزیت واقعاً به تجربه بهتر تبدیل شود، باید حالتهای انتظار، قطع اتصال و لغو را هم طراحی کنید.
خلاصه کاربردی
- پیش از اولین توکن، وضعیت واضحی نشان دهید.
- پایان ناگهانی جریان را با خطای شبکه اشتباه نگیرید.
- دکمه توقف باید درخواست را در سرور هم لغو کند.
انتظار را قابل فهم کنید
پیش از رسیدن اولین بخش پاسخ، وضعیت انتظار را نشان دهید. بعد از دریافت داده، متن را تدریجی نمایش دهید. جریان داده لزوماً سرعت تولید کل پاسخ را بیشتر نمیکند، اما کاربر زودتر بخشی از نتیجه را میبیند.
اولین توکن معمولاً دیرتر از بقیه میرسد؛ چون مدل باید ورودی را پردازش کند. اگر در این بازه هیچ بازخوردی نشان ندهید، کاربر فکر میکند چیزی خراب شده. یک نشانگر ساده که «در حال دریافت پاسخ» را نمایش دهد، کافی است.
قطع جریان را پایان موفق ندانید
اگر اتصال قطع شد، متن ناقص را مشخص کنید. پایان عادی و خطای شبکه باید وضعیتهای متفاوتی داشته باشند. تلاش دوباره پس از نمایش بخشی از متن ممکن است خروجی تکراری بسازد؛ از کاربر بخواهید آگاهانه ادامه دهد یا دوباره تلاش کند.
- پایان موفق: جریان با پیام پایانی سرویس بسته شده است.
- قطع ناگهانی: اتصال بدون پیام پایانی بسته شده؛ متن ناقص است.
- خطای سرویس: سرویس پیام خطا فرستاده؛ متن قبلی معتبر است اما ناقص.
لغو را تا سرور منتقل کنید
دکمه توقف باید درخواست فعال را لغو کند، نه اینکه فقط نمایش متن را متوقف کند. لغو در مرورگر بهتنهایی تضمین نمیکند پردازش بالادست یا هزینه متوقف شده باشد؛ رفتار مسیر سرور را هم بررسی کنید.
const controller = new AbortController();
const response = await fetch("/api/chat", {
method: "POST",
signal: controller.signal,
body: JSON.stringify({ messages }),
});
// دکمه توقف:
controller.abort();وقتی درخواستی لغو شد، حالت رابط را هم بهروزرسانی کنید. متن دریافتشده را نگه دارید و بعد از آن برچسب «متوقف شد» بگذارید تا کاربر بداند پاسخ کامل نیست.
جریان را قابلاعتماد رندر کنید
قطعههای جریان ممکن است وسط یک کلمه یا حتی وسط یک بخش ساختاری برسند. تغییرات رابط را بر اساس متن کاملِ تا این لحظه بسازید، نه بر اساس هر قطعه جداگانه. این کار از پرشهای بصری و رندر ناقص کد جلوگیری میکند.
برای پاسخهای طولانی، در طول جریان اسکرول خودکار را فقط وقتی فعال کنید که کاربر پایین صفحه است. اگر کاربر به بالای متن رفته تا بخشی را بخواند، اسکرول خودکار آن را از او میگیرد.
پرسشهای متداول
آیا استریم هزینه را تغییر میدهد؟
برای یک مدل و مسیر با تعرفه یکسان، استریم بهخودیخود به معنی تخفیف یا هزینه اضافه نیست؛ مصرف ثبتشده و قواعد صورتحساب تعیینکنندهاند. قطع اتصال یا زدن دکمه توقف تضمین نمیکند پردازش بالادست و هزینه فوراً متوقف شود. مصرف نهایی را در گزارش سرویس بررسی کنید.
آیا باید همیشه از استریم استفاده کنم؟
برای پاسخهای کوتاه و پردازش دستهای لازم نیست. برای پاسخهای طولانی و رابط تعاملی، استریم تجربه بهتری میدهد، به شرطی که حالتهای قطع و لغو را پوشش داده باشید.