Модель Qwen2.5-Coder генерирует код, обучаясь на разнообразных данных

Модель Qwen2.5-Coder предназначена для генерации кода и обучена на данных из 92 языков программирования, включая синтетические и текстовые материалы. В её основе лежит мультиязычная поддержка и итеративный процесс обучения с использованием различных LLM и RLEF для проверки кода
Новости 2025 04 03

Введение в Qwen2.5-Coder

Qwen2.5-Coder представляет собой продвинутую модель генерации кода, разработанную с целью улучшения качества и функциональности программирования. Основной задачей этой модели является создание кода на различных языках с учетом разнообразных источников данных и методов обучения. В процессе разработки исследователи собрали обширные датасеты, включающие код на 92 языках, текстовые данные и документацию, что позволило модели не только генерировать код, но и интерпретировать и улучшать его. Кроме того, внедрение методов, таких как Fill-in-the-Middle (FIM), позволяет модели работать с фрагментами кода и эффективно справляться с задачами в условиях ограниченного контекста.

Обучение модели происходило через несколько этапов, охватывающих как файловые структуры, так и целые репозитории. Это позволило значительно увеличить объем контекста, используя современную технику RoPE и параметры YARN. Уникальной особенностью Qwen2.5-Coder является также мульти-язычная поддержка, на создание которой потребовалось привлечение экспертов и постоянное обновление эталонных примеров. В результате модель демонстрирует высокую степень универсальности и эффективности в решении задач, связанных не только с программированием, но и с анализом текстов и математическими вычислениями.

Обучение и токенизация

Модель Qwen2.5-Coder обучалась как на отдельных файлах кода, так и на целых репозиториях, что позволило ей более эффективно воспринимать структурированную информацию. Основой для обучения послужил словарь Qwen2.5, который включает в себя 151,646 токенов. Однако для повышения универсальности и эффективности работы модели, авторы решили дополнить этот словарь специальными токенами. Эти дополнительные токены играют ключевую роль в специфических режимах обучения, таких как Fill-in-the-Middle (FIM), который предоставляет модели возможность более точно предугадывать и генерировать недостающие части кода на основе контекста.

Процесс токенизации и обучение на разнообразных данных позволили модели осваивать не только синтаксис различных языков программирования, но и основополагающие принципы разработки программного обеспечения. Это в свою очередь помогло Qwen2.5-Coder не просто генерировать код, а делать это качественно и осмысленно, что, безусловно, является важным шагом к созданию более продвинутых инструментов программирования и автоматизации.

Типы данных в датасете

Для дополнительного преобучения модели Qwen2.5-Coder использовались пять типов данных, что позволило достигнуть высокой эффективности в генерации кода и выполнении различных задач. Первоначально модель училась на коде, охватывающем 92 языка программирования, что составило основную часть датасета и предоставило разнообразные примеры. Затем были добавлены текстовые и кодовые данные, включая документацию и руководства, что обогатило систему контекстом и пониманием языковых особенностей.

Синтетические данные, созданные с помощью предыдущей версии системы, а также математические примеры добавили специфику, позволяя модели справляться с не только программными задачами, но и с вычислительными, что повысило ее универсальность. Анализ бенчмарков показал, что оптимальная пропорция между кодом, математическими данными и текстом составила 7:2:1. Это соотношение обеспечило баланс, который необходим для эффективного обучения и тестирования модели, что является ключевым фактором в ее успешной работе.

Этапы обучения

Обучение Qwen2.5-Coder началось с процесса, ориентированного на отдельные файлы, где контекстное окно ограничивалось 8 тысячами токенов. На этом этапе была внедрена методология Fill-in-the-Middle (FIM), что позволило модели научиться обрабатывать код с гибкостью, затрагивая как стандартные, так и специфические примеры кода. Постепенно обучение перешло на уровень репозиториев с увеличением контекстного окна до 32 тысяч токенов. Это стало возможным благодаря повышению параметра RoPE base до миллиона, что значительно расширило возможности обработки информации и улучшило контекстное понимание в коде. Для дальнейшего увеличения контекстного окна до 128 тысяч токенов применялась методика экстраполяции под названием YARN, что позволило модели эффективно обрабатывать значительно большие объемы данных, включая сложные структуры кода и их взаимосвязи. Таким образом, подходящий алгоритм обучения сумел нарастить как объем обрабатываемой информации, так и качество генерируемого кода.

Посттрейнинг и классификация

