# Bewertungsrubrik für Modell-Prompt-Tests Zweck: Modellwechsel (anderes Modell, andere Quantisierung, `Balanced` statt `Aggressive`, MTP, KV-Cache-Einstellungen) sollen an **Zahlen** entschieden werden, nicht an Bauchgefühl. Ohne Vorher-Nachher-Messung ist nicht feststellbar, ob eine Änderung verbessert oder verschlechtert hat. Grundlage sind die Läufe unter `~/llamacppctl_prompt_tests/` gegen die Prompts in `example_user_prompts/`. Modelleignung siehe [`KI_TOOLS_PROFILES.md`](KI_TOOLS_PROFILES.md). ## Zwei Ebenen **Objektiv** — von `scripts/eval_prompt_tests.py` automatisch gemessen, keine Meinung nötig: | Metrik | Domäne | Bedeutung | |---|---|---| | Wortzahl, Abweichung vom Ziel | prosa, reden | Der Prompt nennt ein Ziel („etwa 1200 Wörtern"). | | Trunkierungsverdacht | alle | Text endet ohne Satzzeichen → Budget zu klein. | | Tests laufen durch | coding | Der generierte Code wird **wirklich ausgeführt**. | | Anteil bestandener Tests | coding | `passed / (passed + failed)`. | **Subjektiv** — von Hand oder per LLM-Judge, Skala 1–5. Die Anker unten sind bewusst so formuliert, dass 3 „brauchbar, aber mit Mängeln" bedeutet; ein durchschnittlich guter Text landet nicht automatisch bei 4. ## Skala | Punkte | Bedeutung | |---|---| | 5 | Kriterium durchgängig erfüllt; kein Eingriff nötig. | | 4 | Erfüllt, mit einzelnen Schwächen, die den Gesamteindruck nicht tragen. | | 3 | Brauchbar, aber erkennbare Mängel; Überarbeitung nötig. | | 2 | Kriterium überwiegend verfehlt; Grundgerüst vorhanden. | | 1 | Verfehlt. | ## Prosa 1. **Show, don't tell** — Innenleben ausschließlich über Handlung, Gegenstand, Wahrnehmung. *1 = benannte Gefühle („sie war traurig"); 5 = kein einziges benanntes Gefühl, Zustand trotzdem eindeutig.* 2. **Schlussbild** — konkretes, bedeutungstragendes Bild statt Moral oder Zusammenfassung. *1 = explizite Lehre; 5 = Bild, das die Geschichte trägt.* 3. **Ton- und Registertreue** — hält die geforderte Tonlage (z. B. „nüchtern, ohne Pathos") über den gesamten Text. 4. **Sprachliche Präzision** — konkrete Substantive, keine Füllattribute, keine Klischees. 5. **Komposition** — Aufbau trägt; kein Leerlauf, kein abrupter Abbruch. 6. **Sprachrichtigkeit (Deutsch)** — Grammatik, Kasus, Idiomatik. *Eigener Punkt, weil abliterierte, primär englisch trainierte Modelle hier auffällig sind.* ## Reden 1. **Argumentative Substanz** — trägt der Gedankengang, oder reiht er Behauptungen? 2. **Vorweggenommene Einwände** — wird der stärkste Gegeneinwand benannt und beantwortet, nicht der schwächste? 3. **Benannte Zielkonflikte** — werden echte Interessengegensätze offen ausgesprochen statt harmonisiert? 4. **Rhetorische Mittel** — bewusst und sparsam eingesetzt (Trikolon, Anapher, Antithese), nicht dekorativ. 5. **Adressatenbezug** — Sprache, Beispiele und Anrede passen zum Publikum. 6. **Sprachrichtigkeit (Deutsch)** — siehe oben. ## Coding 1. **Korrektheit** — *primär aus dem automatischen Testlauf.* Ein Modul, dessen eigene Tests durchfallen, kann in diesem Kriterium nicht über 2 kommen. 2. **Anforderungsabdeckung** — sind alle Punkte des Prompts umgesetzt? 3. **Fehlerbehandlung** — die im Prompt geforderten Fehlerfälle, sauber getrennt. 4. **Testqualität** — decken die Tests die genannten Fälle ab, und sind sie konsistent zum eigenen Code (richtiger Exception-Typ, Fixtures erfüllen das Schema)? 5. **Keine Halluzinationen** — keine erfundenen APIs, Signaturen, Framework-Aussagen oder Benchmark-Messwerte. *Automatisch nicht prüfbar; erfundene Messwerte sind in den bisherigen Läufen wiederholt aufgetreten.* 6. **Lesbarkeit** — Benennung, Struktur, Kommentardichte. ## Durchführung - **Blind bewerten.** Die Modellzuordnung steckt im Dateinamen; beim Scoren ausblenden (`scripts/eval_prompt_tests.py --anonymize` schreibt anonymisierte Kopien mit Zufalls-IDs und eine Auflösungstabelle). - **Ein Kriterium über alle Texte**, nicht ein Text über alle Kriterien. Das hält den Maßstab konstant. - **LLM-Judge:** möglich gegen den lokalen Server, aber der Judge darf **nicht** das bewertete Modell sein. Ein Modell bewertet seine eigenen Texte zu gut. Der Judge ersetzt die menschliche Stichprobe nicht — mindestens 20 % der Texte gegenlesen und die Übereinstimmung prüfen. - **Mindestens zwei Läufe pro Zelle**, weil bei `temp > 0` ein Einzellauf wenig aussagt. Für Coding-Vergleiche `--seed` fixieren. ## Was die Zahlen nicht sagen Ein bestandener Testlauf beweist, dass der Code *seine eigenen* Tests besteht — nicht, dass er korrekt ist. Wenn Modell und Test aus derselben Halluzination stammen, sind beide konsistent falsch. Kriterium 4 (Testqualität) ist deshalb nicht redundant zu Kriterium 1, sondern dessen Korrektiv. ## Sicherheitshinweis `scripts/eval_prompt_tests.py` führt **modellgenerierten Code aus**. Das ist der Sinn der Übung, aber es ist Codeausführung aus einer nicht vertrauenswürdigen Quelle. Der Runner arbeitet in einem temporären Verzeichnis, erzwingt ein Zeitlimit und verweigert den Start als `root`. Er bietet **keine** Netz- oder Dateisystem-Isolation. Wer die Läufe auf einem Rechner mit Produktionsdaten auswertet, sollte `--no-exec` verwenden oder das Skript in einem Container starten.