Effiziente Markdown‑Streaming‑Optimierungen in Textual
Key Takeaway
Effiziente Markdown‑Streaming‑Optimierungen in Textual ermöglichen das fortlaufende Rendern großer Dokumente in Echtzeit, indem Widgets minimiert, Parsing geschrumpft und ein Puffermechanismus verwendet wird.
Summary
- Problemstellung: Beim Dialog mit einer LLM über das API‑Interface tauchen Markdown‑Tokens schrittweise auf und müssen kontinuierlich an ein bestehendes Dokument angehängt werden.
- Frühere Lösung: Im Textual‑Framework wurde das gesamte Markdown‑Widget bei jedem Update komplett neu erzeugt – ein Ansatz, der mit wachsender Dokumentgröße zunehmend langsamer wurde.
- Bedeutung: Die Unfähigkeit, Streaming zu unterstützen, verlangsamte die UI, insbesondere bei sehr großen Markdown‑Inhalten.
- Lösungsansatz: Durch eine Reihe von Optimierungen wurde das Streaming skalierbar gemacht, was auch im Webbrowser nutzbar sein sollte.
- Textual‑Widget‑Aufbau: Jedes Markdown‑Element (Absatz, Code‑Fence, Tabelle) ist ein eigenständiges Widget mit eigenem Event‑Loop; dadurch werden viele Aktualisierungen ineffizient.
- Optimierung 1 – Block‑Prävention: Markdown‑Dokumente lassen sich in top‑Level‑Blöcke unterteilen. Nur der letzte Block kann sich beim Hinzufügen neuer Tokens ändern; vorherige Blöcke gelten als finalisiert.
- Optimierung 2 – Widget‑Wiederverwendung: Falls sich der Block‑Typ nicht ändert, ersetzt man das Widget nicht, sondern aktualisiert den Inhalt des bestehenden Widgets.
- Optimierung 3 – Beschleunigtes Parsen: Nur der Text vom Beginn des letzten Blocks bis zum Dokumentende wird erneut an markdown‑it‑py gesendet. Durch Speichern der Zeilennummer des letzten Block‑Starts bleibt die Parsing‑Zeit immer unter 1 ms.
- Optimierung 4 – Puffer‑Mechanismus: Tokens können schneller ankommen als gezeichnet werden können. Neue Tokens werden bis zur nächsten Verarbeitungsphase aggregiert.
- Technische Umsetzung: Der Code wird in Kürze im Textual‑Repository veröffentlicht. Die Optimierungen sind als Bestandteil des Kern‑Libraries planbar.
- Weitere Details: Das Markdown‑Parsing erfolgt über die Python‑Bibliothek markdown‑it‑py – unterstützt kein nativen Streaming, kann jedoch damit ergänzt werden.
- Verfügbarkeit: Der aktuelle Code steht im Textual‑Repository: https://github.com/textualize/textual.
Related queries
Wie lässt sich das Streaming von Markdown außerhalb von Textual implementieren?
Welche Performance-Vorteile bringen die vier vorgestellten Optimierungen im Vergleich zur alten Lösung?
Wo finde ich den Code für das neue Streaming‑Feature in Textual?
