Zuletzt aktualisiert:

Benchmark: cook_suggest — Modellwahl für „Was koch ich draus?" (16.08.2026)

Auftrag

Dennis, nach der Umstellung von estimate/photo auf gemini-3.7-flash: „cook_suggest testen." Der Job läuft heute als einziger auf google/gemini-3.6-flash mit reasoning={"effort": "high"} — und 3.6 hat in der Schätz-Runde durchweg schlecht abgeschnitten.

Kurzfassung

  1. effort=high kauft nichts. Dieselbe Familie mit effort=low liefert in jeder Qualitätskennzahl gleich gut oder besser — bei 2,5× kürzerer Wartezeit (10,9 s statt 27,3 s) und 60 % weniger Kosten. Das ist der sicherste Befund der Runde.
  2. Empfehlung: gemini-3.6-flash mit effort=low. Ein Familienwechsel ist hier nicht nötig — anders als bei der Kalorienschätzung ist 3.6 auf dieser Aufgabe gut.
  3. gemini-3.7-flash [low] ist die schnellere, deutlich billigere Alternative (6,8 s, ein Achtel der heutigen Kosten) mit leicht schwächerer Regeltreue.
  4. gemini-3.5-flash-lite ist untauglich — es lieferte in 3 von 16 Läufen überhaupt kein verwertbares JSON und hält das kcal-Band nur in 54 % der Fälle.
  5. Ein Fehler, der von der Modellwahl unabhängig ist: 6 von 7 Konfigurationen kippen 20–50 g „Sriracha-Sauce scharf" in ein Gericht, das sie selbst „mild" nennen — obwohl „kindgerecht, nichts Scharfes" als harte Achse gesetzt war. Eigenes Ticket wert.

Status: Empfehlung, kein Deploy.


1. Warum diese Runde anders misst

cook_suggest ist eine generative Aufgabe — es gibt keine Ground Truth, an der sich ein Vorschlag messen ließe. Gemessen wird deshalb mit den Maßen, die die Vorgänger-Runde (SILV-331, 19.06.) etabliert hat, damit die Runden vergleichbar bleiben:

Maß Bedeutung
Vertrag genau 3 Vorschläge, servings korrekt, Zutaten mit Menge + Nährwerten
Match Anteil KI-Zutaten, die der echte Server-Matcher (_cs_match_food) auf ein Food trägt
Band kcal je Portion im geforderten Band (Snack 100–300 … deftig 700–1000)
Vielfalt unterscheiden sich die drei Vorschläge wirklich?
Würfel unpassende Zutat im Gericht (das „Apfel + Schinken + Gouda"-Muster)
Auflagen harte Vorgaben verletzt (laktosefrei, kindgerecht, Budgetdeckel, nicht wiederholen)

Aufbau: 8 realistische Situationen × 7 Konfigurationen × 2 Wiederholungen = 112 Aufrufe. Prompt verbatim aus job_cook_suggest, der Fuzzy-Matcher aus backend/main.py kopiert, damit die Match-Rate produktionsgleich fällt. Offline — kein POST an /_ai-result, kein State-Wechsel, kein Live-Activity-Push.

Die Situationen decken die Achsen des Wizards ab: freie Wahl, Nur-Vorrat, bald-weg, Co-op-Konflikt mit Kind, hartes Budget + Eiweißlücke, Snack, harte Freitext-Einschränkung (laktosefrei), Wiederholungsverbot.

Die eingebaute Falle: Der echte „bald weg"-Vorrat enthielt an diesem Tag Flüssigwaschmittel, Kaffeepads, Smarties, Apfelschorle und Mineralwasser. Im expiring-Modus lautet die Anweisung „bevorzuge, was bald weg muss" — richtig ist, die unpassenden wegzulassen (Memory quality-judge-culinary-coherence).


2. Ergebnis

Konfiguration Vertrag Match Band Vielfalt Würfel Auflagen Latenz $/Call
3.6-flash [low] 100 % 99 % 100 % 99 % 0/48 6 10,9 s 0,0107
3.6-flash [high] — heute 100 % 97 % 98 % 99 % 0/48 6 27,3 s 0,0267
3.7-flash [low] 100 % 95 % 92 % 99 % 1/48 5 6,8 s 0,0031
3.7-flash [medium] 100 % 94 % 98 % 99 % 0/48 6 18,4 s 0,0079
3.7-flash [high] 100 % 94 % 94 % 99 % 0/48 6 27,9 s 0,0126
3.5-flash 100 % 97 % 100 % 99 % 3/48 0 27,5 s 0,0558
3.5-flash-lite 100 %* 99 % 54 % 97 % 1/39 4 2,0 s 0,0020

* nur auf den Läufen, die überhaupt JSON lieferten — 3 von 16 taten das nicht.

Der klarste Befund: effort=high ist verschwendet

3.6-flash [low] schlägt die heutige Produktionskonfiguration 3.6-flash [high] bei Match (99 % gegen 97 %) und Band (100 % gegen 98 %), ist bei allem anderen gleich — und braucht 10,9 s statt 27,3 s bei 60 % weniger Kosten. Mehr Denken hat hier also nicht nur nichts gebracht, es hat 16 Sekunden Wartezeit gekostet. Dasselbe Muster zeigt 3.7: [low] 6,8 s gegen [high] 27,9 s ohne Qualitätsgewinn.

Das deckt sich mit dem Befund der Schätz-Runde und mit Googles eigener Ansage — und es korrigiert eine Entscheidung vom 03.08., die effort=high auf Wunsch gesetzt hatte, ohne die Stufe gegen low zu messen.

gemini-3.5-flash-lite ist untauglich

Drei von sechzehn Läufen lieferten kein verwertbares JSON (finish_reason=stop, also keine Abschneidung — das Modell hat schlicht keine gültige Antwort gebaut). In Produktion bedeutet jeder dieser Fälle einen Fallback auf die teure claude-CLI. Dazu hält es das kcal-Band nur in 54 % der Fälle und wiederholt sich über die Wiederholungen wörtlich („Wiener-Kartoffel-Eintopf / Salami-Steinofen-Pizza / Melonen-Snack" zweimal identisch) — ein „Vorschlag", der aus dem Aufbacken einer Tiefkühlpizza besteht, ist kein Kochvorschlag. Das bestätigt den Wiki-Eintrag cook-suggest-generierungs-modell: flash-lite ist der Qualitätsdeckel.

gemini-3.5-flash ist der Regeltreueste — und der teuerste

Es ist die einzige Konfiguration ohne eine einzige harte Auflagenverletzung: nur sie hat für das Kind auf Sriracha verzichtet. Dafür kostet sie $0,056 pro Aufruf — 18× so viel wie 3.7-flash [low] — braucht 27,5 s und leistet sich drei Geschmacks-Ausrutscher (Apfelschorle an einer Steinofenpizza).


3. Der Fund, der nichts mit der Modellwahl zu tun hat

Situation „Co-op-Konflikt": Dennis will scharf/asiatisch, Jaqueline hat kindgerecht gesetzt mit der Notiz „nichts Scharfes". Der Prompt sagt ausdrücklich: „bei Konflikt gewinnt die restriktivere HARTE Achse (Budget/Kind/Abneigung)."

6 von 7 Konfigurationen setzen trotzdem „Sriracha-Sauce scharf" mit 20–50 g in das Gericht — und betiteln es gleichzeitig „Mild-asiatische Puten-Nudelpfanne", „Mildes Asia-Teriyaki Hähnchen", „Mild-würzige Asia-Hähnchen-Nudelpfanne". Das Modell weiß also, dass es mild sein soll, und tut trotzdem 40 g Sriracha hinein.

Nur gemini-3.5-flash lässt sie weg.

Der wahrscheinliche Auslöser ist die kuratierte Zutatenliste: „Sriracha-Sauce scharf" ist ein Haushalts-Staple und steht deshalb im Prompt-Vokabular. Das Modell greift danach, um Dennis' „scharf/asiatisch" zu bedienen — und die Kind-Achse verliert. Das ist ein Prompt-/Daten-Problem, kein Modell-Problem, und kein Modellwechsel repariert es.


4. Ehrlichkeit zur Bewertung: meine Rubrik lag dreimal falsch

Die automatischen Maße haben zunächst systematisch die Modelle bestraft, die es richtig gemacht haben. Jeder einzelne Treffer wurde deshalb von Hand nachgeprüft und die Rubrik dreimal korrigiert:

  1. „Kaffeepads Fein&Mild 5 g" als Nonfood gewertet. Falsch — daraus brüht man Kaffee. gemini-3.5-flash hatte daraus mit dem ablaufenden Cuja-Mara-Eis einen kohärenten Eiskaffee gebaut; das war eine der kreativsten Antworten der Runde.
  2. Laktosefrei-Verstöße bei ausnahmslos jedem Modell. Falsch — die Treffer standen alle in Untertiteln wie „ganz ohne Käse", „garantiert milchfrei", „komplett laktosefrei". In den Zutatenlisten stand kein einziges Milchprodukt. Die Prüfung schlug also an, weil die Modelle korrekt dazuschrieben, was sie weggelassen hatten. Seither werden nur Zutatennamen geprüft, keine Prosa.
  3. „Mineralwasser" und „Blütenhonig" als Würfelware. Falsch — Wasser ist Kochflüssigkeit in einem Eintopf, und Honig auf Zimt-Apfelspalten ist ein Dessert. Nach der Korrektur bleiben von 13 Würfel-Flags noch 5 echte übrig.

Das ist keine Nebensache: eine naive automatische Bewertung hätte hier ein falsches Modell gekürt. Die Zahlen oben sind die Fassung nach der Handprüfung.


5. Empfehlung

  1. cook_suggest von effort=high auf effort=low umstellen, Modell bleibt gemini-3.6-flash. Eine Zeile. Gleiche oder bessere Qualität, 27,3 s → 10,9 s, 60 % weniger Kosten. Risiko minimal, weil Familie und Prompt unverändert bleiben.
  2. Optional statt dessen gemini-3.7-flash [low] — 6,8 s und ein Achtel der heutigen Kosten, aber Band 92 % statt 100 % und Match 95 % statt 99 %. Wer die Wartezeit noch weiter drücken will, zahlt mit etwas Regeltreue.
  3. gemini-3.5-flash-lite nicht — auch nicht als Sparvariante.
  4. Sriracha-/Kind-Konflikt als eigenes Ticket (Prompt oder kuratierte Liste), unabhängig von der Modellwahl.

6. Was diese Runde nicht gemessen hat


Rohdaten: app/data/ai-bench/results-cook.json, Lauf run-cook.log, Harness bench_cook.py, Auswertung analyze_cook.py. Judge: StratoClaude (Memory ich-bin-der-judge) — kein bezahltes Fremdmodell.