¿Tu IA falla? Cómo usar dspy en python y ajustar prompts
Aprende cómo usar dspy en python para reemplazar la ingeniería manual de prompts por programas declarativos y optimizadores automáticos en 2026.
Si alguna vez pasaste horas ajustando adjetivos en un prompt del sistema solo para ver cómo tu aplicación fallaba tras una actualización del modelo, sabes que la ingeniería de prompts tradicional no escala en producción. Tratar los modelos de lenguaje como cajas negras que requieren ajustes artesanales de texto introduce fragilidad e impide un versionado serio de software. Entender cómo usar dspy en python resuelve este cuello de botella al transformar el desarrollo orientado a LLMs en una disciplina de programación declarativa, donde el código define la estructura de la tarea y los algoritmos de optimización compilan las mejores instrucciones de forma automática.
En este artículo práctico, dejaremos atrás los trucos caseros con cadenas formateadas y construiremos un pipeline robusto utilizando DSPy en Python 3.14.8. Verás cómo definir firmas tipadas, encadenar módulos de razonamiento, optimizar prompts con conjuntos de datos de entrenamiento e implementar programas de inteligencia artificial reproducibles en producción.
¿Qué es DSPy y por qué colapsó la ingeniería de prompts manual?
DSPy (Declarative Self-improving Python), desarrollado por el grupo de NLP de la Universidad de Stanford, cambia fundamentalmente la forma en que interactuamos con los modelos de lenguaje. En lugar de escribir textos gigantescos repletos de ejemplos manuales (few-shot prompting) dentro del código, el desarrollador expresa el comportamiento deseado mediante firmas declarativas y módulos reutilizables.
La ingeniería de prompts manual colapsó porque es extremadamente sensible a variaciones pequeñas. Cuando OpenAI o Anthropic actualizan sus modelos, un prompt perfectamente ajustado puede empezar a generar JSONs inválidos o alucinaciones de parámetros. Además, cuando la complejidad del pipeline crece —integrando búsqueda vectorial (RAG), validación de esquemas y herramientas externas—, gestionar dependencias entre docenas de textos se vuelve insostenible.
DSPy introduce el concepto de compilación de prompts. De la misma forma en que un compilador de C transforma código de alto nivel en instrucciones de máquina optimizadas para un procesador específico, el optimizador de DSPy toma tus firmas en Python, ejecuta evaluaciones contra un conjunto de datos y compila el prompt final ideal para el modelo seleccionado (ya sea un modelo propietario vía API o una instancia local ejecutando vLLM).
¿Cómo usar dspy en python para estructurar y optimizar llamadas de IA?

