Sua IA erra? Como usar dspy em python para corrigir prompts
Aprenda como usar dspy em python para substituir a engenharia manual de prompts por programas declarativos e otimizadores automáticos em 2026.
Se você já passou horas ajustando adjetivos em um prompt do sistema apenas para ver sua aplicação quebrar após uma atualização de modelo, sabe que a engenharia de prompts tradicional não escala em produção. Tratar modelos de linguagem como caixas pretas que exigem ajustes artesanais de texto introduz fragilidade e impede o versionamento sério de software. Entender como usar dspy em python resolve esse gargalo ao transformar o desenvolvimento orientado a LLMs em uma disciplina de programação declarativa, onde o código define a estrutura da tarefa e algoritmos de otimização compilam as melhores instruções automaticamente.
Neste artigo prático, vamos abandonar as gambiarras com strings formatadas e construir um pipeline robusto usando o DSPy em Python 3.14.8. Você verá como definir assinaturas tipadas, encadear módulos de raciocínio, otimizar prompts com datasets de treino e implantar programas de inteligência artificial reproduzíveis em produção.
O que é o DSPy e por que a engenharia de prompts manual ruiu?
O DSPy (Declarative Self-improving Python), desenvolvido pelo grupo de NLP da Universidade de Stanford, altera fundamentalmente a forma como interagimos com modelos de linguagem. Em vez de escrever textos gigantescos repletos de exemplos manuais (few-shot prompting) dentro do código, o desenvolvedor expressa o comportamento desejado por meio de assinaturas declarativas e módulos reutilizáveis.
A engenharia de prompts manual ruiu porque é extremamente sensível a variações pequenas. Quando a OpenAI ou a Anthropic atualizam seus modelos, um prompt perfeitamente ajustado pode passar a gerar JSONs inválidos ou alucinações de parâmetros. Além disso, quando a complexidade do pipeline cresce — integrando busca vetorial (RAG), validação de esquema e ferramentas externas —, gerenciar dependências entre dezenas de textos torna-se insustentável.
O DSPy introduz o conceito de compilação de prompts. Da mesma forma que um compilador C transforma código de alto nível em instruções de máquina otimizadas para um processador específico, o otimizador do DSPy pega suas assinaturas em Python, executa avaliações contra um conjunto de dados e compila o prompt final ideal para o modelo selecionado (seja ele um modelo proprietário via API ou uma instância local rodando vLLM).
Como usar dspy em python para estruturar e otimizar chamadas de IA?

