labZero:~$ cd ./lab / lab-llm-streaming-error-...
Streaming من LLM: ماذا يحدث عند انقطاع في المنتصف؟
استجابة انقطعت عند chunk 47 — المستخدم قرأ جملة ناقصة والـ backend لم يعلم بالفشل.
السياق
تطبيق يولّد تقارير بـ GPT-4o streaming عبر Server-Sent Events. في 3% من الطلبات، التقرير يظهر ناقصاً دون رسالة خطأ. المستخدم لا يعرف — يقرأ فقرة في منتصفها. البيانات تُحفظ ناقصة في قاعدة البيانات.
الإجراء
فعّلت logging لكل chunk مع timestamp. الـ stream ينتهي بـ finish_reason: null بدل stop في الحالات الفاشلة. اختبرت ثلاثة حلول: (1) فحص finish_reason في نهاية stream وتخزين علامة is_complete — يعمل لكن يكتشف الفشل بعد انتهاء stream، (2) timeout: إذا لم يصل chunk جديد خلال 8 ثوانٍ، تشغيل fallback وعرض رسالة فورية، (3) buffer كامل قبل العرض — يلغي فائدة streaming. أضفت UI indicator واضح: "اكتمل" أو "انتهى غير مكتمل — أعد المحاولة."
النتيجة
finish_reason كشف 100% من الانقطاعات — لكن بعد انتهاء stream. Timeout كشف 85% أثناء الانقطاع. الجمع بينهما: timeout يعرض رسالة فورية، وfinish_reason يُثبّت الحالة في DB. تجربة المستخدم تحسّنت: الفشل أصبح معلوماً وقابلاً للإعادة.
الدرس
Streaming يحتاج كاشف انقطاع صريحاً — الصمت ليس نجاحاً، وfailure صامت أسوأ من رسالة خطأ واضحة.
هل تشبه فكرتك هذا المشروع؟ باب التعاون من هنا ‹