Cérebro humano simbolizando o processamento de linguagem natural e raciocínio dos LLMs
llms-chatbots

Extraia Dados Estruturados de LLMs: Tutorial Python com Pydantic e Instructor (GPT, Claude, Gemini)

NeuralPulse|31 de maio de 2026|12 min de leitura|Read in English
Preparando avatar...
🎬 NeuralPulse Shorts

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ídaTaxa de falhaCusto extra por falha
JSON mode livre8–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 aceitosValidaçã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árioEscolha
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 simplesGemini response_schema
Você troca de provedor ou quer portabilidadeInstructor (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

Compartilhar:
NeuralPulse

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.

Comentarios

Powered by Disqus

Para ativar os comentarios, configure seu shortname do Disqus no componente.

<div id="disqus_thread"></div>