Uso de IA no trabalho

Extrair texto desorganizado para JSON com IA e validar o resultado em Python

A IA pode transformar anotações não estruturadas em JSON, mas o resultado ainda precisa ser validado. Este guia usa um pequeno exemplo sintético e uma verificação em Python para conferir campos obrigatórios, tipos, valores permitidos e consistência básica.

Ver o sumário

A tradução foi feita com IA. Confira o código, as unidades e os valores junto com o original. A revisão por falantes nativos de cada idioma ainda não foi concluída. English

Para quem éPessoas que usam um assistente de chat com IA para converter anotações, e-mails, formulários ou outros textos desorganizados em JSON estruturado e precisam de uma etapa de validação repetível.

Preparação
  • Python 3.12
  • Familiaridade básica com objetos JSON, strings, números e listas

01Por que validar o JSON extraído por IA

A IA é útil para transformar texto irregular em campos estruturados, mas uma resposta que parece um JSON válido ainda pode estar errada. Uma chave obrigatória pode estar ausente, um número pode ser retornado como texto, um campo pode conter um valor não permitido ou a IA pode inferir informações que nunca apareceram na fonte.

O fluxo mais seguro separa extração de validação. Primeiro, peça à IA para mapear o texto de origem para uma estrutura fixa. Depois, verifique o JSON retornado contra regras explícitas. A validação não prova que todos os fatos extraídos estão corretos, mas detecta muitos erros estruturais antes que os dados sejam copiados para uma planilha, banco de dados, script ou fluxo de trabalho.

02Defina uma pequena fonte sintética e um esquema

Este exemplo é sintético. Suponha que uma breve nota de suporte contenha nome do cliente, número do ticket, prioridade, produtos afetados e um horário opcional para retorno.

Texto de origem: "Ticket 1842. Customer: Mira Lee. Login fails on the desktop app and web portal. Priority is high. Please call after 15:30. Products affected: Desktop, Web."

CampoRegra
ticket_idInteiro obrigatório
customerString obrigatória não vazia
priorityObrigatório: low, medium ou high
productsLista obrigatória não vazia de strings
callback_timeString no formato HH:MM ou null

O esquema é deliberadamente simples e pode ser verificado apenas com a biblioteca padrão do Python. As regras são mais rígidas do que simplesmente perguntar se a resposta pode ser analisada como JSON.

03Peça à IA um objeto JSON com restrições

Informe exatamente quais campos são permitidos e como tratar informações ausentes. Por exemplo: "Extraia o texto a seguir para um único objeto JSON com exatamente estas chaves: ticket_id, customer, priority, products, callback_time. ticket_id deve ser inteiro. priority deve ser low, medium ou high. products deve ser uma lista de strings. Use null para callback_time se não estiver informado. Não infira fatos ausentes. Retorne apenas JSON."

Um resultado correto para a nota sintética teria ticket_id 1842, customer Mira Lee, priority high, products Desktop e Web e callback_time 15:30.

Uma resposta plausível, mas incorreta, poderia retornar ticket_id como a string "1842", priority como "urgent" e adicionar um campo não permitido como issue_summary. Ainda pode parecer organizada e legível, mas não atende ao esquema combinado.

04Valide o JSON com Python

O script a seguir usa apenas a biblioteca padrão do Python. Ele carrega uma resposta sintética da IA, verifica se existem chaves inesperadas, confere chaves obrigatórias e tipos, testa os valores permitidos de priority, valida a lista products e verifica o formato de callback_time. O relatório é gravado em outputs e o script para se o arquivo já existir.

python
import json
import re
from pathlib import Path

AI_RESPONSE = '''{
  "ticket_id": "1842",
  "customer": "Mira Lee",
  "priority": "urgent",
  "products": ["Desktop", "Web"],
  "callback_time": "15:30",
  "issue_summary": "Login problem"
}'''

REQUIRED_KEYS = {
    "ticket_id",
    "customer",
    "priority",
    "products",
    "callback_time",
}

ALLOWED_PRIORITIES = {"low", "medium", "high"}
TIME_PATTERN = re.compile(r"^(?:[01]\d|2[0-3]):[0-5]\d$")

errors = []

try:
    data = json.loads(AI_RESPONSE)
except json.JSONDecodeError as exc:
    raise SystemExit(f"Invalid JSON: {exc}")

if not isinstance(data, dict):
    errors.append("Top-level value must be a JSON object.")
else:
    actual_keys = set(data)
    missing = REQUIRED_KEYS - actual_keys
    unexpected = actual_keys - REQUIRED_KEYS

    if missing:
        errors.append("Missing keys: " + ", ".join(sorted(missing)))
    if unexpected:
        errors.append("Unexpected keys: " + ", ".join(sorted(unexpected)))

    if "ticket_id" in data and not isinstance(data["ticket_id"], int):
        errors.append("ticket_id must be an integer.")

    if "customer" in data:
        customer = data["customer"]
        if not isinstance(customer, str) or not customer.strip():
            errors.append("customer must be a non-empty string.")

    if "priority" in data:
        priority = data["priority"]
        if not isinstance(priority, str) or priority not in ALLOWED_PRIORITIES:
            errors.append("priority must be low, medium, or high.")

    if "products" in data:
        products = data["products"]
        if not isinstance(products, list) or not products:
            errors.append("products must be a non-empty list.")
        elif not all(isinstance(item, str) and item.strip() for item in products):
            errors.append("Every product must be a non-empty string.")

    if "callback_time" in data:
        callback = data["callback_time"]
        if callback is not None:
            if not isinstance(callback, str) or not TIME_PATTERN.fullmatch(callback):
                errors.append("callback_time must be HH:MM or null.")

