Extraia Dados Estruturados de LLMs: Tutorial Python com Pydantic e Instructor (GPT, Claude, Gemini)
Se você já usou um LLM em produção, sabe o drama: o modelo responde um JSON bonito por 3 dias, e no quarto dia resolve inventar uma chave nova, pular um campo obrigatório ou — a pior de todas — devolver texto puro dentro de um bloco que deveria ser JSON.
Esse problema tem nome: schema enforcement. E até 2025, cada time resolvia na gambiarra — regex, retry loops, validadores pós-processamento. Em 2026, a história mudou.
"Structured outputs have gone from a hack (regex parsing, retry loops) to a first-class feature across all major LLM providers." — TokenMix.ai, análise de 2 milhões de chamadas API
OpenAI, Anthropic e Google agora entregam garantia de schema no nível da API. Não é mais "tomara que venha certo" — é contrato. Cada um faz do seu jeito, claro. Este tutorial mostra os 4 caminhos para extrair dados estruturados em Python, do mais específico ao mais universal, com código que você pode copiar e adaptar hoje.
O Custo (Oculto) do JSON Solto
Antes de mergulhar no código, vale entender o tamanho do problema. Uma análise de 2 milhões de chamadas de API publicada pelo TokenMix.ai revelou que o JSON mode sem schema enforcement falha em 8 a 15% das requisições. Os motivos são variados: campo faltando, tipo errado, chave extra, ou simplesmente JSON inválido.
Cada falha dessas significa uma nova chamada de retry. E cada retry dobra a latência e queima tokens.
| Modo de saída | Taxa de falha | Custo extra por falha |
|---|---|---|
| JSON mode livre | 8–15% | Retry = 2× latência + tokens descartados |
| Structured output (OpenAI strict) | < 0,1% | 30–300 tokens de overhead por chamada |
| Tool use forçado (Anthropic) | ~0% no Carrick Benchmark (7/8 schemas) | Overhead do schema no tool definition |
| Response schema (Gemini) | 0% nos schemas aceitos | Validação pré-voo rejeita schemas inválidos |
A conclusão é direta: schema enforcement paga o próprio custo — 30 a 300 tokens de overhead por chamada, que é nada perto de uma taxa de retry de 10%. Como resumiu o TokenMix.ai:
"Schema enforcement is solved — pick OpenAI Structured Outputs, Anthropic tool use, or Gemini schema. Stop building retry logic for malformed JSON."
Vamos à implementação.
Opção 1: OpenAI Structured Outputs
A OpenAI foi a primeira a oferecer garantia formal de schema com o strict: true no modo response_format. Em 2026, o caminho recomendado é o método parse() do SDK — que já integra Pydantic nativamente.
from pydantic import BaseModel, Field
from openai import OpenAI
Define o schema com Pydantic — tipagem forte, sem surpresas
class TicketTriage(BaseModel): prioridade: str = Field(description="Alta, Media ou Baixa") departamento: str = Field(description="Suporte, Faturamento, Tecnico") resumo: str = Field(description="Resumo em 1 frase") precisa_escalacao: bool = Field(description="Precisa de humano?")
client = OpenAI()
O método parse() garante conformidade de schema
resposta = client.beta.chat.completions.parse( model="gpt-5.5", messages=[ {"role": "system", "content": "Classifique o ticket do cliente."}, {"role": "user", "content": "Meu cartao foi cobrado duas vezes esse mes"} ], response_format=TicketTriage, )
ticket: TicketTriage = resposta.choices[0].message.parsed print(f"Departamento: {ticket.departamento}, Prioridade: {ticket.prioridade}")
Prós: 99,9% de conformidade comprovada em testes com 500 mil chamadas (Fonte: TokenMix.ai). Integração nativa com Pydantic.
Contras: O strict mode da OpenAI rejeita 6 de 8 schemas no pré-voo por exigir additionalProperties: false, todos os campos como required, e não aceitar oneOf ou type: array em certos casos (Fonte: Carrick Benchmark, Maio/2026). Ou seja: schemas complexos podem ser barrados antes mesmo de chegar ao modelo.
Opção 2: Anthropic Tool Use Forçado
A Anthropic trata structured output como um "tool call forçado" — você define uma ferramenta com input_schema e obriga o modelo a usá-la com tool_choice: {type: "tool", name: "..."}.
from pydantic import BaseModel
from anthropic import Anthropic
class TicketTriage(BaseModel): prioridade: str departamento: str resumo: str precisa_escalacao: bool
client = Anthropic()
resposta = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, tools=[{ "name": "extrair_ticket", "description": "Classifica ticket de suporte", "input_schema": TicketTriage.model_json_schema() }], tool_choice={"type": "tool", "name": "extrair_ticket"}, messages=[ {"role": "user", "content": "Assinatura renovou mas nao consigo acessar"} ] )
Resposta vem como tool call — estrutura garantida
tool_call = resposta.content[0] ticket = TicketTriage.model_validate(tool_call.input)
A Anthropic se sai muito bem no Carrick Benchmark (Maio/2026): o Claude Sonnet 4.6 produz saída 100% conforme em 7 dos 8 schemas testados. O calcanhar de Aquiles? Schemas com aninhamento profundo (7 níveis), onde a conformidade cai a 0%.
Prós: Abordagem flexível, funciona com qualquer schema JSON, sem restrições draconianas de schema. Ideal para dados hierárquicos de até 4-5 níveis.
Contras: A volta do tool call adiciona um passo de extração. E se seu schema for muito aninhado, prepare-se para falhas.
Opção 3: Gemini response_schema
O Google entrou na briga com o parâmetro response_schema no generation_config, combinado com response_mime_type: "application/json".
from pydantic import BaseModel
from google import genai
class TicketTriage(BaseModel): prioridade: str departamento: str resumo: str precisa_escalacao: bool
client = genai.Client()
resposta = client.models.generate_content( model="gemini-2.5-pro-3-1", contents="Nota fiscal veio com valor errado, preciso de ajuda", config={ "response_mime_type": "application/json", "response_schema": TicketTriage } )
ticket = TicketTriage.model_validate_json(resposta.text)
O Gemini Pro 3.1 e o Flash 3.5 mantêm 100% de aderência estrita em todos os schemas aceitos pelo validador pré-voo (Fonte: Carrick Benchmark, Maio/2026). O diferencial do Google é a validação antes da chamada: se o schema for inválido, a API avisa na hora.
Prós: Zero falha nos schemas que passam no validation. Documentação clara do que é ou não aceito.
Contras: Menos flexível que a Anthropic em schemas complexos. O ecossistema Pydantic não é integrado tão nativamente quanto na OpenAI.
Opção 4: Instructor — O Unificador
Se você não quer se prender a um provedor, a biblioteca Instructor (11k+ estrelas no GitHub, 3M+ downloads mensais) unifica os três provedores com a mesma API baseada em Pydantic. E mais: faz retry automático com validação.
from pydantic import BaseModel, Field
import instructor
from openai import OpenAI
Funciona igual com Anthropic ou Google — só troca o client
client = instructor.from_openai(OpenAI())
class TicketTriage(BaseModel): prioridade: str = Field(description="Alta, Media ou Baixa") departamento: str = Field(description="Suporte, Faturamento, Tecnico") resumo: str = Field(description="Resumo conciso") precisa_escalacao: bool = Field(default=False)
Retry automático se falhar validação
ticket = client.chat.completions.create( model="gpt-5.5", response_model=TicketTriage, messages=[ {"role": "user", "content": "Sistema travou na minha maquina"} ], max_retries=3, # Instructor tenta de novo se o JSON for inválido )
print(f"Prioridade: {ticket.prioridade}")
O Instructor suporta 15+ provedores — OpenAI, Anthropic, Gemini, DeepSeek, Llama via Together, e mais. Com max_retries, ele detecta falha de schema e re-chama o modelo automaticamente. É a escolha certa para quem quer portabilidade entre provedores e robustez sem escrever boilerplate.
Se quiser se aprofundar em agentes com ferramentas, veja também nosso tutorial Do Prompt ao Agente — o Instructor se integra naturalmente com loops de agente.
Qual Escolher? Um Guia de Decisão
Cada provedor tem um ponto ideal. Aqui vai uma regra prática:
| Cenário | Escolha |
|---|---|
| Você já usa OpenAI e o schema é simples (flat, < 5 campos) | client.beta.chat.completions.parse |
| Você precisa de schemas aninhados ou hierarquia média (2-5 níveis) | Anthropic tool use |
| Você quer zero surpresas com schemas simples | Gemini response_schema |
| Você troca de provedor ou quer portabilidade | Instructor (qualquer um) |
| Schema profundamente aninhado (6+ níveis) | Use Instructor + Anthropic com fallback para chunking |
E o JSON mode solto? Só use se for para saída não-crítica, como brainstorming ou drafts. Para qualquer fluxo que alimente outro sistema, structured output não é luxo — é requisito.
O Que Vem Depois
Structured output é a base. O próximo passo é orquestrar múltiplas chamadas com validação entre etapas. Se você já está construindo sistemas com agentes, vale conferir o tutorial de RAG do Zero — onde a extração estruturada de entidades é parte crítica do pipeline.
A evolução é clara: em 2025, a pergunta era "como fazer o LLM devolver JSON válido?". Em 2026, a pergunta é "qual provedor oferece a melhor garantia de schema para meu caso de uso?". A resposta muda conforme seu schema, seu orçamento e sua tolerância a falhas — mas uma coisa é certa: retry loop escrito à mão é coisa do passado.
Artigos Relacionados
Confira também: Do Prompt ao Agente: Construa um Assistente de IA com Memória e Ferramentas em Python (2026) Confira também: O Que Sao Modelos de Linguagem Grandes (LLMs) e Como Estao Transformando a Tecnologia Confira também: Agentes de IA Autonomos em 2026: como funcionam, onde estao sendo usados e o que esperar
NeuralPulse
Blog profissional sobre Inteligencia Artificial. Exploramos tendencias, ferramentas, tutoriais e analises profundas sobre como a IA esta transformando negocios, tecnologia e o dia a dia.
Receba as novidades sobre IA
Junte-se a milhares de leitores que acompanham as ultimas tendencias em inteligencia artificial.
Artigos Relacionados
Automação de Licitações com IA: Guia Prático para Órgãos Públicos
Aprenda a usar IA gratuita para automatizar a análise de editais e propostas em licitações públicas com Python, dados abertos e modelos como Sabiá-4 e Gemini.
Function Calling na Prática: Tutorial Python para Chatbots com LLMs que Executam Ações em 2026
Aprenda a implementar function calling em Python com OpenAI, Anthropic Claude e Google Gemini. Tutorial completo com código para integrar APIs, bancos de dad...
A Crise Silenciosa dos Multimodais: Por que 1 em Cada 3 Respostas Visuais de LLMs em 2026 é Alucinação
Análise da crescente incidência de alucinações visuais em LLMs multimodais de 2026, contrastando com a confiança do mercado e propondo métricas de validação ...
Comentarios
Powered by Disqus
Para ativar os comentarios, configure seu shortname do Disqus no componente.
<div id="disqus_thread"></div>