technology
Strumieniowanie odpowiedzi AI
Aktualizacja: 23.07.2026
Krótka odpowiedź
Strumieniowanie (streaming) to sposób zwracania odpowiedzi przez modele AI, w którym tokeny są przesyłane do użytkownika w czasie rzeczywistym, zamiast czekać na wygenerowanie całej odpowiedzi. Działa przez protokół Server-Sent Events (SSE) i jest standardem we wszystkich głównych API – OpenAI, Anthropic, Google Gemini. Dzięki streamingowi użytkownik widzi efekt sekundę po wysłaniu prompta, zamiast czekać 10–30 sekund na pełną odpowiedź.
Streaming zmienia sposób, w jaki aplikacja komunikuje się z modelem AI. W trybie nie-streamowanym (synchronicznym) wysyłasz zapytanie i czekasz, aż model wygeneruje wszystkie tokeny – od pierwszego do ostatniego – zanim dostaniesz odpowiedź. W trybie streamowanym API otwiera połączenie HTTP i wysyła każdy token osobno, w momencie gdy zostanie wygenerowany. Klient (przeglądarka, aplikacja, terminal) pokazuje je na bieżąco.
Technicznie streaming opiera się na protokole Server-Sent Events (SSE). Odpowiedź ma nagłówek Content-Type: text/event-stream. Każdy fragment danych to osobna wiadomość zaczynająca się od "data:", a w przypadku Anthropica dodatkowo z polem "event:" określającym typ zdarzenia (np. message_start, content_block_delta, message_stop). Klient parsuje te wiadomości i aktualizuje interfejs. Ważne: przeglądarkowe EventSource nie działa z API, bo SSE wymaga metody POST, a EventSource obsługuje tylko GET – trzeba użyć fetch z czytaniem strumienia.
Korzyści ze streamingu są trzy. Po pierwsze, czas do pierwszego tokena (TTFT) spada z kilkunastu sekund do poniżej sekundy – użytkownik widzi, że coś się dzieje, zamiast patrzeć w pusty ekran. Po drugie, eliminuje timeouty przy długich odpowiedziach – przy generowaniu 4000 tokenów zwykłe API może przerwać połączenie po 30–60 sekundach; streaming utrzymuje otwarte połączenie i przesyła tokeny sukcesywnie. Po trzecie, daje płynne UX z efektem maszyny do pisania, który buduje zaangażowanie.
Implementacja w praktyce. W Pythonie i Node.js najpopularniejsze SDK (openai, anthropic) mają wbudowaną obsługę streamingu – wystarczy dodać stream=True do wywołania. W czystym curl używa się flagi --no-buffer i parsuje linie zaczynające się od "data:". W przeglądarce można użyć ReadableStream z fetch() – to pozwala odczytywać fragmenty JSON-a i aktualizować DOM. Popularne frameworki frontendowe (Next.js, Vue, Svelte) mają dedykowane hooki do SSE.
Ograniczenia. Streaming nie nadaje się do zadań, gdzie potrzebujesz całej odpowiedzi przed podjęciem decyzji – np. gdy walidujesz JSON, sprawdzasz warunki albo wywołujesz narzędzia na podstawie pełnego outputu. W takich przypadkach najpierw generujesz odpowiedź w tle (bez streamingu), dopiero potem ją renderujesz hybrydowo: pierwszy fragment leci przez streaming, reszta czeka na walidację. Modele z tool use (function calling) wymagają szczególnej uwagi – część odpowiedzi może być zaproszeniem do wywołania narzędzia, a nie tekstem do pokazania użytkownikowi.
Dla soloprzedsiębiorcy streaming ma konkretne zastosowania. Budujesz asystenta na swoją stronę? Streaming sprawi, że odpowiedzi będą płynne i naturalne. Generujesz długie analizy konkurencji przez agenta? Bez streamingu API przerwie po 60 sekundach; ze streamingiem agent wygeneruje pełny raport. Piszesz posta na bloga przez API? Streaming pokazuje podgląd na żywo, możesz przerwać generowanie w połowie, jeśli idzie w złym kierunku, zamiast czekać na całość i zaczynać od nowa.
FAQ
Czy streaming zużywa więcej tokenów niż zwykłe zapytanie?
Nie. Streaming nie zmienia liczby wygenerowanych tokenów – to ta sama odpowiedź, tylko dostarczana fragmentami. W API liczysz tokeny tak samo, niezależnie od trybu transmisji. Jedyna różnica to minimalnie większy transfer danych (nagłówki SSE każdego chunka), ale to pomijalne. W praktyce streaming może zaoszczędzić tokeny, bo jeśli od razu widzisz, że odpowiedź idzie w złym kierunku, możesz przerwać – w trybie nie-streamowanym czekasz na całość.
Jak obsłużyć streaming w przeglądarce bez bibliotek?
Standardowym sposobem jest fetch z odczytem strumienia. Wywołujesz API z stream: true, odbierasz odpowiedź jako ReadableStream, a potem w pętli odczytujesz kolejne fragmenty (chunki) i aktualizujesz element DOM z odpowiedzią. W Anthopicu musisz dodatkowo parsować eventy SSE – nie wszystkie chunki zawierają tekst (są też chunki informujące o rozpoczęciu bloku, zakończeniu, użyciu narzędzia). Biblioteki takie jak ai-sdk od Vercela automatyzują ten proces, ale czysty fetch w zupełności wystarczy.
Źródła
Newsletter
Chcesz więcej takich konkretów?
Co niedzielę wysyłam jeden praktyczny mail o AI, sprzedaży wiedzy i budowaniu systemów, które realnie pomagają w pracy.
Bez spamu. Wypisujesz się w każdej chwili.