Diffuser les réponses d’un LLM avec SSE et les fragments d’utilisation
Traduction automatique
Cet article a été traduit automatiquement depuis la version originale en anglais.
Pour diffuser une réponse de LLM progressivement, analysez le protocole d’événements du serveur, assemblez les deltas de contenu et actualisez l’affichage dès qu’un texte utilisable arrive. De nombreuses APIs utilisent Server-Sent Events, ou SSE. Une lecture HTTP peut contenir une partie d’un événement ou plusieurs événements. Un événement peut contenir plusieurs tokens du modèle.
Les implémentations clientes doivent gérer la mise en tampon et la fin du flux, en plus d’une première mise à jour rapide.
Analyser les événements avant les données du modèle
Le format SSE utilise des lignes telles que data: et termine un événement par une ligne vide. Les lectures réseau peuvent scinder ces lignes ou regrouper plusieurs événements. Mettez le texte incomplet en tampon, identifiez les événements complets, puis analysez les données propres à l’API. Plusieurs lignes data: appartiennent à un même événement.
Avec OpenAI Chat Completions, le contenu arrive sous forme de deltas que le client assemble en un message. Traitez les deltas de tool calls ou les deltas structurés selon leurs champs au lieu de considérer chaque événement comme du texte courant. Le marqueur [DONE] est une convention de l’API, pas une exigence générale de SSE.
Voici un ordre de traitement utile côté client :
- Décodez les octets entrants sans perdre un caractère UTF-8 scindé entre deux lectures.
- Mettez les données en tampon jusqu’à disposer d’un événement SSE complet.
- Interprétez cet événement selon le schéma de l’API choisie.
- Ajoutez le contenu ou les champs structurés à la réponse assemblée.
- Actualisez l’affichage à une limite de tampon appropriée.
Séparer l’affichage, la fin du flux et l’utilisation
Affichez le texte courant rapidement lorsque c’est possible. Mettez en tampon les constructions Markdown ou les lignes de code incomplètes si leur mise en forme immédiate provoque des changements répétés de mise en page. Enregistrez le début de la requête et le premier contenu généré séparément de l’ouverture de la connexion ou d’un événement contenant uniquement des métadonnées.
Dans l’API Chat d’OpenAI, stream_options: {"include_usage": true} demande un fragment final d’utilisation avant [DONE]. Ce fragment contient un tableau de choix vide. Les flux interrompus ou annulés peuvent ne jamais le fournir ; l’absence de données d’utilisation ne peut donc pas être interprétée comme zéro token.
Les serveurs compatibles avec OpenAI peuvent employer d’autres formats de données ou gérer différemment la fin du flux. Testez les événements fragmentés, plusieurs événements par lecture, les deltas vides, l’annulation, les erreurs du serveur et l’absence de données finales d’utilisation avec l’implémentation dont vous avez fixé la version. Conservez le texte déjà reçu et distinguez une réponse incomplète d’une exécution terminée avec succès.
Guide d’ingénierie : diffusion progressive en pratique relie le comportement du client à TTFT, TPOT et à l’ordonnancement du prefill.