Перейти к содержимому
Aback Tools Logo

Guardrails AI: Валидация структурированного вывода с JSON Schema

Как Guardrails AI валидирует структурированный вывод LLM: пять режимов отказа невалидированных ответов, контракты JSON Schema, интеграция с Pydantic, повторные запросы reask, действия on_fail и бесплатная цепочка инструментов для схем.

DH
Tutorials & How-Tos13 мин чтения2,800 слов

Языковые модели вероятностны — они не гарантируют, что их вывод будет корректным JSON, содержать все обязательные поля или уважать ограничения значений, от которых зависит ваше приложение. Guardrails AI решает это, оборачивая вызовы LLM слоем валидации на основе JSON Schema и Python-валидаторов и автоматически повторяя запрос, когда модель выдаёт несоответствующий вывод. Это руководство объясняет, как именно это работает, и как построить надёжный пайплайн структурированного вывода с нуля.

JSON SchemaОсновной формат контрактаDraft-07 и 2020-12
reaskМеханизм автоповтораНастраиваемое число попыток
0 загрузокИнструменты для схемСхемные инструменты локально в браузере

Что такое Guardrails AI?

Guardrails AI — это open-source библиотека Python, созданная, чтобы сделать выводы LLM надёжными и предсказуемыми. Она оборачивает любой вызов LLM API — OpenAI, Anthropic, Cohere, локальные модели — пайплайном валидации, который проверяет ответ модели по заданному пользователем схеме и набору валидаторов на уровне полей, прежде чем вернуть результат в код вашего приложения.

Ключевая абстракция — объект `Guard`. Вы создаёте Guard из модели Pydantic или определения JSON Schema, при желании прикрепляете валидаторы к отдельным полям, а затем вызываете Guard вместо прямого вызова LLM. Guard берёт на себя построение промпта, парсинг ответа, валидацию и автоматический повторный промпт при провале валидации — всё в одном проверяемом пайплайне.

Место Guardrails AI в стеке LLM

Guardrails стоит между вашим прикладным кодом и провайдером LLM. Он не заменяет модель и не меняет способ вызова модели — он добавляет слой принудительного исполнения контракта вокруг вызова. Думайте о нём как о валидаторе схем для ответов API, только «API» здесь — языковая модель, порождающая естественный язык, а «ответ» нужно распарсить в структурированные данные, прежде чем валидировать.

  • Guard: главный интерфейс — оборачивает вызов LLM и применяет схему + валидаторы.
  • ValidationOutcome: объект результата, возвращаемый вызовом Guard — содержит валидированный вывод, статус успеха/провала и ошибки полей.
  • Validator: вызываемый объект, прикреплённый к полю схемы и обеспечивающий конкретное правило (тип, диапазон, regex, внешняя проверка).
  • reask: механизм повтора — при провале валидации Guardrails повторяет промпт модели с контекстом ошибки.
  • Hub: реестр валидаторов Guardrails — курированный набор общественных валидаторов, устанавливаемых через `guardrails hub install`.

Note

Guardrails AI — не то же самое, что нативный режим структурированного вывода OpenAI (`response_format: json_object`) и tool-use API Anthropic. Эти функции провайдеров обеспечивают базовый синтаксис JSON, но не валидируют значения полей, не запускают пользовательские валидаторы и не реализуют логику повторов. Guardrails добавляет всё это сверху и работает с любым провайдером.

Почему выводу LLM нужна валидация

Фундаментальная проблема в том, что языковые модели обучены порождать правдоподобный текст, а не соблюдать программные контракты. Даже когда вы просите модель вернуть JSON, она может выдать вывод с отсутствующими полями, неверными типами значений, лишними полями, которых не ожидает ваш последующий код, галлюцинированными значениями вне допустимых диапазонов или текстовыми фрагментами вокруг JSON-блока, ломающими парсинг целиком.

