Strukturierte Ausgabe von LLMs: JSON Schema Erklärt

Wenn Sie ein Modell um eine Antwort in JSON bitten, funktioniert json.loads() meistens problemlos. Die Ausfälle sind die, die Sie eine Debugging-Sitzung kosten: ein einzeiliger Kommentar innerhalb des Objekts, ein Markdown-Code-Fence darum, ein Schlüssel als userEmail geschrieben, wo Ihr Code user_email erwartet. Ein strikterer Prompt (“antworte NUR mit dem JSON-Objekt, kein weiterer Text”) macht diese Fälle seltener. Unmöglich macht er sie nicht, denn das Modell kann die Anweisung trotzdem ignorieren. Strukturierte Ausgabe macht diese Anweisung überflüssig: Sie übergeben der API ein JSON Schema, und das schränkt das Token-Sampling des Modells selbst so ein, dass die Antwort dazu passen muss. ...

6. November 2026 · 9 Minuten · 1754 Wörter · SpaghettiCoder

ESLint vs Prettier: Unterschiede und Kombination

Sie speichern eine Datei, Prettier formatiert sie neu, und ESLint meldet sofort einen Fehler in der Zeile, die Prettier gerade angefasst hat. Beide Tools sind konfiguriert, beide laufen, und statt zu helfen, bekämpfen sie sich gegenseitig. Die beiden Tools erledigen unterschiedliche Aufgaben. Das Problem: Beide haben eine Meinung zu genau einer Sache — wie der Code auf der Seite aussieht. Was ESLint tatsächlich prüft ESLint zerlegt Ihren Code in einen abstrakten Syntaxbaum und führt Regeln gegen dessen Struktur aus. Der größte Teil seines Nutzens kommt von Regeln, die echte Bugs finden: eine Variable, die nie definiert wird, ein nicht erreichbares return nach einem anderen return, ein ungenutzter Import, der nach einem Refactoring übrig blieb, ein doppelter Objekt-Key, der den ersten lautlos überschreibt. Das sind semantische Prüfungen — ESLint liest, was der Code tut. ...

1. November 2026 · 6 Minuten · 1212 Wörter · SpaghettiCoder

LLM-Eval Aufbauen: Prompts Testen Wie Code

Warum “sieht richtig aus” kein Test für einen Prompt ist Sie schärfen die Formulierung eines Prompts, der Tickets routet, testen ihn an den drei Beispielen, die in Ihrem Scratch-Notebook offen sind, und bringen ihn live. Eine Woche später landen Rechnungsbeschwerden, die früher in der richtigen Warteschlange ankamen, plötzlich bei “Frage”. Nicht die drei Fälle, die Sie geprüft haben: die anderen vierhundert, die Sie nicht geprüft haben. Nichts stürzt ab. Es gibt keinen Stacktrace. Der Prompt klingt, laut vorgelesen, immer noch gut. ...

30. Oktober 2026 · 8 Minuten · 1632 Wörter · SpaghettiCoder

Function Calling und Tool Use bei LLMs Erklärt

Was Function Calling bei LLMs wirklich macht Fragen Sie ein Modell „wie ist das Wetter gerade in Austin" ohne jede Verbindung zur Außenwelt, und es hat zwei Optionen: sagen, dass es das nicht weiß, oder sich etwas ausdenken. Function Calling gibt ihm eine dritte Option. Es beschreibt, was es braucht, gibt diese Beschreibung an Ihren Code weiter und wartet auf eine echte Antwort, bevor es antwortet. Der Name ist etwas irreführend. Das Modell ruft nichts auf. Es gibt einen Block strukturierter Daten aus, der sagt, welches Tool es möchte und mit welchen Argumenten, und Ihre Anwendung entscheidet, ob sie es ausführt und was sie mit dem Ergebnis macht. „Tool Use" ist der genauere Begriff und der, den Anthropics Dokumentation verwendet; OpenAI und Google sprechen meist von Function Calling. Der Mechanismus ist unter beiden Namen derselbe. Das Modell erzeugt immer nur eine Anfrage, nie den Seiteneffekt. ...

22. Oktober 2026 · 7 Minuten · 1487 Wörter · SpaghettiCoder

npm vs Yarn vs pnpm: Welcher Paketmanager?

