Едно и също време, различно усещане
Отговор от 300 токена отнема около 6 секунди. Показан наведнъж след шестата секунда, той изглежда като заседнало приложение. Показван дума по дума от първата секунда, изглежда бърз — макар да свършва по същото време.
Поточен изход (streaming)
Предаване на отговора на части, докато моделът го генерира, вместо изчакване на пълния текст.
| Наведнъж | На поток | |
|---|---|---|
| Първи знак след | 6 сек | 0.4 сек |
| Общо време | 6 сек | 6 сек |
| Усещане | заседнало | живо |
| Отказ по средата | нищо не е получено | част от отговора е налична |
| Сложност на кода | ниска | по-висока |
Как се предава
Моделът връща парчета. Сървърът ги препраща на клиента, без да чака края. Обичайният начин е Server-Sent Events — еднопосочен поток от сървъра към браузъра върху обикновена HTTP заявка.
Клиент → сървър: POST /pitay
Сървър → клиент: Content-Type: text/event-stream
data: {"parche": "Учениците "}
data: {"parche": "влизат до "}
data: {"parche": "7:45 ч."}
data: {"gotovo": true, "iztochnici": ["Правилник, чл. 12"]}- Работи върху обикновен HTTP — не изисква WebSocket.
- Еднопосочен е, което е достатъчно за отговор.
- Всяко парче е самостоятелен ред — лесно се разчита.
- Последното съобщение носи данните, които се знаят чак накрая: източници, разход, идентификатор на съобщението.
Какво се усложнява
Записът в базата
Отговорът е готов чак накрая. Два подхода: да се събира в паметта и да се запише един път, или да се запише празен ред и да се обнови. Първият е по-прост; вторият оцелява при прекъсване.
Валидирането
Структуриран изход и поток не се съчетават добре: половин JSON не е валиден. Затова при заявки със схема (11. клас, урок 25) потокът обикновено не се използва — там отговорът трябва да е цял, за да има смисъл.
Прекъсването
Ако потребителят затвори страницата, генерирането трябва да спре — иначе плащате за отговор, който никой няма да види. Затова се следи дали връзката е жива и се отменя заявката към модела.
Грешка по средата
Половин отговор плюс грешка е по-лош от липса на отговор. Клиентът трябва да разпознае, че потокът е прекъснат необичайно, и да покаже това ясно — не да остави половин изречение като краен резултат.
Кога поток и кога не
- Чат и дълги обяснения → поток.
- Структуриран изход по схема → без поток.
- Класификация в една дума → без поток, няма какво да се показва.
- Обработка на много документи → нито едното: отложена задача със състояние.
Не започвайте с поток
Направете първо работеща синхронна версия и я измерете. Потокът е подобрение на усещането, а не на резултата — добавя се, когато останалото работи.