Long-Form-LLM-Generierung mit niedrigen Token-Kosten Ein Engineering-Report

Veroffentlicht am

Als wir begonnen haben, lange Texte ueber eine LLM-Pipeline zu erzeugen, sah das Hauptproblem zuerst nach Modellqualitaet aus. In der Praxis war es vor allem Systems Engineering: Request-Groesse, Latenzvarianz, Proxy-Timeouts und unbegrenzter Output.

Dieser Bericht fasst zusammen, was unter produktionsnahen Bedingungen funktioniert hat, wenn die Ziele waren:

  • Lange Texte zuverlaessig erzeugen,
  • Tokenverbrauch vorhersagbar halten,
  • Timeout-Risiko senken,
  • Qualitaet ueber mehrere Abschnitte erhalten.

1) Warum Single-Shot-Prompting scheiterte #

Der naive Ansatz war ein grosser Request mit vollem Quelltext plus viel Kontext. Das fuehrte zu drei Problemen:

  • Hohe Input-Token-Kosten bei jedem Lauf,
  • Hohe Latenzvarianz je nach Promptlaenge und Modelllast,
  • Gateway-504s, obwohl das Modell spaeter noch eine Antwort lieferte.

Zentrale Erkenntnis: Eine erfolgreiche Modellantwort ist wertlos, wenn eine vorgelagerte Komponente vorher in den Timeout laeuft. Zuverlaessigkeit muss auf Pipeline-Ebene entworfen werden, nicht nur auf Modell-Ebene.

2) Architektur, die lange Texte stabil gemacht hat #

Wir sind von One-Shot-Generierung auf eine begrenzte, mehrstufige Pipeline gewechselt.

Stufe A: Retrieval-Kontext mit strikten Budgets #

Statt alles verwandte Material mitzuschicken, haben wir:

  • Quelltexte in absatzbasierte Segmente gechunkt,
  • Embeddings einmal erzeugt und gecacht,
  • Pro Request nur die relevantesten Chunks gewaehlt,
  • Harte Limits gesetzt: Gesamtzahl Chunks, Chunks pro Datei, Snippetlaenge und Retrieval-Zeichenbudget.

Das reduzierte wiederholte Tokenverschwendung und machte Requests vorhersagbarer.

Stufe B: Adaptives Input-Budgeting #

Vor jedem Modellaufruf berechnen wir ein dynamisches Budget aus:

  • Aktueller Inhaltslaenge,
  • Promptlaenge,
  • Erwartetem Overhead des Systemprompts.

Wenn der Input das Budget ueberschreiten wuerde:

  • Zuerst Retrieval-Kontext reduzieren,
  • Dann Hauptinhalt mit kontrollierter Middle-Trim-Strategie kuerzen,
  • Kopf und Ende behalten, damit Einleitung und Schlusskontext erhalten bleiben.

Das liefert bessere Qualitaet als harte Abschneidung nur von einer Seite.

Stufe C: Segmentierte Generierung fuer grosse Texte #

Bei grossen Dokumenten verzichten wir auf Single-Pass-Generierung.

Ablauf:

  • Text in ueberlappende Segmente aufteilen,
  • Jedes Segment separat mit kleinerem Max-Output ueberarbeiten,
  • In Originalreihenfolge zusammenfuehren,
  • Einen finalen Konsistenz-Pass ueber den Gesamttext laufen lassen.

So wird aus einem fragilen Grossaufruf eine Reihe robusterer Kleinaufrufe.

Stufe D: Konsistenz-Pass #

Nach dem Zusammenfuehren laeuft ein kurzer globaler Pass mit Fokus auf:

  • Terminologiekonsistenz,
  • Tonalitaetsabgleich,
  • Stilharmonisierung.

Wichtig ist hier regelbasiertes Prompting: kein neuer Inhalt, kein strukturelles Umschreiben, keine Meta-Kommentare.

3) Token- und Latenz-Kontrollen mit groesster Wirkung #

