Статья Автор: Деникина Н.В., Деникин А.В.

Кастомный скоринг

Новая функция

Кастомный скоринг: гибкий подсчёт баллов за задачи

Руководство для учителей по настройке правил оценивания на платформе SilverTests

Что такое кастомный скоринг?

Раньше баллы за задачу считались одним способом: пропорционально количеству пройденных тестов. Если в задаче 10 тестов и ученик прошёл 7 — получал 70% от максимального балла.

Теперь вы можете задать собственные правила подсчёта баллов. Например, для задачи ЕГЭ №27 часто нужна такая схема:

Все тесты верны
2 балла
Неверен 1 тест
1 балл
Неверны 2+ тестов
0 баллов

Пропорциональный подсчёт не может дать такой результат. Кастомный скоринг — может.

Как включить?

  1. Откройте редактирование задачи (страница «Новый вопрос с автоматической проверкой»).
  2. Поставьте галочку «Использовать кастомный подсчёт баллов (скоринг)» — появится панель настройки.
  3. Выберите готовый пример из выпадающего списка — JSON-конфиг заполнится автоматически. Либо напишите свой конфиг вручную.
  4. Сохраните задачу. Теперь при проверке решений учеников будут применяться новые правила.
Обратная совместимость
Если галочка не стоит — работает прежняя логика (процент от максимального балла). Все старые задачи продолжают работать без изменений.

Три модели оценивания

Конфиг скоринга — это текст в формате JSON. В нём указывается тип модели и параметры. Платформа поддерживает три модели:

Модель Ключ Идея Для чего подходит
Пороговая threshold Балл зависит от количества ошибок ЕГЭ, ОГЭ, учебные задачи
Пропорциональная proportional Балл = доля пройденных тестов Олимпиады, контесты
Группы тестов groups Всё или ничего за каждую группу Олимпиады (Polygon-стиль)

Модель 1: Пороговая (threshold)

Самая популярная модель. Вы задаёте правила — список порогов. Система считает количество проваленных тестов и проверяет правила сверху вниз. Первое подходящее правило определяет балл. Если ни одно не подошло — выставляется default_score.

Пример 1
Классическая схема ЕГЭ: 2 / 1 / 0 баллов

Все верно — 2 балла, одна ошибка — 1 балл, больше — 0.

{ "scoring_type": "threshold", "rules": [ { "max_failures": 0, "score": 2 }, // 0 провалов → 2 балла { "max_failures": 1, "score": 1 } // 1 провал → 1 балл ], "default_score": 0 // всё остальное → 0 }
Результат ученика Провалов Балл
Все 10 тестов пройдены 0 2
9 из 10 пройдены 1 1
8 из 10 пройдены 2 0
5 из 10 пройдены 5 0
Пример 2
Всё или ничего (бинарное)

Балл начисляется только если все тесты пройдены. Подходит для ЕГЭ/ОГЭ.

{ "scoring_type": "threshold", "rules": [ { "max_failures": 0, "score": 1 } ], "default_score": 0 }
Пример 3
Задача ЕГЭ №27: 4 / 3 / 2 / 0 баллов

Четырёхступенчатая шкала.

{ "scoring_type": "threshold", "rules": [ { "max_failures": 0, "score": 4 }, { "max_failures": 1, "score": 3 }, { "max_failures": 2, "score": 2 } ], "default_score": 0 }

Модель 2: Пропорциональная (proportional)

Простейшая модель: балл равен доле пройденных тестов от максимума, с округлением вниз. Отличается от стандартной логики тем, что вы можете задать любой максимальный балл, не привязываясь к полю «Количество баллов» в задаче.

Пример 4
100-балльная шкала

Если 7 из 10 тестов пройдены → 70 баллов.

{ "scoring_type": "proportional", "max_score": 100 }

Модель 3: Группы тестов (groups)

Тесты объединяются в именованные группы. За каждую группу начисляется балл только если все тесты в ней пройдены (принцип «всё или ничего»). Группы могут зависеть друг от друга — если зависимость не пройдена, зависимая группа не засчитывается.

Номера тестов
Номера тестов в конфиге — это порядковые номера в таблице тестов задачи (1, 2, 3...), сверху вниз, как они отображаются в редакторе.
Пример 5
Две группы с зависимостью

Базовые тесты (1–3) дают 30 баллов. Продвинутые (4–7) дают 70 баллов, но только если базовые полностью пройдены.

{ "scoring_type": "groups", "groups": [ { "name": "basic", "tests": [1, 2, 3], "score": 30, "depends": [] }, { "name": "advanced", "tests": [4, 5, 6, 7], "score": 70, "depends": ["basic"] // зависит от basic } ] }
Результат basic (30) advanced (70) Итого
Все 7 тестов верны ✅ 30 ✅ 70 100
Тесты 1–3 верны, 4-й нет ✅ 30 ❌ 0 30
Тест 2 неверен, 4–7 верны ❌ 0 ❌ 0 (зависимость) 0
Пример 6
Три независимые группы

Каждая группа считается отдельно, без зависимостей. Ученик может набрать баллы за любую комбинацию.

{ "scoring_type": "groups", "groups": [ { "name": "easy", "tests": [1, 2], "score": 20, "depends": [] }, { "name": "medium", "tests": [3, 4, 5], "score": 30, "depends": [] }, { "name": "hard", "tests": [6, 7, 8], "score": 50, "depends": [] } ] }

Справочник полей JSON

Общие поля

Поле Тип Описание
scoring_type строка threshold, proportional или groups

Для threshold

Поле Тип Описание
rules массив Список правил, каждое с max_failures и score. Проверяются сверху вниз.
rules[].max_failures число Максимальное допустимое количество проваленных тестов для этого правила
rules[].score число Балл, если количество провалов ≤ max_failures
default_score число Балл, если ни одно правило не подошло (обычно 0)

Для proportional

Поле Тип Описание
max_score число Максимальный балл. Итоговый балл = max_score × (пройдено / всего), округление вниз.

Для groups

Поле Тип Описание
groups массив Список групп тестов
groups[].name строка Уникальное имя группы (используется в depends)
groups[].tests массив чисел Номера тестов (начиная с 1), принадлежащих группе
groups[].score число Баллы за группу, если все тесты пройдены
groups[].depends массив строк Имена групп, от которых зависит текущая. Пустой массив [] = нет зависимостей.

Частые вопросы

Что будет, если я включу скоринг, но не заполню JSON?

Система автоматически откатится на стандартный пропорциональный подсчёт.

Что будет, если я допущу ошибку в JSON?

При проверке решения система попытается распарсить конфиг. Если не получится — откатится на стандартную логику и запишет предупреждение в лог. Задача ученика не пострадает.

Влияет ли скоринг на поле «Количество баллов» в задаче?

Нет. Поле «Количество баллов» используется только в стандартной логике. Когда включён скоринг, итоговый балл определяется полностью из JSON-конфига (поля score в правилах или max_score).

Можно ли использовать дробные баллы?

Да. Указывайте в JSON дробные значения: "score": 1.5. Итоговый балл округляется до двух знаков после запятой.

Как быстро скопировать скоринг из одной задачи в другую?

Скопируйте текст из поля «JSON-конфиг скоринга» одной задачи и вставьте в другую. Также можно использовать готовые примеры из выпадающего списка.


Совет
Начните с готовых примеров из выпадающего списка — их можно адаптировать под свои нужды, изменив числа в полях max_failures, score и default_score. Это проще, чем писать JSON с нуля.
Печать