Saltar al contenido
Aback Tools Logo

Guardrails AI: Validación de Salida Estructurada con JSON Schema

Cómo valida Guardrails AI la salida estructurada de los LLM: los cinco modos de fallo de respuestas sin validar, contratos JSON Schema, integración con Pydantic, reintentos reask, acciones on_fail y una cadena de herramientas de esquemas gratuita.

DH
Tutorials & How-Tos13 min de lectura2,800 palabras

Los modelos de lenguaje son probabilísticos: no garantizan que su salida será JSON bien formado, que contendrá todos los campos requeridos, ni que respetará las restricciones de valor de las que depende tu aplicación. Guardrails AI resuelve esto envolviendo las llamadas al LLM con una capa de validación construida sobre JSON Schema y validadores de Python, reintentando automáticamente cuando el modelo produce salida no conforme. Esta guía explica exactamente cómo funciona y cómo montar desde cero un pipeline de salida estructurada fiable.

JSON SchemaFormato de contrato principalDraft-07 y 2020-12
reaskMecanismo de reintento automáticoNúmero de reintentos configurable
0 subidasHerramientas de esquemasHerramientas locales en el navegador

¿Qué es Guardrails AI?

Guardrails AI es una biblioteca de Python de código abierto diseñada para hacer las salidas de los LLM fiables y predecibles. Envuelve cualquier llamada a la API de un LLM — OpenAI, Anthropic, Cohere, modelos locales — con un pipeline de validación que comprueba la respuesta del modelo contra un esquema definido por el usuario y un conjunto de validadores a nivel de campo antes de devolver el resultado a tu código de aplicación.

La abstracción central es el objeto `Guard`. Construyes un Guard a partir de un modelo de Pydantic o de una definición JSON Schema, opcionalmente adjuntas validadores a campos individuales, y luego llamas al Guard en lugar de llamar al LLM directamente. El Guard se encarga de la construcción del prompt, el parseo de la respuesta, la validación y la repetición automática del prompt cuando la validación falla, todo en un único pipeline auditable.

Dónde encaja Guardrails AI en la pila de LLM

Guardrails se sitúa entre tu código de aplicación y el proveedor del LLM. No reemplaza el modelo ni cambia cómo se llama al modelo: añade una capa de cumplimiento de contratos alrededor de la llamada. Piensa en él como un validador de esquemas para respuestas de API, salvo que la "API" es un modelo de lenguaje que produce lenguaje natural y la "respuesta" necesita parsearse a datos estructurados antes de poder validarse.

  • Guard: La interfaz principal — envuelve una llamada al LLM y aplica esquema + validadores.
  • ValidationOutcome: El objeto de resultado devuelto por una llamada al Guard — contiene la salida validada, el estado de aprobación/fallo y los errores de campo.
  • Validator: Un callable adjunto a un campo del esquema que aplica una regla específica (tipo, rango, regex, comprobación externa).
  • reask: El mecanismo de reintento — cuando la validación falla, Guardrails vuelve a prompting al modelo con el contexto del error.
  • Hub: El registro de validadores de Guardrails — una colección curada de validadores de la comunidad instalables mediante `guardrails hub install`.

Note

Guardrails AI es distinto del modo de salida estructurada nativo de OpenAI (`response_format: json_object`) y de la API de tool-use de Anthropic. Esas características específicas del proveedor aplican sintaxis JSON básica pero no validan valores de campos, no ejecutan validadores personalizados ni implementan lógica de reintentos. Guardrails añade todo eso encima y funciona con cualquier proveedor.

Por qué la salida del LLM necesita validación

El problema fundamental es que los modelos de lenguaje se entrenan para producir texto plausible, no para respetar contratos programáticos. Incluso cuando le indicas a un modelo que devuelva JSON, puede producir salida con campos faltantes, tipos de valor incorrectos, campos extra que tu código posterior no espera, valores alucinados fuera de los rangos permitidos, o fragmentos de texto alrededor del bloque JSON que rompen el parseo por completo.

