Перейти к содержанию

JSON-схема

JsonSchemaMetric проверяет, что фактический вывод является валидным JSON и соответствует указанной JSON-схеме.

Как это работает

  1. Парсит фактический вывод как JSON
  2. Валидирует разобранный JSON по предоставленной схеме с помощью библиотеки jsonschema
  3. Возвращает 1.0, если валидация пройдена, 0.0, если вывод не является валидным JSON или не соответствует схеме

Параметры

Параметр Тип По умолчанию Описание
threshold float 1.0 Минимальный балл для прохождения
schema dict обязательный Определение JSON-схемы (соответствует спецификации JSON Schema)

Обязательные поля

Поле Обязательно
input Нет
actual_output Да (должен быть валидным JSON)
expected_output Нет

Зависимости

Эта метрика требует библиотеку jsonschema:

pip install jsonschema

Использование

from eval_lib.metrics import JsonSchemaMetric
from eval_lib.test_case import EvalTestCase
import asyncio

test_case = EvalTestCase(
    input="Верните информацию о пользователе в формате JSON",
    actual_output='{"name": "Алиса", "age": 30, "email": "alice@example.com"}'
)

metric = JsonSchemaMetric(
    threshold=1.0,
    schema={
        "type": "object",
        "properties": {
            "name": {"type": "string"},
            "age": {"type": "integer"},
            "email": {"type": "string", "format": "email"}
        },
        "required": ["name", "age", "email"]
    }
)
result = asyncio.run(metric.evaluate(test_case))
print(result.score)  # 1.0

Примеры сценариев

Прошел (1.0)

metric = JsonSchemaMetric(schema={
    "type": "array",
    "items": {"type": "string"},
    "minItems": 1
})
EvalTestCase(
    input="Верните список цветов",
    actual_output='["красный", "зеленый", "синий"]'
)
# Валидный JSON-массив строк с хотя бы одним элементом

Не прошел (0.0) — невалидный JSON

metric = JsonSchemaMetric(schema={"type": "object"})
EvalTestCase(
    input="Верните JSON",
    actual_output="Это не JSON"
)
# Вывод не может быть разобран как JSON

Не прошел (0.0) — нарушение схемы

metric = JsonSchemaMetric(schema={
    "type": "object",
    "required": ["name", "age"]
})
EvalTestCase(
    input="Верните информацию о пользователе",
    actual_output='{"name": "Алиса"}'
)
# Отсутствует обязательное поле "age"