Para comprender cómo usar dspy en python en tu proyecto, el primer paso es configurar el entorno y conectar el framework al proveedor de modelo que elijas. DSPy utiliza LiteLLM internamente para estandarizar la comunicación con cientos de proveedores de inferencia.
Comienza instalando la biblioteca oficial en tu entorno virtual:
pip install dspy
Tras la instalación, configuramos el modelo global utilizando la clase dspy.LM. Puedes pasar tanto modelos de APIs comerciales como endpoints locales compatibles con la API de OpenAI:
import dspy
# Configuración del modelo de lenguaje global
lm = dspy.LM('openai/gpt-4o-mini', api_key='sk-sua-chave-aqui')
dspy.configure(lm=lm)
# Prueba rápida de conectividad
resposta = lm('Explica qué es el tipado estático en una frase.')
print(resposta)
La gran ventaja de esta abstracción es la portabilidad. Si decides cambiar el modelo en la nube por un LLM local ejecutándose en tu propio servidor en 2026, solo necesitas modificar la cadena de inicialización de dspy.LM. Todo el resto de tu sistema, incluida la lógica de validación y extracción, permanecerá exactamente igual.
¿Cómo funcionan las Signatures y Modules en DSPy?
Los dos pilares fundamentales de DSPy son las Signatures (Firmas) y los Modules (Módulos). Una Signature define el contrato de entrada y salida de una tarea de IA, sin especificar cómo se debe formatear el prompt visualmente.
Puedes definir una Signature utilizando una sintaxis inline simplificada o heredando de dspy.Signature para agregar docstrings explicativos y tipos explícitos a través de Pydantic:
from pydantic import BaseModel, Field
# Definiendo el contrato de entrada y salida
class ClassificarBug(dspy.Signature):
"""Analiza un informe de error y extrae el componente afectado y la gravedad."""
relatorio_erro: str = dspy.InputField(desc="Descripción técnica del bug enviada por el usuario")
componente: str = dspy.OutputField(desc="Módulo del sistema afectado (ej: banco_dados, auth, interface)")
nivel_gravidade: str = dspy.OutputField(desc="Clasificación: ALTA, MEDIA o BAJA")
Con la Signature definida, instanciamos un Module. DSPy proporciona varios módulos preconstruidos que implementan estrategias conocidas de razonamiento:
dspy.Predict: Ejecuta una llamada directa basada en la firma.dspy.ChainOfThought: Fuerza al modelo a generar una etapa intermedia de razonamiento (rationale) antes de responder.dspy.ReAct: Capacita al modelo para utilizar herramientas externas en bucles de decisión.
Mira cómo utilizar el módulo ChainOfThought con nuestra firma personalizada:
# Instanciando el módulo de razonamiento en cadena
classificador = dspy.ChainOfThought(ClassificarBug)
# Ejecutando la inferencia
resultado = classificador(
relatorio_erro="Fallo de Timeout al intentar conectar a PostgreSQL 18.6 durante el pico de acceso."
)
print(f"Raciocínio: {resultado.rationale}")
print(f"Componente: {resultado.componente}")
print(f"Gravidade: {resultado.nivel_gravidade}")
DSPy genera automáticamente la plantilla del prompt con instrucciones claras de delimitación de campos, analiza la respuesta y devuelve un objeto tipado. Si deseas inspeccionar el prompt exacto enviado al modelo, solo debes llamar a dspy.inspect_history(n=1).
¿Cómo compilar programas con optimizadores MIPROv2 y BootstrapFewShot?
La verdadera magia de DSPy ocurre cuando dejamos de ejecutar llamadas aisladas y pasamos a compilar nuestros programas. La compilación es el proceso mediante el cual un algoritmo de optimización (denominado Teleprompter u Optimizer) evalúa tu programa con respecto a un conjunto pequeño de datos de entrenamiento y selecciona automáticamente las mejores instrucciones y ejemplos few-shot.
Para compilar un programa, necesitamos tres componentes:
- El programa DSPy (compuesto por uno o más módulos).
- Una métrica de evaluación (una función en Python que devuelve
True/Falseo un puntaje numérico). - Un conjunto de ejemplos de entrenamiento (
dspy.Example).
Vamos a construir un optimizador completo utilizando MIPROv2 (Multistage Instruction Proposal and Optimization), uno de los optimizadores más avanzados disponibles en el framework en 2026:
# 1. Definiendo el conjunto de datos de entrenamiento
treino = [
dspy.Example(relatorio_erro="NullPointer al autenticar token JWT expirado", componente="auth", nivel_gravidade="MEDIA").with_inputs('relatorio_erro'),
dspy.Example(relatorio_erro="Fuga de memoria en el worker Celery consumiendo 16GB RAM", componente="infraestrutura", nivel_gravidade="ALTA").with_inputs('relatorio_erro'),
dspy.Example(relatorio_erro="Botón de guardar perfil con desalineación de 2px en CSS", componente="interface", nivel_gravidade="BAIXA").with_inputs('relatorio_erro'),
]
# 2. Definiendo la métrica de evaluación
def metrica_avaliacao(example, pred, trace=None):
componente_correto = example.componente.lower() == pred.componente.lower()
gravidade_correta = example.nivel_gravidade.upper() == pred.nivel_gravidade.upper()
return componente_correto and gravidade_correta
# 3. Configurando el optimizador MIPROv2
otimizador = dspy.MIPROv2(
metric=metrica_avaliacao,
auto="light" # Configuración para optimización rápida con pocas iteraciones
)
# 4. Compilando el programa
programa_compilado = otimizador.compile(
student=dspy.ChainOfThought(ClassificarBug),
trainset=treino,
max_bootstrapped_demos=2,
max_labeled_demos=2
)
# 5. Guardando el programa optimizado en disco
programa_compilado.save("classificador_bugs_otimizado.json")
Durante la ejecución de compile, MIPROv2 prueba diferentes variaciones de la instrucción del sistema y selecciona los mejores ejemplos del historial de ejecuciones exitosas. El resultado final es un archivo JSON ligero que contiene los prompts exactos que alcanzaron la puntuación más alta en la métrica estipulada.
Para cargar y ejecutar el programa en producción, no es necesario ejecutar el optimizador nuevamente. El proceso de carga es instantáneo:
programa_producao = dspy.ChainOfThought(ClassificarBug)
programa_producao.load("classificador_bugs_otimizado.json")
resultado_final = programa_producao(relatorio_erro="Error 500 al emitir factura electrónica vía webhook")
print(resultado_final.componente)
¿Cómo comparar DSPy con frameworks tradicionales de orquestación?
Una duda frecuente de arquitectura de software es entender dónde encaja DSPy frente a alternativas consolidadas como LangChain y Pydantic AI. La diferencia fundamental no está en las funcionalidades de conexión, sino en la filosofía de diseño.
Mientras que los frameworks tradicionales se enfocan en abstracciones para encadenar llamadas e integrar herramientas, DSPy se enfoca en la optimización matemática y algorítmica de las instrucciones enviadas al modelo.
| Criterio de comparación | DSPy | LangChain | Pydantic AI |
|---|---|---|---|
| Enfoque principal | Programación declarativa y compilación | Cadenas y ecosistema de integraciones | Validación de datos rigurosa en Python |
| Creación de prompts | Automática mediante algoritmos de búsqueda | Manual por interpolación de cadenas | Manual con Jinja / docstrings |
| Mantenibilidad | Alta: los cambios requieren recompilación | Media: prompts dispersos en el código | Alta: fuertemente integrado con Pydantic |
| Adaptación a nuevos modelos | Automática al recompilar con el dataset | Manual: reescribir prompts para cada LLM | Manual: ajustar prompts en el código |
| Curva de aprendizaje | Media (requiere cambio de mentalidad) | Baja inicial, alta complejidad a escala | Baja para quien ya domina Pydantic |
Ten en cuenta que DSPy no excluye el uso de bibliotecas de validación. De hecho, puedes utilizar esquemas de Pydantic directamente en las Signatures de DSPy para garantizar que los datos devueltos cumplan con restricciones estrictas de tipos.
¿Cómo monitorear e implementar programas DSPy en producción?