status = "PASS" if not errors else "FAIL"
lines = [f"Validation: {status}"]
lines.extend(f"- {error}" for error in errors)

output_dir = Path("outputs")
output_dir.mkdir(exist_ok=True)
output_file = output_dir / "json_validation.txt"

if output_file.exists():
    raise SystemExit(f"Stop: {output_file} already exists.")

output_file.write_text("\n".join(lines) + "\n", encoding="utf-8")
print(f"Wrote {output_file}")

05Interprete corretamente a validação estrutural

Para a resposta sintética incorreta, a validação deve falhar por três motivos. ticket_id é uma string em vez de inteiro. priority é urgent, que está fora do conjunto permitido. issue_summary é uma chave inesperada. A lista products e o formato de callback_time atendem às respectivas regras estruturais.

VerificaçãoValor da IAEsperadoResultado
ticket_id"1842"inteiroFAIL
customer"Mira Lee"string não vaziaPASS
priority"urgent"low, medium ou highFAIL
products["Desktop", "Web"]lista não vazia de stringsPASS
callback_time"15:30"HH:MM ou nullPASS
chaves extrasissue_summarynenhumaFAIL

Quando o esquema falha, normalmente é melhor devolver o resultado para correção em vez de converter valores silenciosamente. Converter automaticamente "1842" em 1842 pode esconder o fato de que as instruções de extração não foram seguidas. Permitir ou não coerção depende do fluxo posterior.

06Compare os campos extraídos com o texto de origem

A validação estrutural é apenas uma camada. Campos importantes também devem ser comparados diretamente com o texto original. Neste exemplo, ticket 1842, Mira Lee, high, Desktop, Web e 15:30 aparecem explicitamente na fonte. A fonte não usa a palavra urgent, portanto substituir high por urgent altera o valor declarado em vez de apenas reformatá-lo.

  • Confirme identificadores e nomes contra o texto exato da fonte.
  • Verifique se campos com conjunto fechado de valores, como priority, preservam o significado da fonte e usam um valor permitido pelo esquema.
  • Confira se os itens de listas foram realmente mencionados e não inferidos.
  • Use null para campos opcionais ausentes em vez de adivinhar.
  • Rejeite campos adicionais, a menos que o esquema permita explicitamente propriedades extras.
  • Diferencie normalização de invenção; ajustar maiúsculas e minúsculas pode ser aceitável, mas adicionar um prazo inexistente não é.

07Erros comuns e limitações

Um erro comum é verificar apenas se json.loads aceita a resposta. Uma análise bem-sucedida prova que a sintaxe é JSON válida, não que chaves obrigatórias, tipos ou valores estejam corretos. Outro erro é permitir campos extras arbitrários, fazendo com que o código posterior possa depender de informações que nunca fizeram parte da especificação.

Com esquemas maiores, código de validação escrito à mão fica mais difícil de manter. Um sistema de esquema dedicado ou uma biblioteca de validação pode ser mais adequado, mas as perguntas básicas continuam iguais: quais campos são obrigatórios, quais tipos são permitidos, quais valores são válidos e se informações ausentes podem ser representadas por null.

A validação também não prova que o texto original seja completo ou confiável. Se a fonte contiver um número de ticket incorreto ou redação ambígua, uma extração estruturalmente correta preservará esse problema. Mantenha o texto original disponível para rastrear campos importantes quando uma regra de validação ou de negócio falhar.

Registro de execução e verificação

2026-09-21 · hand-checked example · Python 3.12

  • Foi verificado que o texto sintético contém ticket 1842, customer Mira Lee, priority high, products Desktop e Web e callback time 15:30.
  • Foi verificado que o esquema pretendido contém exatamente cinco chaves permitidas: ticket_id, customer, priority, products e callback_time.
  • Foi verificado que o exemplo incorreto usa a string "1842" em vez do inteiro 1842.
  • Foi verificado que urgent está fora do conjunto permitido de priority: low, medium, high.
  • Foi verificado que issue_summary é uma chave inesperada segundo o esquema definido.
  • Foi verificado que ["Desktop", "Web"] atende à regra de lista não vazia de strings.
  • Foi verificado que 15:30 corresponde ao padrão HH:MM de 24 horas informado.
  • Foi verificado que o script grava apenas em outputs/json_validation.txt e para se esse arquivo já existir.
Limites da verificação
  • O código Python não foi executado por mim; o exemplo sintético, os ramos de validação e as falhas esperadas foram verificados por inspeção.
  • Este validador escrito à mão cobre apenas o pequeno esquema mostrado aqui e não é uma implementação geral de JSON Schema.
  • A validação estrutural não prova que os valores extraídos estão factualmente corretos; valores importantes ainda precisam ser comparados com o texto de origem.
  • O exemplo não envia automaticamente uma saída inválida de volta à IA para correção nem realiza filtragem de segurança sobre texto de entrada arbitrário.

Princípios de redação e verificação de todo o site

Fontes de referência

As explicações e os exemplos são de elaboração própria. Os comportamentos e conceitos relacionados podem ser consultados nas fontes oficiais abaixo.