
В прошлом году мы уже рассказывали, как создавали нашего помощника программиста Kodify. Не прошло и года, и мы представили вам новую его версию — Kodify 2. А буквально сегодня объявили о выпуске опенсорсной — Kodify Nano. Kodify 2 доступен только для корпоративных заказчиков, а Kodify Nano мы сделали открытым — выложили на Hugging Face.
Ключевое слово для обеих этих версий — компактность. В этой статье отвечаем на главный вопрос, который нам отовсюду прилетал при запуске Kodify: Почему мы решили пойти против течения и создать «легких» ИИ‑помощников для разработчиков? Также вы узнаете, как мы их учили, чтобы они справлялись с поставленными задачами не хуже, чем их собратья схожего или даже большего размера, и какую методологию оценки использовали.
Характеристики Kodify 2 и Kodify Nano
Kodify 2 содержит 7 млрд параметров и поддерживает контекст до 32 768 токенов. Модель поставляется с бэкендом, который обеспечивает OpenAI‑совместимый API для интеграции с плагинами к IDE и другими приложениями. Хотя нашими целевыми языками являются Python, Java, JavaScript, C# и Go (мы обучаем и проверяем наши модели на них), Kodify знает больше 90 языков. Основные способы использования: автодополнение кода (autocomplete), генерация юнит‑тестов, автоматическое документирование кода (Docstrings, JavaDoc, etc), написание кода по текстовому запросу пользователя, объяснение кода.
Модель Kodify Nano отличается только меньшим размером — 1,5 миллиарда параметров. Она умеет делать то же самое (ну почти).
Модельки можно встроить в любую среду разработки в формате чат‑ассистента, который выполняет команды на естественном языке, как на картинке ниже.