Пять режимов отказа невалидированного вывода LLM

  • Сбой парсинга: модель оборачивает JSON в markdown-кодовые ограждения, добавляет комментарии до или после либо выдаёт искажённый JSON, который нельзя распарсить.
  • Отсутствуют обязательные поля: модель пропускает поле, которое просили заполнить, вызывая KeyError или ошибку нулевой ссылки в последующем коде.
  • Нарушения типов: поле, ожидаемое числом, приходит строкой, или boolean приходит строкой "true" вместо литерала `true`.
  • Нарушения ограничений значений: поле рейтинга возвращает 11, когда допустимый диапазон 1-10, или enum-поле возвращает значение вне заданного списка.
  • Галлюцинированная структура: модель выдумывает дополнительные поля или вкладывает объекты иначе, чем предписывает схема.

Любой из этих сбоев может тихо испортить последующие данные, вызвать исключения во время выполнения или позволить плохим значениям просочиться в бизнес-логику. Для несерьёзных прототипов оптимистичный парсинг приемлем. Для продакшен-пайплайнов — извлечение счетов, парсинг клинических данных, сигналы детекции мошенничества, обогащение карточек клиентов — каждое нарушение поля является проблемой качества данных, которую нужно ловить и обрабатывать.

Контракт между вашим приложением и LLM ровно настолько прочен, насколько строга валидация, которую вы применяете к каждому ответу. Надежда — не стратегия валидации.

- Философия документации Guardrails AI

Warning

Даже модели с нативными режимами структурированного вывода (например, `response_format: json_schema` у OpenAI) гарантируют лишь синтаксически корректный JSON, соответствующий форме схемы верхнего уровня. Они не проверяют, что поле `rating` между 1 и 5, что поле `email` содержит настоящий адрес, или что поле `status` равно одному из ваших enum-значений. Семантическая валидация на уровне полей всегда требует дополнительного слоя.

JSON Schema как контракт валидации

JSON Schema — язык, которым Guardrails AI описывает, как выглядит корректный ответ LLM. Определение JSON Schema задаёт ожидаемую структуру объекта: какие поля существуют, их типы, какие обязательны и какие ограничения применяются к значениям. Эта схема решает две задачи: она говорит Guardrails, как валидировать распарсенный ответ, и Guardrails использует её для построения инструкции промпта, сообщающей модели, какую форму выдавать.

Что JSON Schema покрывает для валидации LLM

Для случаев структурированного вывода самые полезные ключевые слова JSON Schema — контроль типов, списки обязательных полей, значения enum, форматы строк и числовые диапазоны. Вместе они покрывают большинство правил уровня полей, которые нужно обеспечить задачам извлечения или генерации.

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
    }
  }
}

Эта схема велит Guardrails отклонять любой ответ, где `rating` вне 1-5, `sentiment` не равен одному из трёх допустимых значений, или `summary` короче 20 символов. Поля, перечисленные в `required`, должны присутствовать. `additionalProperties: false` отклоняет любые дополнительные поля, которые модель добавляет самовольно.

Генерация схемы из примера ответа

При проектировании новой задачи извлечения выработка правильной исходной схемы требует времени. Практический сокращённый путь: запустите промпт один раз без валидации, изучите сырой JSON, который вернёт модель, а затем используйте Генератор JSON Schema, чтобы автоматически вывести схему Draft-07 из этой выборки. Сгенерированная схема захватывает типы, обязательные поля и вложенную структуру. Затем вы её дорабатываете — ужесточаете длины строк, добавляете enum-ограничения, задаёте числовые границы — вместо того чтобы писать каждое ключевое слово с нуля.

Генератор JSON Schema

Вставьте любой JSON-пayload и автоматически получите полную схему Draft-07 или Draft 2020-12 — локально в браузере, без загрузок, без регистрации.

Open tool

Tip

Используйте `additionalProperties: false` в каждой схеме Guardrails. Без него модель может добавить поля вроде «confidence»: 0.9 или «notes»: «...», которые тихо проходят валидацию, но засоряют вашу модель данных. Строгие схемы дают более чистые результаты извлечения, потому что модель не может сбрасывать неопределённость в выдуманные поля.

Как Guardrails AI валидирует вывод

Понимание пайплайна валидации помогает отлаживать сбои и настраивать правильную стратегию реагирования для каждого поля. Пайплайн выполняется в фиксированном порядке при каждом вызове Guard: инъекция промпта, парсинг ответа, валидация JSON Schema, исполнение валидаторов уровня полей и сборка результата.

