Exakte Arithmetik in LLMs: Ausführbaren Code generieren
LLMs sind nicht für präzise Berechnungen konzipiert – die Transformer-Architektur prognostiziert Token basierend auf Wahrscheinlichkeiten, nicht auf mathematischen Operationen. Eine Anfrage wie »18 × 38,76« könnte 697,68 oder sogar einen Fehler wie 680 liefern, da das Modell Muster aus den Trainingsdaten approximiert. Das ist kein Modellversagen, sondern eine systemische Beschränkung.
Lösung: Halte das LLM von direkten Berechnungen fern. Das Modell generiert einen Python-Skript für die Aufgabe, das in einer isolierten Umgebung ausgeführt wird. Python garantiert Genauigkeit: 18 * 38,76 liefert immer exakt 697,68.
Systemarchitektur
Ablauf: Benutzer → LLM → Python-Skript → Docker-Container → Ergebnis (Text + Excel).
Beispiel: Abrechnung von Nebenkosten (Tomsk):
- Benutzereingabe: «CW 320, HW 229, electricity 7422, prev: CW 302, HW 222, electricity 7133».
- LLM mit Systemprompt (Preise aus Konfiguration) generiert ein Skript.
- Skript berechnet Verbrauch, wendet Tarife an und erstellt eine Tabelle.
- Ausführung im Sandbox-Umfeld, Datei zurückgegeben.
Vereinfachter generierter Code:
# Zählerstände
cold_current, cold_prev = 320, 302
hot_current, hot_prev = 229, 222
elec_current, elec_prev = 7422, 7133
# Verbrauch
cold_usage = cold_current - cold_prev # 18 m³
hot_usage = hot_current - hot_prev # 7 m³
elec_usage = elec_current - elec_prev # 289 kWh
# Tomsk 2025-Tarife (aus Konfig, nicht vom Modell)
tariffs = {
'cold_water': 38.76,
'hot_water': 142.63,
'electricity': 4.94,
'drainage': 27.04,
}
# Berechnung
cold_cost = cold_usage * tariffs['cold_water'] # 697.68
hot_cost = hot_usage * tariffs['hot_water'] # 998.41
elec_cost = elec_usage * tariffs['electricity'] # 1427.66
drain_cost = (cold_usage + hot_usage) * tariffs['drainage'] # 676.00
total = cold_cost + hot_cost + elec_cost + drain_cost # 3799.75
# Excel-Datei erstellen
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
ws.append(['Dienstleistung', 'Verbrauch', 'Tarif, ₽', 'Betrag, ₽'])
ws.append(['Kaltwasser', f'{cold_usage} m³', tariffs['cold_water'], cold_cost])
ws.append(['Warmwasser', f'{hot_usage} m³', tariffs['hot_water'], hot_cost])
ws.append(['Strom', f'{elec_usage} kWh', tariffs['electricity'], elec_cost])
ws.append(['Abwasser', f'{cold_usage + hot_usage} m³', tariffs['drainage'], drain_cost])
ws.append(['GESAMT', '', '', total])
wb.save('gemeinde.xlsx')
Die Tarife stammen aus einer externen Konfigurationsdatei, die über offizielle Quellen aktualisiert wird – keine Halluzinationen durch das Modell.
Auswahl des LLMs und der Sandbox
Modelle:
- Qwen (Alibaba): Kostenlose API, zuverlässige Codeerzeugung für einfache Aufgaben.
- DeepSeek V3: Für komplexe Szenarien (Dokumentenanalyse), unterstützt Prompt-Caching.
GPT-4/Claude sind für Skripte unter 20 Zeilen überdimensioniert.
Sandbox: Docker-Container on Demand.
- Benutzerisolierung.
- Basisbibliotheken: openpyxl, math, datetime.
- 30-Sekunden-Timeout.
- Pandas/numpy sind in Prompts blockiert.
Häufige Probleme und Lösungen
| Problem | Lösung |
|--------|----------|
| Tarif-Halluzination | Tarife aus Konfig in Prompt einfügen |
| Direkte Berechnung ohne Code | Validierung + erneuter Versuch mit Anweisung: »nur Code« |
| Unlesbarer Text in Excel | encoding='utf-8' verwenden, nachträgliche Validierung |
| Fehlende Importe | Bibliotheken in Image und Prompt einschränken |
| UX: falsche Tokenanzahl | Backend-basierte Zählung |
| Code-Fehler | stderr an Modell zurückgeben für iterative Korrekturen |
stderr zurückzugeben reduziert die Iterationen um das Fünffache – Modelle analysieren Tracebacks schneller und beheben Fehler effizienter.
Erweiterungen: Budgetanalyse
Für Budgetüberprüfungen (Excel-Datei, Stadt): Modell generiert 150–200 Zeilen Code.
- Verarbeitet beliebige Strukturen.
- Vergleicht mit Marktpreisen aus Konfig.
- Erkennt arithmetische Fehler.
- Generiert Berichte mit Farbcodierung (openpyxl).
Beispiel: Renovierung Bad (Tomsk) – Überpreis von 25,9 %, 8 Artikel >50 % über dem Markt, Differenzen von 1–4 Rubel.
Wichtige Erkenntnisse
- Arithmetik ist 100 % genau: wird über Python ausgeführt.
- Tarife stammen aus externen Daten, niemals vom Modell.
- Sandbox ist zwingend für Sicherheit.
- Iterationen mittels stderr beschleunigen die Fehlersuche.
- Skalierbar: Konfiguration aktualisieren, ohne Neutrainieren.
— Editorial Team
Noch keine Kommentare.