Los cinco modos de fallo de la salida de LLM sin validar

  • Fallo de parseo: El modelo envuelve el JSON en vallas de código markdown, añade comentarios antes o después, o produce JSON malformado que no puede parsearse.
  • Campos requeridos faltantes: El modelo omite un campo que se le pidió rellenar, provocando un KeyError o un error de referencia nula en el código posterior.
  • Violaciones de tipo: Un campo que se esperaba numérico llega como cadena, o un booleano llega como la cadena "true" en lugar del literal `true`.
  • Violaciones de restricciones de valor: Un campo de calificación devuelve 11 cuando el rango permitido es 1-10, o un campo enum devuelve un valor fuera de la lista definida.
  • Estructura alucinada: El modelo inventa campos adicionales o anida objetos de forma distinta a como especifica el esquema.

Cualquiera de estos fallos puede corromper silenciosamente datos posteriores, provocar excepciones en tiempo de ejecución o dejar que valores incorrectos se propaguen a la lógica de negocio. Para prototipos de bajo riesgo, el parseo optimista es aceptable. Para pipelines de producción — extracción de facturas, parseo de datos clínicos, señales de detección de fraude, enriquecimiento de registros de clientes — cada violación de campo es un problema de calidad de datos que hay que detectar y gestionar.

El contrato entre tu aplicación y el LLM es tan fuerte como la validación que apliques a cada respuesta. Esperar no es una estrategia de validación.

- Filosofía de la documentación de Guardrails AI

Warning

Incluso los modelos con modos nativos de salida estructurada (como `response_format: json_schema` de OpenAI) solo garantizan JSON sintácticamente válido que coincida con la forma del esquema de nivel superior. No validan que un campo `rating` esté entre 1 y 5, que un campo `email` contenga una dirección de correo real, ni que un campo `status` sea uno de tus valores enum definidos. La validación semántica a nivel de campo siempre requiere una capa adicional.

JSON Schema como contrato de validación

JSON Schema es el lenguaje que Guardrails AI usa para describir el aspecto de una respuesta LLM válida. Una definición JSON Schema especifica la estructura esperada del objeto: qué campos existen, sus tipos, cuáles son obligatorios y qué restricciones aplican a sus valores. Este esquema cumple dos propósitos: indica a Guardrails cómo validar la respuesta parseada, y Guardrails lo usa para construir la instrucción de prompt que le dice al modelo qué forma producir.

Qué cubre JSON Schema para la validación de LLM

Para los casos de uso de salida estructurada, las palabras clave de JSON Schema más útiles son la aplicación de tipos, las listas de campos requeridos, los valores enum, los formatos de cadena y los rangos numéricos. Juntas cubren la mayoría de las reglas a nivel de campo que una tarea de extracción o generación necesita aplicar.

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 le dice a Guardrails que rechace cualquier respuesta donde `rating` esté fuera de 1-5, `sentiment` no sea uno de los tres valores permitidos, o `summary` tenga menos de 20 caracteres. Los campos listados en `required` deben estar presentes. `additionalProperties: false` rechaza cualquier campo extra que el modelo añada por su cuenta.

Generar un esquema a partir de una respuesta de ejemplo

Al diseñar una nueva tarea de extracción, obtener el esquema inicial correcto lleva tiempo. Un atajo práctico: ejecuta tu prompt una vez sin validación, examina el JSON crudo que devuelve el modelo y luego usa el Generador de JSON Schema para inferir automáticamente un esquema Draft-07 a partir de esa muestra. El esquema generado captura tipos, campos requeridos y estructura anidada. Después lo refinas: ajustando longitudes de cadena, añadiendo restricciones enum, fijando límites numéricos, en lugar de escribir cada palabra clave desde cero.

Generador de JSON Schema

Pega cualquier payload JSON y obtén automáticamente un esquema completo Draft-07 o Draft 2020-12 — local en el navegador, sin subidas, sin registro.

Open tool

Tip

Usa `additionalProperties: false` en todos los esquemas de Guardrails. Sin él, un modelo puede añadir campos como `"confidence": 0.9` o `"notes": "..."` que pasan la validación silenciosamente pero contaminan tu modelo de datos. Los esquemas estrictos producen resultados de extracción más limpios porque el modelo no puede descargar la incertidumbre en campos inventados.

Cómo valida Guardrails AI la salida

