Pedir JSON no prompt gera três problemas: prosa ao redor do objeto, aspas mal escapadas e valores de enum inventados. O parse quebra de madrugada e quem está de plantão descobre depois. Structured outputs resolvem na raiz: você restringe a geração token a token contra um JSON Schema.
Constrained decoding
O constrained decoding restringe a saída contra o schema no nível de cada token. OpenAI structured outputs e Anthropic tool use garantem validade sintática do primeiro ao último token. No open-source, Outlines e as grammars do llama.cpp compilam o schema em máscaras de token e fazem o mesmo na sua infraestrutura. OpenAI expõe via response_format com json_schema e strict: true; Anthropic força a forma combinando tool definitions com tool_choice.
Design de schema
- Estrutura rasa supera aninhamento profundo; cada nível extra aumenta a chance de confusão
- Enums substituem strings livres; modelo preenche campo ambíguo com valor plausível e errado
- Campos obrigatórios explícitos e
additionalProperties: false; modelos respeitam constraints melhor que instruções em texto
Validação semântica
Constrained decoding cobre a forma. Semântica fica por sua conta: data de checkout anterior à data de criação do pedido passa pelo schema e explode no relatório contábil. Intervalos de data coerentes, integridade referencial e regras de negócio ficam fora do decoding. Uma camada de validação com zod, pydantic ou JSON Schema validators pega o que escapou, e os erros alimentam o retry.
Retry com feedback
Falhou a validação? Reenvie o prompt com a mensagem de erro do validador e a saída rejeitada, para o modelo ver o que corrigir. Um retry resolve a maioria dos casos. Três falhas seguidas indicam prompt ou schema doente e merecem rota de fallback ou fila humana. Sem esse limite, o loop queima tokens em erro determinístico.
Versionamento
Adição de campos mantém compatibilidade retroativa: respostas em cache de semanas atrás validam contra o parser novo. Adicione campos no fim do objeto, marque como opcionais e promova a obrigatórios depois. Número de versão no envelope do payload ajuda a escalonar migração por coortes.
Testes de borda
Property-based tests geram prompts adversários que sondam limites: enums vazios, datas-limite, textos cheios de caracteres de escape. Encaixe-os na suíte de evals junto das métricas de qualidade. Regressão de formato é regressão.
Curtiu o conteúdo?
Construo produtos web e soluções com IA do jeito certo — arquitetura sólida, código sustentável e entrega real.
Vamos conversar