1

Инъекция промпта

Перед отправкой промпта в LLM Guardrails добавляет структурированный блок инструкций, выведенный из вашей схемы. Этот блок описывает ожидаемый формат вывода, перечисляет обязательные поля с их типами и ограничениями и (когда reask активен) включает ошибки валидации предыдущей попытки. Инъекция прозрачна — вы пишете рабочий промпт как обычно, а Guardrails занимается инструкциями по форматированию.

2

Парсинг ответа

После ответа модели Guardrails извлекает JSON из вывода. Он обрабатывает типичные привычки форматирования моделей: снимает markdown-ограждения кода, обрезает прозу до или после JSON-блока и исправляет мелкие синтаксические проблемы. Если вывод невозможно распарсить в Python-dict, Guard немедленно запускает reask с сообщением об ошибке парсинга вместо выброса исключения.

3

Валидация JSON Schema

Распарсенный dict валидируется по вашему JSON Schema стандартным валидатором. Нарушения типов, отсутствующие обязательные поля, несоответствия enum и выходы за диапазон дают на этом этапе структурированные объекты ошибок. Вы можете заранее независимо проверить свою схему на кандидате-пейлоаде с помощью Валидатора JSON Schema, прежде чем встраивать её в Guard.

4

Исполнение валидаторов уровня полей

После прохождения проверки JSON Schema последовательно запускаются зарегистрированные валидаторы каждого поля. Встроенные валидаторы включают `ValidChoices`, `ValidRange`, `ValidURL`, `NoRefusal`, `ToxicLanguage`, `PIIFilter` и десятки других из Hub. Пользовательские валидаторы — обычные Python-функции, декорированные `@register_validator`. Каждый валидатор возвращает `PassResult` или `FailResult` с человекочитаемым сообщением об ошибке.

5

Сборка результата и reask

Guardrails собирает `ValidationOutcome`, содержащий валидированный словарь вывода, булево `validation_passed` и список ошибок полей. Если валидация провалилась и `num_reasks` больше нуля, пайплайн возвращается к шагу 1 с ошибками валидации, инжектированными в промпт, давая модели шанс исправить вывод. Каждый круг reask уменьшает счётчик повторов.

Действие on_failЧто делаетЛучше всего для
exceptionНемедленно выбрасывает ValidationErrorЖёсткие требования — быстрый провал
reaskПовторяет промпт модели с контекстом ошибкиБольшинство случаев структурированного вывода
fixАвтоматически применяет функцию исправленияНормализация (обрезка, нижний регистр, приведение)
filterУдаляет сбойное поле из выводаОпциональные поля обогащения
refrainВозвращает None для всего вызова GuardКонсервативные запасные сценарии
noopФиксирует сбой, но продолжаетПайплайны логирования и наблюдаемости

Спецификации Rail и интеграция с Pydantic

Guardrails AI поддерживает два стиля определения схем: устаревший формат Rail spec и современный подход с моделями Pydantic. Знать оба полезно, потому что Rail-спецификации встретятся вам в старых кодовых базах и примерах сообщества, а Pydantic — рекомендуемый путь для всех новых проектов начиная с Guardrails v0.4+.

Модели Pydantic как схемы Guard

