docs/novaberg-graph_l_prompt_ueber_framework.md
Rama master · réplica de lectura del repositorio original.
# Lesson: Prompt ueber Framework — Wenn das Framework versagt, uebernimmt der Prompt
**Projekt:** Novaberg — The Nova Anima Resonance System
**Dokument:** Lesson — Prompt ueber Framework
**Stand:** 23. August 2026 (der Override-Pfad heisst `prompts/gemma4-gpu/` — nach dem Modell geschluesselt, nicht nach dem Connector). Davor: 15. April 2026, Chat 46
**Pfad:** novaberg/docs/novaberg-graph_l_prompt_ueber_framework.md
**Kontext:** Ollama Bug #15260 — think=false bricht format="json" bei Gemma4
---
## 1. Das Problem
Ollama bietet einen `format="json"` Parameter der das Modell zwingt, valides JSON zu produzieren. Das funktioniert zuverlaessig — ausser bei Modellen mit Thinking-Support (Gemma4, Qwen3.5).
Bug #15260: Wenn `think=false` zusammen mit `format="json"` gesendet wird, wird der Format-Constraint stillschweigend ignoriert. Das Modell gibt Klartext statt JSON aus. Kein Fehler, kein Warning — einfach falsches Format.
Die Alternative — `think` weglassen und `format="json"` behalten — funktioniert, aber das Modell denkt dann bei jedem Call (14-40 Sekunden Latenz statt 2-3 Sekunden). Unbrauchbar fuer eine Chat-Pipeline mit 7+ LLM-Calls pro Turn.
## 2. Die Iterationen
Sechs Versuche, das JSON-Problem zu loesen:
| # | Ansatz | Ergebnis |
|---|--------|----------|
| 1 | think nicht gesetzt (implizit an) | Leerer Content — Thinking verbraucht alle Tokens |
| 2 | think=False global | Leerer Content — format="json" wird ignoriert |
| 3 | think=False nur bei Nicht-JSON | Thinking bei JSON-Nodes, extrem langsam |
| 4 | max_output_tokens erhoehen | Teilweise besser, Salienz/Jurist immer noch leer |
| 5 | repeat_penalty erhoehen | Repetition kuerzer, aber nicht eliminiert |
| **6** | **think=False immer, format raus, Prompt+Cleanup** | **Funktioniert** |
Die Loesung war, das Format NICHT ueber das Framework zu erzwingen, sondern dem Modell ueber den Prompt zu sagen was es tun soll.
## 3. Drei Verteidigungslinien
### Linie 1: Prompt-Overrides (praezise Anweisung)
Gemma4-spezifische [REGELN]-Bloecke:
```
KRITISCH — Ausgabeformat:
- Deine GESAMTE Antwort ist ein einziges JSON-Objekt.
- KEIN Text vor dem JSON. KEIN Text nach dem JSON.
- KEINE Markdown-Codebloecke verwenden.
- Beginne direkt mit dem oeffnenden { und ende mit dem schliessenden }.
```
### Linie 2: Cleanup-Pipeline (robustes Parsing)
Drei Funktionen im OllamaProvider, sequenziell:
1. `_clean_json_response()` — Markdown-Wrapper entfernen
2. `_deduplicate_repetition()` — Repetitions-Loops brechen (Regex)
3. `_repair_truncated_json()` — Offene Quotes/Klammern schliessen
### Linie 3: Fallback im Node (graceful degradation)
Jeder Node hat einen `except json.JSONDecodeError` Block mit sinnvollen Defaults. Router faellt auf "kein Management" zurueck, Tribunal auf "ok", Salienz ueberspringt das Segment.
## 4. Warum der Prompt besser ist als das Framework
`format="json"` ist eine harte Constraint — Ollama maskiert Token-Wahrscheinlichkeiten so dass nur JSON-valide Tokens generiert werden koennen. Das ist maechtig, aber:
- Es interagiert schlecht mit anderen Constraints (Thinking-Tags)
- Es ist framework-spezifisch (funktioniert nur in Ollama, nicht in vLLM oder llama.cpp identisch)
- Es gibt keine Kontrolle ueber die Fehlerbehandlung
Der Prompt ist eine weiche Constraint — das Modell WILL JSON produzieren, aber KANN bei Bedarf abweichen. Die Cleanup-Pipeline faengt Abweichungen auf. Das ist robuster, portabler und debugbarer.
## 5. Verallgemeinerung
Das Prinzip geht ueber JSON hinaus:
> Wenn ein Framework-Feature mit einem anderen Framework-Feature kollidiert, verlasse dich auf den Prompt statt auf das Framework.
Ollama `format` + `think` kollidieren. Die Antwort ist nicht "besseres Framework", sondern "Prompt uebernimmt". Das Modell ist staerker als das Framework — es versteht Anweisungen, das Framework kann nur Constraints setzen.
Das passt zu Novas bestehendem Prinzip "Strukturierte Kontextualisierung statt Imperative": Nicht verbieten (Framework-Constraint), sondern beschreiben (Prompt: "Deine gesamte Antwort ist ein JSON-Objekt").
## 6. Kontext: Gemma4-spezifisch
Gemma4 ist explizit auf Agentic Workflows und strukturierten JSON-Output trainiert. Das Modell KANN zuverlaessig JSON produzieren — es braucht nur die richtige Anweisung im Prompt, nicht die Framework-Kruecke. Der Bug liegt in Ollama, nicht im Modell.
Sobald Ollama den Bug fixt (#15260), kann `format="json"` wieder aktiviert werden als zusaetzliche Sicherheit. Die Prompt-Overrides und die Cleanup-Pipeline bleiben als Sicherheitsnetz — Defense in Depth.
---
→ Ollama Bug: #15260 (github.com/ollama/ollama/issues/15260)
→ Cleanup-Pipeline: services/llm_provider.py
→ Gemma4-Overrides: prompts/gemma4-gpu/*.txt (nach dem MODELL geschluesselt,
seit 23.08.2026 — der Gespraechspfad
haengt am Modell, nicht am Connector)
→ Vorherige Lesson: novaberg-graph_l_kontextualisierung.md (Chat 27)