Но ведь 7 млрд параметров — это очень мало!
Такой была реакция, когда пару месяцев назад мы объявили о выпуске Kodify 2.
Действительно, в погоне за качеством наблюдается тенденция к увеличению размеров моделей для генерации кода. Большинство недавно вышедших моделей содержат от 7 млрд до 72 млрд параметров, и чувствуется тенденция выхода моделей размером несколько сотен миллиардов параметров, из‑за чего растут требования к вычислительным ресурсам. А что делать, если вычислительных ресурсов не так много, как надо?
Мы в MTS AI уверены, что компактные модели могут быть не менее эффективными, если оптимизировать их архитектуру и процессы обучения. Создание маленькой LLM, способной работать на массовых устройствах, открывает возможности для широкого круга разработчиков и предприятий — они могут использовать передовые технологии без существенных инвестиций в инфраструктуру.
Качество выпускаемых моделей растет достаточно быстро, например, CodeLlama 32B, выпущенная в августе 2023 года, сегодня уступает по качеству современным 7B моделям.
Что мы сделали, чтобы наши малые LLM хорошо справлялись с поставленными задачами?
Kodify Nano и Kodify 2 основаны на Qwen Coder 2.5, которая уже зарекомендовала себя как очень качественный инструмент для генерации кода. Однако мы еще улучшили способности модели в области генерации кода, создания юнит‑тестов и документирования кода, а также работу с русским языком.
Для обучения второго поколения моделей Kodify мы использовали метод Direct Preference Optimization (DPO) на собственном датасете, содержащем большое количество высококачественного кода на разных языках программирования. Этот метод позволяет модели эффективно обучаться на предпочтительных примерах, улучшая качество генерируемого кода.
Чтобы сделать Kodify еще доступнее, мы подготовили квантизированные версии — до 4 бит (это существенно снизило потребление памяти почти без потери качества). Применяли метод GPTQ‑квантизации (Generalized Post‑Training Quantization). Это один из лучших, на сегодня, методов. Он использует калибровочный датасет, являющийся частью датасета, на котором обучалась модель, для того, чтобы «сжать» модель, не испортив её.
Ну и традиционно алайменту моделей уделили должное внимание.
В целом, наши бенчмарки показали, что обе модели хорошо справляются со своими задачами для своего размера — об этом подробнее расскажу в конце статьи. Единственно, что при работе с Kodify Nano из‑за небольшого размера (1,5 млрд параметров), мы не рекомендуем использовать автокомплит, его качество может расстроить. Но у Kodify 2 с этим порядок ?️️️️️️.
Использование моделей
Kodify 2 доступен только корпоративным клиентам, его уже используют в группах разработки МТС. Поставляется в зависимости от требований заказчика в виде стандартной 16 битной модели или квантизированной в 8 бит или 4 бита.
Kodify Nano вы можете опробовать сами — тоже в трех версиях. Вот ссылки:
Kodify‑Nano — это основная модель, которую мы представляем. Рекомендуется на видеокартах Nvidia c не менее, чем 10 Гб памяти.
Kodify‑Nano‑GPTQ (4bit) — это квантизированная версия Kodify Nano, которая в три раза меньше оригинальной модели. Рекомендуется на видеокартах Nvidia c не менее 6 Гб памяти.
Kodify‑Nano‑GGUF — это модель, сконвертированная для работы с Ollama/llama.cpp. Рекомендуется, если нет мощной видеокарты. Есть варианты 16 бит, 8 бит и 4 бита.
Мы рекомендуем использовать модели с нашим собственным плагином (скачать тут), он уже настроен для работы с Kodify Nano. Есть версии для VS Code и IntelliJ IDEA (и других IDE Jet Brains). Плагин создан на основе Continue.dev, можно настроить его для себя, если потребуется, используя документацию на сайте.
Использование с Ollama
Вы можете запустить Kodify Nano на OLLAMA двумя способами:
используя Docker;
локально. При этом способе запуска модель отвечает быстрее, чем при запуске через Docker.
Необходимо выбрать одну из 3х моделей:
hf.co/MTSAIR/Kodify‑Nano‑GGUF — неквантизированная модель, максимальное качество, 3.1 Гб. Рекомендуем для CPU или GPU не менее 5 Гб.
hf.co/MTSAIR/Kodify‑Nano‑GGUF:Q8_0 — квантизованная 8 бит, 1.65 Гб. Рекомендуем для GPU с 3–5 Гб памяти.
hf.co/MTSAIR/Kodify‑Nano‑GGUF:Q4_K_S — квантизация 4 бита, 0.94 Гб. Рекомендуем для GPU с 1–3 Гб памяти.
Способ 1. Запуск Kodify Nano на OLLAMA в Docker
1. Если у вас нет видеокарты NVIDIA, запустите OLLAMA следующей командой
docker run -e OLLAMA_HOST=0.0.0.0:8985 -p 8985:8985 --name ollama -d ollama/ollama
Убедитесь, что у вас установлен и запущен Docker перед запуском команды.
Важно! Если порт 8985 уже занят, замените его на любой другой свободный порт. В этом случае также требуется изменить порт в конфигурации плагина (смотрите раздел «Изменение адреса порта в настройках плагина в средах Visual Studio Code и JetBrains» — ниже).
Если у вас есть видеокарта NVIDIA и нужно добавить GPU в контейнер, выполните следующую команду:
docker run --runtime nvidia -e OLLAMA_HOST=0.0.0.0:8985 -p 8985:8985 --name ollama -d ollama/ollama
2. Загрузите выбранную модель в OLLAMA:
docker exec ollama ollama pull hf.co/MTSAIR/Kodify-Nano-GGUF
3. Задайте корректное имя для модели. Измените «hf.co/MTSAIR/Kodify‑Nano‑GGUF» на «kodify_nano» следующей командой:
docker exec ollama ollama cp hf.co/MTSAIR/Kodify-Nano-GGUF kodify_nano
4. Запустите модель:
docker exec ollama ollama run kodify_nano
Способ 2. Запуск Kodify Nano на OLLAMA локально
Скачайте и установите OLLAMA с сайта:
https://ollama.com/downloadЗадайте порт:
export OLLAMA_HOST=0.0.0.0:8985
Важно! Если порт 8985 уже занят, замените его на любой другой свободный порт. В этом случае также требуется изменить порт в конфигурации плагина (смотрите раздел «Изменение адреса порта в настройках плагина в средах Visual Studio Code и JetBrains» ).
3. Поднимите сервер OLLAMA.
ollama serve &
4. Загрузите выбранную модель, выполнив следующую команду:
ollama pull hf.co/MTSAIR/Kodify-Nano-GGUF
5. Задайте корректное имя для модели. Измените hf.co/MTSAIR/Kodify‑Nano‑GGUF на kodify_nano следующей командой:
ollama cp hf.co/MTSAIR/Kodify-Nano-GGUF kodify_nano
6. Запустите модель следующей командой:
ollama run kodify_nano
Установка плагина
Установка плагина в среде Visual Studio Code
Скачайте последнюю версию плагина Kodify для Visual Studio Code.
Перейдите в раздел «Extensions» на левой панели инструментов.
В диалоговом меню выберите пункт «Install from VSIX…» и укажите скачанный файл плагина.
Установка плагина в среде JetBrains
Скачайте последнюю версию плагина Kodify для JetBrains.
Запустите IDE и перейдите в настройки.
Выберите пункт «Plugins» для перехода в настройку плагинов.
Нажмите на шестеренку в правом верхнем углу и выберите «Install Plugin from Disk…»
Выберите скачанный файл с плагином.
Подтвердите перезагрузку IDE после установки. Нажмите «Restart IDE».
Изменение адреса порта в настройках плагина в средах Visual Studio Code и JetBrains
Если порт при поднятии Docker Compose отличается от порта 8985, измените порт в файле config.json, выполнив следующие шаги:
Откройте в IDE любой файл.
-
Откройте боковую панель Kodify, используя следующую комбинацию клавиш:
в Visual Studio Code — «CTRL + L» («CMD + L» на Mac);
в JetBrains — «CTRL+ J» («CMD + J» на Mac). Откройте конфигурационный файл config.json одним из следующих способов:
Способ 1. На боковой панели Kodify нажмите на кнопку «Open Settings» в Visual Studio Code или «Kodify Сonfig» в JetBrains.
В разделе Configuration для Chat настроек нажмите кнопку «Open Config File».
Способ 2. На боковой панели раскройте меню Kodify и нажмите на кнопку «Open Settings» (шестеренка).Измените в конфигурационном файле config.json адрес порта для поля «apiBase» в разделах конфигурации плагина «tabAutocompleteModel» и «models».
Сохраните настройки файла config.json в IDE. Для этого, нажмите комбинацию клавиш Ctrl+S или выберите пункт меню IDE: File → Save.
Развёртывание модели в vLLM
Для развёртывания наших моделей с использованием GPU мы рекомендуем использовать фреймворк vLLM (подробнее можно почитать здесь)
Установка vLLM:
pip install vllm
Деплой модели c vLLM:
python3 -m vllm.entrypoints.openai.api_server --model MTSAIR/Kodify-Nano --port 8985 --max-model-len 8192 --served-model-name kodify_nano
Или при помощи Docker:
docker run --gpus all \
-p 8985:8000 \
-v ~/.cache/huggingface:/root/.cache/huggingface \
vllm/vllm-openai:latest \
--model MTSAIR/Kodify-Nano \
--max-model-len 8192 \
--served-model-name kodify_nano
Во время первого запуска нужно подождать, пока скачаются веса модели.
Готово, теперь у Вас есть своя собственная LLM, работающая локально!
Пример запроса к API при помощи Python
import openai
endpoint = 'http://localhost:8985/v1'
model = "MTSAIR/Kodify-Nano"
client = openai.OpenAI(base_url=endpoint, api_key="123")
response = client.chat.completions.create(
model=model,
max_tokens=2048, # Use more if you have enough memory (or less if not)
messages=[
{"role": "user", "content": "Разработай на языке Python алгоритм для поиска всех уникальных слов в тексте."},
]
)
answer = response.choices[0].message.content
print(answer)
Пример использования через transformers
from transformers import pipeline
pipe = pipeline("text-generation", model="MTSAIR/Kodify-Nano", device="cuda")
messages = [
{"role": "user", "content": "Напиши алгоритм для поиска всех уникальных слов в тексте на Python."},
]
res = pipe(messages, max_length=1024)
print(res[0]['generated_text'][-1][‘content’])
Оценка моделей
В последнее время для оценки моделей все чаще применяется методика сравнения Side‑by‑Side (SBS), или «параллельное сравнение» с ChatGPT (gpt-3.5-turbo или gpt-4-turbo). И наш случай не стал исключением — мы также решили использовать этот подход, сравнивая нашу модель с Github Copilot. Подробнее о нашем подходе к SBS мы рассказывали, когда запускали Cotype Pro 2, читайте тут.
Мы проводим 2 вида SBS‑тестирования для наших моделей:
1. Ручная оценка квалифицированными ИИ‑тренерами — людьми. Используется в качестве референсной для калибровки автоматической оценки.
2. Автоматическая оценка при помощи одной из лучших моделей на рынке. Мы используем для разных задач GPT4o, GPT4.1, Claude Sonnet, Claude Opus, DeepSeek‑R1, Qwen 3.
Ручная оценка
Мы делаем модели, которые используют люди, и, конечно, не можем полностью доверить оценку LLM, какими бы хорошими они не были. Оценку, сделанную людьми, мы считаем эталоном и подбираем модели, промпты, параметры и методику автоматической оценки таким образом, чтобы её результаты максимально коррелировали с ручной. Важно, что ИИ‑тренеры, которые выступают здесь в качестве судей, получают обезличенные данные, и не знают, ответы от каких моделей они оценивают. В каждой паре ответов, модели, которые скрываются под псевдонимами «модель А» и «модель B» выбираются случайно, это необходимо для объективности оценки.
Автоматическая оценка
В качестве набора тестовых данных мы использовали 2500 пользовательских запросов, которые включали задачи написания документации (Docstrings, documentation comments) к функции, unit‑тестов, а также задачи генерации кода по текстовому запросу пользователя. В тестовый сет входит одинаковое количество задач по каждому из 5 наших целевых языков программирования, это Python, Java, JavaScript, C# и Go, в задачах написания документации так же — одинаковое количество задач на русском и английском языках. Задач, где требуется сгенерировать текст на русском, в наборе данных 20%, на английском — тоже 20%, остальное — генерация кода. На каждый из 2500 запросов мы получаем ответы от сравниваемых моделей и Github Copilot.
Для сравнения ответов используется специальный промпт для модели‑судьи, в котором расписаны критерии и поставлена задача определить итоговую оценку или «победителя» в сравнении пары ответов.
Упрощенный пример такого промпта (перевод)
«Твоя задача — выступить в качестве объективного и строгого судьи, оценивая ответы двух ИИ‑помощников по коду на запрос пользователя (программиста). Выяви и исправь любые ошибки в коде. Выбери помощника, который лучше следует инструкциям пользователя и отвечает на вопрос более качественно. Твоя оценка должна учитывать такие факторы, как полезность, релевантность, точность, глубина, отсутствие ошибок в коде, стиль кода.
После предоставления пояснения выведи два значения: 0 или 1, указывающие баллы для помощников А и B, соответственно, по правилу: если один ответ намного лучше другого, то лучший ответ — 1, а худший — 0, если ответы одинаково хороши — оба 1, если ответы одинаково плохи — оба 0.
Выведи свой окончательный вердикт, строго следуя этому формату: [[{{Оценка помощника А}} {{Оценка помощника B}}]]
[Начало запроса пользователя]
<<Сюда вставляется текст запроса пользователя>>
[Конец запроса пользователя]
[Начало ответа ассистента А]
<<Сюда вставляется текст ответа ассистента А>>
[Конец ответа ассистента А]
[Начало ответа ассистента B]
<<Сюда вставляется текст ответа ассистента B>>
[Конец ответа ассистента B]»
Модель‑оценщик (судья) просматривает пары ответов и решает, какой из них лучше. Из‑за того, что модели часто склонны выбирать ответ, который идёт первым, мы делаем двойную оценку: меняем ответы А и B местами и отдаем «судье» снова. Таким образом, мы получаем 5000 вердиктов для 2500 тестовых запросов.
По каждому из направлений оценки (документация, тесты и кодогенерация) мы рассчитываем показатель доли «хороших» ответов, то есть, определяем, среди всех ответов от двух моделей, которые «понравились судье», сколько ответов принадлежит тестируемой нами модели. Формула:
где:
— число сравнений, где победила модель А (вердикт судьи [[1 0]])
— число сравнений, где победила модель B (вердикт судьи [[0 1]])
— число сравнений, где ответы оказались одинаково хорошими (вердикт судьи [[1 1]]).
— число сравнений, где ответы оказались одинаково плохими (вердикт судьи [[0 0]]).
Преимущества такой метрики:
Она нормирована, всегда находится в диапазоне от 0 до 1, где 0 соответствует худшему результату, а 1 — лучшему, для одинаковых моделей равна 0.5.
Интерпретируема — это доля хороших или правильных ответов одной модели среди всех хороших ответов обеих моделей.
Сумма метрик для двух моделей в одном тестировании равна 1.
А главное — это одно число вместо четырёх.
Результаты тестов
Мы тестировали Side‑by‑Side (SBS) Kodify Nano и Kodify 2 против GitHub Copilot Chat* с использованием GPT-4o в качестве модели‑судьи (имеем в виду, она же используется в GitHub Copilot Chat v0.21, поэтому может немного занижать оценки моделей, не принадлежащих OpenAI).
*Применяли версию плагина для VS Code GitHub Copilot Chat v0.21.2 024 090 602 (pre‑release, сентябрь 2024 года), использующую модель GPT-4o, без RAG и других дополнительных функций плагина.
Как видим из графика ниже, наши модели эффективнее справились с задачами предоставления релевантных решений для разработчиков по сравнению с открытыми моделями сопоставимого размера.

