📊 Cap 12: Structured Outputs & Pydantic
AI Engineering • Determinismo e Tipagem Estrita em LLMs
🗺️ O Desafio da Saída Livre vs Amostragem com Gramática Restrita
flowchart TD
subgraph FREE ["Geração em Linguagem Livre (Risco de Quebra)"]
F1["LLM responde: 'Aqui está seu JSON: ```json { 'nome': 'Carlos', } ```'\n(Aspas simples ilegais, trailing comma, Markdown em volta: CRASH no backend!) 🚨"]
end
subgraph STRICT ["Structured Outputs (Constrained Decoding)"]
S1["O motor de inferência MASCARA os logits inválidos!\n(100% garantido que o texto gerado respeita o JSON Schema da classe Pydantic!) ⚡"]
end
FREE -.-> |"Pydantic + Instructor"| STRICT
style FREE fill:#ffebee,stroke:#d32f2f,stroke-width:2px
style STRICT fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
🎯 Slide 1: Por Que Texto Livre é um Pesadelo para APIs?
-
Instruir o modelo com “Responda apenas em JSON” no prompt falha entre 2% a 10% das vezes em casos de borda.
- Problemas Comuns:
- Inclusão de blocos
jsondesnecessários. - Alucinação de nomes de propriedades que não existem no banco.
- Valores nulos onde o sistema exige inteiros positivos.
- Inclusão de blocos
🎯 Slide 2: Constrained Decoding (Amostragem por Gramática)
-
Motores modernos (OpenAI Structured Outputs, vLLM via Outlines, llama.cpp com BNF) alteram o cálculo de probabilidades:
- Se o próximo caractere permitido pelo JSON Schema for apenas um dígito ou aspas duplas, todos os outros tokens do vocabulário recebem probabilidade zero!
🎯 Slide 3: O Papel da Biblioteca Instructor
import instructor
from openai import OpenAI
client = instructor.from_openai(OpenAI())
# O retorno é DIRETAMENTE a instância da classe Pydantic:
usuario = client.chat.completions.create(
model="gpt-4o-mini",
response_model=UsuarioSchema,
messages=[{"role": "user", "content": "Cadastrar Ana, 28 anos, analista."}]
)
🔗 Navegação do Capítulo 12
| 📖 Ler Conteúdo Completo | 🧠 Fazer Quiz | 💻 Ver Exemplos | 🧩 Exercícios |
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim