Всем привет! Авторы бенчмарка MERA этим летом не только анонсировали отраслевую ветку — MERA Industrial, но и рады сообщить о расширении проекта на кодовые задачи.
Большие языковые модели (LLM) сегодня умеют не только вести диалог, но и писать код, помогать с документацией и автоматизировать задачи разработчиков. Однако возникает вопрос: «Как мы измеряем качество этих способностей?» Большинство бенчмарков сосредоточены на проверке понимания языка и, частично, на генерации кода. Но насколько такой код применим на практике? Учитываются ли требования, сформулированные на русском? Как модели работают с документацией на других языках, кроме английского? Мультиязычные бенчмарки вроде HumanEval-X, MultiPL-E и mxEval делают шаг в нужную сторону, но по большей части сосредоточены на языках программирования. Связь между кодом и естественным языком, особенно в многоязычном контексте, пока освещена слабо.
Чтобы учесть все эти моменты, мы разработали MERA Code — первый комплексный бенчмарк для оценки больших языковых моделей на реальных прикладных задачах, с которыми сталкивается программист в русскоязычном контексте.
Что внутри бенчмарка?
Прозрачная методика оценки LLM для русского языка.
11 задач в формате инструкций (text2code, code2text, code2code) на 8 языках программирования: Python, Java, C#, JavaScript, Go, C, C++ и Scala.
Открытая платформа со сквозной системой подсчёта баллов, рейтингом и удобным фреймворком для тестирования.
И, конечно, анализ и результаты, охватывающие как открытые общие модели, так и проприетарные API для генерации кода.
🔗Репозиторий проекта на GitVerse
Что такое MERA Code?
Современные кодовые языковые модели и модели общего назначения (ChatGPT, Claude, Qwen, YandexGPT, GigaChat и др.) быстро развиваются, но их сравнение затруднено из-за отсутствия единой методологии оценки. Ключевая проблема — разрозненность тестовых задач и условий замеров: разные датасеты, промптинговые стратегии и метрики. Кроме того, оценивают часто сами разработчики, что ставит под сомнение объективность результатов.
Мы предлагаем открытый инструкционный бенчмарк для русскоязычных моделей для задач работы с кодом, основанный на фиксированном наборе тестов с чёткими критериями.
Наш подход обеспечивает:
Стандартизированные конфигурации: промпты, параметры генерации.
Экспертно составленные задачи, отражающие реальные сценарии использования при работе с кодом.
Методологию оценки сгенерированного кода на основе его запуска в специально подготовленных независимых средах для отдельных языков программирования на стороне платформы.
Проект поддерживает Альянс в сфере ИИ, индустриальные лидеры и академические исследователи, что гарантирует независимость и релевантность бенчмарка для развития кодовых моделей.

