Problemas que cada ferramenta resolve
O structured output requer resolver três problemas interdependentes: definição de esquema, conformidade na API e validação. Diferentes ferramentas atacam esses problemas de formas diferentes. Instructor gerencia os três em Python com tentativas. Outlines elimina a etapa de validação via constrained decoding. Pydantic AI adiciona type safety para agentes. LangChain envolve as APIs do fornecedor. Marvin prioriza a velocidade do desenvolvedor. PromptQuorum valida a consistência entre todos os modelos.
| Problema | Instructor | Outlines | Pydantic AI | LangChain | Marvin |
|---|---|---|---|---|---|
| Definir esquema | Modelos Pydantic | JSON Schema / GBNF | Modelos Pydantic | Definições de ferramenta | Decoradores Python |
| Forçar na chamada API | Tentativa + validação | Restrição em nível de token | API + validação | Modo JSON do fornecedor | Injeção de prompt |
| Validar resposta | Automático | Garantido na geração | Verificado por tipo | Manual | Automático |
Instructor: extração Pydantic
Instructor é a biblioteca de structured output mais adotada. Envolve qualquer API LLM — OpenAI GPT-4.5, Claude 4.8, Gemini, Ollama, vLLM — e retorna modelos Pydantic validados em vez de texto simples. Instructor gerencia tentativas automaticamente quando a validação falha, tornando-o adequado para produção sem tratamento adicional de erros.
- Compatível com 20+ provedores LLM (OpenAI, Anthropic, Google, modelos locais via Ollama/vLLM)
- Esquemas Pydantic v2: type hints, regras de validação, descrições de docstring integradas no esquema
- Tentativa automática com backoff em falha de validação — sem necessidade de tratamento manual de erros
- Funciona em Python e TypeScript (via adaptador Node.js)
- Open-source Apache 2.0, mantido ativamente
- Preços: Gratuito (sem custo adicional além das chamadas à API LLM)
import instructor
from pydantic import BaseModel
from openai import OpenAI
class User(BaseModel):
name: str
age: int
client = instructor.from_openai(OpenAI())
user = client.chat.completions.create(
model="gpt-4o",
response_model=User,
messages=[{"role": "user", "content": "Extract: John is 25 years old"}]
)
# user.name == "John", user.age == 25Outlines: constrained decoding
Outlines força a conformidade do esquema no momento da geração de tokens via constrained decoding. Em vez de gerar tokens e depois validar, Outlines limita os tokens válidos em cada etapa para corresponder ao seu esquema. Isso garante 100% de conformidade do esquema com risco zero de alucinações, tornando-o ideal para modelos locais.
- Funciona com llama.cpp, vLLM, transformers, NVIDIA NIM e qualquer modelo HuggingFace
- Definições de esquema em formato JSON Schema ou GBNF (GGML BNF)
- Conformidade do esquema garantida — sem necessidade de validação pós-geração ou tentativas
- Mais rápido que validação baseada em tentativas (menos tokens desperdiçados)
- Gratuito e open-source (Apache 2.0)
- Ideal para implantação local e fluxos de trabalho sensíveis ao custo
Pydantic AI: agentes type-safe
Pydantic AI é um framework novo (2025) que combina modelos Pydantic com suporte de primeira classe para conversas de agentes multi-turn. Ele adiciona type safety completo a loops de agentes enquanto força structured output em cada turno. Projetado para fluxos de trabalho Python async.
- Sistema de tipos Pydantic v2 — suporte completo de IDE e verificação de tipos
- Structured output integrado em cada etapa do agente
- Design async-first para aplicações de alto desempenho
- Suporta OpenAI GPT, Anthropic Claude, Google Gemini e modelos locais via Ollama
- Chamadas de ferramentas integradas — defina ferramentas como funções Python com type hints
- Gratuito (sem custo adicional além das chamadas à API LLM)
LangChain: APIs unificadas
LangChain 0.1+ adicionou with_structured_output() a todos os principais modelos de chat. Isso unifica o structured output no OpenAI, Anthropic, Google e modelos locais por trás de uma única API. Se sua equipe já usa chains ou agentes LangChain, este é o caminho mais fácil para o structured output.
- API unificada: um método .with_structured_output() funciona em todos os provedores
- Converte automaticamente as definições de ferramentas do LangChain para formatos de esquema específicos do fornecedor
- Integra-se perfeitamente com chains, agentes e fluxos de trabalho executáveis
- Suporta modelos Pydantic, TypedDict e definições de esquema OpenAI
- Parte do ecossistema LangChain (sem dependências adicionais)
- Ideal para equipes já investidas em LangChain
Marvin: extração baseada em decoradores
Marvin usa decoradores Python para converter assinaturas de funções em chamadas LLM com tipos. Você define uma assinatura de função com type hints, decora com @marvin.fn e o Marvin gerencia automaticamente a geração de prompts e a validação do structured output. O caminho mais rápido da ideia ao código funcional.
- Sintaxe de decorador: @marvin.fn converte assinaturas Python em prompts LLM
- Funciona com OpenAI, Anthropic, Google e modelos locais
- Os type hints são convertidos em esquema — mínimo de boilerplate
- Validação e tratamento de erros integrados
- Adequado para prototipagem e fluxos de trabalho pequenos a médios
- Gratuito (preços a confirmar em abril de 2026)
PromptQuorum: testes multi-modelo
PromptQuorum não é uma biblioteca de structured output em si, mas uma plataforma de testes para validar a consistência do structured output entre modelos. Execute o mesmo prompt simultaneamente contra GPT-4.5, Claude 4.8 Opus, Gemini 3.1 Pro e 20+ modelos mais. Meça a conformidade do esquema, a latência e o custo por modelo.
- Despacho multi-modelo em uma única chamada de API — teste um prompt contra 25+ modelos
- Métricas de conformidade de structured output — taxa de aprovação, latência, custo por modelo
- Identifica modelos que alucinam com seu esquema — evite implantar em modelos pouco confiáveis
- Modo de consenso — encontre acordos entre execuções de modelos independentes
- Funciona com Instructor, Outlines, Pydantic AI, LangChain ou APIs LLM brutas
- Tier gratuito disponível, preços enterprise para testes de alto volume
Comparativo lado a lado
| Ferramenta | Ideal para | Formato de esquema | Linguagem | Modelos locais | Preço | Curva de aprendizado |
|---|---|---|---|---|---|---|
| Instructor | APIs Python + tentativas | Modelos Pydantic | Python/TypeScript | Sim (Ollama) | Gratuito | Baixa |
| Outlines | Implantação de modelos locais | JSON Schema/GBNF | Python | Sim (nativo) | Gratuito | Média |
| Pydantic AI | Agentes type-safe | Modelos Pydantic | Python | Sim (Ollama) | Gratuito | Baixa |
| LangChain | Chains + agentes | Definições de ferramenta | Python/JS | Sim | Gratuito | Média |
| Marvin | Prototipagem rápida | Type hints | Python | Sim | Gratuito | Muito baixa |
| PromptQuorum | Testes multi-modelo | API-agnóstico | API-first | Via proxy OpenAI | Gratuito + enterprise | Baixa |
Escolhendo a ferramenta certa
Comece respondendo três perguntas: (1) Você já usa LangChain? (2) Você precisa de suporte a modelos locais? (3) Qual é a complexidade de validação que você tem?
- Use Instructor se: você constrói APIs Python e precisa de tentativas automáticas em falha de validação. Melhor opção de uso geral.
- Use Outlines se: você implanta modelos locais (llama.cpp, vLLM) e quer conformidade garantida do esquema no momento da geração.
- Use Pydantic AI se: você constrói fluxos de trabalho de agentes multi-turn com type safety em todas as etapas.
- Use LangChain se: você já usa chains ou agentes LangChain — with_structured_output() é a adição mais simples.
- Use Marvin se: você quer prototipar rapidamente e não precisa de validação complexa — os decoradores são o caminho mais rápido.
- Use PromptQuorum se: você precisa testar a consistência do structured output no GPT, Claude e Gemini antes da produção.
Adicionando structured output passo a passo
- 1Defina seu esquema de saída — Crie um modelo Pydantic (Python), interface TypeScript ou JSON Schema descrevendo os campos, tipos e restrições que você quer que o LLM retorne.
- 2Escolha uma biblioteca — Instructor para APIs Python, Outlines para modelos locais, Pydantic AI para agentes, LangChain se já estiver em uso, Marvin para rapidez.
- 3Instale e envolva sua chamada LLM — `pip install instructor` (Python), depois passe seu esquema para a chamada de API. Instructor gerencia validação e tentativas.
- 4Teste com PromptQuorum — Implante no PromptQuorum e execute seu prompt contra GPT, Claude e Gemini. Meça a conformidade do esquema por modelo.
- 5Refine o esquema conforme falhas — Se um modelo falha na validação, adicione exemplos ao seu prompt ou ajuste as restrições do esquema. Itere até que todos os modelos passem.
Erros comuns de structured output
❌ Usar o modo JSON sem validação
Why it hurts: O modo JSON da API (response_format da OpenAI, controle JSON da Anthropic) apenas sugere estrutura JSON — NÃO garante que seu esquema seja respeitado. Os modelos ainda alucinam nomes de campos e tipos.
Fix: Sempre adicione validação por cima: use Instructor, Outlines ou Pydantic AI. Nunca confie apenas no modo JSON. Teste com PromptQuorum para detectar falhas de conformidade.
❌ Projetar esquemas muito rígidos
Why it hurts: Esquemas muito restritos (listas de enum pequenas, padrões regex muito específicos) fazem os LLMs falharem na validação com frequência. Altas contagens de tentativas desperdiçam tokens e dinheiro.
Fix: Use PromptQuorum para testar a rigidez do esquema entre modelos. Relaxe as restrições para alcançar 95%+ de conformidade. Use campos opcionais em vez de obrigatórios quando possível.
❌ Não testar diferenças entre modelos locais e de API
Why it hurts: Outlines no llama.cpp se comporta de forma diferente do Instructor no GPT-4.5. As taxas de conformidade do esquema diferem por modelo. Construir apenas para GPT e depois implantar localmente causa falhas em produção.
Fix: Teste todos os backends de modelos previstos cedo. Use PromptQuorum para executar o mesmo prompt em modelos locais (vLLM), API (OpenAI, Anthropic) e open-source (Gemini).
❌ Ignorar o impacto na latência e custo de tokens
Why it hurts: O structured output com tentativas custa mais tokens. Instructor tenta novamente em caso de falha. O constrained decoding do Outlines é mais lento que a geração livre. Não medir o custo por modelo.
Fix: Use o rastreamento de custos do PromptQuorum. Compare latência entre modelos. Para fluxos de trabalho sensíveis ao orçamento, prefira Outlines (sem tentativas). Para precisão, aceite o custo de tentativas do Instructor.
❌ Misturar métodos de validação (sem consistência)
Why it hurts: Algumas requisições usam Instructor, outras parsing JSON bruto. Alguns modelos validados, outros não. Isso leva a erros inconsistentes em produção.
Fix: Padronize em uma abordagem de validação por base de código. Todas as requisições usam Instructor, ou todas usam Outlines. A consistência reduz o tempo de depuração em 10x.
Leitura relacionada
- Structured Output e JSON Mode — Como o modo JSON funciona nas APIs da OpenAI, Anthropic e Google; quando usar conformidade de formato vs validação de esquema.
- Prompt Injection e segurança — Riscos ao aceitar entrada de usuário em prompts estruturados; estratégias de sanitização.
- Como avaliar a qualidade de prompts — Meça precisão, consistência e seguimento de instruções em seus esquemas de structured output.
- Como testar prompts entre modelos — Execute o mesmo conjunto de testes no GPT, Claude e Gemini; compare taxas de aprovação.
- Prompt Engineering vs Fine-Tuning — Quando o prompting estruturado é suficiente vs quando você precisa de fine-tuning do modelo.
- Configuração de prompt engineering para equipes pequenas — Construir fluxos de trabalho com saída de dados estruturada para equipes de 2–15.
O que é structured output em LLMs?
O structured output restringe as respostas do LLM a um esquema específico — formato JSON, campos definidos, restrições de tipo. Em vez de respostas em texto livre, o structured output retorna dados que seu código pode analisar e validar diretamente sem tratamento de erros.
Qual ferramenta é melhor para desenvolvedores Python?
Instructor é a opção Python mais popular. Usa modelos Pydantic para definir esquemas, gerencia automaticamente tentativas e validação, e suporta qualquer API LLM (OpenAI, Anthropic, Google, Ollama). Pydantic AI é uma alternativa se você também quiser conversas multi-turn type-safe com agentes.
Posso usar structured output com modelos locais como Llama?
Sim. Outlines se especializa em constrained decoding para modelos locais — funciona com llama.cpp, vLLM e bibliotecas transformers. Outlines garante conformidade do esquema no momento da geração de tokens com risco zero de alucinações. Instructor também suporta Ollama se você o executar como API.
Qual é a diferença entre Instructor e Marvin?
Instructor usa modelos Pydantic para definir esquemas e gerencia a extração com recuperação de erros. Marvin usa decoradores Python — você decora uma assinatura de função e o Marvin auto-gera o prompt LLM. Instructor é mais explícito (melhor para validações complexas), Marvin é mais conciso (melhor para prototipagem rápida).
LangChain suporta structured output?
Sim. LangChain 0.1+ inclui o método with_structured_output() no ChatOpenAI, ChatAnthropic, ChatGoogle, etc. Converte automaticamente ferramentas do LangChain para esquemas de structured output. Use-o se já utiliza agentes LangChain e quer adicionar conformidade do esquema sem mudar de biblioteca.
Como testo se o structured output é confiável?
Use PromptQuorum para executar o mesmo prompt em múltiplos modelos e medir a conformidade do esquema. Diferentes modelos (GPT-4.5, Claude 4.8, Gemini 3.1) têm diferentes níveis de confiabilidade de structured output. Teste antes de implantar em produção.
O que significa "constrained decoding"?
O constrained decoding limita a geração de tokens a apenas valores válidos segundo seu esquema. Outlines faz isso calculando o conjunto de próximos tokens válidos em cada etapa. Isso garante conformidade do esquema sem validação pós-geração ou tentativas, tornando-o mais rápido e confiável que o modo JSON em nível de API.
Posso usar structured output sem nenhuma biblioteca?
Tecnicamente sim — você pode fazer o modelo retornar JSON e depois analisá-lo você mesmo. Mas a validação falhará em alucinações. As seis ferramentas resolvem isso validando com tentativas (Instructor, Marvin), forçando no tempo de decodificação (Outlines) ou envolvendo APIs do fornecedor (LangChain, Pydantic AI).
Qual ferramenta tem a melhor documentação?
LangChain e Pydantic AI têm a documentação mais completa devido ao seu suporte corporativo. Instructor tem excelentes tutoriais e exemplos apesar de ser mantido pela comunidade. A documentação do Outlines é técnica mas abrangente. Marvin tem guias de início rápido.
Preciso das seis ferramentas ou apenas de uma?
Comece com uma. Desenvolvedores Python devem experimentar Instructor ou Pydantic AI. Equipes com modelos locais devem experimentar Outlines. Usuários do LangChain devem experimentar with_structured_output() do LangChain. Use PromptQuorum para validar a consistência entre todos os modelos. A maioria das equipes usa uma ferramenta + PromptQuorum para testes.
Fontes
- Repositório GitHub do Instructor — Repositório oficial e docs para a biblioteca Instructor
- Documentação do Outlines — Constrained decoding para conformidade garantizada do esquema
- Pydantic AI — Framework de agentes type-safe com structured output
- with_structured_output() do LangChain — API unificada de structured output do LangChain
- Documentação do Marvin — Framework de extração LLM baseado em decoradores