Compilación y optimización de prompts
BootstrapFewShot, MIPRO y otros optimizadores de DSPy en la práctica.
Compilación y optimización de prompts es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Prompt Engineering, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Prompt Engineering incluye 4 lecciones en total.
Qué significa optimizar en DSPy
La optimización de DSPy (denominada compilación) encuentra la mejor configuración de prompts para su programa a partir de un conjunto de entrenamiento y una métrica. El optimizador busca entre posibles ejemplos few-shot, instrucciones y demostraciones de razonamiento.
Ejecute la compilación una vez, guarde el resultado y ponga en producción el programa optimizado. En tiempo de inferencia solo se realizan llamadas rápidas al LLM: ya no hay sobrecarga de optimización.
Definir una función métrica
Todo optimizador de DSPy necesita una función métrica que puntúe una predicción a partir de la salida esperada. Devuelve un número (o un booleano): cuanto mayor, mejor.
La métrica es la señal que utiliza el optimizador para decidir si una configuración de prompt es buena.
# 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)Preparar un conjunto de entrenamiento
DSPy necesita un conjunto de entrenamiento de objetos dspy.Example. Cada ejemplo especifica las entradas y la salida esperada. Incluso 20-50 ejemplos suelen bastar para 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)Optimizador BootstrapFewShot
BootstrapFewShot es el optimizador de DSPy más habitual. Ejecuta el programa con el conjunto de entrenamiento, recopila trazas correctas (pares de entrada y salida en los que la métrica se cumple) y utiliza esas trazas como demostraciones few-shot en el prompt compilado.
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')Optimizador MIPRO
MIPRO (Multi-prompt Instruction Proposal and Optimization) es un optimizador más potente. No solo selecciona ejemplos few-shot, sino que también busca un texto de instrucciones mejor para incluirlo en el prompt.
MIPRO requiere más llamadas al LLM durante la compilación, pero a menudo logra una exactitud significativamente mayor.
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')Cómo es un prompt compilado
Después de la compilación, DSPy inserta demostraciones few-shot optimizadas en el prompt. Puede inspeccionarlo examinando los predictores del programa compilado.
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')Interfaz teleprompter.compile()
Todos los optimizadores de DSPy comparten la misma interfaz compile(). Esta coherencia permite cambiar de optimizador sin modificar el código del programa.
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 amplía BootstrapFewShot generando muchos conjuntos candidatos de demostraciones y seleccionando el que ofrece mejores resultados en un conjunto de validación.
Es un buen punto intermedio entre la sencillez de BootstrapFewShot y la potencia 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')Consideraciones sobre el coste de compilación
La compilación realiza llamadas adicionales al LLM para generar y evaluar prompts candidatos. Planifique el presupuesto en consecuencia:
- BootstrapFewShot: aproximadamente 1-2 veces el tamaño del conjunto de entrenamiento en llamadas al LLM
- RandomSearch con 8 candidatos: aproximadamente 8-10 veces
- MIPRO medium: aproximadamente 30-50 veces
Ejecute la compilación sin conexión, guarde el resultado y ponga en producción el programa guardado. El coste de inferencia en producción no cambia.
Validar el programa compilado
Después de la compilación, evalúe siempre el programa con un conjunto de prueba reservado para confirmar que el programa optimizado realmente se generaliza. No compruebe únicamente el rendimiento en el conjunto de entrenamiento.
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%}')Integrarlo todo
Un flujo de trabajo completo de optimización con DSPy: definir la firma → crear el módulo → preparar los datos de entrenamiento → elegir el optimizador → compilar → evaluar → guardar. Este es el ciclo completo, desde la idea hasta un pipeline de prompts optimizado y listo para producción.
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')Comprobación de conocimientos: BootstrapFewShot
¿Qué utiliza BootstrapFewShot de su conjunto de entrenamiento para mejorar el prompt compilado?
Recapitulación: compilación y optimización
La optimización de DSPy busca la mejor configuración de prompts mediante una función métrica y un conjunto de entrenamiento. BootstrapFewShot encuentra buenas demostraciones few-shot a partir de trazas correctas. MIPROv2 también busca un texto de instrucciones mejor. Todos los optimizadores comparten una interfaz compile(program, trainset=...). La compilación es un coste único que se asume sin conexión: guarde el resultado con program.save() y ponga en producción el programa optimizado sin sobrecoste de optimización durante la inferencia.
Aprende AI Prompt Engineering con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 53
- Lecciones
- 199
Preguntas frecuentes
¿La lección «Compilación y optimización de prompts» es gratis?
Sí — el texto completo de «Compilación y optimización de prompts» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Prompt Engineering, actualiza a CoddyKit PRO. El curso de AI Prompt Engineering incluye 4 lecciones en total.
¿Qué aprenderé en «Compilación y optimización de prompts»?
BootstrapFewShot, MIPRO y otros optimizadores de DSPy en la práctica. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Prompt Engineering?
No se requiere experiencia previa. AI Prompt Engineering en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Compilación y optimización de prompts»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Prompt Engineering?
Sí. Cada lección de AI Prompt Engineering incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Introducción al framework DSPy
- Definición de firmas y módulos
- Compilación y optimización de prompts
- Evaluación de pipelines de DSPy