[{"data":1,"prerenderedAt":793},["ShallowReactive",2],{"blog-dspy-de":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":22,"sources":35,"cover":111,"og":112,"expertise":113,"locales":114,"lang":116,"title":118,"description":119,"coverAlt":120,"metaTitle":121,"takeaways":122,"faq":128,"toc":141,"blocks":169,"others":553},"dspy","2026-10-06",8,"llmops",[9,10,11,12,13],"Prompt optimisation","LLM programs","MIPROv2","GEPA","Python",[4,15,16,17,18,19,20,21],"dspy tutorial","dspy optimizer","miprov2","gepa prompt optimization","dspy vs prompt engineering","automatic prompt optimization","dspy signatures",[23,26,29,32],{"name":24,"url":25},"DSPy","https:\u002F\u002Fdspy.ai",{"name":27,"url":28},"Prompt engineering","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPrompt_engineering",{"name":30,"url":31},"Bayesian optimization","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBayesian_optimization",{"name":33,"url":34},"Fine-tuning (deep learning)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFine-tuning_(deep_learning)",[36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108],{"title":37,"url":38},"DSPy home and cost example","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002F",{"title":40,"url":41},"DSPy installation","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fgetting-started\u002Finstallation\u002F",{"title":43,"url":44},"DSPy: program, don't prompt","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fgetting-started\u002Fprogram-dont-prompt\u002F",{"title":46,"url":47},"DSPy signatures","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fdiving-deeper\u002Fsignatures-in-depth\u002F",{"title":49,"url":50},"DSPy metrics","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fgetting-started\u002Fmetrics\u002F",{"title":52,"url":53},"DSPy Example API","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fapi\u002Fprimitives\u002FExample\u002F",{"title":55,"url":56},"DSPy Predict API","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fapi\u002Fmodules\u002FPredict\u002F",{"title":58,"url":59},"DSPy ChainOfThought API","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fapi\u002Fmodules\u002FChainOfThought\u002F",{"title":61,"url":62},"DSPy ReAct API","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fapi\u002Fmodules\u002FReAct\u002F",{"title":64,"url":65},"DSPy optimizers index","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fapi\u002Foptimizers\u002F",{"title":67,"url":68},"DSPy MIPROv2 API","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fapi\u002Foptimizers\u002FMIPROv2\u002F",{"title":70,"url":71},"MIPROv2 source code","https:\u002F\u002Fgithub.com\u002Fstanfordnlp\u002Fdspy\u002Fblob\u002Fmain\u002Fdspy\u002Fteleprompt\u002Fmipro_optimizer_v2.py",{"title":73,"url":74},"DSPy BootstrapFewShot API","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fapi\u002Foptimizers\u002FBootstrapFewShot\u002F",{"title":76,"url":77},"DSPy BootstrapFinetune API","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fapi\u002Foptimizers\u002FBootstrapFinetune\u002F",{"title":79,"url":80},"DSPy GEPA guide","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fgetting-started\u002Fgepa-optimization\u002F",{"title":82,"url":83},"GEPA source code","https:\u002F\u002Fgithub.com\u002Fstanfordnlp\u002Fdspy\u002Fblob\u002Fmain\u002Fdspy\u002Fteleprompt\u002Fgepa\u002Fgepa.py",{"title":85,"url":86},"DSPy saving programs","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Ftutorials\u002Fsaving\u002F",{"title":88,"url":89},"DSPy caching","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Ftutorials\u002Fcache\u002F",{"title":91,"url":92},"DSPy LM API","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Fapi\u002Fmodels\u002FLM\u002F",{"title":94,"url":95},"DSPy FAQ","https:\u002F\u002Fdspy.ai\u002Fcurrent\u002Ffaqs\u002F",{"title":97,"url":98},"DSPy GitHub repository","https:\u002F\u002Fgithub.com\u002Fstanfordnlp\u002Fdspy",{"title":100,"url":101},"DSPy 3.4.0 release","https:\u002F\u002Fgithub.com\u002Fstanfordnlp\u002Fdspy\u002Freleases\u002Ftag\u002F3.4.0",{"title":103,"url":104},"DSPy paper, arXiv","https:\u002F\u002Farxiv.org\u002Fabs\u002F2310.03714",{"title":106,"url":107},"MIPRO paper, arXiv","https:\u002F\u002Farxiv.org\u002Fabs\u002F2406.11695",{"title":109,"url":110},"GEPA paper, arXiv","https:\u002F\u002Farxiv.org\u002Fabs\u002F2507.19457","\u002Fimages\u002Fblog\u002Fdspy\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fdspy\u002Fog.jpg","ai-engineer",[115,116,117],"en","de","hu","DSPy im Test: Prompts gegen eine Metrik kompilieren, nicht von Hand","DSPy erzeugt Prompts aus Signaturen, einer Metrik und Beispielen. Was Optimierer an Modellaufrufen kosten und wann ein handgeschriebener Prompt besser ist.","Drei kleine Quadrate fallen durch einen Trichter in eine offene Kiste, ein breiteres Blatt gleitet heraus.","DSPy im Test: Prompts gegen eine Metrik · Balázs Csorba",[123,124,125,126,127],"DSPy ersetzt handgeschriebene Prompts durch Signaturen, Module und Optimierer, die anhand einer Metrik, die du schreibst, bessere Prompts suchen.","Ein Optimierungslauf wird in Modellaufrufen bezahlt. Bei MIPROv2 mit light macht ein Programm mit einem Prädiktor etwa 750 davon, vor dem Bootstrapping.","Schreibe zuerst die Metrik. Ein Optimierer kann nur verbessern, was die Metrik misst, und genau dort steckt der meiste Aufwand.","Ein kompiliertes Programm ist eine JSON-Datei mit Anweisungen und Demonstrationen. Sie gehört unter Versionskontrolle, und ihre Demonstrationen sind deine Trainingsdaten.","Für einen Prompt auf einem stabilen Modell sind ein geprüfter Prompt und eine Eval-Suite einfacher. DSPy lohnt sich bei mehrstufigen Pipelines, die sich ändern.",[129,132,135,138],{"q":130,"a":131},"Ist DSPy kostenlos?","Die Bibliothek ist MIT-lizenziert und kostenlos. Du zahlst jeden Modellaufruf, auch die Aufrufe, die der Optimierer bei der Suche macht. Die Beispielläufe der Doku kosteten einige Dollar.",{"q":133,"a":134},"Wie viele Beispiele braucht DSPy?","Ich habe in der Doku kein festes Minimum gefunden. Die FAQ verlangt einige Beispieleingaben, Labels nur, wenn die Metrik sie braucht. MIPROv2 mit light nutzt höchstens 100 Beispiele zur Validierung.",{"q":136,"a":137},"Kann ich DSPy auf ein lokales Modell richten?","dspy.LM nimmt Provider- und Modellnamen im LiteLLM-Format. Ein lokaler Endpunkt kann funktionieren, wenn LiteLLM ihn ansprechen kann. Ich habe für diese Kritik keinen getestet, prüfe das also zuerst in deinem Setup.",{"q":139,"a":140},"Muss ich neu optimieren, wenn ich das Modell wechsle?","Ja. Die FAQ nennt den Wechsel des Ziel-LM als Grund zum Neukompilieren, weil der Compiler das Programm auf neue Prompts abbildet. Behalte die alte kompilierte Datei, um vergleichen und zurückrollen zu können.",[142,145,148,151,154,157,160,163,166],{"id":143,"title":144},"what-it-is","Was es ist",{"id":146,"title":147},"how-it-works","So funktioniert es",{"id":149,"title":150},"getting-started","Erste Schritte",{"id":152,"title":153},"signatures-and-modules","Signaturen und Module",{"id":155,"title":156},"optimisers","Optimierer und was sie brauchen",{"id":158,"title":159},"cost-and-deployment","Kosten, Betrieb und Daten",{"id":161,"title":162},"where-it-falls-short","Wo es zu kurz greift",{"id":164,"title":165},"verdict","Fazit",{"id":167,"title":168},"sources","Quellen",[170,174,177,186,216,217,220,226,227,229,232,233,236,253,256,257,260,306,309,326,333,336,339,342,343,380,383,386,393,399,400,403,406,409,412,413,416,436,449,450],{"type":171,"content":172},"paragraph",[173],"DSPy ist ein quelloffenes Python-Framework, das eine LLM-Pipeline wie Code behandelt. Du deklarierst Ein- und Ausgaben, wählst ein Modul und lässt einen Optimierer nach den Anweisungen und Beispielen suchen, die auf deiner Metrik am besten abschneiden. Das Urteil vorweg: Nimm es für eine Pipeline mit mehreren Modellaufrufen, die du messen kannst und die sich ändern wird. Lass die Finger davon bei einem einzelnen Prompt auf einem stabilen Modell – ein geprüfter Prompt und eine Eval-Suite sind einfacher.",{"type":175,"level":176,"id":143,"text":144},"heading",2,{"type":171,"content":178},[179,180,185],"DSPy nennt sich das Framework zum Programmieren, nicht zum Prompten, von Sprachmodellen. Signaturen beschreiben, was hineingeht und was herauskommt. Module entscheiden, wie das Modell gefragt wird, von einer einfachen Vorhersage bis zu schrittweiser Begründung oder einer Tool-Schleife. Optimierer kompilieren ein Programm gegen eine Metrik, indem sie Anweisungen und Few-Shot-Beispiele ändern. Es liegt zwischen Prompt Engineering und Feintuning: Der Prompt wird zu einem Artefakt, das der Optimierer schreibt. Für die größere Entscheidung lies ",{"tag":181,"to":182,"children":183},"link","\u002Fblog\u002Ffine-tuning-vs-rag-vs-prompting",[184],"meinen Entscheidungsleitfaden zu Prompting, Retrieval und Feintuning",".",{"type":187,"ordered":188,"items":189},"list",false,[190,201,206,211],[191,195,196,200],{"tag":192,"children":193},"strong",[194],"MIT-Lizenz, kostenlos nutzbar. ","Installation mit ",{"tag":197,"children":198},"code",[199],"pip install dspy",", Python 3.10 oder neuer.",[202,205],{"tag":192,"children":203},[204],"Neueste Version 3.4.0, ","veröffentlicht am 25. September. Das Repository zeigte bei meiner Prüfung 38.6k Sterne.",[207,210],{"tag":192,"children":208},[209],"14 Optimierer in der API-Referenz, ","von BootstrapFewShot über MIPROv2 und GEPA bis BootstrapFinetune.",[212,215],{"tag":192,"children":213},[214],"Kein gehosteter Dienst, den ich finden konnte. ","Er läuft in deinem Prozess und ruft den Provider auf, den du einrichtest.",{"type":175,"level":176,"id":146,"text":147},{"type":171,"content":218},[219],"Ein Modul baut auf einer Signatur auf. Zur Laufzeit macht der Adapter aus der Signatur die Systemnachricht, das Modell antwortet, und DSPy zerlegt die Antwort in die Ausgabefelder. Ohne Optimierer ist das Programm nur so gut wie seine Formulierung. Der Optimierer bekommt eine Metrik dazu, eine Python-Funktion, die eine Vorhersage bewertet, meist von 0.0 bis 1.0, dazu Beispieleingaben. Er lässt das Programm über die Beispiele laufen, schlägt neue Anweisungen und Demonstrationen vor, behält die beste Kombination und gibt ein kompiliertes Programm zurück.",{"type":221,"src":222,"alt":223,"wide":224,"caption":225},"image","\u002Fimages\u002Fblog\u002Fdspy\u002Fdiagram-6.webp","Wie DSPy ein Programm kompiliert Eine Signatur und ein Modul bilden das Programm. Eine Metrik und eine Menge von Beispielen speisen den Optimierer, der Anweisungen und Demonstrationen sucht und ein kompiliertes Programm zurückgibt. Das kompilierte Programm lässt sich als JSON-Datei speichern und anstelle des ursprünglichen Moduls aufrufen.",true,"Metrik und Beispiele speisen den Optimierer, der Signatur und Modul zu einem Programm kompiliert, das du speichern kannst.",{"type":175,"level":176,"id":149,"text":150},{"type":197,"code":228},"import os\nimport dspy\n\nlm = dspy.LM(\"openai\u002Fgpt-5-nano\", api_key=os.environ[\"OPENAI_API_KEY\"])\ndspy.configure(lm=lm)\n\n\nclass ExtractIntent(dspy.Signature):\n    \"\"\"Classify the customer's intent in one short email.\"\"\"\n\n    email: str = dspy.InputField()\n    intent: str = dspy.OutputField(desc=\"one of: order, return, invoice, other\")\n\n\nextract = dspy.ChainOfThought(ExtractIntent)\n\n\ndef intent_metric(example, prediction, trace=None):\n    return float(prediction.intent.strip().lower() == example.intent.strip().lower())\n\n\ntrainset = [\n    dspy.Example(email=\"Where is my parcel 4411?\", intent=\"order\").with_inputs(\"email\"),\n    dspy.Example(email=\"I want my money back for the shoes.\", intent=\"return\").with_inputs(\"email\"),\n    # more labelled emails from your own inbox\n]\n\noptimizer = dspy.MIPROv2(metric=intent_metric, auto=\"light\")\ncompiled = optimizer.compile(extract, trainset=trainset)\ncompiled.save(\"intent_v1.json\")",{"type":171,"content":230},[231],"Die Metrik vergleicht das vorhergesagte Label mit dem gelabelten, deshalb braucht dieses Beispiel Labels. Der compile-Aufruf ist die Stelle, an der die Kosten entstehen: light macht Hunderte Modellaufrufe. Lauf ihn also zuerst auf einem kleinen Satz, prüfe die gespeicherte Datei und skaliere erst dann.",{"type":175,"level":176,"id":152,"text":153},{"type":171,"content":234},[235],"Eine Signatur ist der Vertrag. Die Stringform, etwa question -> answer, ist eine Kurzschreibweise. Die Klassenform ergänzt einen Docstring, der zur Anweisung wird, und typisierte Felder. Die Reihenfolge zählt, denn das Umsortieren von Ein- oder Ausgaben ändert den Prompt. Behandle jede Änderung an einer Signatur wie eine Prompt-Änderung und teste sie.",{"type":187,"ordered":188,"items":237},[238,243,248],[239,242],{"tag":192,"children":240},[241],"dspy.Predict ","bildet Eingaben mit einem Sprachmodell auf Ausgaben ab. Seine Schlüsselwortargumente gehen an das Modell.",[244,247],{"tag":192,"children":245},[246],"dspy.ChainOfThought ","begründet zuerst Schritt für Schritt. Es ergänzt ein Begründungsfeld, das du anpassen kannst.",[249,252],{"tag":192,"children":250},[251],"dspy.ReAct ","führt eine Schleife aus Denken und Handeln über Tools aus. Sein max_iters ist standardmäßig 20.",{"type":171,"content":254},[255],"Die Startseite fasst das als „gleiche Schnittstelle, andere Strategie“ zusammen. Die Strategie bestimmt auch die Rechnung: Begründungsfelder fügen jedem Aufruf Ausgabe-Tokens hinzu, und jeder ReAct-Schritt ist ein weiterer Modellaufruf.",{"type":175,"level":176,"id":155,"text":156},{"type":171,"content":258},[259],"DSPy liefert 14 Optimierer, von BootstrapFewShot, das Demonstrationen sammelt, bis GEPA, das Anweisungen aus dem Feedback der Metrik neu schreibt. Alle brauchen eine Metrik. Die FAQ verlangt eine Aufgabe, eine Metrik und einige Beispieleingaben, Labels nur dort, wo die Metrik sie braucht. Die Tabelle vergleicht die vier Optimierer, die ich am genauesten angeschaut habe.",{"type":261,"head":262,"rows":271},"table",[263,265,267,269],[264],"Optimierer",[266],"Ändert",[268],"Braucht",[270],"Hauptkosten",[272,281,289,297],[273,275,277,279],[274],"BootstrapFewShot",[276],"Few-Shot-Demonstrationen",[278],"Metrik und Trainingsbeispiele",[280],"Programmläufe, ein Versuch pro Beispiel",[282,283,285,287],[11],[284],"Anweisungen und Demonstrationen",[286],"Metrik und Trainingsset",[288],"Versuche mit 35 Beispielen, dazu volle Validierungsläufe",[290,291,293,295],[12],[292],"Anweisungen, neu geschrieben von einem Reflexionsmodell",[294],"Metrik mit Feedback und Reflexionsmodell",[296],"Budget nach Validierungsgröße und Anzahl der Prädiktoren",[298,300,302,304],[299],"BootstrapFinetune",[301],"Feinabgestimmtes Modell pro Prädiktor",[303],"Traces und ein Modell, das du feinabstimmen kannst",[305],"Ein Job pro Modell oder pro Prädiktor",{"type":171,"content":307},[308],"MIPROv2 ist der übliche Einstieg, deshalb lohnt sich ein Blick auf die Rechnung. Die auto-Einstellung legt die Suche fest. Bei einem Programm mit einem Prädiktor und Few-Shot laufen bei light etwa zehn Versuche, validiert wird an höchstens 100 Beispielen. Medium macht 18 Versuche auf 300 Beispielen, heavy 27 auf 1.000. Jeder Versuch bewertet ein Minibatch aus 35 Beispielen, und ein voller Validierungslauf kommt bei jedem sechsten Versuch, beim letzten Versuch und für das unoptimierte Programm.",{"type":187,"ordered":188,"items":310},[311,316,321],[312,315],{"tag":192,"children":313},[314],"light: etwa 750 Läufe, ","350 für Versuche und 400 für volle Läufe.",[317,320],{"tag":192,"children":318},[319],"medium: etwa 2.100 Läufe, ","630 für Versuche und 1.500 für volle Läufe.",[322,325],{"tag":192,"children":323},[324],"heavy: etwa 7.900 Läufe, ","945 für Versuche und 7.000 für volle Läufe.",{"type":327,"variant":328,"title":329,"body":330},"callout","note","So liest du die Zahlen",[331],[332],"Die Zahlen stammen aus dem Optimierer-Code, für einen Prädiktor mit Few-Shot-Demonstrationen. Bootstrapping und Vorschlagsaufrufe kommen obendrauf, und jeder weitere Prädiktor fügt Versuche und Aufrufe hinzu. Lies sie als Größenordnungen und zähle die Aufrufe in deinem ersten Lauf.",{"type":171,"content":334},[335],"Tokens folgen den Aufrufen. Die FAQ, die als möglicherweise veraltet für DSPy 2.5 und 2.6 markiert ist, nennt etwa sechs Minuten, 3.200 Aufrufe, 2,7 Millionen Eingabe-Tokens und 156.000 Ausgabe-Tokens, für etwa 3 $ zum damaligen OpenAI-Preis. Das sind rund 850 Eingabe- und 50 Ausgabe-Tokens pro Aufruf, also kommen die 750 Aufrufe eines light-Laufs auf etwa 0,6 Millionen Eingabe- und 40.000 Ausgabe-Tokens. Das aktuelle Beispiel auf der Startseite, GEPA mit auto auf medium über 200 Beispiele mit gpt-5.4-mini, wird mit 2,18 $ angegeben.",{"type":171,"content":337},[338],"GEPA geht mit seinem Budget anders um. Seine Metrik liefert eine Punktzahl und Feedback-Text, und ein Reflexionsmodell liest die Beispiele und ihre Punktzahlen und schlägt neu geschriebene Anweisungen vor. Der Leitfaden empfiehlt für die Reflexion ein größeres Modell als das, das du optimierst, und der Konstruktor verlangt eines, außer du übergibst einen eigenen Vorschlagsgeber. Light zielt auf etwa sechs Kandidaten-Prompts, und der Code macht daraus ein Budget an Metrikaufrufen, in dem mehrere volle Validierungsläufe stecken.",{"type":171,"content":340},[341],"Die Veröffentlichungen liefern das stärkste Argument, und jede stützt sich auf die eigenen Aufgaben der Autoren. Das DSPy-Paper berichtet, dass Pipelines den Standard-Few-Shot-Prompt um generell über 25 % bzw. 65 % schlagen, für GPT-3.5 bzw. llama2-13b-chat. Das MIPROv2-Paper berichtet Erfolge bei fünf von sieben mehrstufigen Programmen, mit Gewinnen von bis zu 13 % Genauigkeit. Das GEPA-Paper berichtet im Schnitt 6 % Vorsprung vor GRPO, einer Verstärkungslern-Baseline, mit bis zu 35-mal weniger Rollouts.",{"type":175,"level":176,"id":158,"text":159},{"type":261,"head":344,"rows":351},[345,347,349],[346],"Posten",[348],"Preis",[350],"Was er abdeckt",[352,359,366,373],[353,355,357],[354],"DSPy-Bibliothek",[356],"MIT · kostenlos",[358],"Mit pip installiert, läuft in deinem Prozess",[360,362,364],[361],"Modellaufrufe zur Laufzeit",[363],"Tarif deines Providers",[365],"Jeder Aufruf des Programms, nach Tokens abgerechnet",[367,369,371],[368],"Optimierungslauf, Beispiel des Anbieters",[370],"2,18 $",[372],"GEPA, auto medium, 200 Beispiele, gpt-5.4-mini",[374,376,378],[375],"Älterer FAQ-Lauf",[377],"etwa 3 $",[379],"3.200 Aufrufe, 2,7 Mio. Eingabe- und 156.000 Ausgabe-Tokens",{"type":171,"content":381},[382],"Behandle das kompilierte Programm wie ein Build-Artefakt. Speichere es als JSON, das die Doku als sicherer und lesbarer beschreibt, neben den Signaturen im selben Repository, mit einer Version im Dateinamen und der gepinnten DSPy-Version. Die Datei enthält Signatur, Demonstrationen und das Modell je Prädiktor. Zum Laden musst du zuerst dasselbe Programm im Code aufbauen.",{"type":171,"content":384},[385],"Ein Modellwechsel löst ein Neukompilieren aus, weil der Compiler das Programm auf neue Prompts für das neue Modell abbildet. Behalte die alte Datei, lass die Metrik auf beiden laufen und übernimm die neue nur, wenn sie gewinnt. Pinne auch die Version: Die LM-Seite beschreibt eine auto-Engine, die ein neueres Backend bevorzugt, ein Upgrade kann also das Verhalten ändern.",{"type":171,"content":387},[388,389,185],"Der Datenweg ist der, den du konfigurierst, deshalb entsprechen die Fragen nach Auftragsverarbeiter und Region denen jeder Modell-API. Drei Dinge halten zusätzlich Kopien deiner Daten. Der LM-Cache ist standardmäßig an, im Speicher und auf der Festplatte. Ein gespeichertes Programm trägt Demonstrationen aus deinen Trainingsdaten mit sich, die JSON-Datei kann also personenbezogene Daten enthalten. Ein GEPA-Reflexionsmodell liest deine Beispiele und ihre Punktzahlen, es ist also ein zweiter Auftragsverarbeiter. Für EU-Optionen siehe ",{"tag":181,"to":390,"children":391},"\u002Fblog\u002Fgdpr-llm-api-eu-data-residency",[392],"meinen DSGVO-Artikel zur EU-Datenresidenz",{"type":327,"variant":394,"title":395,"body":396},"warn","Lade nie einen Pickle, den du nicht selbst geschrieben hast",[397],[398],"Die Doku sagt, ein Pickle kann beliebigen Code ausführen, und save_program=True nutzt cloudpickle mit demselben Risiko. Lade nur den JSON-Zustand, aus deinem eigenen Repository.",{"type":175,"level":176,"id":161,"text":162},{"type":171,"content":401},[402],"Die meisten Aufgaben brauchen keinen Optimierer. Die FAQ räumt ein, dass bei extrem einfachen Aufgaben ein schlichter Prompt durchaus reichen kann, und du schreibst trotzdem die Tools, Wiederholungen und das Parsing selbst. Wenn du keine Metrik schreiben kannst, die dem entspricht, was ein Nutzer als richtig bezeichnen würde, verbessert der Optimierer genau das, was du gemessen hast, und das ist nicht dasselbe.",{"type":171,"content":404},[405],"Gegenüber handgeschriebenen Prompts gewinnt es am deutlichsten, wenn mehrere Aufrufe voneinander abhängen, sich das Modell oft ändert und sich die Ausgabe bewerten lässt. Gegenüber Feintuning ist es für die meisten Teams die günstigere und leichter rückgängig zu machende Option. BootstrapFinetune kompiliert das Programm zu Feintuning-Jobs, aber dann musst du feinabgestimmte Modelle betreiben und versionieren, eines pro Modell oder pro Prädiktor.",{"type":171,"content":407},[408],"Die Rechnung und die Metrik sind die anderen Schwachstellen. Ein light-Lauf macht Hunderte Aufrufe, heavy-Läufe Tausende, und die Validierungsmenge bestimmt den größten Teil des Preises. Die Herstellerbehauptung, ein kleines, günstiges Modell könne ein handgeprompteltes Spitzenmodell oft erreichen oder übertreffen, ist eine Hypothese, die du an deinen eigenen Daten prüfen musst.",{"type":171,"content":410},[411],"Die API bewegt sich noch. Die Versionshinweise zu 3.4.0 listen eine Breaking Change an rlm(...) und entfernen die alten Exporte dspy.LMRequest und dspy.LMResponse, lies sie also vor jedem Upgrade.",{"type":175,"level":176,"id":164,"text":165},{"type":171,"content":414},[415],"Nimm DSPy, wenn eine Pipeline mehrstufig, messbar und im Wandel ist. Für einen einzelnen Prompt auf einem Modell, das du nie wechselst, reichen ein geprüfter Prompt und eine Regressionssuite. Wenn du die Metrik nicht schreiben kannst, kompiliere noch nichts.",{"type":187,"ordered":224,"items":417},[418,423,427,432],[419,422],{"tag":192,"children":420},[421],"Nimm es, wenn ","mehrere Modellaufrufe zusammenpassen müssen und ihre Ausgabe automatisch bewertbar ist.",[424,426],{"tag":192,"children":425},[421],"sich das Modell oder die Daten oft ändern, denn Neukompilieren schlägt das Neuschreiben von Prompts.",[428,431],{"tag":192,"children":429},[430],"Lass es, wenn ","die Aufgabe ein einzelner Prompt auf einem stabilen Modell ist.",[433,435],{"tag":192,"children":434},[430],"niemand die Metrik schreibt und pflegt.",{"type":171,"content":437},[438,439,443,444,448],"Drei Alternativen decken den Rest weitgehend ab. Wenn du Prompts im Code halten und Änderungen durch Evals absichern willst, passt ",{"tag":181,"to":440,"children":441},"\u002Fblog\u002Fpromptfoo",[442],"Promptfoo"," besser. Wenn das Problem expliziter Zustand und Ablaufsteuerung ist, schau dir ",{"tag":181,"to":445,"children":446},"\u002Fblog\u002Flanggraph",[447],"LangGraph"," an und kombiniere beides, wenn du beides brauchst. Wenn das Modell ein Format oder einen Stil lernen muss, ist Feintuning der Hebel, wie der Entscheidungsleitfaden erklärt.",{"type":175,"level":176,"id":167,"text":168},{"type":187,"ordered":188,"items":451},[452,457,461,465,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533,537,541,545,549],[453],{"tag":454,"href":38,"children":455},"a",[456],"DSPy-Startseite und Kostenbeispiel",[458],{"tag":454,"href":41,"children":459},[460],"DSPy-Installation",[462],{"tag":454,"href":44,"children":463},[464],"DSPy: Programm statt Prompt",[466],{"tag":454,"href":47,"children":467},[468],"DSPy-Signaturen",[470],{"tag":454,"href":50,"children":471},[472],"DSPy-Metriken",[474],{"tag":454,"href":53,"children":475},[476],"DSPy Example-API",[478],{"tag":454,"href":56,"children":479},[480],"DSPy Predict-API",[482],{"tag":454,"href":59,"children":483},[484],"DSPy ChainOfThought-API",[486],{"tag":454,"href":62,"children":487},[488],"DSPy ReAct-API",[490],{"tag":454,"href":65,"children":491},[492],"DSPy-Optimierer-Übersicht",[494],{"tag":454,"href":68,"children":495},[496],"DSPy MIPROv2-API",[498],{"tag":454,"href":71,"children":499},[500],"MIPROv2-Quellcode",[502],{"tag":454,"href":74,"children":503},[504],"DSPy BootstrapFewShot-API",[506],{"tag":454,"href":77,"children":507},[508],"DSPy BootstrapFinetune-API",[510],{"tag":454,"href":80,"children":511},[512],"DSPy GEPA-Leitfaden",[514],{"tag":454,"href":83,"children":515},[516],"GEPA-Quellcode",[518],{"tag":454,"href":86,"children":519},[520],"DSPy: Programme speichern",[522],{"tag":454,"href":89,"children":523},[524],"DSPy: Cache",[526],{"tag":454,"href":92,"children":527},[528],"DSPy LM-API",[530],{"tag":454,"href":95,"children":531},[532],"DSPy-FAQ",[534],{"tag":454,"href":98,"children":535},[536],"DSPy-GitHub-Repository",[538],{"tag":454,"href":101,"children":539},[540],"DSPy 3.4.0 Release",[542],{"tag":454,"href":104,"children":543},[544],"DSPy-Paper, arXiv",[546],{"tag":454,"href":107,"children":547},[548],"MIPRO-Paper, arXiv",[550],{"tag":454,"href":110,"children":551},[552],"GEPA-Paper, arXiv",[554,611,679,737],{"slug":555,"published":556,"minutes":557,"category":7,"tags":558,"keywords":564,"about":578,"sources":586,"cover":605,"og":606,"expertise":113,"locales":607,"lang":116,"title":608,"description":609,"coverAlt":610},"deepseek-v4-1-flash-1017","2026-10-17",15,[559,560,561,562,563],"DeepSeek","Open-weight models","KV cache","Mixture of experts","LLM cost",[565,566,567,568,569,570,571,572,573,574,575,576,577],"DeepSeek V4.1 Flash 1017","DeepSeek V4.1 Flash","Causal Encoder-Decoder","Compressed Sparse Attention 2","CSA2","FP4 KV cache","KV cache compression","SWA Bounded Replay","Engram conditional memory","DSpark speculative decoding","DeepSeek pricing","DeepSWE benchmark","open-weight coding model",[579,581,583],{"name":559,"url":580},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDeepSeek",{"name":562,"url":582},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMixture_of_experts",{"name":584,"url":585},"Transformer (deep learning architecture)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTransformer_(deep_learning_architecture)",[587,590,593,596,599,602],{"title":588,"url":589},"DeepSeek-AI: DeepSeek-V4.1-Flash: Pushing the Limits of KV Cache Compression (arXiv:2609.19969)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2609.19969",{"title":591,"url":592},"Hugging Face: deepseek-ai\u002FDeepSeek-V4.1-Flash-1017 model card","https:\u002F\u002Fhuggingface.co\u002Fdeepseek-ai\u002FDeepSeek-V4.1-Flash-1017",{"title":594,"url":595},"OpenRouter: DeepSeek V4.1 Flash 1017, pricing and providers","https:\u002F\u002Fopenrouter.ai\u002Fdeepseek\u002Fdeepseek-v4.1-flash-1017",{"title":597,"url":598},"The Decoder: Deepseek V4.1 Flash 1017 beats larger rivals in agentic tasks while once again massively cutting per-task costs","https:\u002F\u002Fthe-decoder.com\u002Fdeepseek-v4-1-flash-1017-beats-larger-rivals-in-agentic-tasks-while-once-again-massively-cutting-per-task-costs\u002F",{"title":600,"url":601},"AI Weekly: DeepSeek opens V4.1-Flash-1017 weights and $0.75 Search API","https:\u002F\u002Faiweekly.co\u002Falerts\u002Fdeepseek-opens-v41-flash-1017-weights-and-075-search-api",{"title":603,"url":604},"DeepSeek on X: DeepSeek-V4.1-Flash-1017 announcement","https:\u002F\u002Fx.com\u002Fdeepseek_ai\u002Fstatus\u002F2111375640717033777","\u002Fimages\u002Fblog\u002Fdeepseek-v4-1-flash-1017\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fdeepseek-v4-1-flash-1017\u002Fog.jpg",[115,116,117],"DeepSeek V4.1 Flash 1017: 890 Byte KV-Cache pro Token, und was ein Agent davon hat","Technischer Deep Dive zu DeepSeek V4.1 Flash 1017: Encoder-Decoder-Aufteilung, CSA2-Cache-Sharing, FP4-KV-Cache, Benchmarks und die echten Kosten pro Agenten-Task.","Links ein hoher Stapel dünner Karten, ein Pfeil, rechts dieselben Karten auf ein Viertel der Höhe zusammengepresst.",{"slug":612,"published":556,"minutes":613,"category":7,"tags":614,"keywords":620,"about":632,"sources":642,"cover":673,"og":674,"expertise":113,"locales":675,"lang":116,"title":676,"description":677,"coverAlt":678},"llm-rate-limits-retries-provider-fallback",10,[615,616,617,618,619],"Rate limits","Retries","Fallback","Reliability","LLM gateway",[621,622,623,624,625,626,627,628,629,630,631],"llm rate limit handling","429 too many requests llm api","exponential backoff with jitter","anthropic 529 overloaded error","openai rate limit retry","llm provider fallback","litellm fallbacks","retry-after header","llm circuit breaker","multi provider llm failover","claude api rate limits",[633,636,639],{"name":634,"url":635},"Token bucket","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FToken_bucket",{"name":637,"url":638},"Exponential backoff","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FExponential_backoff",{"name":640,"url":641},"Circuit breaker design pattern","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCircuit_breaker_design_pattern",[643,646,649,652,655,658,661,664,667,670],{"title":644,"url":645},"Claude Platform Docs: Rate limits","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fapi\u002Frate-limits",{"title":647,"url":648},"Claude Platform Docs: API errors","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fapi\u002Ferrors",{"title":650,"url":651},"OpenAI API Docs: Rate limits","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Frate-limits",{"title":653,"url":654},"AWS Builders Library: Timeouts, retries and backoff with jitter","https:\u002F\u002Fbuilder.aws.com\u002Fcontent\u002F3EumjoZascWd1oZiEgL8ORlv3qE\u002Ftimeouts-retries-and-backoff-with-jitter",{"title":656,"url":657},"MDN: Retry-After header","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FReference\u002FHeaders\u002FRetry-After",{"title":659,"url":660},"Martin Fowler: Circuit Breaker (2014)","https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FCircuitBreaker.html",{"title":662,"url":663},"LiteLLM Docs: Router, retries and cooldowns","https:\u002F\u002Fdocs.litellm.ai\u002Fdocs\u002Frouting",{"title":665,"url":666},"LiteLLM Docs: Proxy fallbacks and reliability","https:\u002F\u002Fdocs.litellm.ai\u002Fdocs\u002Fproxy\u002Freliability",{"title":668,"url":669},"OpenRouter Docs: Model fallbacks","https:\u002F\u002Fopenrouter.ai\u002Fdocs\u002Fguides\u002Frouting\u002Fmodel-fallbacks",{"title":671,"url":672},"AI SDK Docs: Settings (maxRetries, timeout)","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-core\u002Fsettings","\u002Fimages\u002Fblog\u002Fllm-rate-limits-retries-provider-fallback\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-rate-limits-retries-provider-fallback\u002Fog.jpg",[115,116,117],"LLM-Rate-Limits in Produktion: Retries, Backoff und Provider-Fallback","Wie LLM-Rate-Limits funktionieren, welche Fehler man wiederholt, Backoff mit Jitter, Retries in nur einer Schicht und Fallback-Ketten ohne kaputte Ausgaben.","Kleine Quadrate steigen drei Stufen zu einem breiten Rechteck, dahinter zwei weitere in einer Reihe.",{"slug":680,"published":556,"minutes":6,"category":7,"tags":681,"keywords":687,"about":698,"sources":706,"cover":731,"og":732,"expertise":113,"locales":733,"lang":116,"title":734,"description":735,"coverAlt":736},"prompt-versioning-management",[682,683,684,685,686],"Prompt management","Versioning","LLMOps","Evals","Langfuse",[688,689,690,691,692,693,694,695,696,697],"prompt versioning","prompt management","prompt registry","version control for prompts","langfuse prompt management","mlflow prompt registry","prompts in git","openai prompt object deprecation","prompt rollback production","prompt ci evaluation",[699,700,703],{"name":27,"url":28},{"name":701,"url":702},"Version control","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVersion_control",{"name":704,"url":705},"Continuous integration","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FContinuous_integration",[707,710,713,716,719,722,725,728],{"title":708,"url":709},"OpenAI API Docs: Migrate from prompt objects","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fprompting\u002Fmigrate-from-prompt-object",{"title":711,"url":712},"OpenAI API Docs: Prompt engineering (reusable prompts deprecation note)","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fprompt-engineering",{"title":714,"url":715},"Langfuse Docs: Prompt version control","https:\u002F\u002Flangfuse.com\u002Fdocs\u002Fprompt-management\u002Ffeatures\u002Fprompt-version-control",{"title":717,"url":718},"Langfuse Docs: Prompt caching in the SDKs","https:\u002F\u002Flangfuse.com\u002Fdocs\u002Fprompt-management\u002Ffeatures\u002Fcaching",{"title":720,"url":721},"Langfuse Docs: Link prompts to traces","https:\u002F\u002Flangfuse.com\u002Fdocs\u002Fprompt-management\u002Ffeatures\u002Flink-to-traces",{"title":723,"url":724},"MLflow Docs: Prompt Registry","https:\u002F\u002Fmlflow.org\u002Fdocs\u002Flatest\u002Fgenai\u002Fprompt-registry\u002F",{"title":726,"url":727},"Promptfoo Docs: GitHub Action","https:\u002F\u002Fwww.promptfoo.dev\u002Fdocs\u002Fintegrations\u002Fgithub-action\u002F",{"title":729,"url":730},"Claude Platform Docs: Prompt caching","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fprompt-caching","\u002Fimages\u002Fblog\u002Fprompt-versioning-management\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fprompt-versioning-management\u002Fog.jpg",[115,116,117],"Prompt-Versionierung in Produktion: Git, Registries, Labels und Rollbacks","Prompts in Produktion versionieren: was zu einer Version gehört, Git oder Prompt-Registry, Labels und Rollbacks, Eval-Gates in CI und Folgen für Caches.","Fünf aufrechte Karten in einer Reihe, die dritte schwenkt an einem Bogenpfeil zurück, ein Tor vor der letzten.",{"slug":738,"published":556,"minutes":739,"category":7,"tags":740,"keywords":745,"about":756,"sources":766,"cover":787,"og":788,"expertise":113,"locales":789,"lang":116,"title":790,"description":791,"coverAlt":792},"llm-batch-api-offline-workloads",9,[741,742,684,743,744],"Batch API","Cost","Prompt caching","Data pipelines",[746,747,748,749,750,751,752,753,754,755],"llm batch api","anthropic message batches api","openai batch api","gemini batch mode","batch inference llm cost","batch api 50 percent discount","openai flex processing","bedrock batch inference","llm offline processing","batch api prompt caching",[757,760,763],{"name":758,"url":759},"Batch processing","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBatch_processing",{"name":761,"url":762},"JSON Lines","https:\u002F\u002Fjsonlines.org\u002F",{"name":764,"url":765},"Large language model","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLarge_language_model",[767,770,772,773,776,779,781,784],{"title":768,"url":769},"Claude Platform Docs: Batch processing","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fbatch-processing",{"title":771,"url":645},"Claude Platform Docs: Rate limits (Message Batches API)",{"title":729,"url":730},{"title":774,"url":775},"OpenAI API Docs: Batch API","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fbatch",{"title":777,"url":778},"OpenAI API Docs: Flex processing","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fflex-processing",{"title":780,"url":651},"OpenAI API Docs: Rate limits (batch queue limits)",{"title":782,"url":783},"Google AI for Developers: Gemini Batch API","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fbatch-api",{"title":785,"url":786},"Amazon Bedrock User Guide: Batch inference","https:\u002F\u002Fdocs.aws.amazon.com\u002Fbedrock\u002Flatest\u002Fuserguide\u002Fbatch-inference.html","\u002Fimages\u002Fblog\u002Fllm-batch-api-offline-workloads\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-batch-api-offline-workloads\u002Fog.jpg",[115,116,117],"LLM-Batch-APIs: Inferenz zum halben Preis für Arbeit, die warten kann","Wann sich die Batch-APIs von Anthropic, OpenAI und Gemini lohnen, wie Limits, Zuordnung und Fehler funktionieren und wie sich Rabatte mit Caching addieren.","Eine breite Kiste mit acht kleinen Quadraten, Zulauf von links, ein langer Pfeil kehrt zurück.",1792261157287]