Para entender como usar dspy em python no seu projeto, o primeiro passo é configurar o ambiente e conectar o framework ao provedor de modelo de sua escolha. O DSPy utiliza o LiteLLM sob o capô para padronizar a comunicação com centenas de provedores de inferência.
Comece instalando a biblioteca oficial no seu ambiente virtual:
pip install dspy
Após a instalação, configuramos o modelo global usando a classe dspy.LM. Você pode passar tanto modelos de APIs comerciais quanto endpoints locais compatíveis com a API do OpenAI:
import dspy
# Configuração do modelo de linguagem global
lm = dspy.LM('openai/gpt-4o-mini', api_key='sk-sua-chave-aqui')
dspy.configure(lm=lm)
# Teste rápido de conectividade
resposta = lm('Explique o que é tipagem estática em uma frase.')
print(resposta)
A grande vantagem dessa abstração é a portabilidade. Caso você decida trocar o modelo de nuvem por um LLM local executando em servidor próprio em 2026, basta alterar a string de inicialização do dspy.LM. Todo o restante do seu sistema, incluindo a lógica de validação e extração, permanecerá exatamente o mesmo.
Como funcionam as Signatures e Modules no DSPy?
Os dois pilares fundamentais do DSPy são as Signatures (Assinaturas) e os Modules (Módulos). Uma Signature define o contrato de entrada e saída de uma tarefa de IA, sem especificar como o prompt deve ser formatado visualmente.
Você pode definir uma Signature utilizando uma sintaxe inline simplificada ou herdando de dspy.Signature para adicionar docstrings explicativas e tipos explícitos através de Pydantic:
from pydantic import BaseModel, Field
# Definindo o contrato de entrada e saída
class ClassificarBug(dspy.Signature):
"""Analisa um relatório de erro e extrai o componente afetado e a gravidade."""
relatorio_erro: str = dspy.InputField(desc="Descrição técnica do bug enviada pelo usuário")
componente: str = dspy.OutputField(desc="Módulo do sistema afetado (ex: banco_dados, auth, interface)")
nivel_gravidade: str = dspy.OutputField(desc="Classificação: ALTA, MEDIA ou BAIXA")
Com a Signature definida, instanciamos um Module. O DSPy fornece vários módulos pré-construídos que implementam estratégias conhecidas de raciocínio:
dspy.Predict: Executa uma chamada direta baseada na assinatura.dspy.ChainOfThought: Força o modelo a gerar uma etapa intermediária de raciocínio (rationale) antes de responder.dspy.ReAct: Capacita o modelo a utilizar ferramentas externas em loops de decisão.
Veja como utilizar o módulo ChainOfThought com nossa assinatura personalizada:
# Instanciando o módulo de raciocínio encadeado
classificador = dspy.ChainOfThought(ClassificarBug)
# Executando a inferência
resultado = classificador(
relatorio_erro="Falha de Timeout ao tentar conectar no PostgreSQL 18.6 durante o pico de acesso."
)
print(f"Raciocínio: {resultado.rationale}")
print(f"Componente: {resultado.componente}")
print(f"Gravidade: {resultado.nivel_gravidade}")
O DSPy gera automaticamente o template do prompt com instruções claras de delimitação de campos, faz o parse da resposta e retorna um objeto tipado. Se você quiser inspecionar o prompt exato enviado ao modelo, basta chamar dspy.inspect_history(n=1).
Como compilar programas com otimizadores MIPROv2 e BootstrapFewShot?
A verdadeira mágica do DSPy acontece quando deixamos de executar chamadas isoladas e passamos a compilar nossos programas. A compilação é o processo pelo qual um algoritmo de otimização (denominado Teleprompter ou Optimizer) avalia seu programa em relação a um pequeno conjunto de dados de treino e escolhe automaticamente as melhores instruções e exemplos few-shot.
Para compilar um programa, precisamos de três componentes:
- O programa DSPy (composto por um ou mais módulos).
- Uma métrica de validação (uma função Python que retorna
True/Falseou uma nota numérica). - Um conjunto de exemplos de treino (
dspy.Example).
Vamos construir um otimizador completo usando o MIPROv2 (Multistage Instruction Proposal and Optimization), um dos otimizadores mais avançados disponíveis no framework em 2026:
# 1. Definindo o conjunto de dados de treino
treino = [
dspy.Example(relatorio_erro="NullPointer ao autenticar token JWT expirado", componente="auth", nivel_gravidade="MEDIA").with_inputs('relatorio_erro'),
dspy.Example(relatorio_erro="Vazamento de memória no worker Celery consumindo 16GB RAM", componente="infraestrutura", nivel_gravidade="ALTA").with_inputs('relatorio_erro'),
dspy.Example(relatorio_erro="Botão de salvar perfil com desalinhamento de 2px no CSS", componente="interface", nivel_gravidade="BAIXA").with_inputs('relatorio_erro'),
]
# 2. Definindo a métrica de avaliação
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 o otimizador MIPROv2
otimizador = dspy.MIPROv2(
metric=metrica_avaliacao,
auto="light" # Configuração para otimização rápida com poucas iterações
)
# 4. Compilando o programa
programa_compilado = otimizador.compile(
student=dspy.ChainOfThought(ClassificarBug),
trainset=treino,
max_bootstrapped_demos=2,
max_labeled_demos=2
)
# 5. Salvando o programa otimizado em disco
programa_compilado.save("classificador_bugs_otimizado.json")
Durante a execução do compile, o MIPROv2 testa diferentes variações da instrução do sistema e seleciona os melhores exemplos do histórico de execuções bem-sucedidas. O resultado final é um arquivo JSON leve contendo os prompts exatos que atingiram a maior pontuação na métrica estipulada.
Para carregar e executar o programa em produção, não é necessário rodar o otimizador novamente. O processo de carregamento é instantâneo:
programa_producao = dspy.ChainOfThought(ClassificarBug)
programa_producao.load("classificador_bugs_otimizado.json")
resultado_final = programa_producao(relatorio_erro="Erro 500 ao emitir nota fiscal via webhook")
print(resultado_final.componente)
Como comparar DSPy com frameworks tradicionais de orquestração?
Uma dúvida frequente de arquitetura de software é entender onde o DSPy se encaixa frente a alternativas consolidadas como LangChain e Pydantic AI. A diferença fundamental não está nas funcionalidades de conexão, mas na filosofia de design.
Enquanto frameworks tradicionais focam em abstrações para encadear chamadas e integrar ferramentas, o DSPy foca na otimização matemática e algorítmica das instruções enviadas ao modelo.
| Critério de Comparação | DSPy | LangChain | Pydantic AI |
|---|---|---|---|
| Abordagem Principal | Programação declarativa e compilação | Encadeamento e ecossistema de integrações | Validação de dados rigorosa em Python |
| Criação de Prompts | Automática via algoritmos de busca | Manual por interpolação de strings | Manual com Jinja / docstrings |
| Manutenibilidade | Alta: alterações requerem re-compilação | Média: prompts espalhados pelo código | Alta: fortemente integrado com Pydantic |
| Adaptação a Novos Modelos | Automática ao re-compilar contra o dataset | Manual: reescrever prompts para cada LLM | Manual: ajustar prompts no código |
| Curva de Aprendizado | Média (exige mudança de mentalidade) | Baixa inicial, alta complexidade em escala | Baixa para quem já domina Pydantic |
Note que o DSPy não exclui o uso de bibliotecas de validação. Na verdade, você pode utilizar esquemas do Pydantic diretamente nas Signatures do DSPy para garantir que os dados retornados obedeçam a restrições estritas de tipos.
Como monitorar e implantar programas DSPy em produção?

