Валидация JSON и retries на Python: задача Guardrails

Успешный json.loads подтверждает синтаксис JSON, но не наличие обязательных полей и нужные типы. Эти требования проверяются отдельно после разбора объекта.

В Python bool является подклассом int, поэтому проверка числовых типов требует внимания. В упражнении задана упрощённая схема и несколько готовых ответов: обработайте их по порядку без внешних обращений к модели.

Это бесплатное упражнение из платного курса. Проверьте решение без регистрации. Объяснения и последовательная практика — в курсе «LLMOps & Evaluation: из песочницы в продакшн».

Задача: Guardrails — валидируй JSON по схеме и делай ретраи

Цель. Проверить ответы модели по упрощённой JSON-схеме. Нужно принять первый валидный вариант из нескольких попыток (ретраев), либо вернуть, почему не вышло.

Формат ввода

Во все строки подаются валидные UTF-8 тексты.

  1. Схема — JSON-объект вида {"field": "type", ...}, где type ∈ {"str","int","float","bool"}.
  2. Режим strict — 0 или 1. Если 1, то в ответе запрещены лишние поля, не указанные в схеме.
  3. N — целое число попыток (1..5).
  4. Далее N строк — по одной кандидатной JSON-строке (ответ модели) на попытку.

Правила валидации

  • Ответ должен быть валидным JSON-объектом (не массивом/числом и т.п.).
  • Все поля из схемы обязательны.
  • Проверка типов:
    • str — строка;
    • int — целое число (bool недопустим);
    • float — число с плавающей точкой или целое (bool недопустим);
    • bool — логический тип.
  • Если strict = 1, в ответе не должно быть полей, которых нет в схеме.

Логика ретраев

Проверяйте варианты по порядку и примите первый валидный. Если ни один не прошёл — считаем неуспех и возвращаем, что не так у последней попытки.

Формат вывода

Одна минифицированная JSON-строка (без пробелов) со строгим порядком полей:

{"valid":<bool>,"attempts":<int>,"missing_keys":[...],"wrong_types":[...],"extra_keys":[...],"result":<obj|null>}
  • valid — принят ли ответ;
  • attempts — сколько попыток было израсходовано до принятия (или равно N, если не приняли);
  • missing_keys — отсортированный список отсутствующих ключей (для принятого ответа — пустой);
  • wrong_types — отсортированный список ключей с неверным типом;
  • extra_keys — отсортированный список лишних ключей (пусто при strict=0);
  • result — принятый объект, но в любом режиме (strict 0/1) печатайте только поля, объявленные в схеме (лишние поля отбрасывайте); ключи — по алфавиту, минифицированно.

Подсказки

  • Сравнение на степике — точное по stdout.
  • Булевы значения в JSON — true/false.
  • Для канонизации вложенного объекта удобно отсортировать его ключи и печатать с separators=(',',':').

 

РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи