Как бенчмаркать ИИ, и как это делаем мы?

от автора

Одна из сложностей с LLM: как понять, какая модель способнее? Их создатели наперебой кричат «мы совершили революцию», но как пробиться сквозь хайп и измерить, кто чего реально добился?

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

А нам в Kodik важно разбираться, потому что мы делаем редактор кода с ИИ, так что должны понимать, какая модель в нём как себя покажет. И в результате мы не только смотрим на результаты чужих бенчмарков, но и создали для внутреннего использования свой KodikBenchmark.

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


Проблема 1: лукавая цифра

Когда выходит любая значимая версия LLM, в официальном посте можно увидеть не только громкие слова, но и «подтверждающие их числа». Мол, смотрите, как мы по бенчмаркам всех обогнали!

Но в красивых пресс-релизах встречается лукавство. Самый поразительный случай был на слайде с презентации GPT-5, где число 52.8 у новой модели как-то магически оказывалось «больше», чем 69.1 у старой:

Даже когда обходится без таких явных манипуляций, надо учитывать и другие факторы. Например, Y-ось на графиках зачастую начинают не от нуля. Так что при виде эффектного роста важно помнить, что если столбик «83%» втрое выше столбика «81%», это не значит «всё стало втрое лучше», это значит «график начали с 80%».

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

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


Проблема 2: что они вообще считают?

Часто можно прочитать что-то такое: «Новая модель набрала больше всех в Humanity’s Last Exam, TerminalBench и GDPval». Слова «последний экзамен человечества» звучат красиво. Получается, она самая лучшая?

Тут стоит задуматься «лучшая в чём именно». Что бенчмарки меряют-то? Например, три перечисленных оценивают совсем разные вещи:

  • Humanity’s Last Exam — ответы по темам от биологии до математики

  • Terminal-Bench — умение выполнять задачи в терминале

  • GDPval — умение выполнять «задачи популярных профессий»

И тут возникает вопрос «а что важно вам». Например, если вы с помощью модели собираетесь писать код, то важно ли вам, как она отвечает на вопросы по биологии или выполняет задачи бухгалтера?

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

Нельзя ведь измерить абстрактное «владение терминалом в вакууме». Можно измерить какие-то конкретные его проявления, как в Terminal-Bench. Там есть набор из 89 задач, например, таких:

  • вот код, найди и устрани уязвимость

  • вот картинка с шахматной доской, найди лучший ход за белых

  • вот картинка с псевдокодом на ней, распознай и имплементируй по-настоящему

Задания любопытные, но тоже возникает вопрос: а способность «найти лучший ход за белых» лично вам пригодится? У разных людей очень разное использование терминала, и польза Terminal-Bench тоже будет различаться. Так что и тут по числу не стоит делать категоричные выводы, лишь частичные.


Проблема 3: data contamination

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

А тогда модели могут уверенно давать ответы и получать высокие оценки, но это мало о чём будет говорить. Всё равно что заранее получить «правильные ответы» для экзамена и зазубрить их без понимания.

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

Конечно, создатели бенчмарков в курсе этой проблемы, и применяют различные способы борьбы с ней. Но она пока что даёт о себе знать. Например, у бенчмарка GPQA в описании датасета прямо написано «мы просим вас не публиковать примеры из этого датасета плейнтекстом». Однако нет ведь способа заставить людей совсем этого не делать.


Проблема 4: ангажированность

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

Есть логика в том, что они меряют модель способом, который считают самым точным. Но у пользователей возникает вопрос: а как проверить, что бенчмарк не «подкрутили» в пользу Composer? В результате на их анонсы порой отвечали этим мемом:

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

Хуже другая история. Когда OpenAI представляли новую модель, показывали результаты в бенчмарке FrontierMath. А потом выяснилось, что создание этого бенчмарка… финансировалось самой компанией OpenAI. Сам факт финансирования ещё не означает автоматически «бенчмарк неправильный» (как-то он даже присуждал больше очков конкурентам OpenAI). Но проблема в том, что связь скрывалась, и публично картину представляли так, будто измеряет модель абсолютно независимая сторона. В итоге это привело к скандалу и недоверию сообщества.


Проблема 5: benchmaxxing

Даже если бы не предыдущие проблемы, «результаты по бенчмаркам» всё равно могли бы не соответствовать «результатам в жизни». Почему?

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

