Compiler et optimiser les prompts
Mettez en pratique BootstrapFewShot, MIPRO et d’autres optimiseurs DSPy.
Compiler et optimiser les prompts est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.
Ce que signifie l'optimisation dans DSPy
L'optimisation de DSPy (appelée compilation) trouve la meilleure configuration d'invite pour votre programme à partir d'un ensemble d'entraînement et d'une métrique. L'optimiseur recherche parmi différentes possibilités d'exemples en petit nombre, d'instructions et de démonstrations de raisonnement.
Vous exécutez la compilation une seule fois, vous enregistrez le résultat, puis vous déployez le programme optimisé. Au moment de l'inférence, il ne s'agit plus que d'appels rapides à un LLM : il n'y a plus de coût d'optimisation.
Définir une fonction métrique
Chaque optimiseur DSPy a besoin d'une fonction métrique qui évalue une prédiction à partir de la sortie attendue. Elle renvoie un nombre (ou une valeur booléenne) : plus il est élevé, mieux c'est.
La métrique est le signal que l'optimiseur utilise pour déterminer si une configuration d'invite est bonne.
# 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)Préparer un ensemble d'entraînement
DSPy a besoin d'un ensemble d'entraînement composé d'objets dspy.Example. Chaque exemple indique les entrées et la sortie attendue. Même 20 à 50 exemples suffisent souvent pour BootstrapFewShot.
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)L'optimiseur BootstrapFewShot
BootstrapFewShot est l'optimiseur DSPy le plus courant. Il exécute votre programme sur l'ensemble d'entraînement, recueille les traces réussies (les paires entrée-sortie pour lesquelles la métrique est satisfaite), puis utilise ces traces comme démonstrations avec quelques exemples dans l'invite compilée.
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')L'optimiseur MIPRO
MIPRO (proposition et optimisation d'instructions multi-invites) est un optimiseur plus puissant. Il ne se contente pas de sélectionner des exemples en petit nombre : il recherche également un meilleur texte d'instruction à inclure dans l'invite.
MIPRO nécessite davantage d'appels à des LLM pendant la compilation, mais atteint souvent une exactitude nettement supérieure.
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')À quoi ressemble une invite compilée
Après la compilation, DSPy intègre des démonstrations optimisées avec quelques exemples dans l'invite. Vous pouvez l'examiner en inspectant les prédicteurs du programme compilé.
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')L'interface teleprompter.compile()
Tous les optimiseurs DSPy partagent la même interface compile(). Cette cohérence signifie que vous pouvez remplacer un optimiseur sans modifier le code de votre programme.
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 étend BootstrapFewShot en générant plusieurs ensembles candidats de démonstrations, puis en sélectionnant celui qui obtient les meilleurs résultats sur un ensemble de validation.
C'est un bon compromis entre la simplicité de BootstrapFewShot et la puissance de 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')Considérations relatives au coût de compilation
La compilation effectue des appels supplémentaires à des LLM pour générer et évaluer des invites candidates. Prévoyez le budget en conséquence :
- BootstrapFewShot : environ 1 à 2 fois la taille de votre ensemble d'entraînement en appels à des LLM
- RandomSearch avec 8 candidats : environ 8 à 10 fois
- MIPRO moyen : environ 30 à 50 fois
Exécutez la compilation hors ligne, enregistrez le résultat, puis déployez le programme enregistré. Le coût de votre inférence en production reste inchangé.
Valider le programme compilé
Après la compilation, évaluez toujours le programme sur un ensemble de vérification mis de côté afin de confirmer que le programme optimisé se généralise réellement. Ne vérifiez pas uniquement ses performances sur l'ensemble d'entraînement.
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%}')Tout mettre en place
Flux de travail complet d'optimisation avec DSPy : définir la signature → créer le module → préparer les données d'entraînement → choisir l'optimiseur → compiler → évaluer → enregistrer. Il s'agit du cycle complet, de l'idée à une chaîne de traitement d'invites optimisée et prête pour la production.
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')Vérification des connaissances : BootstrapFewShot
Qu'utilise BootstrapFewShot dans votre ensemble d'entraînement pour améliorer l'invite compilée ?
Récapitulatif : compiler et optimiser
L'optimisation DSPy recherche la meilleure configuration d'invite à l'aide d'une fonction métrique et d'un ensemble d'entraînement. BootstrapFewShot trouve de bonnes démonstrations avec quelques exemples à partir de traces réussies. MIPROv2 recherche en outre un meilleur texte d'instruction. Tous les optimiseurs partagent une interface compile(program, trainset=...). La compilation est un coût hors ligne unique : enregistrez le résultat avec program.save(), puis déployez le programme optimisé sans coût supplémentaire au moment de l'inférence.
Questions Fréquemment Posées
La leçon « Compiler et optimiser les prompts » est-elle gratuite ?
Oui — le texte complet de « Compiler et optimiser les prompts » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Compiler et optimiser les prompts » ?
Mettez en pratique BootstrapFewShot, MIPRO et d’autres optimiseurs DSPy. Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?
Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Compiler et optimiser les prompts » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?
Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Introduction au framework DSPy
- Définir des signatures et des modules
- Compiler et optimiser les prompts
- Évaluer les pipelines DSPy