Führen Sie in einem Projekt npm install aus und danach für dieselbe package.json pnpm install. Sie erhalten zwei unterschiedliche node_modules-Bäume und zwei unterschiedliche Lockfiles. Kommt ein Kollege dazu, der Yarn nutzt, landet das Repository mit drei Lockfiles in seiner Historie, jeder mit einem leicht anderen Abhängigkeitsbaum. Alle drei lesen dieselbe package.json und laden aus derselben npm-Registry. Uneinig sind sie sich darüber, was auf die Festplatte geschrieben wird. Wie npm, Yarn und pnpm node_modules aufbauen Die Struktur von npm ist flach. Jedes Paket, das Ihre Abhängigkeiten brauchen, egal wie tief im Baum, wird in die oberste node_modules gehoben, solange kein Versionskonflikt besteht. Das ist seit npm 3 das Standardverhalten. Der Nebeneffekt: Ihr Code kann ein Paket per require() oder import laden, das Sie nie in package.json eingetragen haben, solange etwas anderes im Baum davon abhängt. Das funktioniert, bis dieses andere Paket die Abhängigkeit in einem Minor-Release fallenlässt und Ihr Build bricht, ohne dass Sie Ihren eigenen Code geändert hätten. Das ist eine Phantom-Abhängigkeit, und die Struktur von npm tut nichts, um sie zu verhindern. ...

17. Oktober 2026 · 7 Minuten · 1381 Wörter · SpaghettiCoder

Python-Decorators Erklärt mit Beispielen

Was ein Decorator wirklich mit Ihrer Funktion macht Sie wollen jede Funktion zeitlich messen, die eine langsame externe API aufruft. Sie können time.perf_counter()-Aufrufe in jede einzelne einfügen, oder die Messung einmal schreiben und überall anwenden. Ein Decorator ist die zweite Option: eine Funktion, die eine andere Funktion nimmt, sie in zusätzliches Verhalten einwickelt und die eingewickelte Version unter dem ursprünglichen Namen zurückgibt. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import time def timed(func): def wrapper(*args, **kwargs): start = time.perf_counter() result = func(*args, **kwargs) elapsed = time.perf_counter() - start print(f"{func.__name__} took {elapsed:.3f}s") return result return wrapper @timed def fetch_price(ticker): time.sleep(0.2) # Platzhalter für einen Netzwerkaufruf return 142.50 fetch_price("AAPL") # fetch_price took 0.201s @timed über def fetch_price ist die Kurzform von fetch_price = timed(fetch_price). Python ruft timed einmal auf, direkt nachdem fetch_price definiert wurde, und bindet den Namen fetch_price neu an das, was timed zurückgibt. Das ist alles, was das @ tut. ...

7. Oktober 2026 · 6 Minuten · 1242 Wörter · SpaghettiCoder

Virtuelle Python-Umgebungen: venv, pip und uv

Installieren Sie zwei Python-Projekte auf derselben Maschine, kann das zweite das erste zerstören. Eines braucht requests==2.28, das andere requests==2.32, und pip hat genau ein systemweites site-packages-Verzeichnis, in das es schreibt. Die letzte Installation gewinnt, lautlos. Sie merken es, wenn das andere Projekt Fehler wirft, die nichts mit dem Code zu tun haben, den Sie gerade geändert haben. Eine virtuelle Umgebung gibt jedem Projekt sein eigenes site-packages. Nichts Globales wird berührt, und zwei Projekte können von inkompatiblen Versionen derselben Bibliothek abhängen, ohne dass eines das andere stört. ...

30. September 2026 · 7 Minuten · 1387 Wörter · SpaghettiCoder

Wie CLI-Coding-Agenten funktionieren und welchen Sie wählen

Was einen CLI-Coding-Agenten von einem anderen unterscheidet Bitten Sie einen CLI-Coding-Agenten, einen fehlschlagenden Test zu reparieren, antwortet er nicht mit einem Vorschlag. Er liest die Testausgabe, öffnet die Datei, ändert eine Zeile, führt den Test erneut aus und meldet sich zurück, sobald er grün ist. Diese Schleife ist das Produkt, nicht das Chatfenster. Das Modell in dieser Schleife bekommt die meiste Aufmerksamkeit, und es ist auch der Teil, der sich am schnellsten ändert: Anbieter tauschen alle paar Monate ein neues ein, und bei mehreren Agenten können Sie selbst wählen. Was bleibt, ist der Harness um das Modell herum — welche Tools er erreichen kann, wie er mit Kontext umgeht, was er ohne Nachfrage ausführen darf und wo diese Befehle laufen. Zwei Agenten mit demselben Modell können sich dadurch völlig unterschiedlich verhalten. Der Harness ist es, was Sie eigentlich auswählen. ...

23. September 2026 · 8 Minuten · 1537 Wörter · SpaghettiCoder