На этапе посттрейна модель CodeBERT была настроена для классификации документов, охватывающих более ста языков программирования. Это обучение стало важным шагом для повышения точности и грамотности генерации кода, так как было необходимо четко различать различные языковые структуры и синтаксисы. Авторы проекта сосредоточились на сохранении и анализе документов, написанных на популярных языках, таких как Python, Java и JavaScript, чтобы создать более надежную и актуальную базу данных. Важным решением было частичное удаление документов на редких языках, что способствовало повышению качества обучающего датасета.

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

Генерация инструкций и ответы

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

Для повышения качества таких пар использовалась методика фьюшота на открытых инструкт-датасетах, например, McEval-Instruct. Это подход позволяет модели адаптироваться к контексту и улучшать свои ответы, обучаясь на разнообразных примерах. Многоступенчатая система и использование богатого набора данных способствуют созданию надёжных и информативных инструкций, что в свою очередь значительно облегчает работу разработчиков и конечных пользователей.

Мультиязычный SFT-датасет

Формирование мультиязычного SFT-датасета для модели Qwen2.5-Coder осуществлялось с применением специализированных агентов, каждый из которых управлял собственным банком памяти генераций. Это обеспечивало более эффективную обработку языковых данных, позволяя адаптировать обучение к различным языкам программирования. Хотя технический отчёт не предоставляет детальной информации о структуре SFT-датасета, известно, что оценка сгенерированных пар выполнялась по чеклисту из девяти параметров. Эти параметры включали сложность задач, корректность и ясность кода, что было критически важно для достижения высоких стандартов качества. При таком подходе обеспечивалась не только точность результатов, но и возможность обучить модель на более широком спектре языков, что в свою очередь способствовало универсальности Qwen2.5-Coder в решении различных программных задач.

Создание и обслуживание «песочницы»

Создание мультиязычной «песочницы» для Qwen2.5-Coder стало одной из самых сложных задач проекта, требующей значительных усилий и ресурсов. Для успешной работы «песочницы» необходимо было обеспечить поддержку 92 языков программирования, что включает в себя сбор репозиториев с эталонным кодом и создание генераторов юнит-тестов. Это предполагает не только написание разнообразных тестовых сценариев, но и реализацию движков выполнения кода и анализаторов результатов, которые способны обрабатывать результаты выполнения тестов.

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

Процесс улучшения SFT-данных

Процесс улучшения данных, используемых для SFT (Supervised Fine-Tuning), представлял собой значимый этап в разработке модели Qwen2.5-Coder. Изначально в наличии было несколько десятков миллионов примеров, которые, хотя и отличались разнообразием, не всегда были высокого качества. Это создавало необходимость в тщательной фильтрации, чтобы получить наилучшие образцы.

Для достижения этой цели применяли метод rejection sampling, который позволяет отсеивать менее качественные данные и оставлять только самые удовлетворительные образцы. Благодаря этому, объем выборки постепенно сокращался до нескольких миллионов примеров, демонстрирующих значительно более высокие показатели надежности и актуальности. Таким образом, данная практика не только улучшила качество обучающего материала, но и способствовала созданию более эффективной модели, способной справляться с множеством различных задач, включая решения, не связанные непосредственно с кодом.

Способы поддержания контекста

На этапе SFT для обеспечения сохранения навыков работы модели с длинным контекстом применялись короткие инстракт-сэмплы в режиме Fill-in-the-Middle (FIM). Это позволило избежать потери информации при обучении, обеспечивая концентрированное взаимодействие с контекстом. Для создания синтаксиса добавленного контекста использовали парсер Tree-sitter-languages, который эффективно обрабатывает различные языки программирования. Хотя количество примеров с обогащённым контекстом было меньше, чем у традиционных SFT-данных, такой подход позволил модели лучше справляться с задачами в области программирования и текста. Разнообразие инструкций, как и их членение на короткие сэмплы, способствовали выработке у модели более гибких навыков работы с контекстом в зависимости от сложности и специфики задач.

Использование DPO

В процессе разработки модели Qwen2.5-Coder для DPO (Dynamic Programming Optimization) активно использовались RLEF (Runtime Execution Feedback) для получения сигналов о работоспособности кода. Это позволило эффективно оценить, какие части кода действительно выполняются и решают поставленные задачи. Кроме того, юнит-тесты стали важным фактором в обеспечении стабильности производимого кода. При этом разработчики также интегрировали примеры задач, не связанных непосредственно с программированием, что расширяло горизонты модели и позволяло ей разрабатывать решения в более широком контексте. В этом процессе в качестве LLM-as-a-judge применялась четвёртая версия модели, что обеспечивало дополнительный уровень качества оценки и обратной связи, необходимой для улучшения результата обучения.

Поиск