Валидация JSON и retries на Python: задача Guardrails
Успешный json.loads подтверждает синтаксис JSON, но не наличие обязательных полей и нужные типы. Эти требования проверяются отдельно после разбора объекта.
В Python bool является подклассом int, поэтому проверка числовых типов требует внимания. В упражнении задана упрощённая схема и несколько готовых ответов: обработайте их по порядку без внешних обращений к модели.
Это бесплатное упражнение из платного курса. Проверьте решение без регистрации. Объяснения и последовательная практика — в курсе «LLMOps & Evaluation: из песочницы в продакшн».
Задача: Guardrails — валидируй JSON по схеме и делай ретраи
Цель. Проверить ответы модели по упрощённой JSON-схеме. Нужно принять первый валидный вариант из нескольких попыток (ретраев), либо вернуть, почему не вышло.
Формат ввода
Во все строки подаются валидные UTF-8 тексты.
- Схема — JSON-объект вида
{"field": "type", ...}, гдеtype ∈ {"str","int","float","bool"}. - Режим strict —
0или1. Если1, то в ответе запрещены лишние поля, не указанные в схеме. - N — целое число попыток (1..5).
- Далее 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=(',',':').
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- JSON-лог вызовов LLM на Python: задача с проверкой
- Quality Gate для LLM: задача на допуск релиза
- PromptOps: почему хороший промпт требует версий и тестов
- LLM streaming: задержка первого токена и полный ответ
- Retry backoff, Retry-After и jitter: задача на Python
- RAG с цитатами: что проверять автоматическим тестом
