Pular para o conteúdo
Aback Tools Logo

Guardrails AI: Validação de Saída Estruturada com JSON Schema

Como o Guardrails AI valida a saída estruturada de LLMs: os cinco modos de falha de respostas não validadas, contratos JSON Schema, integração com Pydantic, tentativas reask, ações on_fail e uma cadeia de ferramentas de esquemas gratuita.

DH
Tutorials & How-Tos13 min de leitura2,800 palavras

Modelos de linguagem são probabilísticos - eles não garantem que sua saída será JSON bem formado, conterá todos os campos obrigatórios ou respeitará as restrições de valor de que sua aplicação depende. O Guardrails AI resolve isso envolvendo chamadas LLM com uma camada de validação construída sobre JSON Schema e validadores Python, tentando novamente automaticamente quando o modelo produz saída não conforme. Este guia explica exatamente como funciona e como montar um pipeline de saída estruturada confiável do zero.

JSON SchemaFormato de contrato principalDraft-07 e 2020-12
reaskMecanismo de nova tentativa automáticaContagem de tentativas configurável
0 uploadsFerramentas de esquemasFerramentas locais no navegador

O que é Guardrails AI?

Guardrails AI é uma biblioteca Python de código aberto projetada para tornar as saídas de LLMs confiáveis e previsíveis. Ela envolve qualquer chamada de API LLM - OpenAI, Anthropic, Cohere, modelos locais - com um pipeline de validação que verifica a resposta do modelo contra um esquema definido pelo usuário e um conjunto de validadores no nível dos campos antes de retornar o resultado ao seu código de aplicação.

A abstração central é o objeto `Guard`. Você constrói um Guard a partir de um modelo Pydantic ou de uma definição JSON Schema, opcionalmente anexa validadores a campos individuais e depois chama o Guard em vez de chamar o LLM diretamente. O Guard cuida da construção do prompt, da análise da resposta, da validação e da nova solicitação automática quando a validação falha - tudo em um único pipeline auditável.

Onde o Guardrails AI se encaixa na pilha LLM

O Guardrails fica entre o seu código de aplicação e o provedor do LLM. Ele não substitui o modelo nem muda como o modelo é chamado - adiciona uma camada de cumprimento de contrato ao redor da chamada. Pense nele como um validador de esquemas para respostas de API, exceto que a "API" é um modelo de linguagem que produz linguagem natural, e a "resposta" precisa ser analisada em dados estruturados antes de poder ser validada.

  • Guard: a interface principal - envolve uma chamada LLM e aplica esquema + validadores.
  • ValidationOutcome: o objeto de resultado retornado por uma chamada ao Guard - contém a saída validada, o status de aprovação/falha e os erros dos campos.
  • Validator: um callable anexado a um campo do esquema que impõe uma regra específica (tipo, intervalo, regex, verificação externa).
  • reask: o mecanismo de nova tentativa - quando a validação falha, o Guardrails relança o prompt ao modelo com o contexto do erro.
  • Hub: o registro de validadores do Guardrails - uma coleção curada de validadores da comunidade instalável via `guardrails hub install`.

Note

Guardrails AI é distinto do modo de saída estruturada nativo da OpenAI (`response_format: json_object`) e da API de tool-use da Anthropic. Esses recursos específicos de provedores impõem sintaxe JSON básica, mas não validam valores de campos, não executam validadores personalizados nem implementam lógica de nova tentativa. O Guardrails adiciona tudo isso por cima e funciona com qualquer provedor.

Por que a saída do LLM precisa de validação

O problema fundamental é que modelos de linguagem são treinados para produzir texto plausível - não para respeitar contratos programáticos. Mesmo quando você instrui um modelo a retornar JSON, ele pode produzir saída com campos ausentes, tipos de valor errados, campos extras que seu código posterior não espera, valores alucinados fora dos intervalos permitidos ou fragmentos de texto ao redor do bloco JSON que quebram a análise por completo.

