LLM-antwoorden streamen met SSE en gebruikschunks

Automatische vertaling

Dit artikel is automatisch vertaald vanuit de oorspronkelijke Engelse versie.

Om een LLM-antwoord te streamen, parse je het eventprotocol van de server, voeg je inhoudsdelta’s samen en werk je de weergave bij zodra bruikbare tekst binnenkomt. Veel APIs gebruiken Server-Sent Events, of SSE. Eén HTTP-leesbewerking kan een deel van een event of meerdere events bevatten. Een event kan meerdere tokens van het model bevatten.

Clientimplementaties hebben buffering en afhandeling van de afronding nodig, naast een snelle eerste update.

Parse events vóór modelgegevens

Het SSE-formaat gebruikt regels zoals data: en sluit een event af met een lege regel. Netwerkleesbewerkingen kunnen deze regels splitsen of meerdere events combineren. Buffer onvolledige tekst, herken volledige events en parse daarna de API-specifieke gegevens. Meerdere data:-regels horen bij één event.

Bij OpenAI Chat Completions komt inhoud binnen als delta’s die de client samenvoegt tot een bericht. Verwerk delta’s voor tool calls of gestructureerde delta’s op basis van hun velden, in plaats van elk event als lopende tekst te behandelen. De markering [DONE] is een API-conventie, geen algemene SSE-eis.

Een bruikbare verwerkingsvolgorde voor de client is:

  1. Decodeer binnenkomende bytes zonder een gesplitst UTF-8-teken te verliezen.
  2. Buffer totdat een volledig SSE-event beschikbaar is.
  3. Interpreteer dat event volgens het schema van de gekozen API.
  4. Voeg inhoud of gestructureerde velden toe aan het samengestelde antwoord.
  5. Werk de weergave bij bij een geschikte buffergrens.

Scheid rendering, afronding en gebruik

Render lopende tekst zo snel mogelijk. Buffer onvolledige Markdown-constructies of coderegels als directe opmaak herhaaldelijk tot indelingswijzigingen leidt. Leg de start van het verzoek en de eerste gegenereerde inhoud afzonderlijk vast van het openen van de verbinding of een event met alleen metadata.

In de Chat API van OpenAI vraagt stream_options: {"include_usage": true} om een laatste gebruikschunk vóór [DONE]. Die gebruikschunk bevat een lege choices-array. Onderbroken of geannuleerde streams leveren deze mogelijk nooit aan. Ontbrekende gebruiksgegevens mogen daarom niet als nul tokens worden geïnterpreteerd.

Servers die compatibel zijn met OpenAI kunnen andere gegevensformaten of ander afrondingsgedrag implementeren. Test gefragmenteerde events, meerdere events per leesbewerking, lege delta’s, annulering, serverfouten en ontbrekende laatste gebruiksgegevens met de vastgelegde implementatie. Bewaar de al ontvangen tekst en maak onderscheid tussen een onvolledig antwoord en een succesvolle afronding.

Engineeringgids: streaming in de praktijk verbindt het clientgedrag met TTFT, TPOT en prefillplanning.