Implementar una aplicación construida con DSPy en un entorno de producción exige cuidados similares a los de cualquier microservicio crítico. Como el programa compilado se guarda como un artefacto estático (el archivo JSON con las instrucciones y demostraciones seleccionadas), debes tratar este archivo con el mismo rigor reservado para binarios o pesos de modelos.
Incorpora el archivo compilado en el control de versiones (Git) o almacénalo en un repositorio de artefactos durante el pipeline de CI/CD. Luego, expón la inferencia utilizando un framework asíncrono de alto rendimiento, como FastAPI o Litestar, ejecutando bajo Python 3.14.8:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import dspy
app = FastAPI(title="Servicio de Triaje de Bugs")
# Inicialización y carga en el startup del servicio
lm = dspy.LM('openai/gpt-4o-mini')
dspy.configure(lm=lm)
classificacao_app = dspy.ChainOfThought(ClassificarBug)
classificacao_app.load("classificador_bugs_otimizado.json")
class SolicitacaoBug(BaseModel):
relatorio: str
class RespostaBug(BaseModel):
componente: str
gravidade: str
raciocinio: str
@app.post("/triagem", response_model=RespostaBug)
async def triar_bug(payload: SolicitacaoBug):
try:
resposta = classificacao_app(relatorio_erro=payload.relatorio)
return RespostaBug(
componente=resposta.componente,
gravidade=resposta.nivel_gravidade,
raciocinio=resposta.rationale
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Para el monitoreo de costos y latencia, configura hooks de rastreo con herramientas de observabilidad abiertas, como OpenTelemetry. Como las llamadas de DSPy pasan por LiteLLM, es sencillo capturar métricas de consumo de tokens por petición, recuento de errores de validación y tiempo de respuesta hasta la primera palabra (TTFT).
Otra buena práctica es establecer un pipeline de recompilación periódica. Cada vez que el equipo de soporte recolecte nuevos datos reales de fallas corregidas, agrega esos ejemplos al dataset de validación y programa un trabajo asíncrono para recompilar el programa. De esta forma, tu sistema mejora continuamente a medida que el uso aumenta, sin que ningún desarrollador tenga que escribir una sola línea de prompt adicional.
Conclusión
La ingeniería artesanal de prompts tiene los días contados en el desarrollo de sistemas empresariales. A medida que las aplicaciones exigen mayor confiabilidad y respuestas estructuradas, depender de ajustes manuales de texto se convierte en un riesgo inaceptable de arquitectura. Dominar cómo usar dspy en python permite tratar las llamadas a LLMs como componentes de software tradicionales: compuestos por interfaces bien definidas, evaluables con métricas objetivas y compilables de manera automatizada.
Al adoptar Signatures, Modules y optimizadores en tus proyectos, construirás pipelines que evolucionan junto con los modelos de lenguaje, garantizando previsibilidad, trazabilidad y un alto rendimiento en producción.