Implantar uma aplicação construída com DSPy em um ambiente de produção exige cuidados semelhantes aos de qualquer microsserviço crítico. Como o programa compilado é salvo como um artefato estático (o arquivo JSON com as instruções e demonstrações selecionadas), você deve tratar esse arquivo com o mesmo rigor reservado a binários ou pesos de modelos.
Incorpore o arquivo compilado no controle de versão (Git) ou armazene-o em um repositório de artefatos durante o pipeline de CI/CD. Em seguida, exponha a inferência utilizando um framework assíncrono de alto desempenho, como FastAPI ou Litestar, rodando sob Python 3.14.8:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import dspy
app = FastAPI(title="Serviço de Triagem de Bugs")
# Inicialização e carregamento no startup do serviço
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 o monitoramento de custos e latência, configure hooks de rastreamento com ferramentas de observabilidade abertas, como OpenTelemetry. Como as chamadas do DSPy passam pelo LiteLLM, é simples capturar métricas de consumo de tokens por requisição, contagem de erros de validação e tempo de resposta de primeira palavra (TTFT).
Outra boa prática é estabelecer um pipeline de re-compilação periódica. Sempre que a equipe de suporte coletar novos dados reais de falhas corrigidas, adicione esses exemplos ao dataset de validação e agende um job assíncrono para re-compilar o programa. Dessa forma, seu sistema melhora continuamente à medida que o uso aumenta, sem que nenhum desenvolvedor precise escrever uma única linha de prompt adicional.
Conclusão
A engenharia artesanal de prompts está com os dias contados no desenvolvimento de sistemas corporativos. À medida que as aplicações exigem maior confiabilidade e respostas estruturadas, depender de ajustes manuais de texto torna-se um risco inaceitável de arquitetura. Dominar como usar dspy em python permite tratar chamadas a LLMs como componentes de software tradicionais: compostos por interfaces bem definidas, testáveis com métricas objetivas e compiláveis de forma automatizada.
Ao adotar Signatures, Modules e Otimizadores em seus projetos, você constrói pipelines que evoluem junto com os modelos de linguagem, garantindo previsibilidade, rastreabilidade e alta performance em produção.