Мы также представили таксономию навыков, которая предлагает системный подход к оценке кодовых способностей моделей, сосредоточенный на навыках, необходимых для решения конкретных задач. Это позволяет разбить любую задачу на ограниченный и управляемый набор ключевых способностей моделей, что делает таксономию одновременно всеобъемлющей, но интуитивной для понимания.
В основе подхода лежит представление о языковой модели как о системе с тремя компонентами: входными данными, внутренним состоянием и выходом. Исходя из этого, выделяют четыре базовых навыка:
восприятие (perception), отвечающее за входные данные;
логическое мышление (reasoning) и знания (knowledge), являющиеся внутренними характеристиками модели;
и генерация (generation), отвечающая за выходные данные.
Эти навыки служат фундаментом всей таксономии. Остальные выстраиваются в иерархическую структуру, постепенно увеличивая детализацию на каждом следующем уровне.
Нашу таксономию можно воспринимать как карту навыков, которая показывает: 1) что должно быть в модели, чтобы корректно пройти тест, и 2) что из навыков мы не покрыли на текущий момент сообществом. Само собой, в дальнейшем таксономию можно расширять и детализировать по мере совершенствования моделей.
Какие задания входят в бенчмарк?
На текущий момент усилиями партнёров и членов Альянса в сфере ИИ мы собрали 11 тестов, покрывающих 8 языков программирования (Python, Java, C#, JavaScript, Go, C, C++ и Scala).

Каталог задач MERA Code и их подробное описание представлено на сайте. Пара примеров — ниже:
Создание модульных (unit) тестов:
"instruction": "Напиши тест для этого кода на языке {language} из файла '{focal_file_path}'. Напиши только тест без пояснений и комментариев.\n{focal_func}\nТебе необходимо написать {test_func_type} на языке {language}. Тест будет помещен в файл '{test_file_path}'.\nОбязательно учитывай код, собранный из будущего тестового файла: \n{test_func_context}\nДля тебя собран код из репозитория, который может помочь тебе в написании теста: \n{focal_func_context}",
"inputs": {
"focal_func": "```go\nfunc MergeSorted(l, f *List) (m *List, ok bool) {\n\tm = new(List)\n\tfor l.Len() > 0 || f.Len() > 0 {\n\t\tvl, nl, okl := PopInt(l)\n\t\tvf, nf, okf := PopInt(f)\n\t\tif !okl || !okf {\n\t\t\treturn m, false\n\t\t}\n\n\t\tll, n := l, nl // The assumption is: vl <= vf.\n\t\tswitch {\n\t\tcase l.Len() == 0:\n\t\t\tll, n = f, nf\n\t\tcase f.Len() == 0:\n\t\t\tll, n = l, nl\n\t\tcase vl > vf:\n\t\t\tll, n = f, nf\n\t\t}\n\n\t\tm.Insert(ll.Remove(n))\n\t}\n\treturn m, true\n}\n```",
"focal_func_context": "```go\n#lists/mergesorted.go\n// Copyright (c) 2015, Peter Mrekaj. All rights reserved.\n// Use of this source code is governed by a MIT-style\n// license that can be found in the LICENSE.txt file.\n\npackage lists\n\n// MergeSorted merges int nodes from l and f sorted lists into the ordered list m.\n// Note: when l or f contains different type from int then false is returned and\n// merged list will contains some value(s) merged from l or f up to the different\n// type.\n\n#focal function/method here\n```",
"test_func_type": "тестовую функцию",
"test_func_context": "```\n// Copyright (c) 2015, Peter Mrekaj. All rights reserved.\n// Use of this source code is governed by a MIT-style\n// license that can be found in the LICENSE.txt file.\npackage lists\nimport (\n\t\"math/rand\"\n\t\"reflect\"\n\t\"sort\"\n\t\"testing\"\n)\n```",
"language": "go",
"focal_file_path": "lists/mergesorted.go",
"test_file_path": "lists/mergesorted_test.go",
"test_framework": ""
},
"outputs": "func TestMergeSorted(t *testing.T) {\n\tconst (\n\t\tmaxInt = int(^uint(0) >> 1)\n\t\tminInt = -maxInt - 1\n\t)\n\tfor _, test := range []struct {\n\t\tl, f []interface{}\n\t\twant []interface{}\n\t\tok bool\n\t}{\n\t\t{[]interface{}{0}, []interface{}{0}, []interface{}{0, 0}, true},\n\t\t{[]interface{}{0}, []interface{}{-1, 1}, []interface{}{-1, 0, 1}, true},\n\t\t{[]interface{}{2, 5, 7}, []interface{}{3, 11}, []interface{}{2, 3, 5, 7, 11}, true},\n\t\t{[]interface{}{1, 3, 5}, []interface{}{2, 4, 6}, []interface{}{1, 2, 3, 4, 5, 6}, true},\n\t\t{[]interface{}{maxInt}, []interface{}{minInt}, []interface{}{minInt, maxInt}, true},\n\t\t{[]interface{}{1, \"b\", 3}, []interface{}{0}, []interface{}{0, 1}, false},\n\t\t{[]interface{}{0}, []interface{}{1, \"b\", 3}, []interface{}{0, 1}, false},\n\t} {\n\t\tl, f := NewFromSlice(test.l), NewFromSlice(test.f)\n\t\tm, ok := MergeSorted(l, f)\n\t\tif test.ok && (l.head != nil || f.head != nil) {\n\t\t\tt.Errorf(\"MergeSorted(%v, %v) got l.First() = %v, f.First() = %v; want <nil>, <nil>\", test.l, test.f, l.First(), f.First())\n\t\t}\n\t\tif got := m.ToSlice(); ok != test.ok || !reflect.DeepEqual(got, test.want) {\n\t\t\tt.Errorf(\"MergeSorted(%v, %v) = %v, %t; want %v, %t\", test.l, test.f, got, ok, test.want, test.ok)\n\t\t}\n\t}\n}",
"meta": {
"id": 5,
"repo_id": "38174748",
"focal_func_type": "function"
}
Написание документации к функции:
"instruction": "Напиши русскоязычную документацию к функции.\n\nФункция:\n{function}",
"inputs": {
"function": "private void button15_Click(object sender, EventArgs e)\n {\n label12.Text = \"\";\n\n richTextBox1.Clear();\n richTextBox2.Clear();\n textBox1.Clear();\n textBox2.Clear();\n textBox4.Clear();\n }"
},
"outputs": "/// <summary>\n/// Обработчик события нажатия на кнопку button15.\n/// При вызове этой функции происходит очистка текста в различных элементах управления формы:\n/// - Удаляется текст из метки label12.\n/// - Очищается содержимое многострочного текстового поля richTextBox1.\n/// - Очищается содержимое многострочного текстового поля richTextBox2.\n/// - Очищается текстовое поле textBox1.\n/// - Очищается текстовое поле textBox2.\n/// - Очищается текстовое поле textBox4.\n/// </summary>\n/// <param name=\"sender\">Объект, который вызвал событие (в данном случае, кнопка button15).</param>\n/// <param name=\"e\">Параметры события, содержащие дополнительную информацию о событии.</param>",
"meta": {
"id": 1,
"language": "csharp"
}
Бенчмарк делится на приватные и публичные задачи. Ответы на приватные задачи не были никогда в открытом доступе и доступны только организаторам.
В таблице лидеров результаты ранжированы по общему среднему за задачи показателю, также доступно ранжирование только по приватным задачам.
Каждый тест оформлен в виде фиксированного набора инструкций, в среднем это 10 разных инструкций на один тест, равномерно распределённых по каждой задаче.
В MERA Code промпты строго подобраны под задачу и корректный выбор ответа. Поэтому использовать дополнительно системный промпт и пытаться им влиять на результат запрещено. Исключение — дефолтные зашитые в API, на которые внешний пользовать повлиять не может.
Как использовать бенчмарк и попасть в таблицу лидеров?
Кодовая база для оценки на бенчмарке MERA Code разработана на основе международной кодовой базы LM Evaluation Harness, которая позволяет оценивать модель в генеративном формате.
Пользователю необходимо:
Зайти в репозиторий проекта.
По инструкции запустить замер своей модели.
Получить результаты замера: кодовая база выдаёт ZIP-архив.
ZIP-архив (замер) загрузить на сайт и в форме описать его подробности.
Загруженный замер автоматически тестируется и сравнивается с «эталонными» ответами*.
Затем участник увидит оценку в личном кабинете.
*Для этого поднимаются окружения и тестовые среды для разных языков программирования. Обработка результата тестирования может занимать до двух часов.
Подробно о том, как измерить свою модель, смотри наш скринкаст.
Как сделать замер публичным?
По умолчанию загруженные замеры остаются приватными. Чтобы сделать результат публичным, отметьте опцию «Опубликовать». После этого администраторам MERA Code придёт запрос на проверку. Если замер соответствует требованиям, его одобрят, и ваша модель появится в таблице лидеров. В случае необходимости с вами могут связаться для уточнения деталей. Чтобы замер приняли к публикации, он должен содержать:
результаты по всем заданиям;
описание решения (как минимум, ссылку на модель, статью или описание модели);
полный перечень использованных ресурсов (источники данных, параметры моделей и другие ключевые детали).
Если вы обновите замер, то проверка повторится. Перед отправкой убедитесь, что все данные указаны корректно, а описание максимально подробное.
Результаты и таблица лидеров
На текущий момент мы замерили как ряд известных международных API (OpenAI GPT-4, Gemini 2.5), так и открытые модели разных размеров (Qwen2.5 Coder, Qwen2.5, DeepSeek Coder V2, ByteDance Seed-Coder, Mixtral, Yi Coder).
Среди отечественных решений мы рады видеть результаты Kodify Nano, GigaChat 2 MAX, GigaCode 1.4 32B и T-Pro от T-Technologies.
В ходе экспериментов с языковыми моделями мы с командой обнаружили несколько интересных закономерностей:
Простая замена инструкций с английского на русский приводит к заметному снижению метрик качества.
⚠️ Учитывайте это, если используете англоязычные бенчмарки, а рассчитываете на эксплуатацию в русскоязычной среде — метрики могут оказаться несопоставимыми.
С увеличением размера модели метрики стабильно растут, что подтверждает тренд на масштабирование.
Специализированные кодовые модели, особенно крупные, показывают лучшие результаты, чем универсальные модели сопоставимого размера.
Современные модели демонстрируют результаты на уровне менее 40 % от максимально возможного на данном бенчмарке. Это подчёркивает как его высокую сложность, так и потенциал для дальнейшего прогресса в этой области.
Смотрите результаты в официальной таблице лидеров MERA Code.
В заключение
MERA Code — это попытка закрыть важный пробел в тестировании LLM: насколько они действительно полезны в реальной, локализованной разработке. Надеемся, бенчмарк будет полезным инструментом для исследователей, инженеров и всех, кто работает с ИИ в коде.
Над проектом работали:
команда AGI NLP SberAI: @alenusch, @arorlov, @mathamateur;
команда GigaCode SberAI: @ratatosk, @valeich, @RLevichev, @dmitry-vorobiev, @adefful, @BelowZero, @padamenko;
команда МТС ИИ: @madguro, Мария Дзюба, Алёна Пестова;
команда Т-Банк: @a_ilseyar, @ZavgorodnevAAl, @aimedvedevq, @stanislav-moiseev;
команда Ростелеком: Викулов Владимир, Пихтовников Кирилл, Быков Антон
команда Сибирские нейросети: @rmndrnts, @dangrebenkin.
Мы планируем расширять набор задач и прикладных сценариев, а также количество поддерживаемых языков программирования. Если вам интересно протестировать свои модели или просто разобраться в метриках — добро пожаловать в репозиторий. Присоединяйтесь, предлагайте свои задачи и помогайте развивать бенчмарк, мы открыты к сотрудничеству.
Давайте вместе сделаем оценку LLM более осмысленной! 🚀