Самый чистый способ определить схему вывода Guardrails в Python — подкласс `BaseModel` из Pydantic. Модели Pydantic имеют нативный экспорт в JSON Schema, проверку типов в IDE и привычный синтаксис Python. Валидаторы Guardrails прикрепляются через `Field()` из Pydantic с пользовательскими метаданными либо прямым импортом классов валидаторов из `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)

Пайплайн Pydantic → JSON Schema

Под капотом Guardrails вызывает `model.model_json_schema()`, чтобы экспортировать вашу модель Pydantic в JSON Schema, и затем использует эту схему как для инъекции промпта, так и для валидации ответа. Это значит, что любая модель Pydantic, которую вы можете написать, автоматически является корректным контрактом Guardrails. Вы можете сами осмотреть сгенерированную схему — вставьте пример ответа в Генератор JSON Schema, чтобы увидеть эквивалентную схему, и сравните её с выводом вашей Pydantic-модели.

Если ваше приложение на TypeScript, но вызывает Python-сервис Guardrails, Конвертер JSON в Zod Schema генерирует соответствующую схему Zod из того же примера JSON — полезно для валидации того же контракта на стороне клиента без ручного дублирования определения схемы.

Rail-спецификации — устаревший формат

Rail-спецификации — это XML-файлы, где каждый элемент `<output>` описывает поле с атрибутом `type` и одним или несколькими дочерними элементами `<validator>`. Они появились раньше интеграции с Pydantic и менее эргономичны для Python-разработчиков, но по-прежнему полностью поддерживаются. Если вы унаследовали кодовую базу Guardrails с файлами `.rail`, можете мигрировать каждую спецификацию в модель Pydantic постепенно — поведение валидации эквивалентно.

Note

Существующую Rail-спецификацию можно преобразовать в эквивалент JSON Schema, вызвав `guard.json_function_calling_schema` на Guard, построенном из `.rail`-файла. Это полезно для миграции на Pydantic или для отладки того, какую схему Guard фактически инжектирует в промпт.

Практический workflow и цепочка инструментов

Надёжный workflow Guardrails сочетает офлайн-проектирование схем, локальное тестирование и мониторинг в продакшене. Фаза проектирования схемы — где вы определяете, как выглядит корректный вывод, — самый важный шаг, и она больше всего выигрывает от специализированных инструментов.

Шаг 1: Спроектируйте схему офлайн

Прежде чем писать код Guardrails, определите схему вывода как отдельный документ JSON Schema. Работа сначала в JSON Schema позволяет итерировать контракт независимо от вызова LLM — вы можете валидировать примеры пейлоадов, корректировать ограничения и убеждаться в корректности схемы, не тратя кредиты API на тесты.

Валидатор JSON Schema на Aback Tools позволяет вставить JSON Schema и кандидат-пейлоад и сразу увидеть ошибки валидации на уровне полей. Используйте его, чтобы убедиться, что ваши массивы `required`, списки enum и числовые диапазоны работают как ожидается, прежде чем переводить схему в модель Pydantic. JSON Форматировщик и Валидатор полезен, чтобы проверить, что сам файл схемы является синтаксически корректным JSON, прежде чем ссылаться на него.

Шаг 2: Сгенерируйте Pydantic из JSON

Если вы собрали примеры ответов LLM во время прототипирования, Конвертер JSON в Python Dataclass / Pydantic за один шаг генерирует модель Pydantic из примера JSON-пейлоада. Инструмент выводит типы полей, обрабатывает вложенные объекты и применяет `Optional` там, где поля могут отсутствовать. Используйте вывод как отправную точку и добавьте валидаторы Guardrails к каждому полю по ограничениям вашего JSON Schema.

Шаг 3: Тестируйте локально с мок-ответами

Guards в Guardrails можно вызывать с любым вызываемым объектом Python, а не только с живыми API LLM. Во время разработки передайте мок-функцию, возвращающую фиксированный строковый ответ, чтобы протестировать пайплайн валидации без API-вызовов. Это делает быстрые и бесплатные итерации по изменениям схемы, конфигурациям валидаторов и промптам reask до подключения к платному эндпоинту модели.


Рекомендуемый workflow схем с Aback Tools

Валидатор JSON Schema

Валидируйте любой JSON-пейлоад по схеме с отчётами об ошибках на уровне полей — локально в браузере, без загрузок, мгновенные результаты.

Open tool

Крайние случаи и ограничения

Guardrails AI заметно повышает надёжность структурированного вывода, но не гарантирует корректности. Понимание ограничений помогает проектировать пайплайн с подходящими запасными вариантами, а не доверять Guard безусловно.

Циклы reask сходятся не всегда

Когда модель стабильно проваливает конкретный валидатор, добавление повторных reask-попыток не помогает — это лишь стоит больше кредитов API за тот же результат. Некоторые режимы отказа систематичны: модель действительно не понимает ограничение, или ограничение слишком строгое, чтобы модель надёжно его выполняла при данном вводе. Аудитируйте частоты отказов ваших валидаторов и считайте валидаторы с высокой частотой отказов сигналом пересмотреть либо определение ограничения, либо промпт.

JSON Schema не ловит семантические ошибки

Схема может подтвердить, что `sentiment` один из `["positive", "neutral", "negative"]`, но не может проверить, что присвоенная тональность действительно верна для входного текста. JSON Schema и валидаторы обеспечивают структурные и синтаксические контракты — они не заменяют человеческую проверку или последующие проверки качества для точности содержания. Используйте Guardrails для контроля формата и структуры вывода, а для корректности содержания применяйте отдельные метрики оценки.

Накладные расходы на задержку и стоимость

Каждая попытка reask — это дополнительный вызов API LLM по полной токен-стоимости. Для Guard с `num_reasks=3` худший сценарий извлечения может вызвать четыре вызова LLM до провала. В высокопроизводительных пайплайнах эти накладные расходы значительны. Профилируйте частоту reask вашего Guard на стейджинге перед развёртыванием в продакшен и ставьте `num_reasks=0` для некритичных полей, где действия on_fail `filter` или `noop` — приемлемая альтернатива повтору.

ОграничениеВлияниеСмягчение
Циклы reask не сходятсяПотраченные впустую кредиты API на известные сбоиАудит частот отказов валидаторов; упростить ограничения
Семантические ошибки не ловятсяНеверные значения проходят структурные проверкиПрименять отдельные метрики оценки содержания
Задержка из-за reaskДо 4× стоимость за сбойный вызовПрофилировать частоту reask; filter/noop для некритичных полей
Нет валидации между полямиНе может гарантировать поле A > поле BИспользовать Python-функцию пост-валидации для межполевых правил
Чувствительность к промпту провайдераФормат инъекции влияет на соответствие моделиТестировать несколько форматов промптов; использовать нативные режимы структурированного вывода

Warning

Никогда не используйте Guardrails как единственную защиту для решений с высокими ставками. Структурированный вывод, прошедший все проверки схем и валидаторов, всё равно основан на модельной инференции, которая может быть ошибочной. Guardrails обеспечивает **формат** вывода, а не его **фактическую точность**. Применяйте человеческую проверку или последующую верификацию для любого вывода, ведущего к необратимым действиям.

Tip

Для межполевых правил валидации, которые JSON Schema не может выразить — например, гарантии, что `end_date` всегда позже `start_date` — добавьте валидатор модели Pydantic после Guard с `@model_validator(mode='after')`. Он выполняется после того, как Guardrails вернёт валидированный словарь, и даёт полную Python-логику межполевых проверок без необходимости в кастомном валидаторе Guardrails.

Key takeaways

  • Guardrails AI оборачивает вызовы LLM слоем валидации JSON Schema и валидаторами уровня полей, автоматически повторяя промпт, когда вывод проваливает валидацию.
  • JSON Schema определяет структурный контракт — типы полей, обязательные поля, значения enum и числовые диапазоны. Сгенерируйте исходную схему из примера пейлоада с помощью Генератора JSON Schema.
  • Механизм reask повторяет промпт LLM со структурированным контекстом ошибки — настраивается на вызов через `num_reasks`. Высокая частота reask сигнализирует о слишком строгих ограничениях или рассогласованном промпте.
  • Модели Pydantic — рекомендуемый формат схем в Guardrails v0.4+: они автоматически экспортируются в JSON Schema и интегрируются с проверкой типов Python и IDE-инструментами.
  • Используйте `additionalProperties: false` в каждой схеме, чтобы модель не добавляла выдуманные поля, которые тихо проходят валидацию, но портят вашу модель данных.
  • JSON Schema обеспечивает структуру, а не семантическую корректность — применяйте отдельные метрики оценки точности содержания наряду со схемной валидацией Guardrails.
  • Валидируйте ваш JSON Schema и кандидат-пейлоады офлайн с Валидатором JSON Schema, прежде чем подключать какой-либо Guard к живому LLM-пайплайну.

Частые вопросы

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