Итог:
Малые LLM со сравнительно небольшим набором параметров имеют целый ряд преимуществ и при должном подходе к обучению и архитектуре могут выдавать качественные ответы. Вот саммари сильных сторон наших новых моделей Kodify:
Компактность. Благодаря небольшому размеру модели могут работать на широком диапазоне устройств. Квантизованной версии Kodify Nano достаточно всего 1Гб памяти.
Высокое качество. Несмотря на размер, модели превосходят многие крупные аналоги в задачах разработки кода, особенно это касается Kodify 2.
Производительность. Даже на слабом оборудовании обеспечивают приемлемую скорость ответа благодаря небольшому размеру.
Энергосбережение. Меньшее потребление ресурсов ведет к снижению энергозатрат и удлинению времени автономной работы устройств.
Возможность выбора между опенсорсным помощником Kodify Nano и корпоративным Kodify 2.
У каждого варианта свои плюсы. Kodify 2 — компактная модель, не уступающая мировым лидерам, которая может быть развернута в корпоративном контуре. Это исключает утечку кода и конфиденциальных данных, а еще обеспечивает автономность и низкие задержки при работе. А доступность исходного кода Kodify Nano способствует развитию сообщества и совместным улучшениям. Мы верим, что это приведет к появлению еще более мощных и полезных инструментов в будущем.
Комментарии (4)
Jijiki
11.06.2025 08:54спасибо огромное за статью, читая статью проникся мыслью, как ИИ вообще может знать какой код точно лучше(а какой самый лучший единственный 1 из миллиона), в этом ответе наверно и может быть весь смысл
про колличество парраметров тоже задумался, тоже интересно, 100 миллиардов интов или чего-то там ) занимает память)
Margutoop
11.06.2025 08:54Если Лекун вообще против текущего подхода, как они собираются уживаться в одной компании? Или он так и будет разрабатывать свою JEPу?
Timmek
Почему бы не сделать условно 14b модель, но с MOE? В режиме ожидания и в инференсе будет примерно также, но при этом модель будет изначально умнее.
Polushinm Автор
Да, мы делаем и такие эксперименты тоже. Но пока мы видим больше спроса на модели, которые занимают минимум видеопамяти, стараемся дать максимальное качество при адекватно малых ресурсах.