#!/usr/bin/env python3 """Bewertet gespeicherte Mathe-Laeufe mit dem korrigierten Vergleich neu. Der erste Durchgang wertete Antworten als falsch, die nur anders geschrieben waren: `\\frac43` gegen `\\frac{4}{3}`, `x=5` gegen `5`, `.35625` gegen `0,35625`. Von acht als falsch gewerteten abgeschlossenen Antworten war genau eine wirklich falsch. Kostet keine GPU-Zeit — die Modellantworten liegen in den Berichten. Die Originaldateien bleiben unangetastet, das Ergebnis kommt daneben. """ import glob import json import os import sys sys.path.insert(0, "/mnt/models/qwen38-prep") import bench_mathe as M QUELLE = "/mnt/models/qwen38-prep/mathe-math500" ZIEL = "/mnt/models/qwen38-prep/mathe-math500-neubewertet" def sammle(argumente): """Nimmt Dateien und Verzeichnisse gemischt entgegen.""" if not argumente: return sorted(glob.glob(os.path.join(QUELLE, "*.json"))), ZIEL dateien = [] for a in argumente: if os.path.isdir(a): dateien += sorted(glob.glob(os.path.join(a, "*.json"))) else: dateien.append(a) # Die Bedarfsmessung ist kein Lauf, sondern eine Vorabschaetzung. dateien = [d for d in dateien if os.path.basename(d) != "bedarf.json"] return dateien, os.path.join(os.path.dirname(dateien[0]), "neubewertet") def main(): dateien, ziel = sammle(sys.argv[1:]) os.makedirs(ziel, exist_ok=True) print(f"{'Modell':<26}{'vorher':>9}{'nachher':>9}{'Δ':>7} korrigierte Fälle") for p in dateien: d = json.load(open(p)) geaendert = [] for x in d["aufgaben"]: # Nur Antworten, die ueberhaupt eine Ausgabe hatten. Wo das Modell # ins Limit lief, gibt es nichts neu zu bewerten. g, e = x.get("gegeben"), x.get("erwartet") if not g or not e: continue neu = M.stimmt(g, e) if neu != x["ok"]: geaendert.append((x.get("level"), g, e, x["ok"], neu)) x["ok"] = neu x["neubewertet"] = True ok_n = sum(1 for x in d["aufgaben"] if x["ok"]) nach_level = {} for x in d["aufgaben"]: lv = x.get("level") if lv is not None: s = nach_level.setdefault(str(lv), [0, 0]) s[1] += 1 s[0] += 1 if x["ok"] else 0 vorher = d["quote"] d["quote_vor_neubewertung"] = vorher d["bestanden"] = ok_n d["quote"] = round(ok_n / d["n"] * 100, 1) d["nach_level"] = {k: v for k, v in sorted(nach_level.items())} d["neubewertet"] = len(geaendert) json.dump(d, open(os.path.join(ziel, os.path.basename(p)), "w"), ensure_ascii=False, indent=1) print(f"{d['modell'][:25]:<26}{vorher:>8.1f}%{d['quote']:>8.1f}%" f"{d['quote']-vorher:>+6.1f} {len(geaendert)}") for lv, g, e, alt, neu in geaendert[:3]: print(f" L{lv} {g[:30]!r} == {e[:30]!r}") print(f"\ngeschrieben nach {ziel}") if __name__ == "__main__": main()