Prompts kompilieren und optimieren
BootstrapFewShot, MIPRO und andere DSPy-Optimierer in der Praxis.
Prompts kompilieren und optimieren ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Prompt Engineering-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Was Optimierung in DSPy bedeutet
Die DSPy-Optimierung (auch Kompilierung genannt) ermittelt anhand eines Trainingsdatensatzes und einer Metrik die beste Prompt-Konfiguration für Ihr Programm. Der Optimierer sucht nach möglichen Few-Shot-Beispielen, Anweisungen und Reasoning-Demonstrationen.
Sie führen die Kompilierung einmal aus, speichern das Ergebnis und stellen das optimierte Programm bereit. Zur Inferenzzeit erfolgen lediglich schnelle LLM-Aufrufe — zusätzlicher Optimierungsaufwand fällt nicht mehr an.
Eine Metrikfunktion definieren
Jeder DSPy-Optimierer benötigt eine Metrikfunktion, die eine Vorhersage anhand der erwarteten Ausgabe bewertet. Sie gibt eine Zahl (oder einen booleschen Wert) zurück — je höher, desto besser.
Die Metrik ist das Signal, anhand dessen der Optimierer entscheidet, ob eine Prompt-Konfiguration gut ist.
# Metric: exact match on answer field
def exact_match_metric(example, prediction, trace=None):
"""
example: a training example with .answer
prediction: the module's output with .answer
Returns 1.0 if correct, 0.0 otherwise
"""
expected = example.answer.strip().lower()
predicted = prediction.answer.strip().lower()
return float(expected == predicted)
# Metric: F1 score for token overlap (common in QA)
def token_f1_metric(example, prediction, trace=None):
gold_tokens = set(example.answer.lower().split())
pred_tokens = set(prediction.answer.lower().split())
if not pred_tokens:
return 0.0
precision = len(gold_tokens & pred_tokens) / len(pred_tokens)
recall = len(gold_tokens & pred_tokens) / len(gold_tokens)
if precision + recall == 0:
return 0.0
return 2 * precision * recall / (precision + recall)Einen Trainingsdatensatz vorbereiten
DSPy benötigt einen Trainingsdatensatz aus dspy.Example-Objekten. Jedes Beispiel legt die Eingaben und die erwartete Ausgabe fest. Für BootstrapFewShot genügen häufig bereits 20–50 Beispiele.
import dspy
# Build training examples
trainset = [
dspy.Example(
question='What is the capital of Germany?',
answer='Berlin'
).with_inputs('question'),
dspy.Example(
question='Who wrote Romeo and Juliet?',
answer='William Shakespeare'
).with_inputs('question'),
dspy.Example(
question='What year did World War II end?',
answer='1945'
).with_inputs('question'),
# ... add more examples
]
print(f'Training set size: {len(trainset)} examples')
print(trainset[0].question, '->', trainset[0].answer)Der BootstrapFewShot-Optimierer
BootstrapFewShot ist der am häufigsten verwendete DSPy-Optimierer. Er führt Ihr Programm mit dem Trainingsdatensatz aus, sammelt erfolgreiche Traces (Ein-/Ausgabepaare, bei denen die Metrik erfüllt ist) und verwendet diese Traces als Few-Shot-Demonstrationen im kompilierten Prompt.
import dspy
from dspy.teleprompt import BootstrapFewShot
# Define your program
class QA(dspy.Signature):
"""Answer factual questions."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
program = dspy.ChainOfThought(QA)
# Set up the optimizer
optimizer = BootstrapFewShot(
metric=exact_match_metric,
max_bootstrapped_demos=4, # Up to 4 few-shot examples per predictor
max_labeled_demos=4, # Use labeled examples directly if available
)
# Compile!
compiled_program = optimizer.compile(program, trainset=trainset)
print('Compilation complete')Der MIPRO-Optimierer
MIPRO (Multi-prompt Instruction Proposal and Optimization) ist ein leistungsfähigerer Optimierer. Er wählt nicht nur Few-Shot-Beispiele aus, sondern sucht auch nach besseren Anweisungstexten, die in den Prompt aufgenommen werden.
MIPRO benötigt während der Kompilierung mehr LLM-Aufrufe, erreicht aber häufig eine deutlich höhere Genauigkeit.
import dspy
from dspy.teleprompt import MIPROv2
class QA(dspy.Signature):
"""Answer factual questions."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
program = dspy.ChainOfThought(QA)
# MIPRO: optimizes both instructions AND few-shot examples
optimizer = MIPROv2(
metric=exact_match_metric,
auto='medium', # 'light' / 'medium' / 'heavy' for optimization budget
num_threads=4, # Parallel evaluation threads
)
compiled_program = optimizer.compile(
program,
trainset=trainset,
num_trials=20, # Number of candidate prompts to evaluate
)
print('MIPRO compilation complete')So sieht ein kompilierter Prompt aus
Nach der Kompilierung bettet DSPy optimierte Few-Shot-Demonstrationen in den Prompt ein. Sie können dies überprüfen, indem Sie die Predictor-Komponenten des kompilierten Programms untersuchen.
import dspy
# After compiling, inspect the optimized state
compiled_program = dspy.ChainOfThought('question -> answer')
# (Assume this was returned by optimizer.compile(...))
# Inspect the demos that were found
for demo in compiled_program.demos:
print('Input:', demo.question)
print('Reasoning:', demo.get('reasoning', 'N/A'))
print('Answer:', demo.answer)
print('---')
# Save the compiled state
compiled_program.save('compiled_qa_program.json')
print('Saved compiled program')Die Schnittstelle teleprompter.compile()
Alle DSPy-Optimierer verwenden dieselbe compile()-Schnittstelle. Dank dieser Einheitlichkeit können Sie Optimierer austauschen, ohne Ihren Programmcode zu ändern.
from dspy.teleprompt import BootstrapFewShot, MIPROv2, COPRO
# All optimizers use the same interface:
# compiled = optimizer.compile(program, trainset=trainset)
# BootstrapFewShot: fast, uses successful traces as demos
opt1 = BootstrapFewShot(metric=exact_match_metric)
# MIPRO: slower, optimizes instructions too
opt2 = MIPROv2(metric=exact_match_metric, auto='light')
# COPRO: coordinate descent over instruction proposals
opt3 = COPRO(metric=exact_match_metric, depth=3)
# Swap between them with one line change:
compiled = opt1.compile(program, trainset=trainset)
# or: compiled = opt2.compile(program, trainset=trainset)BootstrapFewShotWithRandomSearch
BootstrapFewShotWithRandomSearch erweitert BootstrapFewShot, indem es viele Kandidatensätze von Demonstrationen erzeugt und den Satz auswählt, der auf einem Validierungsdatensatz die beste Leistung erzielt.
Es ist ein guter Mittelweg zwischen der Einfachheit von BootstrapFewShot und der Leistungsfähigkeit von MIPRO.
from dspy.teleprompt import BootstrapFewShotWithRandomSearch
# Split data into train and validation
trainset = examples[:40]
devset = examples[40:60]
optimizer = BootstrapFewShotWithRandomSearch(
metric=exact_match_metric,
max_bootstrapped_demos=4,
num_candidate_programs=8, # Try 8 different demo sets
num_threads=4,
)
compiled_program = optimizer.compile(
program,
trainset=trainset,
valset=devset, # Picks the best program based on validation
)
print('Best program selected from 8 candidates')Überlegungen zu den Kompilierungskosten
Bei der Kompilierung erfolgen zusätzliche LLM-Aufrufe, um Kandidaten-Prompts zu erzeugen und zu bewerten. Planen Sie entsprechend:
- BootstrapFewShot: etwa das 1- bis 2-Fache der Größe Ihres Trainingsdatensatzes an LLM-Aufrufen
- RandomSearch mit 8 Kandidaten: etwa das 8- bis 10-Fache
- MIPRO medium: etwa das 30- bis 50-Fache
Führen Sie die Kompilierung offline aus, speichern Sie das Ergebnis und stellen Sie das gespeicherte Programm bereit. Ihre produktiven Inferenzkosten bleiben unverändert.
Das kompilierte Programm validieren
Evaluieren Sie nach der Kompilierung immer einen zurückgehaltenen Testdatensatz, um zu bestätigen, dass das optimierte Programm tatsächlich generalisiert. Überprüfen Sie nicht nur die Leistung auf dem Trainingsdatensatz.
import dspy
# Evaluate on test set
evaluate = dspy.Evaluate(
devset=testset,
metric=exact_match_metric,
num_threads=4,
display_progress=True,
)
# Compare uncompiled vs compiled
uncompiled_score = evaluate(uncompiled_program)
compiled_score = evaluate(compiled_program)
print(f'Uncompiled accuracy: {uncompiled_score:.1%}')
print(f'Compiled accuracy: {compiled_score:.1%}')
print(f'Improvement: +{compiled_score - uncompiled_score:.1%}')Alles zusammenführen
Ein vollständiger DSPy-Optimierungsworkflow: Signatur definieren → Modul erstellen → Trainingsdaten vorbereiten → Optimierer auswählen → kompilieren → evaluieren → speichern. Dies ist der vollständige Weg von der Idee bis zu einer produktionsreifen, optimierten Prompt-Pipeline.
import dspy
from dspy.teleprompt import BootstrapFewShot
# 1. Configure LM
dspy.configure(lm=dspy.LM('openai/gpt-4o-mini', api_key='sk-...'))
# 2. Define signature and module
class QA(dspy.Signature):
"""Answer questions accurately."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
program = dspy.ChainOfThought(QA)
# 3. Compile
optimizer = BootstrapFewShot(metric=exact_match_metric)
compiled = optimizer.compile(program, trainset=trainset)
# 4. Save
compiled.save('production_qa.json')
print('Production program ready')Wissenscheck: BootstrapFewShot
Was verwendet BootstrapFewShot aus Ihrem Trainingsdatensatz, um den kompilierten Prompt zu verbessern?
Zusammenfassung: Kompilieren und Optimieren
Die DSPy-Optimierung sucht mithilfe einer Metrikfunktion und eines Trainingsdatensatzes nach der besten Prompt-Konfiguration. BootstrapFewShot findet anhand erfolgreicher Traces gute Few-Shot-Demonstrationen. MIPROv2 sucht zusätzlich nach besseren Anweisungstexten. Alle Optimierer verwenden eine gemeinsame compile(program, trainset=...)-Schnittstelle. Die Kompilierung ist ein einmaliger Offline-Aufwand — speichern Sie das Ergebnis mit program.save() und stellen Sie das optimierte Programm zur Inferenzzeit ohne zusätzliche Optimierungskosten bereit.
Häufig gestellte Fragen
Ist die Lektion „Prompts kompilieren und optimieren“ kostenlos?
Ja — der vollständige Text von „Prompts kompilieren und optimieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Prompt Engineering-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Prompts kompilieren und optimieren“?
BootstrapFewShot, MIPRO und andere DSPy-Optimierer in der Praxis. Du übst AI Prompt Engineering mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Prompt Engineering zu starten?
Keine Vorkenntnisse erforderlich. AI Prompt Engineering auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Prompts kompilieren und optimieren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Prompt Engineering-Lektion Code schreiben und ausführen?
Ja. Jede AI Prompt Engineering-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Einführung in das DSPy Framework
- Signaturen und Module definieren
- Prompts kompilieren und optimieren
- DSPy-Pipelines evaluieren