Гайды

Свой набор тестов для модели: 10 задач вместо чужого рейтинга

Методика личной проверки моделей: фиксация условий прогона, слепая оценка ответов, форма записи результатов и способ убедиться, что сам набор задач рабочий.

У вас на диске две модели, оставить нужно одну. Одна таблица ставит выше первую, другая — вторую, на форуме хвалят третью, а разница между ними в публичных наборах меньше, чем влияние системного промпта. Решение принимать сегодня, и внешние источники его за вас не примут: они измеряли чужие задачи в условиях, которые у вас не воспроизводятся.

Выход — собрать собственный набор из десяти задач и один раз выстроить процедуру, которая переживёт следующие смены моделей. Час на сборку, полчаса на прогон кандидата — и вопрос «какая модель лучше» закрывается за вечер.

Когда это не нужно: если модель одна и она вас устраивает; если вы выбираете между разными весовыми категориями — там разрыв виден без методики; если задача разовая.

#Что понадобится

  • Два-три кандидата одной весовой категории, уже скачанных и запускающихся. Как сузить список до этих двух-трёх — в разборе того, какую модель выбрать под задачу и железо.
  • Десять реальных задач из вашей рабочей недели: не выдуманных, а скопированных из переписки, документов и рабочих файлов.
  • Возможность задавать параметры генерации — через HTTP-интерфейс рантайма или через его интерфейс настройки. Без этого сравнение не воспроизводится.
  • Полтора-два часа на первый цикл. Повторные — примерно полчаса на кандидата.

Дата написания — 25 августа 2026 года; команды приведены для Ollama, но процедура не зависит от рантайма.

#Шаг 1. Соберите набор из десяти задач

Состав набора — три частые задачи, две языковые, одна на длинный вход, одна на формат, одна на честный отказ, одна из узкой области и одна на прошлую боль. Здесь задача другая: превратить список в воспроизводимый артефакт.

Заведите файл-реестр. В нём для каждого слота — задача целиком и критерий приёмки. Смотреть в таблице ниже нужно на последнюю колонку: без неё оценка сползёт в «понравилось — не понравилось».

№ Слот Что кладём Критерий приёмки
1–3 Частая работа Три задачи, которые вы делаете каждую неделю Ответ можно отправить без правок
4 Падежи и числительные Текст с числами, датами, склонением Нет ошибок согласования
5 Термины и имена Текст с аббревиатурами и именами собственными Аббревиатуры не выдуманы, имена не искажены
6 Длинный вход Ваш документ, ответ спрятан в середине Факт найден и процитирован верно
7 Формат Просьба ответить строго таблицей или JSON Формат соблюдён, лишнего текста нет
8 Отказ Вопрос, ответ на который модель знать не может Признание незнания без выдумки
9 Узкая область Ваши профессиональные термины Термины употреблены верно
10 Раздражитель То, на чём вас подводила прошлая модель Ошибка не повторилась

Критерий приёмки формулируется до прогона. Критерий, придуманный после того, как вы увидели ответ, подгоняется под ответ — это не оценка, а самооправдание.

#Шаг 2. Зафиксируйте условия прогона

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

Фиксируется шесть вещей: системный промпт (лучше пустой или предельно короткий — иначе вы измеряете промпт, а не модель), температура, seed, длина контекста, квантизация и версия рантайма. Квантизация особенно важна: сравнение четырёхбитной версии одной модели с восьмибитной версией другой не имеет смысла.

Проверьте, что стоит на диске, и запишите точные имена тегов:

ollama list

Недостающего кандидата загрузите заранее, чтобы во время прогона не ждать сеть:

ollama pull qwen2.5:7b

Про температуру и seed стоит сказать честно сразу: нулевая температура делает вывод стабильнее, но не гарантирует побитово одинаковый результат. Воспроизводимость зависит от рантайма, версии, устройства, размера батча и архитектуры модели, и на практике повторный прогон нередко даёт слегка другой текст при тех же параметрах. Что именно даёт seed и где детерминизм рассыпается — в разборе seed и детерминизма в генерации. Для методики это значит: seed фиксируем, но на его магию не рассчитываем.

