Marcio Cunha

IA gerando lixo? Como usar DSPy para otimizar prompts

Cansado de ajustar prompts manualmente e ver a IA errar? Descubra como o DSPy compila assinaturas e otimiza fluxos programaticamente para eliminar o lixo gerado por LLMs.

Marcio Cunha•4 min
Também disponível em:EnglishEspañol
Resumo
  • Ajustes manuais de prompts em linguagem natural falham porque modelos de linguagem mudam de comportamento com pequenas alterações textuais
  • O framework DSPy trata interações com inteligência artificial como programação estruturada em vez de tentativa e erro
  • Assinaturas tipadas separam a lógica do problema exato dos detalhes de formatação exigidos por cada modelo específico
  • Compiladores internos testam variações de texto e selecionam automaticamente as instruções mais eficientes para cada tarefa
  • Arquiteturas robustas combinam otimização programática com recuperação de contexto externo para eliminar erros estruturais

O problema invisível por trás dos prompts artesanais

Quem já passou horas ajustando uma frase, trocando uma vírgula ou adicionando exemplos aleatórios em uma caixa de texto sabe o quanto o desenvolvimento com inteligência artificial pode parecer tentativa e erro. Na prática, quando construímos sistemas usando modelos de linguagem grande (os chamados LLMs), dependemos de instruções escritas em linguagem natural que funcionam hoje, mas quebram amanhã se o provedor atualizar a versão do modelo subjacente. Esse ciclo vicioso de testes manuais gera frustração, desperdício de tempo e código instável.

Para piorar o cenário, à medida que os fluxos de trabalho crescem e envolvem múltiplas chamadas encadeadas, o custo de manutenção desses textos explode. Se você precisa alterar o comportamento de um agente conversacional em produção, mexer em um prompt central pode desalinhar outras três tarefas secundárias que dependiam daquele formato exato. É justamente para resolver essa fragilidade estrutural que surge a necessidade de tratar o design de prompts não como arte literária, mas como engenharia de software previsível e testável.

O que é o DSPy e por que ele muda o jogo

Criado por pesquisadores da Universidade Stanford, o DSPy (Declarative Self-improving Python) propõe uma mudança radical de paradigma: em vez de escrever prompts extensos repletos de truques textuais, você define assinaturas declarativas e deixa que o framework descubra o melhor texto de instrução para você. Na prática, o DSPy funciona como um compilador para inteligência artificial, onde você declara o que a entrada deve produzir como saída, e o sistema otimiza isso programaticamente com base em métricas de avaliação.

Isso significa que, em vez de adivinhar se a palavra "por favor" melhora a resposta do modelo, o compilador do DSPy executa dezenas de testes automáticos usando seus dados de validação para encontrar a combinação ideal de exemplos e instruções. Esse processo se assemelha muito à forma como um otimizador de banco de dados escolhe o melhor plano de execução para uma consulta SQL pesada, tirando o peso analítico dos ombros do desenvolvedor e garantindo maior resiliência sistêmica.

Como estruturar assinaturas e módulos no código

A unidade básica de construção no DSPy é a assinatura (Signature), que define de forma tipada quais são os campos de entrada e os campos de saída esperados de uma tarefa computacional. Para entender como isso se aplica na prática, podemos observar um exemplo em Python onde criamos um módulo simples para sumarizar documentos técnicos e extrair pontos-chave sem precisar escrever uma única linha de instruções textuais complexas.

import dspy

# Configura o modelo padrão a ser utilizado
llm = dspy.LM('openai/gpt-4o-mini')
dspy.configure(lm=llm)

# Define uma assinatura tipada para a tarefa
class ResumidorTecnico(dspy.Signature):
    """Resume um artigo técnico e extrai as três principais conclusões."""
    documento = dspy.InputField(desc="Texto completo do artigo")
    conclusoes = dspy.OutputField(desc="Lista com três conclusões principais")

# Cria o módulo funcional utilizando a assinatura
class ProcessadorArtigo(dspy.Module):
    def __init__(self):
        super().__init__()
        self.resumir = dspy.Predict(ResumidorTecnico)
        
    def forward(self, documento):
        return self.resumir(documento=documento)

No código acima, a classe ResumidorTecnico estabelece um contrato claro do que entra e do que sai, enquanto o módulo ProcessadorArtigo encapsula a execução. Se no futuro decidirmos migrar para outro provedor de IA ou para um modelo de código aberto rodando localmente, não precisaremos reescrever nenhum prompt espalhado pelo código; bastará alterar a configuração base, pois o DSPy ajustará dinamicamente a interface de comunicação.

O poder dos otimizadores e a compilação automática

A verdadeira mágica do ecossistema DSPy acontece quando utilizamos os otimizadores (anteriormente conhecidos como teleprompters). Otimizadores como o BootstrapFewShot analisam o seu conjunto de dados de treino e selecionam os melhores exemplos para injetar no contexto do modelo de forma dinâmica, garantindo que o LLM receba exatamente o suporte necessário para acertar a resposta sem gastar tokens desnecessários.

Na prática, isso significa que o seu sistema de inteligência artificial melhora de forma autônoma à medida que você alimenta o pipeline com novos exemplos validados. Para garantir que essas saídas continuem confiáveis e livres de alucinações antes de chegarem ao usuário final, muitas equipes combinam essa compilação programática com mecanismos adicionais, conforme discutimos em estratégias para validar saídas de modelos com guardrails estruturados. Para complementar essa implementação em produção, vale conferir também nossas análises técnicas sobre Microservices travando? Como usar o padrão Saga Orquestrado e Conexões esgotadas no banco? Como usar PgBouncer no Node.js.

Considerações finais sobre a engenharia de prompts moderna

Abandonar a engenharia de prompts baseada em achismos e adotar uma abordagem declarativa com o DSPy representa um salto de maturidade para qualquer equipe que desenvolve aplicações baseadas em inteligência artificial. Deixamos de ser reféns de ajustes manuais instáveis e passamos a tratar os prompts como artefatos compiláveis, versionáveis e passíveis de testes automatizados rigorosos.

Investir tempo na estruturação de assinaturas e no uso de otimizadores programáticos reduz drasticamente o custo operacional e aumenta a previsibilidade dos sistemas em produção. À medida que os modelos continuam evoluindo, ferramentas que abstraem a complexidade textual e trazem rigor de engenharia tradicional para o ecossistema de LLMs deixarão de ser um diferencial e se tornarão o padrão de mercado.