JFBench — CLI-инструмент для бенчмаркинга LLM-моделей на задаче извлечения и приведения сырого текста к целевому JSON-формату по заранее заданным схемам и кейсам.
Проект ориентирован на воспроизводимые прогоны:
- данные кейсов и схем лежат в файловой структуре;
- конфигурация прогона задается через
csv/xlsx; - результаты сохраняются в отчет (
csvилиxlsx) с метриками качества.
JFBench помогает сравнивать модели в одинаковых условиях:
- одна и та же входная выборка (
cases); - одна и та же JSON Schema (
schemas); - одинаковые системные промпты (
prompts); - измеримые метрики похожести (
similarity,field_match,value_match).
Это удобно для:
- выбора модели под конкретный формат данных;
- регрессионного контроля качества при смене модели;
- документирования результатов экспериментов.
- Python
>=3.13 - пакетный менеджер и раннер:
uv - CLI:
click - валидация JSON Schema:
jsonschema - табличные данные и экспорт:
polars - тесты:
pytest - линт/форматирование:
ruff
git clone <repo-url>
cd jfb
uv sync --devuv run jfb --helpПосле установки в pyproject.toml зарегистрирован скрипт:
jfb = "models.cli:main"
Создает структуру каталогов (cases, schemas, runs, prompts):
uv run jfb --new /absolute/path/to/benchmarkuv run jfb PATH PROVIDER RUN_CONFIG OUTPUT_PATH [OPTIONS]Где:
PATH— путь к корневой директории кейсов.PROVIDER— провайдер из enum приложения (сейчас:lmstudio).RUN_CONFIG— путь кcsv/xlsxконфигу прогона.- если передан относительный путь и файл не найден в текущей директории, он ищется в
PATH/runs. - имя файла без расширения используется как
run_nameв отчете.
- если передан относительный путь и файл не найден в текущей директории, он ищется в
OUTPUT_PATH— файл результата (.csvили.xlsx).
Опции:
--api-host— адрес провайдера в форматеhost:port(по умолчаниюlocalhost:1234).-v,-vv— уровень подробности логов.--quiet— только ошибки.--log-level— явный уровень (DEBUG|INFO|WARNING|ERROR|CRITICAL).
Пример:
uv run jfb /absolute/path/to/benchmark lmstudio demo.csv /absolute/path/to/results.csv --api-host localhost:1234 -vbenchmark/
cases/
schemas/
prompts/
runs/
{
"raw": "Сырой текст для обработки моделью",
"expected_value": {
"answer": "ok"
},
"schema": "answer.schema.json"
}Поля:
raw— исходный текст для модели;expected_value— эталонный JSON;schema— имя файла схемы (изschemas/).
Обычная JSON Schema (draft 2020-12), которая:
- передается в модель как
response_format; - используется для валидации ответа модели.
Системный промпт для конкретного кейса.
Обязательные колонки:
model_idcase_name
Пример csv:
model_id,case_name
model-a,invoice_case
model-b,invoice_caseДля каждой строки run_config:
- Загружается кейс (
cases/<case_name>.json). - Загружается и компилируется схема (с кешированием).
- Загружается системный промпт (с кешированием).
- Выполняется запрос к LLM-провайдеру.
- Ответ валидируется по JSON Schema.
- Считаются метрики похожести относительно
expected_value. - Формируется строка отчета.
На выходе формируется таблица с полями:
- идентификатор/имя прогона;
- кейс, модель, схема;
similarity,field_match,value_matchи счетчики;- время ответа;
- эталон, фактический результат и текст ошибки (если была).
- Создать ветку:
git checkout -b codex/<short-feature-name>- После правок прогнать форматтер и линтер:
uv run ruff format <changed_paths>
uv run ruff check <changed_paths>- Прогнать целевые тесты, затем полный набор:
uv run pytest -q tests/<target_test>.py
uv run pytest -q tests- Если затрагивалась типизация клиентов:
uv run pyright tests/test_llm_clients.pyuv run pre-commit install
uv run pre-commit run --all-filessrc/models/case.py— управление директориями кейсов, загрузкаcaseиrun_config.src/models/llm_clients/— адаптеры провайдеров (сейчас LMStudio).src/models/repositories/— кеши схем/промптов и LRU-кеш.src/models/estimator.py— вычисление метрик похожести.src/models/report.py— генерация отчета.src/models/cli.py— orchestration CLI-пайплайна.tests/— unit-тесты.
- На текущем этапе поддерживается провайдер
lmstudio. --api-hostдолжен быть строго в форматеhost:port(безhttp://).- Для чтения
xlsxrun-config может потребоваться дополнительная зависимостьfastexcel(ограничениеpolars.read_excel). OUTPUT_PATHподдерживает только.csvи.xlsx.
Пока не определена. Добавьте файл LICENSE при необходимости.