#Шаг 3. Прогоните кандидатов одинаково

Самый надёжный способ не сбить условия — держать каждую задачу отдельным файлом запроса и отправлять его напрямую.

Файл task-06.json для шестой задачи:

{
  "model": "qwen2.5:7b",
  "prompt": "Ниже документ. Вопрос: ...\n\nДОКУМЕНТ:\n...",
  "stream": false,
  "options": {
    "temperature": 0,
    "seed": 42,
    "num_ctx": 8192
  }
}

Отправка и сохранение ответа — одной командой, одинаковой в Windows, macOS и Linux:

curl http://localhost:11434/api/generate -d @task-06.json > out/task-06_A.json

Для второго кандидата поменяйте значение поля model в файле задачи и сохраните вывод в out/task-06_B.json. Буквы A, B, C — это и есть обезличивание: соответствие «буква — модель» вы записываете один раз в отдельный файл и не открываете до конца оценки.

В интерактивной сессии те же параметры задаются командой вида /set parameter temperature 0, но способ хуже: история диалога влияет на следующий ответ, а каждая задача должна начинаться с чистого состояния.

Сколько прогонов делать: при нулевой температуре достаточно одного. Для задач, где вы намеренно ставите температуру выше нуля, делайте три прогона и оценивайте худший из них — вас интересует не удачный случай, а нижняя граница.

#Шаг 4. Оцените ответы вслепую

Протокол слепой оценки состоит из четырёх правил, и каждое закрывает конкретную дыру.

  1. Имена скрыты. Вы читаете task-06_A.json и task-06_B.json, не зная, кто есть кто.
  2. Порядок перемешан. Для каждой задачи заранее решите случайно, чей ответ читается первым: при последовательном чтении первый ответ систематически получает фору как точка отсчёта.
  3. Оценка по одной задаче за раз. Открываете все ответы на задачу шесть, ставите оценки, закрываете, переходите к задаче семь. Сравнение внутри задачи корректнее, чем сравнение общего впечатления от кандидата.
  4. Шкала из трёх значений. 2 — пригодно как есть; 1 — пригодно после правки; 0 — мусор или неверно. Пятибалльная шкала на десяти задачах создаёт иллюзию точности, которой в ней нет.

Оценку ставьте по критерию приёмки из реестра, а не по ощущению: если ответ приятно читается, но факт из середины документа потерян — это 0.

#Шаг 5. Сведите результаты в форму

Форма — обычный текстовый файл. Заведите его сразу в таком виде:

task,criterion,A_score,B_score,note
01,отправить без правок,2,1,B добавил лишнее вступление
02,отправить без правок,2,2,
03,отправить без правок,1,2,A потерял часть условия
04,нет ошибок согласования,1,0,B: "5 клиента"
05,аббревиатуры не выдуманы,2,1,B развернул ГОСТ наугад
06,факт найден в середине,0,2,A пересказал начало документа
07,формат соблюдён,2,2,
08,признание незнания,0,2,A выдумал дату уверенно
09,термины верны,1,1,
10,ошибка не повторилась,2,0,

После заполнения раскрывайте имена и считайте две величины: сумму баллов и число нулей. Число нулей важнее суммы: модель со средним баллом повыше, но с двумя провалами в критичных для вас слотах, хуже ровной модели без нулей — провал вы будете чинить руками каждый раз.

Что считать значимой разницей на десяти задачах: расхождение в один-два балла из двадцати возможных — шум, его создаёт одна пограничная формулировка. Устойчивый сигнал — разрыв от трёх-четырёх баллов или разное число нулей. Если кандидаты разошлись на один балл, у вас нет победителя; выбирайте по скорости, памяти или лицензии.