Скажем, есть набор из 89 задач для терминала в Terminal-Bench, и все в лепёшку разбиваются, чтобы их модели выполняли как можно больше из этого набора. А есть другие задачи в терминале, о которых думают куда меньше. И может оказываться так, что модель отрастила мощнейшие мышцы для узкого круга задач, но за их пределами на ваших задачах «превращается в тыкву».

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

В результате, например, ИИ-рисёрчер Андрей Карпатый в своих итогах 2025-го написал, что потерял веру в бенчмарки. Но вопрос «какая модель способнее» остаётся важным. И что тогда с ним делать?


Что с этим делать

Может показаться «если даже самые известные бенчмарки ненадёжны, то полезную информацию вообще не получить».

Но здесь есть интересный контринтуитивный момент. «Самые известные» не обязательно значит «самые показательные». У закрытых бенчмарков, которые в разных компаниях делают для внутреннего использования, есть свои преимущества:

  • Если делаешь бенчмарк сам, создатели LLM не исказят его «в свою пользу».

  • В нём можешь оценивать именно те способности моделей, которые полезны для тебя.

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

  • Если бенчмарк не нашумел на весь мир, крупные компании не будут искусственно оптимизировать свои модели под него.

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

Но для компании, которой особенно важно качество ИИ-моделей, это оправданная задача. А мы как раз такая компания, поскольку делаем редактор кода с ИИ. И поэтому сделали для внутреннего использования собственный бенчмарк.


KodikBenchmark

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

Просто броситься и «что-то посчитать» легко. И после выхода любой модели люди наперегонки постят разные числа. Порой довольно бессмысленные, вроде «количества строк кода», как будто его качество измеряется этим.

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

1. Что мы вообще хотим узнать?

Конкретно нам важно понимать, как разные LLM проявляют себя, когда люди используют их в Kodik. Насколько хорошо они помогают нашим пользователям добиваться своих целей?

И это сразу отличает наш подход от многих популярных бенчмарков.

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

Во-вторых, многие бенчмарки оценивают модели по «правильным ответам». Но теоретические ответы подходят для оценки чат-бота. А в редакторе кода ИИ-модели используют в агентском режиме: не чтобы они статьи из Википедии пересказывали, а чтобы действовали.

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

2. А на каких задачах проверять?

Это непростой вопрос. Работа с кодом — вещь многогранная, и одним бенчмарком её не измерить целиком, а некоторые важные вещи и вовсе неизмеримы.

Но если всё же делать бенчмарк, с чем в нём обращаться к моделям?

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

И поэтому подаём задачу на вход в таких формулировках, с какими может обратиться реальный человек. То есть в промпте используется не какая-то искусственная спецификация на пять листов, а живой язык: «Сделай так, чтобы этот проект успешно собирался».

При этом, конечно, результат должен быть измерим. Задачи должны быть такими, чтобы можно было тестами определить «получилось или нет».

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

Так вместо общих умений «переворачивать деревья» проверяется практическая способность приносить конкретную пользу: какая модель лучше справится с заданием?

3. А что такое «лучше»?

Этот вопрос сложнее, чем может показаться по интернет-обсуждениям популярных бенчмарков. Там обычно говорят только о метрике «сколько задач модель осилила», выбирая лучшую по этому.

Но в жизни людей волнует не только «справилась ли LLM с задачей». Ещё их волнует, например, «сколько токенов она на это потратила».

Это производители LLM могут жечь токены без раздумий и говорить только о том, как много сделала их новая модель. А реальные пользователи Kodik могут рассуждать, например, так: «Сложную задачу поручу самой мощной модели, а на простеньких лучше сэкономлю».

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

И что тогда делать? На что смотреть, если нас волнуют все наши пользователи? Наш ответ в ответ в том, чтобы смотреть на всё:

— «Success rate»: с какой частью наших заданий модель справилась
— «Iteration score»: наша общая оценка её способностей, посчитанная по формуле
— Ряд отдельных метрик: потраченное время, потраченное количество токенов (такое приведено на графике в начале текста), и так далее

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

4. Как правильно считать?

Мы упомянули «общую оценку по формуле», а как её высчитываем? Опишем общие принципы без раскрытия полностью самой формулы.

Для нас важно не только «сколько задач удалось выполнить», но и «как именно». Например, одно дело, если модель с ходу всё правильно сделала, и совсем другое — если до успеха долго «ходила кругами», выжирая время и токены пользователя.