Diese Kontrollen hatten den groessten Effekt:

  • Max-Output-Tokens pro Aufruf, angepasst an die Input-Groesse,
  • Reduziertes Retrieval-Budget bei groesseren Dokumenten,
  • Weniger Retrieval-Chunks bei sehr grossen Inputs,
  • Segmentmodus oberhalb einer Inhalts-Schwelle,
  • Verkuerzter Retrieval-Kontext waehrend Segmentaufrufen,
  • Persistenter Embedding-Cache mit Content-Hash als Schluessel.

Der Cache ist kritisch. Ohne ihn bezahlt ein Long-Form-Workflow Embedding-Kosten immer wieder und verliert den Grossteil des Effizienzgewinns.

4) Betriebskontrollen und Observability #

Wir haben strukturiertes Logging rund um jede Stufe eingefuehrt:

  • Request-Metadaten: model, input_chars, context_chars, max_tokens, timeout,
  • Retrieval-Metadaten: Cache-Hits, neu eingebettete Dateien, ausgewaehlte Chunks, Laufzeit,
  • Segment-Metadaten: Segmentanzahl, Output-Groesse je Segment, Status des Konsistenz-Passes,
  • Outcome-Metadaten: Quellmodell, Fallback-Grund, Laufzeit pro Datei.

Dadurch wurde Debugging von Bauchgefuehl zu messbarem Tuning.

Wenn Aufrufe exakt an der Timeout-Grenze scheiterten, war klar: lokales oder clientseitiges Timeout-Verhalten, nicht mangelnde Modellqualitaet.

5) Praktisches Implementierungsmuster #

Eine einfache Implementierungsstrategie fuer Entwickler:

  • Limits aus Inhalts- und Promptlaenge vorab berechnen,
  • Retrieval-Kontext innerhalb dieser Limits aufbauen,
  • Bei Ueberschreiten der Schwelle Segmentmodus aktivieren,
  • Fuer jeden Modellaufruf Max-Output-Tokens setzen,
  • Zusammenfuehren und optional Konsistenz-Pass ausfuehren,
  • Vorschlag plus Metadaten fuer Observability und Retries persistieren.

Pseudo-Flow:

compute limits
retrieval_context = bounded_retrieval(...)
if segmented_mode:
  segments = split_with_overlap(...)
  revised_segments = map(revise_segment)
  merged = join(revised_segments)
  final = consistency_pass(merged)
else:
  final = revise_single_pass(...)
store result with source and error metadata

6) Trade-offs und worauf man achten sollte #

Segmentmodus verbessert Zuverlaessigkeit und Kostenkontrolle, kann aber Merge-Artefakte erzeugen, wenn die Ueberlappung zu klein ist. Eine kurze Ueberlappung plus Konsistenz-Pass loest das meist.

Zu aggressives Trimming senkt die Qualitaet. Immer erst Retrieval kuerzen, dann erst bei Bedarf den Hauptinhalt.

Zu hoher Max-Output erhoeht das Timeout-Risiko, zu niedriger verursacht abgeschnittene Antworten. Besser dynamische Baender nach Input-Groesse statt eines festen Werts.

7) Empfohlene Defaults fuer den Start #

  • Segment-Schwelle: etwa 26k Zeichen,
  • Segmentgroesse: etwa 5k Zeichen mit 300-350 Ueberlappung,
  • Retrieval-Budget: hoeher bei kleinen Dokumenten, niedriger bei grossen,
  • Max-Output-Tokens: niedriger bei kleinen Dokumenten, moderat bei grossen, aber gedeckelt,
  • Timeout: Modell-Timeout ueber der durchschnittlichen Antwortzeit, Gateway-Timeout ueber dem Modell-Timeout.

Zentrales Fazit #

Long-Form-LLM-Generierung mit niedrigen Token-Kosten ist primaer ein Pipeline-Design-Problem, kein Prompt-Trick. Das erfolgreiche Muster ist:

  • Weniger, aber besseres Retrieval,
  • Aggressives Input-Budgeting,
  • Segmentierung grosser Arbeitspakete,
  • Output-Caps,
  • Vollstaendige Instrumentierung.

Diese Kombination liefert niedrigere Kosten, weniger 504s und besser vorhersagbare Qualitaet fuer reale Engineering-Workflows.

Anzeigeeinstellungen

Wahlen Sie ein Design, um das Erscheinungsbild der Website anzupassen.