Os cinco modos de falha de saída LLM não validada

  • Falha de análise: o modelo envolve o JSON em delimitadores de código markdown, adiciona comentários antes ou depois, ou produz JSON malformado que não pode ser analisado.
  • Campos obrigatórios ausentes: o modelo omite um campo que foi pedido para preencher, causando um KeyError ou erro de referência nula no código posterior.
  • Violações de tipo: um campo esperado como número chega como string, ou um booleano chega como a string "true" em vez do literal `true`.
  • Violações de restrição de valor: um campo de avaliação retorna 11 quando o intervalo permitido é 1-10, ou um campo enum retorna um valor fora da lista definida.
  • Estrutura alucinada: o modelo inventa campos adicionais ou aninha objetos de forma diferente da que o esquema especifica.

Qualquer uma dessas falhas pode corromper silenciosamente dados posteriores, causar exceções em tempo de execução ou permitir que valores ruins se propaguem para a lógica de negócio. Para protótipos de baixo risco, análise otimista é aceitável. Para pipelines de produção - extração de faturas, análise de dados clínicos, sinais de detecção de fraude, enriquecimento de registros de clientes - cada violação de campo é um problema de qualidade de dados que precisa ser capturado e tratado.

O contrato entre sua aplicação e o LLM é tão forte quanto a validação que você impõe a cada resposta. Esperança não é uma estratégia de validação.

- Filosofia da documentação do Guardrails AI

Warning

Mesmo modelos com modos nativos de saída estruturada (como o `response_format: json_schema` da OpenAI) só garantem JSON sintaticamente válido que corresponde ao formato do esquema de nível superior. Eles não validam que um campo `rating` está entre 1 e 5, que um campo `email` contém um endereço de e-mail real, nem que um campo `status` é um dos seus valores enum definidos. A validação semântica no nível dos campos sempre exige uma camada adicional.

JSON Schema como contrato de validação

JSON Schema é a linguagem que o Guardrails AI usa para descrever como uma resposta LLM válida se parece. Uma definição JSON Schema especifica a estrutura esperada do objeto - quais campos existem, seus tipos, quais são obrigatórios e que restrições se aplicam aos seus valores. Este esquema cumpre dois propósitos: diz ao Guardrails como validar a resposta analisada, e o Guardrails o usa para construir a instrução de prompt que diz ao modelo que forma produzir.

O que o JSON Schema cobre para validação de LLM

Para casos de uso de saída estruturada, as palavras-chave JSON Schema mais úteis são imposição de tipos, listas de campos obrigatórios, valores enum, formatos de string e intervalos numéricos. Juntas, elas cobrem a maioria das regras de nível de campo que uma tarefa de extração ou geração precisa impor.

product_review_schema.json
json
{
  "$schema": "https://json-schema.org/draft-07/schema",
  "type": "object",
  "required": ["product_name", "rating", "sentiment", "summary"],
  "additionalProperties": false,
  "properties": {
    "product_name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "rating": {
      "type": "integer",
      "minimum": 1,
      "maximum": 5
    },
    "sentiment": {
      "type": "string",
      "enum": ["positive", "neutral", "negative"]
    },
    "summary": {
      "type": "string",
      "minLength": 20,
      "maxLength": 500
    },
    "pros": {
      "type": "array",
      "items": { "type": "string" },
      "maxItems": 5
    },
    "cons": {
      "type": "array",
      "items": { "type": "string" },
      "maxItems": 5
    }
  }
}

Este esquema diz ao Guardrails para rejeitar qualquer resposta em que `rating` esteja fora de 1-5, `sentiment` não seja um dos três valores permitidos, ou `summary` tenha menos de 20 caracteres. Campos listados em `required` devem estar presentes. `additionalProperties: false` rejeita qualquer campo extra que o modelo adicione por conta própria.

Gerando um esquema a partir de uma resposta de exemplo

Ao projetar uma nova tarefa de extração, acertar o esquema inicial leva tempo. Um atalho prático: execute seu prompt uma vez sem validação, examine o JSON bruto que o modelo retorna e depois use o Gerador de JSON Schema para inferir automaticamente um esquema Draft-07 a partir dessa amostra. O esquema gerado captura tipos, campos obrigatórios e estrutura aninhada. Depois você o refina - apertando comprimentos de string, adicionando restrições enum, definindo limites numéricos - em vez de escrever cada palavra-chave do zero.

Gerador de JSON Schema

Cole qualquer payload JSON e obtenha automaticamente um esquema completo Draft-07 ou Draft 2020-12 - local no navegador, sem upload, sem cadastro.

Open tool

Tip

Use `additionalProperties: false` em todos os esquemas Guardrails. Sem isso, um modelo pode adicionar campos como `"confidence": 0.9` ou `"notes": "..."` que passam na validação silenciosamente mas poluem seu modelo de dados. Esquemas estritos produzem resultados de extração mais limpos porque o modelo não pode descarregar incerteza em campos inventados.

Como o Guardrails AI valida a saída

Entender o pipeline de validação ajuda a depurar falhas e configurar a estratégia de resposta certa para cada campo. O pipeline roda em uma ordem fixa para cada chamada ao Guard: injeção de prompt, análise da resposta, validação JSON Schema, execução de validadores de campo e montagem do resultado.

1

Injeção de prompt

Antes de enviar o prompt ao LLM, o Guardrails anexa um bloco de instruções estruturado derivado do seu esquema. Este bloco descreve o formato de saída esperado, lista os campos obrigatórios com seus tipos e restrições e (quando o reask está ativo) inclui os erros de validação da tentativa anterior. A injeção é transparente - você escreve seu prompt de tarefa normalmente e o Guardrails cuida das instruções de formatação.

2

Análise da resposta

Depois que o modelo responde, o Guardrails extrai o JSON da saída. Ele lida com hábitos comuns de formatação de modelos: remover delimitadores de código markdown, aparar prosa antes ou depois do bloco JSON e corrigir problemas menores de sintaxe. Se a saída não puder ser analisada em um dict Python, o Guard dispara imediatamente um reask com uma mensagem de erro de análise em vez de lançar uma exceção.

3

Validação JSON Schema

O dict analisado é validado contra o seu JSON Schema usando um validador compatível com os padrões. Violações de tipo, campos obrigatórios ausentes, divergências de enum e violações de intervalo produzem objetos de erro estruturados nesta etapa. Você pode testar seu esquema contra um payload candidato de forma independente com o Validador de JSON Schema antes de conectá-lo a um Guard.

4

Execução de validadores no nível dos campos

Depois que a verificação do JSON Schema passa, os validadores registrados de cada campo rodam em ordem. Validadores integrados incluem `ValidChoices`, `ValidRange`, `ValidURL`, `NoRefusal`, `ToxicLanguage`, `PIIFilter` e dezenas mais do Hub. Validadores personalizados são funções Python simples decoradas com `@register_validator`. Cada validador retorna um `PassResult` ou `FailResult` com uma mensagem de erro legível.

5

Montagem do resultado e reask

O Guardrails monta um `ValidationOutcome` contendo o dict de saída validada, um booleano `validation_passed` e uma lista de erros de campos. Se a validação falhou e `num_reasks` é maior que zero, o pipeline volta ao Passo 1 com os erros de validação injetados no prompt, dando ao modelo a chance de corrigir sua saída. Cada rodada de reask decrementa o contador de tentativas.

Ação on_failO que fazMelhor para
exceptionLança ValidationError imediatamenteRequisitos rígidos - falhar rápido
reaskRelança o prompt ao modelo com contexto do erroA maioria dos casos de saída estruturada
fixAplica uma função de correção automaticamenteNormalização (trim, minúsculas, conversão)
filterRemove o campo que falhou da saídaCampos de enriquecimento opcionais
refrainRetorna None para toda a chamada ao GuardFluxos de fallback conservadores
noopRegistra a falha mas continuaPipelines de logging e observabilidade

Especificações Rail e integração com Pydantic

O Guardrails AI suporta dois estilos de definição de esquema: o formato legado Rail spec e a abordagem moderna com modelos Pydantic. Conhecer ambos é útil porque você encontrará Rail specs em bases de código antigas e exemplos da comunidade, enquanto Pydantic é o caminho recomendado para todos os projetos novos a partir do Guardrails v0.4+.

Modelos Pydantic como esquemas do Guard

A forma mais limpa de definir um esquema de saída Guardrails em Python é uma subclasse de `BaseModel` do Pydantic. Modelos Pydantic têm exportação nativa para JSON Schema, verificação de tipos no IDE e sintaxe Python familiar. Você anexa validadores do Guardrails usando o `Field()` do Pydantic com metadados personalizados, ou importando classes de validadores diretamente de `guardrails`.