Поэтому, кроме факта успеха, мы учитываем в оценке ещё ряд факторов. Баллы там могут не только начисляться за то, что приближает к успеху, но и сниматься, если модель «пробуксовывает» или вносит ухудшения.

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

А также для нас важно базовое организационное правило: сама модель никогда не должна знать, сколько баллов она набирает в нашем бенчмарке.

Ведь известна проблема reward hacking: когда модель знает «нужный результат», она может достигать его «обходными путями». И в интернете можно прочитать о том, как во всех популярных бенчмарках находили лазейки, теоретически позволяющие добиться красивых чисел без реального выполнения нужных задач.

Так что мы просто говорим модели «выполни эту задачу», и она знает только об этой цели. А о дугих факторах оценки не знает, и задачи улучшать их ей в промпте никто не ставит. И тогда мы можем увидеть, насколько создатели модели смогли развить в ней эти способности.

И ещё важная организационная деталь. Если в своих сценариях считаешь полезным какой-то подход (например, использование определённого инструмента), то в своём бенчмарке можно награждать баллами за это, но при этом важно устанавливать «потолок» награды. Иначе получится бенчмарк, где возможно просто бессмысленно запустить один инструмент тысячу раз и получить баллов больше всех. Даже если модель не знает о баллах и не стремится их оптимизировать, это всё равно дыра.

5. Как правильно запускать?

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

Во-первых, для качественного сравнения важно, чтобы все модели оказывались в равных условиях. А если запускать бенчмарк просто на случайных компьютерах, отличающихся друг от друга, то их отличия могут вносить помехи. Тут полезна изолированная среда (sandbox), и мы используем Docker-контейнеры.

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

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


Результаты бенчмарка

При подготовке этого поста мы ещё раз прогнали бенчмарк на актуальном наборе моделей — включая совсем свежую GLM-5.1 от Z.ai. И получили такие числа:

Model

Success rate

Iteration score

Average iterations

Time per project

Tokens spent

Tool calls

anthropic/claude-opus-4.6

100.0%

106.6

4.3

281.26

494894

196

anthropic/claude-sonnet-4.6

100.0%

105.2

7.1

404.61

1780184

257

z-ai/glm-5.1

100.0%

103

4.7

577.58

589332

197

z-ai/glm-5

100.0%

101.7

4.5

529.63

417340

192

anthropic/claude-sonnet-4.5

100.0%

101.6

5.2

323.74

779848

196

moonshotai/kimi-k2.5

100.0%

100.7

6.7

934.53

566564

223

openai/gpt-5.4

100.0%

100.6

7.9

299.44

1390396

297

openai/gpt-5.3-codex

100.0%

98.6

6

439.95

1721668

194

google/gemini-3.1-pro-preview

100.0%

96

6.5

874.14

969900

205

openai/gpt-5.2-codex

95.5%

92.2

6

613.35

2458263

194

google/gemini-3-flash-preview

95.5%

91.5

7.5

489.11

1504753

348

z-ai/glm-4.7

95.5%

89.1

9.3

779.75

954516

300

qwen/qwen3.6-plus

95.5%

88.1

8.9

780.1

2014437

361

minimax/minimax-m2.7

81.8%

93

4.5

985.12

1322780

327

openai/gpt-5.1-codex

81.8%

76.6

5.2

900.59

3294475

171

openai/gpt-5.1-codex-mini

72.7%

80.2

4.6

875.81

4493368

167

z-ai/glm-4.6

72.7%

71.5

7.2

1499.32

3255338

405

qwen/qwen3-coder-next

63.6%

68

7.9

677.27

5102147

531

deepseek/deepseek-v3.2

63.6%

66.6

7.8

1101.1

1555624

214

minimax/minimax-m2.5

50.0%

88.5

4.2

2803.6

1615976

562

z-ai/glm-4.5

36.4%

57.1

3.1

796.09

3309643

326

Ну всё, теперь можно начинать холиварить в комментариях «кто лучше»!

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

А ещё можно с помощью этих чисел выводить другие интересные метрики. Например, токеноэффективность: если мы знаем общие результаты и количество токенов, какая модель даёт наибольший результат в пересчёте «на тысячу токенов»?


Итоги

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

Конечно, это даёт частичное знание, а не какое-то волшебное «абсолютное». В кодинге есть множество вещей, которые не посчитать конкретно этим бенчмарком. А некоторые и вовсе можно понять только при активном личном использовании.

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

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

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

ссылка на оригинал статьи https://habr.com/ru/articles/1024618/