Entender el pipeline de validación te ayuda a depurar fallos y configurar la estrategia de respuesta correcta para cada campo. El pipeline se ejecuta en un orden fijo en cada llamada al Guard: inyección de prompt, parseo de respuesta, validación JSON Schema, ejecución de validadores a nivel de campo y ensamblado del resultado.

1

Inyección de prompt

Antes de enviar el prompt al LLM, Guardrails añade un bloque de instrucciones estructurado derivado de tu esquema. Este bloque describe el formato de salida esperado, lista los campos requeridos con sus tipos y restricciones, y (cuando reask está activo) incluye los errores de validación del intento anterior. La inyección es transparente: escribes tu prompt de tarea con normalidad y Guardrails se encarga de las instrucciones de formato.

2

Parseo de la respuesta

Después de que el modelo responde, Guardrails extrae el JSON de la salida. Gestiona los hábitos de formato habituales de los modelos: eliminar vallas de código markdown, recortar prosa antes o después del bloque JSON y corregir problemas de sintaxis menores. Si la salida no puede parsearse a un dict de Python, el Guard dispara inmediatamente un reask con un mensaje de error de parseo en lugar de lanzar una excepción.

3

Validación JSON Schema

El dict parseado se valida contra tu JSON Schema mediante un validador compatible con los estándares. Las violaciones de tipo, los campos requeridos faltantes, las discrepancias de enum y las violaciones de rango producen objetos de error estructurados en esta etapa. Puedes probar tu esquema contra un payload candidato de forma independiente usando el Validador de JSON Schema antes de conectarlo a un Guard.

4

Ejecución de validadores a nivel de campo

Tras pasar la comprobación del JSON Schema, los validadores registrados de cada campo se ejecutan en orden. Los validadores integrados incluyen `ValidChoices`, `ValidRange`, `ValidURL`, `NoRefusal`, `ToxicLanguage`, `PIIFilter` y decenas más del Hub. Los validadores personalizados son funciones Python simples decoradas con `@register_validator`. Cada validador devuelve un `PassResult` o un `FailResult` con un mensaje de error legible.

5

Ensamblado del resultado y reask

Guardrails ensambla un `ValidationOutcome` que contiene el dict de salida validada, un booleano `validation_passed` y una lista de errores de campo. Si la validación falló y `num_reasks` es mayor que cero, el pipeline vuelve al Paso 1 con los errores de validación inyectados en el prompt, dando al modelo la oportunidad de corregir su salida. Cada ronda de reask decrementa el contador de reintentos.

Acción on_failQué haceIdeal para
exceptionLanza ValidationError inmediatamenteRequisitos duros: fallar rápido
reaskVuelve a prompting al modelo con el contexto del errorLa mayoría de casos de salida estructurada
fixAplica una función de corrección automáticamenteNormalización (recortar, minúsculas, conversión)
filterElimina el campo fallido de la salidaCampos de enriquecimiento opcionales
refrainDevuelve None para toda la llamada al GuardFlujos de respaldo conservadores
noopRegistra el fallo pero continúaPipelines de logging y observabilidad

Especificaciones Rail e integración con Pydantic

Guardrails AI admite dos estilos de definición de esquemas: el formato heredado Rail spec y el enfoque moderno de modelos Pydantic. Conocer ambos es útil porque encontrarás Rail specs en bases de código antiguas y ejemplos de la comunidad, mientras que Pydantic es el camino recomendado para todos los proyectos nuevos desde Guardrails v0.4+.

Modelos Pydantic como esquemas de Guard