review_guard.py
python
from pydantic import BaseModel, Field
from guardrails import Guard
from guardrails.hub import ValidRange, ValidChoices

class ProductReview(BaseModel):
    product_name: str = Field(description="Name of the product reviewed")
    rating: int = Field(
        description="Rating from 1 to 5",
        validators=[ValidRange(min=1, max=5, on_fail="reask")]
    )
    sentiment: str = Field(
        description="Overall sentiment of the review",
        validators=[ValidChoices(
            choices=["positive", "neutral", "negative"],
            on_fail="reask"
        )]
    )
    summary: str = Field(description="One paragraph summary of the review")

# Build the Guard from the Pydantic model
guard = Guard.from_pydantic(ProductReview)

# Call the LLM through the Guard
outcome = guard(
    openai.chat.completions.create,
    model="gpt-4o",
    messages=[{"role": "user", "content": f"Extract a review from: {raw_text}"}],
    num_reasks=2,
)

if outcome.validation_passed:
    review: ProductReview = outcome.validated_output
else:
    print(outcome.error)

O pipeline Pydantic para JSON Schema

Por baixo dos panos, o Guardrails chama `model.model_json_schema()` para exportar seu modelo Pydantic como JSON Schema e depois usa esse esquema tanto para injeção de prompt quanto para validação da resposta. Isso significa que todo modelo Pydantic que você consiga escrever é automaticamente um contrato Guardrails válido. Você pode inspecionar o esquema gerado você mesmo - cole uma resposta de exemplo no Gerador de JSON Schema para ver o esquema equivalente e depois compare-o com a saída do seu modelo Pydantic.

Se sua aplicação é baseada em TypeScript mas chama um serviço Guardrails em Python, o Conversor JSON para Zod Schema gera um esquema Zod correspondente a partir do mesmo JSON de exemplo - útil para validar o mesmo contrato no lado do cliente sem duplicar manualmente a definição do esquema.

Rail specs - o formato legado

Rail specs são arquivos XML onde cada elemento `<output>` descreve um campo com um atributo `type` e um ou mais elementos filhos `<validator>`. Eles precedem a integração com Pydantic e são menos ergonômicos para desenvolvedores Python, mas ainda são totalmente suportados. Se você herdar uma base de código Guardrails que usa arquivos `.rail`, pode migrar cada especificação para um modelo Pydantic de forma incremental - o comportamento de validação é equivalente.

Note

Você pode converter uma Rail spec existente em seu equivalente JSON Schema chamando `guard.json_function_calling_schema` em um Guard construído a partir do arquivo `.rail`. Isso é útil para migrar para Pydantic ou para depurar qual esquema o Guard está realmente injetando no prompt.

Fluxo de trabalho prático e cadeia de ferramentas

Um fluxo de trabalho Guardrails confiável combina design de esquema offline, testes locais e monitoramento em produção. A fase de design do esquema - onde você define como uma saída válida se parece - é a etapa mais importante e a que mais se beneficia de ferramentas dedicadas.

Etapa 1: Projete o esquema offline

Antes de escrever qualquer código Guardrails, defina seu esquema de saída como um documento JSON Schema independente. Trabalhar primeiro em JSON Schema permite iterar no contrato independentemente da chamada LLM - você pode validar payloads de amostra, ajustar restrições e confirmar que o esquema está correto antes de gastar créditos de API em testes.

O Validador de JSON Schema da Aback Tools permite colar um JSON Schema e um payload candidato, e ver imediatamente os erros de validação no nível dos campos. Use-o para confirmar que seus arrays `required`, listas enum e intervalos numéricos se comportam como esperado antes de traduzir o esquema para um modelo Pydantic. O Formatador & Validador JSON é útil para verificar se o próprio arquivo de esquema é JSON sintaticamente válido antes de referenciá-lo.

Etapa 2: Gere Pydantic a partir de JSON

