У вас на диске две модели, оставить нужно одну. Одна таблица ставит выше первую, другая — вторую, на форуме хвалят третью, а разница между ними в публичных наборах меньше, чем влияние системного промпта. Решение принимать сегодня, и внешние источники его за вас не примут: они измеряли чужие задачи в условиях, которые у вас не воспроизводятся.
Выход — собрать собственный набор из десяти задач и один раз выстроить процедуру, которая переживёт следующие смены моделей. Час на сборку, полчаса на прогон кандидата — и вопрос «какая модель лучше» закрывается за вечер.
Когда это не нужно: если модель одна и она вас устраивает; если вы выбираете между разными весовыми категориями — там разрыв виден без методики; если задача разовая.
#Что понадобится
- Два-три кандидата одной весовой категории, уже скачанных и запускающихся. Как сузить список до этих двух-трёх — в разборе того, какую модель выбрать под задачу и железо.
- Десять реальных задач из вашей рабочей недели: не выдуманных, а скопированных из переписки, документов и рабочих файлов.
- Возможность задавать параметры генерации — через 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. Оцените ответы вслепую
Протокол слепой оценки состоит из четырёх правил, и каждое закрывает конкретную дыру.
- Имена скрыты. Вы читаете
task-06_A.jsonиtask-06_B.json, не зная, кто есть кто. - Порядок перемешан. Для каждой задачи заранее решите случайно, чей ответ читается первым: при последовательном чтении первый ответ систематически получает фору как точка отсчёта.
- Оценка по одной задаче за раз. Открываете все ответы на задачу шесть, ставите оценки, закрываете, переходите к задаче семь. Сравнение внутри задачи корректнее, чем сравнение общего впечатления от кандидата.
- Шкала из трёх значений.
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, если детерминизм всё равно не гарантирован?
Фиксировать стоит: это снимает часть разброса и делает повторный прогон ближе к исходному. Но полагаться на побитовое совпадение нельзя — воспроизводимость зависит от рантайма, устройства и параметров запуска, поэтому уровень шума всё равно нужно измерить повторным прогоном.
#Как часто повторять проверку?
Разумный ритм — при выходе нового поколения моделей в вашей весовой категории или примерно раз в квартал. Собранный набор делает повторную проверку получасовой процедурой, поэтому основные затраты приходятся только на первый цикл.
#Вывод
Чужой рейтинг отвечает на вопрос, который вы не задавали. Собственный набор из десяти задач отвечает ровно на ваш — при условии, что условия прогона зафиксированы, оценка идёт вслепую, а результаты записаны в форму, которую можно переоткрыть через полгода.
Если вы выбираете между моделями разных весовых категорий — методика избыточна, разрыв виден и так. Если кандидаты одного класса, а решение вам принимать регулярно — потратьте полтора часа один раз: дальше каждая смена поколения будет стоить вам получаса вместо недели чтения чужих таблиц.