La forma más limpia de definir un esquema de salida de Guardrails en Python es una subclase de `BaseModel` de Pydantic. Los modelos de Pydantic tienen exportación nativa a JSON Schema, comprobación de tipos en el IDE y una sintaxis de Python familiar. Adjuntas validadores de Guardrails usando `Field()` de Pydantic con metadatos personalizados, o importando clases de validadores directamente desde `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)

El pipeline de Pydantic a JSON Schema

Bajo el capó, Guardrails llama a `model.model_json_schema()` para exportar tu modelo Pydantic como JSON Schema, y luego usa ese esquema tanto para la inyección de prompt como para la validación de la respuesta. Esto significa que cada modelo Pydantic que puedas escribir es automáticamente un contrato de Guardrails válido. Puedes inspeccionar el esquema generado tú mismo: pega una respuesta de muestra en el Generador de JSON Schema para ver el esquema equivalente y compáralo con la salida de tu modelo Pydantic.

Si tu aplicación está en TypeScript pero llama a un servicio Guardrails de Python, el Convertidor de JSON a Zod Schema genera un esquema Zod equivalente a partir del mismo JSON de muestra — útil para validar el mismo contrato en el lado del cliente sin duplicar manualmente la definición del esquema.

Rail specs: el formato heredado

Las Rail specs son archivos XML donde cada elemento `<output>` describe un campo con un atributo `type` y uno o más elementos hijo `<validator>`. Anteceden a la integración con Pydantic y son menos ergonómicos para desarrolladores Python, pero siguen completamente soportados. Si heredas una base de código Guardrails que usa archivos `.rail`, puedes migrar cada especificación a un modelo Pydantic de forma incremental: el comportamiento de validación es equivalente.

Note

Puedes convertir una Rail spec existente a su equivalente JSON Schema llamando a `guard.json_function_calling_schema` sobre un Guard construido a partir del archivo `.rail`. Esto es útil para migrar a Pydantic o para depurar qué esquema está inyectando realmente el Guard en el prompt.

Flujo de trabajo práctico y cadena de herramientas

Un flujo de trabajo de Guardrails fiable combina diseño de esquemas sin conexión, pruebas locales y monitoreo en producción. La fase de diseño del esquema — donde defines el aspecto de una salida válida — es el paso más importante y el que más se beneficia de herramientas dedicadas.

Paso 1: Diseña el esquema sin conexión

Antes de escribir cualquier código de Guardrails, define tu esquema de salida como un documento JSON Schema independiente. Trabajar primero en JSON Schema te permite iterar sobre el contrato de forma independiente a la llamada al LLM: puedes validar payloads de muestra, ajustar restricciones y confirmar que el esquema es correcto antes de gastar créditos de API en pruebas.

El Validador de JSON Schema de Aback Tools permite pegar un JSON Schema y un payload candidato, y ver inmediatamente los errores de validación a nivel de campo. Úsalo para confirmar que tus arrays `required`, listas enum y rangos numéricos se comportan como esperas antes de traducir el esquema a un modelo Pydantic. El Formateador y Validador JSON es útil para comprobar que tu propio archivo de esquema es JSON sintácticamente válido antes de referenciarlo.

Paso 2: Genera Pydantic desde JSON

Si has recogido respuestas LLM de muestra durante el prototipado, el Convertidor de JSON a Dataclass / Pydantic de Python genera un modelo Pydantic a partir de un payload JSON de muestra en un paso. La herramienta infiere los tipos de campo, maneja objetos anidados y aplica `Optional` donde los campos pueden ausentarse. Usa la salida como punto de partida y añade validadores de Guardrails a cada campo según las restricciones de tu JSON Schema.

Paso 3: Prueba localmente con respuestas simuladas

Los Guards de Guardrails pueden llamarse con cualquier callable de Python, no solo con APIs de LLM en vivo. Durante el desarrollo, pasa una función simulada que devuelva una respuesta de cadena fija para probar el pipeline de validación sin llamadas a la API. Esto hace que iterar sobre cambios de esquema, configuraciones de validadores y prompts de reask sea rápido y gratuito antes de conectarte a un endpoint de modelo de pago.


Flujo de esquemas recomendado con Aback Tools

Validador de JSON Schema

Valida cualquier payload JSON contra un esquema con errores reportados a nivel de campo — local en el navegador, sin subidas, resultados instantáneos.

Open tool

Casos límite y limitaciones

Guardrails AI mejora significativamente la fiabilidad de la salida estructurada, pero no es una garantía de corrección. Entender las limitaciones te ayuda a diseñar tu pipeline con respaldos apropiados en lugar de confiar incondicionalmente en el Guard.

Los bucles de reask no siempre convergen

Cuando un modelo falla consistentemente un validador específico, añadir más reintentos reask no ayuda: solo cuesta más créditos de API por el mismo resultado. Algunos modos de fallo son sistemáticos: el modelo genuinamente no entiende una restricción, o la restricción es demasiado estricta para que el modelo la satisfaga de forma fiable dado el input. Audita tus tasas de fallo de validadores y trata los validadores con alta tasa de fallo como señales para revisar la definición de la restricción o el prompt.

JSON Schema no captura errores semánticos

Un esquema puede confirmar que `sentiment` es uno de `["positive", "neutral", "negative"]`, pero no puede verificar que el sentimiento asignado sea realmente correcto para el texto de entrada. JSON Schema y los validadores aplican contratos estructurales y sintácticos: no pueden reemplazar la revisión humana ni las comprobaciones de calidad posteriores para la exactitud del contenido. Usa Guardrails para aplicar el formato y la estructura de la salida, y aplica métricas de evaluación separadas para la corrección del contenido.

Sobrecarga de latencia y coste

Cada intento de reask es una llamada adicional a la API del LLM a coste completo de tokens. Para un Guard configurado con `num_reasks=3`, una extracción en el peor caso puede disparar cuatro llamadas al LLM antes de fallar. En pipelines de alto rendimiento, esta sobrecarga es significativa. Perfila la tasa de reask de tu Guard en staging antes de desplegar a producción, y establece `num_reasks=0` para campos no críticos donde las acciones on_fail `filter` o `noop` son alternativas aceptables al reintento.

LimitaciónImpactoMitigación
Los bucles reask no convergenCréditos de API desperdiciados en fallos conocidosAudita las tasas de fallo de validadores; simplifica las restricciones
Errores semánticos no detectadosValores incorrectos que pasan las comprobaciones estructuralesAplica métricas de evaluación de contenido separadas
Latencia por reasksHasta 4× el coste por llamada fallidaPerfila la tasa de reask; usa filter/noop en campos no críticos
Sin validación entre camposNo puede imponer campo A > campo BUsa una función Python de post-validación para reglas entre campos
Sensibilidad al prompt del proveedorEl formato de inyección afecta al cumplimiento del modeloPrueba varios formatos de prompt; usa modos nativos de salida estructurada

Warning

Nunca uses Guardrails como única salvaguarda para decisiones de alto riesgo. Una salida estructurada que pasa todas las comprobaciones de esquema y validadores sigue basándose en una inferencia del modelo que podría estar equivocada. Guardrails aplica el **formato** de la salida, no su **exactitud factual**. Aplica revisión humana o verificación posterior para cualquier salida que impulse acciones irreversibles.

Tip

Para reglas de validación entre campos que JSON Schema no puede expresar — por ejemplo, asegurar que `end_date` sea siempre posterior a `start_date` — añade un validador de modelo Pydantic posterior al Guard usando `@model_validator(mode='after')`. Esto se ejecuta después de que Guardrails devuelva el dict validado y te da toda la lógica de Python para comprobaciones entre campos sin necesidad de un validador personalizado de Guardrails.

Key takeaways

  • Guardrails AI envuelve las llamadas al LLM con una capa de validación JSON Schema y validadores a nivel de campo, repitiendo el prompt automáticamente cuando la salida falla la validación.
  • JSON Schema define el contrato estructural: tipos de campo, campos requeridos, valores enum y rangos numéricos. Genera un esquema inicial a partir de un payload de muestra con el Generador de JSON Schema.
  • El mecanismo reask repite el prompt al LLM con contexto de error estructurado, configurable por llamada con `num_reasks`. Tasas de reask altas señalan restricciones demasiado estrictas o un prompt desalineado.
  • Los modelos Pydantic son el formato de esquema recomendado en Guardrails v0.4+: se exportan a JSON Schema automáticamente y se integran con la comprobación de tipos de Python y las herramientas del IDE.
  • Usa `additionalProperties: false` en cada esquema para impedir que el modelo añada campos inventados que pasan la validación silenciosamente pero corrompen tu modelo de datos.
  • JSON Schema aplica estructura, no corrección semántica: aplica métricas de evaluación separadas para la exactitud del contenido junto a la validación de esquemas de Guardrails.
  • Valida tu JSON Schema y payloads candidatos sin conexión con el Validador de JSON Schema antes de conectar cualquier Guard a un pipeline de LLM en vivo.

Preguntas frecuentes

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