Se você coletou respostas LLM de exemplo durante a prototipagem, o Conversor JSON para Dataclass / Pydantic Python gera um modelo Pydantic a partir de um payload JSON de exemplo em uma etapa. A ferramenta infere tipos de campo, lida com objetos aninhados e aplica `Optional` onde campos podem estar ausentes. Use a saída como ponto de partida e adicione validadores Guardrails a cada campo com base nas restrições do seu JSON Schema.

Etapa 3: Teste localmente com respostas simuladas

Guards do Guardrails podem ser chamados com qualquer callable Python, não apenas APIs LLM ao vivo. Durante o desenvolvimento, passe uma função simulada que retorne uma resposta de string fixa para testar o pipeline de validação sem chamadas de API. Isso torna rápida e gratuita a iteração sobre mudanças de esquema, configurações de validadores e prompts de reask antes de conectar a um endpoint de modelo pago.


Fluxo de esquemas recomendado com Aback Tools

Validador de JSON Schema

Valide qualquer payload JSON contra um esquema com erros reportados no nível dos campos - local no navegador, sem upload, resultados instantâneos.

Open tool

Casos extremos e limitações

O Guardrails AI melhora significativamente a confiabilidade da saída estruturada, mas não é uma garantia de correção. Entender as limitações ajuda você a projetar seu pipeline com fallbacks apropriados em vez de confiar no Guard incondicionalmente.

Laços de reask nem sempre convergem

Quando um modelo falha consistentemente em um validador específico, adicionar mais tentativas reask não ajuda - apenas custa mais créditos de API pelo mesmo resultado. Alguns modos de falha são sistemáticos: o modelo genuinamente não entende uma restrição, ou a restrição é muito estrita para o modelo satisfazê-la de forma confiável dado o input. Audite suas taxas de falha de validadores e trate validadores com alta taxa de falha como sinais para revisar a definição da restrição ou o prompt.

JSON Schema não captura erros semânticos

Um esquema pode confirmar que `sentiment` é um de `["positive", "neutral", "negative"]`, mas não pode verificar que o sentimento atribuído está realmente correto para o texto de entrada. JSON Schema e validadores impõem contratos estruturais e sintáticos - eles não substituem revisão humana nem verificações de qualidade posteriores para a precisão do conteúdo. Use o Guardrails para impor o formato e a estrutura da saída, e aplique métricas de avaliação separadas para a correção do conteúdo.

Sobrecarga de latência e custo

Cada tentativa de reask é uma chamada adicional de API LLM com custo total de tokens. Para um Guard configurado com `num_reasks=3`, uma extração no pior caso pode disparar quatro chamadas LLM antes de falhar. Em pipelines de alto volume, essa sobrecarga é significativa. Perfle a taxa de reask do seu Guard em staging antes de implantar em produção, e defina `num_reasks=0` para campos não críticos onde as ações on_fail `filter` ou `noop` são alternativas aceitáveis à nova tentativa.

LimitaçãoImpactoMitigação
Laços reask não convergemCréditos de API desperdiçados em falhas conhecidasAudite taxas de falha de validadores; simplifique restrições
Erros semânticos não detectadosValores errados que passam nas checagens estruturaisAplique métricas de avaliação de conteúdo separadas
Latência por reasksAté 4× o custo por chamada com falhaPerfle a taxa de reask; use filter/noop para campos não críticos
Sem validação entre camposNão consegue impor campo A > campo BUse uma função Python de pós-validação para regras entre campos
Sensibilidade ao prompt do provedorO formato de injeção afeta a conformidade do modeloTeste vários formatos de prompt; use modos nativos de saída estruturada

Warning

Nunca use o Guardrails como única salvaguarda para decisões de alto risco. Uma saída estruturada que passa em todas as checagens de esquema e validadores ainda se baseia em uma inferência do modelo que pode estar errada. O Guardrails impõe o **formato** da saída - não sua **precisão factual**. Aplique revisão humana ou verificação posterior para qualquer saída que impulsione ações irreversíveis.

Tip

Para regras de validação entre campos que o JSON Schema não consegue expressar - por exemplo, garantir que `end_date` seja sempre posterior a `start_date` - adicione um validador de modelo Pydantic pós-Guard usando `@model_validator(mode='after')`. Isso roda depois que o Guardrails retorna o dict validado e lhe dá toda a lógica Python para checagens entre campos sem precisar de um validador Guardrails personalizado.

