Как это работает
Типичные поломки: модель добавляет пояснение до или после JSON, оборачивает его в блок разметки, пропускает обязательное поле, выдаёт значение не из списка допустимых или неверный тип. Часть провайдеров умеет ограничивать вывод схемой, но проверку на стороне приложения всё равно нужно оставлять.
Валидация по схеме отвечает на вопрос о структуре, но не о смысле: значение может быть допустимым и при этом неверным. Поэтому для содержимого полей нужны отдельные проверки или судья.
Пример
1import json
2from jsonschema import validate
3
4SCHEMA = {
5 "type": "object",
6 "required": ["intent", "confidence"],
7 "properties": {
8 "intent": {"enum": ["refund", "delivery", "other"]},
9 "confidence": {"type": "number", "minimum": 0, "maximum": 1},
10 },
11 "additionalProperties": False,
12}
13
14def test_answer_is_valid_json():
15 raw = classify("Хочу вернуть куртку")
16 validate(json.loads(raw), SCHEMA) # бросит исключение, если схема нарушенаКак применять в тестировании ИИ
Прогоните набор входов, включая неполные и вредные запросы, и проверьте, что вывод на каждом из них парсится и проходит схему. Отдельно проверьте поведение при ошибках: пустой ответ, обрезанный JSON, лишний текст.
Типичные ошибки
- Проверять только json.loads: разбор проходит, а обязательного поля нет.
- Схема слишком мягкая: без required, enum и additionalProperties она пропускает мусор.
- Не тестировать ситуации, когда модель добавляет текст вокруг JSON.
Частые вопросы
Как проверить, что JSON от LLM не сломан?
Разберите ответ парсером и проверьте его по JSON Schema: обязательные поля, типы, допустимые значения и запрет лишних полей. Отдельно тестируйте краевые случаи: лишний текст вокруг JSON, обрезанный ответ, пустое значение.
Достаточно ли json.loads для проверки ответа?
Нет. Он проверяет только синтаксис. Ответ может быть валидным JSON, но без нужного поля или с недопустимым значением, поэтому нужна проверка по схеме.