fix: Gegenprobe der Abbildungen je Datenzeile; Standardmodell ~deepseek/deepseek-flash-latest

- check_figure_readings vergleicht Zahlentupel je Datenzeile statt aller Zahlen des
  Freitexts (Fehlalarm im ersten echten Lauf: zusätzliche Knotenaufzählung); fängt
  falsch zugeordnete Bewertungen und vertauschte Pfeilrichtungen
- feste Form 'Start → Ziel: Bewertung' in Verstehen- und Abbildungs-Prompt;
  abweichende Lesungen stehen im Log
- Standardmodell ist der Alias ~deepseek/deepseek-flash-latest (derzeit V4.1 Flash);
  Benchmarks weiter mit festen IDs

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-09-17 18:01:37 +02:00
commit 101d55b713
2 changed files with 55 additions and 28 deletions

View file

@ -14,7 +14,9 @@ import instructor
from core.model_schema import CallRecord, LLMUsage
DEFAULT_MODEL = os.environ.get("LLM_MODEL", "deepseek/deepseek-v4.1-flash")
# Alias auf das jeweils neueste DeepSeek-Flash-Modell (September 2026: V4.1 Flash, nimmt auch Bilder an).
# Für vergleichbare Benchmarks ein festes Modell mit --models angeben.
DEFAULT_MODEL = os.environ.get("LLM_MODEL", "~deepseek/deepseek-flash-latest")
# Modell je Pipeline-Stufe: ein starkes Modell für Extraktion/Prüfung, ein schnelles für den Solver-Code
# (oder umgekehrt, je nach Messung). Leer = das Modell der Session (LLM_MODEL bzw. --model).
STEP_MODEL_ENV = {

View file

@ -132,8 +132,8 @@ class FigureTranscription(BaseModel):
id: str = Field(description="Kennung wie im Text, z. B. 'Abbildung 1'")
shows: str = Field(description="Was die Abbildung zeigt, in einem Satz (z. B. 'gerichteter Graph mit 4 Knoten')")
transcription: str = Field(
description="Vollständige Übertragung ALLER Inhalte: jede Zahl, jede Beschriftung, jede Pfeilrichtung, "
"am besten als Tabelle oder Liste (z. B. 'Pfeil 1→2: 3'). Nichts ergänzen, was nicht zu sehen ist.")
description="Nur die Daten, eine Zeile je Datenpunkt, jede Zahl genau einmal (Graph: '1 → 2: 3' je Pfeil; "
"Tabelle: 'Zeile / Spalte: Wert'). Keine Knotenaufzählung, keine Lagebeschreibung – das gehört nach shows.")
uncertain: List[str] = Field(
default_factory=list,
description="Stellen, die nicht sicher lesbar sind (verdeckt, unscharf, mehrdeutig); leer = alles sicher gelesen")