Key takeaways

  • Guardrails AI envolve chamadas LLM com uma camada de validação JSON Schema e validadores de campo, relançando automaticamente o prompt quando a saída falha na validação.
  • JSON Schema define o contrato estrutural - tipos de campo, campos obrigatórios, valores enum e intervalos numéricos. Gere um esquema inicial a partir de um payload de amostra com o Gerador de JSON Schema.
  • O mecanismo reask relança o prompt ao LLM com contexto de erro estruturado - configurável por chamada com `num_reasks`. Taxas altas de reask sinalizam restrições muito estritas ou um prompt desalinhado.
  • Modelos Pydantic são o formato de esquema recomendado no Guardrails v0.4+: eles são exportados para JSON Schema automaticamente e se integram à verificação de tipos Python e ferramentas de IDE.
  • Use `additionalProperties: false` em todos os esquemas para impedir que o modelo adicione campos inventados que passam na validação silenciosamente mas corrompem seu modelo de dados.
  • JSON Schema impõe estrutura, não correção semântica - aplique métricas de avaliação separadas para a precisão do conteúdo junto com a validação de esquemas do Guardrails.
  • Valide seu JSON Schema e payloads candidatos offline com o Validador de JSON Schema antes de conectar qualquer Guard a um pipeline LLM em produção.

Perguntas frequentes

Guardrails AI is a Python library that wraps LLM API calls and validates the model's output against a user-defined schema and set of validators. It is used to enforce structured output from language models - ensuring that responses conform to expected field types, value ranges, formats, and custom business rules. It supports OpenAI, Anthropic, Cohere, and any other LLM provider accessible via a Python callable.

Guardrails AI accepts a Pydantic model or a JSON Schema definition as the output contract for a Guard. It prompts the LLM to return a response matching that schema, then validates the parsed JSON response against the schema's type and constraint rules. Field-level validators are layered on top of the JSON Schema checks to enforce rules that JSON Schema cannot express, such as checking whether a URL resolves or whether a value appears in a live database.

A Rail spec (short for Reliable AI Language) is an XML-based format used in earlier versions of Guardrails AI to define output schemas and attach validators to fields. Modern Guardrails (v0.4+) has largely moved to Pydantic models as the primary way to define the output schema, as Pydantic integrates more naturally with Python type systems and IDE tooling. Rail specs are still supported for backwards compatibility.

Pydantic validates Python objects at parse time - if the data does not match the model, it raises a ValidationError immediately. Guardrails AI goes further by orchestrating the LLM call itself, injecting schema requirements into the prompt, re-prompting the model if the output fails validation, and running validators that check runtime conditions beyond pure type checks. Guardrails uses Pydantic models as the schema definition layer but adds a correction loop on top.

Yes, via two mechanisms. The `fix` on_fail action instructs Guardrails to apply a correction function automatically - for example, converting a string to lowercase or truncating it to a maximum length. The `reask` mechanism re-prompts the LLM with the original prompt plus a structured description of which fields failed validation and why, giving the model a second chance to produce a conforming response. The number of reask retries is configurable.

Guardrails AI supports any Python callable that takes a prompt and returns a string, which means it works with OpenAI (including the Responses API), Anthropic Claude, Cohere, Mistral, local models via Ollama or vLLM, and any LangChain-wrapped provider. For providers with native structured output modes (OpenAI's `response_format`, Anthropic's tool-use API), Guardrails can use those modes to improve first-pass validation rates.

For simple use cases - extracting a fixed set of fields from a single LLM call - writing JSON Schema validation manually with AJV or Pydantic is faster and has no additional dependency. Guardrails AI adds the most value when you need reask retry logic, a library of pre-built validators, hub-distributed community validators, or a consistent validation pipeline across many LLM calls in a larger application. If your validation needs grow beyond basic type checking, Guardrails becomes worth the setup cost.

The primary Guardrails AI library is Python-only. There is no official JavaScript or Go port. For TypeScript LLM applications needing structured output, the common alternatives are Zod with Vercel AI SDK's structured output mode, or instructor-js for OpenAI function calling. If your application runs in Python even partially, you can run Guardrails in a Python service and expose the validated output over an internal API.

ShareXLinkedIn