#Проверка результата: работает ли ваш набор

Набор задач — тоже инструмент, и его нужно откалибровать, иначе вы будете аккуратно измерять ничто.

Тест на различающую способность. Прогоните через набор две модели заведомо разных классов: самую маленькую, что у вас есть, и самую большую. Разрыв должен быть очевидным — большая модель обязана выигрывать по сумме и по числу нулей. Если ваш набор не различает даже их, он не различит и близких кандидатов: задачи слишком просты либо критерии приёмки слишком мягкие.

Тест на устойчивость. Прогоните одного кандидата дважды с теми же параметрами и оцените вслепую оба прогона. Расхождение оценок между двумя прогонами одной модели — это ваш уровень шума. Разница между кандидатами имеет смысл, только если она заметно больше этого уровня.

Тест на согласие с собой. Через день переоцените один прогон, не заглядывая в прошлые баллы. Разошедшиеся оценки означают, что критерии приёмки расплывчаты и их нужно переписать в проверяемом виде.

Набор считается рабочим, когда проходит все три проверки. После этого его можно переиспользовать: при обновлении моделей достаточно повторить прогон и сравнить с прошлой формой — практика обновления разобрана в гайде о том, как обновлять локальные модели.

#Что может пойти не так

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

Условия разъехались между кандидатами. Разная квантизация, разная длина контекста, разный системный промпт — и вы сравниваете настройки, а не модели. Именно так возникает большинство противоречий между публичными таблицами; механизм подробно разобран в статье о том, как читать бенчмарки LLM.

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

Набор оценивает дообученную модель по общим слотам. Если вы сравниваете базовую модель с дообученной на своих данных, общий набор покажет не то: у дообучения свои критерии успеха, разобранные в материале о том, как оценить дообученную модель.

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

#Сколько задач нужно для своего набора?

Десяти достаточно, чтобы отличить кандидатов одной весовой категории, и это тот объём, который вы реально прогоните и оцените за вечер. Набор из пятидесяти задач звучит убедительнее, но обычно остаётся недооценённым до конца, а половина оценок ставится наспех.

#Можно ли доверить оценку другой модели вместо себя?

Модель-судья ускоряет процесс и приносит собственные перекосы: она предпочитает длинные оформленные ответы и хуже ловит фактические ошибки в вашей предметной области. Как черновой фильтр это допустимо, но итоговое решение по десяти задачам стоит принимать самому — это полчаса.

#Что делать, если разница между моделями получилась минимальной?

Считать, что победителя нет, и выбирать по остальным критериям: скорость ответа, объём занимаемой памяти, длина контекста, условия лицензии. Разница в один-два балла из двадцати на десяти задачах — это шум, и гнаться за ней не стоит.

#Нужно ли фиксировать seed, если детерминизм всё равно не гарантирован?

Фиксировать стоит: это снимает часть разброса и делает повторный прогон ближе к исходному. Но полагаться на побитовое совпадение нельзя — воспроизводимость зависит от рантайма, устройства и параметров запуска, поэтому уровень шума всё равно нужно измерить повторным прогоном.

#Как часто повторять проверку?

Разумный ритм — при выходе нового поколения моделей в вашей весовой категории или примерно раз в квартал. Собранный набор делает повторную проверку получасовой процедурой, поэтому основные затраты приходятся только на первый цикл.

#Вывод

Чужой рейтинг отвечает на вопрос, который вы не задавали. Собственный набор из десяти задач отвечает ровно на ваш — при условии, что условия прогона зафиксированы, оценка идёт вслепую, а результаты записаны в форму, которую можно переоткрыть через полгода.

Если вы выбираете между моделями разных весовых категорий — методика избыточна, разрыв виден и так. Если кандидаты одного класса, а решение вам принимать регулярно — потратьте полтора часа один раз: дальше каждая смена поколения будет стоить вам получаса вместо недели чтения чужих таблиц.

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт