LLM-Input als strukturierten Envelope (JSON/YAML) statt Markdown-Headings #9

Open
opened 2026-05-30 14:36:16 +02:00 by Brummel · 0 comments
Owner

Kontext

Aus der Diskussion zu #8 (Zeitstempel der Transkripte lecken ins Dokument). Der LLM-Input wird in server/src/analyze/prompt.rs::render_prompt heute als Markdown gebaut: jede Aufnahme bekommt ein ## <recorded_at>-Heading (RFC3339) vor dem Transkript, Trenner \n\n---\n\n. Der Zeitstempel wird von keinem System-Prompt genutzt und kann vom LLM in den Fliesstext-Output kopiert werden.

#8 schliesst den konkreten Leak im bestehenden Markdown-Format. Dieses Issue ist die groessere, davon entkoppelte Design-Aenderung.

Idee

Den LLM-Input als strukturierten Envelope bereitstellen — ein Format, das jedes LLM kennt (JSON oder YAML) — statt als Markdown-Headings. Vorteile:

  • Leak-Robustheit: ein Feld recorded_at sieht aus wie Metadaten, ein ##-Heading sieht aus wie Dokumentstruktur. Echo-Wahrscheinlichkeit sinkt (reduziert, nicht eliminiert).
  • Natuerlicher Ort fuer 'Metadaten, nicht ausgeben'-Deklaration im System-Prompt (text = Diktat, recorded_at = Metadaten).
  • Erweiterbar um kuenftige Metainfos (Sprecher, Geraet, Sprache, Confidence, Fall-Label, ...) — Markdown-Headings skalieren dafuer nicht.

JSON vs. YAML (Trade-off)

  • JSON: maximale Ubiquitaet, trivial via serde_json. Nachteil: langer deutscher Fliesstext wird zu Escape-Suppe (\n, \"), schlechter lesbar fuers Modell.
  • YAML Block-Scalar (text: |): haelt Originaltext zeilenweise ohne Escaping, modell-freundlicher fuer Prosa. Nachteil: serverseitige Serialisierung fragiler (Indentation/Sonderzeichen), echte YAML-Lib noetig.

Format-Entscheidung offen.

Wichtig: Prompt-Contract-Aenderung

Das ist KEIN reiner Refactor. Beide System-Prompts (prompts/default_system_prompt.md, prompts/llama_system_prompt.md) muessen umgeschrieben werden (Input-Schema erklaeren). Prompt-Aenderungen haben schon still Inhalte geloescht (Mistral 24B, Case c414cf52). Daher PFLICHT vor Auslieferung:

  • Sandbox-A/B ueber die volle Pipeline (Pre+Post-LLM-Gazetteer), mehrere Laeufe.
  • Risiko pruefen: strukturierter Input koennte das Modell 'daten-verarbeitend' statt 'prosa-zusammenfassend' stimmen und die Fliesstext-Qualitaet verschieben.

Empfehlung zum Timing

recorded_at erst dann in den Envelope aufnehmen, wenn eine Prompt-Regel ihn tatsaechlich konsumiert (z.B. Verlauf ueber Aufnahme-Daten). Solange ungenutzt: weglassen statt 'mitsenden aber nicht ausgeben'. D.h. dieses Issue lohnt sich voll, sobald die erste echte Zusatz-Metainfo gebraucht wird.

Refs #8

## Kontext Aus der Diskussion zu #8 (Zeitstempel der Transkripte lecken ins Dokument). Der LLM-Input wird in `server/src/analyze/prompt.rs::render_prompt` heute als Markdown gebaut: jede Aufnahme bekommt ein `## <recorded_at>`-Heading (RFC3339) vor dem Transkript, Trenner `\n\n---\n\n`. Der Zeitstempel wird von keinem System-Prompt genutzt und kann vom LLM in den Fliesstext-Output kopiert werden. #8 schliesst den konkreten Leak im bestehenden Markdown-Format. Dieses Issue ist die groessere, davon entkoppelte Design-Aenderung. ## Idee Den LLM-Input als strukturierten Envelope bereitstellen — ein Format, das jedes LLM kennt (JSON oder YAML) — statt als Markdown-Headings. Vorteile: - **Leak-Robustheit:** ein Feld `recorded_at` sieht aus wie Metadaten, ein `##`-Heading sieht aus wie Dokumentstruktur. Echo-Wahrscheinlichkeit sinkt (reduziert, nicht eliminiert). - **Natuerlicher Ort fuer 'Metadaten, nicht ausgeben'-Deklaration** im System-Prompt (`text` = Diktat, `recorded_at` = Metadaten). - **Erweiterbar** um kuenftige Metainfos (Sprecher, Geraet, Sprache, Confidence, Fall-Label, ...) — Markdown-Headings skalieren dafuer nicht. ## JSON vs. YAML (Trade-off) - **JSON:** maximale Ubiquitaet, trivial via serde_json. Nachteil: langer deutscher Fliesstext wird zu Escape-Suppe (`\n`, `\"`), schlechter lesbar fuers Modell. - **YAML Block-Scalar (`text: |`):** haelt Originaltext zeilenweise ohne Escaping, modell-freundlicher fuer Prosa. Nachteil: serverseitige Serialisierung fragiler (Indentation/Sonderzeichen), echte YAML-Lib noetig. Format-Entscheidung offen. ## Wichtig: Prompt-Contract-Aenderung Das ist KEIN reiner Refactor. Beide System-Prompts (`prompts/default_system_prompt.md`, `prompts/llama_system_prompt.md`) muessen umgeschrieben werden (Input-Schema erklaeren). Prompt-Aenderungen haben schon still Inhalte geloescht (Mistral 24B, Case c414cf52). Daher PFLICHT vor Auslieferung: - Sandbox-A/B ueber die volle Pipeline (Pre+Post-LLM-Gazetteer), mehrere Laeufe. - Risiko pruefen: strukturierter Input koennte das Modell 'daten-verarbeitend' statt 'prosa-zusammenfassend' stimmen und die Fliesstext-Qualitaet verschieben. ## Empfehlung zum Timing `recorded_at` erst dann in den Envelope aufnehmen, wenn eine Prompt-Regel ihn tatsaechlich konsumiert (z.B. Verlauf ueber Aufnahme-Daten). Solange ungenutzt: weglassen statt 'mitsenden aber nicht ausgeben'. D.h. dieses Issue lohnt sich voll, sobald die erste echte Zusatz-Metainfo gebraucht wird. Refs #8
Brummel added the feature label 2026-05-30 14:36:16 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Brummel/doctate#9