- BrainTools - https://www.braintools.ru -

Instinct от Continue: будущее автоматического рефакторинга

Команда AI for Devs [1] подготовила перевод статьи о том, как Continue обучила Instinct — открытую модель Next Edit для предсказания следующей правки кода. Разработчики собрали тысячи реальных правок, внедрили алгоритм SeleKT для обучения [2] и показали, что их модель работает в 6,4 раза быстрее ручного редактирования.


Мы рады представить Instinct [3] — открытую Next Edit-модель, которая умно предугадывает ваши действия и поддерживает рабочий ритм.

Когда мы запускали Next Edit [4], её впервые представил Mercury Coder [5] от Inception. Сегодня мы расширяем границы возможностей с Instinct — открытой моделью, обученной внутри компании, которую разработчики могут запускать локально на своих GPU.

В процессе работы Instinct улавливает траекторию ваших изменений и автоматически выполняет следующий шаг — примерно в 6,4 раза быстрее ручного редактирования.

Instinct от Continue: будущее автоматического рефакторинга - 1

Зачем обучать открытую модель?

Хотя open source модели для агентного программирования в последние месяцы развиваются стремительно, направление Next Edit пока находится в зачаточном состоянии. Основной прогресс был достигнут командой Zed с их моделью Zeta, и мы рады, что можем опираться на их опыт [6]. Одна из наших целей — подчеркнуть открывающиеся возможности и заложить основу для будущей работы, которая принесёт пользу не только нашей команде, но и сообществу, и всей экосистеме разработчиков.

И хотя существующие модели вроде Mercury Coder показывают отличные результаты, Instinct даёт разработчикам возможность запускать или настраивать Next Edit-модель на собственных GPU, решая задачи приватности и кастомизации.

Что такое Next Edit?

Аспект

Традиционное атодополнение

Next Edit

Область изменений

Вставляет текст только в точке курсора

Переписывает окно кода (удаления, вставки, замены)

Сложные изменения

Требует многократного подтверждения

Выполняет сложный рефакторинг одной операцией

Перестройка кода

Не умеет удалять или перестраивать код

Понимает траектории редактирования и намерения разработчика

Рабочий поток

Частые прерывания сбивают ритм

Поддерживает поток с минимумом отвлечений

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

Например, рефакторинг функции может включать: удаление старых параметров (5 нажатий клавиш), переход к оператору return (2 перемещения курсора), изменение возвращаемого типа (8 нажатий), обновление тела функции (20+ нажатий и 5+ перемещений курсора). С Instinct вся эта последовательность превращается в одно нажатие Tab для подтверждения — 40+ ручных операций сокращаются до одной.

Обучение модели

Данные из реальной разработки

Чтобы создать нашу Next Edit-модель, нам нужны были качественные обучающие данные. Вместо того чтобы синтетически генерировать примеры, мы автоматически собрали более 4000 реальных правок от команды Continue во время работы над нашим open source-кодом. Это на порядок больше, чем датасет Zeta, опубликованный ранее в этом году, и такие данные лучше отражают реальные паттерны разработки, чем чисто синтетические примеры, собранные из git-коммитов.

Каждый пример данных включал:

  • пять последних правок разработчика,

  • релевантный контекст из других файлов,

  • участок кода для переписывания,

  • фактическое изменение, которое разработчик внёс в этот участок.

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

Анализируя последовательности таких диффов, мы заметили, что разработчики иногда возвращались к одним и тем же строкам, многократно изменяя их. Мы ввели фильтры, отбрасывающие такие примеры, поскольку хотели, чтобы Instinct делал эффективные и ненавязчивые изменения без повторов.

Пайплайны контекста автодополнения [7] Continue предоставляли релевантную информацию о кодовой базе, включая содержимое текущего файла в prompt. Область редактирования (участок кода, который модель должна переписать) мы определили как отрезок, начинающийся строкой выше курсора и заканчивающийся пятью строками ниже. Это решение базировалось на естественных особенностях диффов в собранном датасете.

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

Поддержка многоязычности

Одной из проблем стало то, что команда Continue в основном работает с кодом на Typescript. Однако нам хотелось, чтобы модель сохраняла поддержку нескольких языков. Помимо продуманного подхода к обучению (об этом ниже), мы использовали развернутую у себя модель Qwen3-Coder-30B, чтобы синтетически «перевести» диффы, контекст и содержимое файлов на Java, C, Python и Rust. Таким образом мы построили многоязычный датасет на основе данных с Typescript. Набор точных корректоров и фильтров обеспечивал высокое качество и сопоставимое распределение правок среди 4000+ синтетических примеров.

Надёжное обучение для задачи Next Edit

С готовым многоязычным датасетом мы перешли к supervised fine-tuning (SFT). Для специализированных задач вроде Next Edit SFT обычно выполняется с помощью Low-Rank Adaptation (LoRA): она хоть и усваивает меньше, зато и забывает меньше [8] из уже имеющихся у предобученной модели навыков программирования.

Главная проблема LoRA в том, что параметры для дообучения фиксируются ещё до старта обучения. Более предпочтительно выявить те параметры, обновление весов которых действительно критично, и менять только их. Тогда задача Next Edit будет не обучением «с нуля» ценой потери прежних знаний, а адаптацией к редактированию при сохранении общего кодерского бэкграунда.

Именно такое решение мы нашли в алгоритме Selective Knowledge Transfer (SeleKT), применяемом для обучения NextCoder [9] — моделей с инструкциями для редактирования кода. SeleKT вычисляет плотные градиенты (как при полном fine-tuning), выбирает top-k по величине и обновляет только их. Таким образом, практика показывает, что действительно нужно изменить, вместо угадывания заранее. В итоге корректируются только самые важные веса для задачи Next Edit. Более того, зануление мелких обновлений помогает избежать переобучения и деградации уже имеющихся знаний — проблем, с которыми столкнулся бы полный fine-tuning.

Мы дообучили 5% параметров модели Qwen2.5-Coder-7B [10] с помощью SeleKT. После первоначального подбора гиперпараметров процесс обучения был стандартным: постепенный разогрев learning rate и последующее затухание по косинусной кривой в течение 5 эпох. Для быстрой оценки качества переписываний на обучении мы использовали метрику CodeBLEU [11], сравнивая предсказанные изменения с эталонными. Сравнение CodeBLEU между разными языками датасета позволило настроить пропорции данных и добиться высокой валидационной точности во всех языках. Благодаря такому подходу для обучения потребовалось всего небольшое число многоязычных примеров.

Результаты: оценка качества и скорости

  • 3.877 — средний балл LLM-оценщика (новый open-source state-of-the-art)

  • в 6.4 раза быстрее, чем ручной набор правок (на нашем кластере 8xH100)

Формально оценить качество предложений Next Edit непросто, ведь одну и ту же задачу можно решить разными способами. Поэтому мы использовали Claude как LLM-оценщика с инструкциями оценивать предложения Next Edit по пятибалльной шкале, где:

  • 5 — полное функциональное совпадение с правкой разработчика;

  • 4 — близкая к эталонной правка, но без точного функционального совпадения;

  • 3 — правка, не совпадающая с эталоном, но логичная для эксперта в такой ситуации;

  • 2 — изменение, которое не вытекает логически из предыдущих правок и контекста;

  • 1 — вмешательство, мешающее работе разработчика (например, крупные удаления или полный оффтоп);

  • 0 — некорректное переписывание, не совпадающее с выделенной областью.

Эта методика близка к той, что использует Zed для модели Zeta. Мы заметили, что их prompt приводил к оценкам только 0 или 5 и основывался на ручных утверждениях о следующей правке. Мы же разработали другой системный prompt, который позволяет охватить весь спектр баллов и сравнивает правку модели с эталонной правкой разработчика вместо жёстких правил.

С небольшими адаптациями под наши промпты Instinct показала средний результат 3.877, превысив показатель Zeta (3.735) на тестовом наборе. Мы рады видеть, что сообщество продолжит развивать этот бенчмарк и улучшать результаты.

Instinct не только выдаёт качественные подсказки — наша метрика «keystroke-distance», частично основанная на подходе Coeditor [12], показывает, что модель также значительно ускоряет рабочий процесс.

Если пройтись назад по таблице динамического программирования (DP) в алгоритме вычисления расстояния Левенштейна, можно извлечь посимвольный дифф между редактируемой областью и предложенным переписыванием. Этот дифф затем можно «нарезать» на операции редактирования: например, добавление трёх символов в одной позиции, удаление пяти в другой и т. д.

Минимальное время выполнения правки определяется оптимальной комбинацией нажатий клавиш и перемещений курсора, необходимых для всех операций. Это тоже можно формализовать как задачу DP. Мы исходили из следующих допущений: разработчик печатает со средней скоростью 90 слов в минуту, может выделять и удалять блоки вместо многократного Backspace, использует мелкие перемещения стрелками вместо более затратных прыжков курсора, а при расчёте учитывается пространственная дистанция между позициями курсора (строка и символ), а не просто индекс в строке.

Это нижняя граница времени для ручного редактирования. Мы сравнили её со средним временем инференса модели на нашем внутреннем эндпоинте SGLang плюс временем одного нажатия клавиши (Tab для подтверждения).

Результат: даже если бы разработчик сразу знал нужную правку и выполнил её оптимальной последовательностью действий со скоростью 90 WPM, использование модели всё равно обеспечивало бы получение качественного изменения в 6,4 раза быстрее.

Русскоязычное сообщество про AI в разработке

Instinct от Continue: будущее автоматического рефакторинга - 2

Друзья! Эту статью перевела команда ТГК «AI for Devs [1]» — канала, где мы рассказываем про AI-ассистентов, плагины для IDE, делимся практическими кейсами и свежими новостями из мира ИИ. Подписывайтесь [1], чтобы быть в курсе и ничего не упустить!

Что дальше?

Во-первых, попробуйте Instinct сами! Модель весит 7B параметров, так что на большинстве ноутбуков она будет работать медленно, но при достаточном «железе» — отличный вариант для локального развертывания. Подробнее читайте в нашем гайде [13].

Если хотите развивать наш датасет, пайплайны обучения или открытые веса (например, чтобы запускать KTO [14] на своих данных о принятых/отклонённых правках), загляните в наш репозиторий на GitHub [15], модельную карточку на HuggingFace [3] и датасет.

Автор: python_leader

Источник [16]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/19431

URLs in this post:

[1] AI for Devs: https://t.me/+k2M02gENeksyM2Y6

[2] обучения: http://www.braintools.ru/article/5125

[3] Instinct: https://huggingface.co/continuedev/instinct?ref=blog.continue.dev

[4] Next Edit: https://blog.continue.dev/next-edit-powered-by-mercury-coder/

[5] Mercury Coder: https://hub.continue.dev/inceptionlabs/mercury-coder?ref=blog.continue.dev

[6] опыт: http://www.braintools.ru/article/6952

[7] Пайплайны контекста автодополнения: https://blog.continue.dev/root-path-context-the-secret-ingredient-in-continues-autocomplete-prompt/

[8] усваивает меньше, зато и забывает меньше: https://arxiv.org/abs/2405.09673?ref=blog.continue.dev

[9] NextCoder: https://www.microsoft.com/en-us/research/publication/nextcoder-robust-adaptation-of-code-lms-to-diverse-code-edits/?ref=blog.continue.dev

[10] Qwen2.5-Coder-7B: https://arxiv.org/abs/2409.12186?ref=blog.continue.dev

[11] CodeBLEU: https://arxiv.org/abs/2009.10297?ref=blog.continue.dev

[12] Coeditor: https://arxiv.org/abs/2305.18584?ref=blog.continue.dev

[13] нашем гайде: https://docs.continue.dev/guides/instinct?ref=blog.continue.dev

[14] KTO: https://arxiv.org/abs/2402.01306?ref=blog.continue.dev

[15] репозиторий на GitHub: https://github.com/continuedev/instinct?ref=blog.continue.dev

[16] Источник: https://habr.com/ru/articles/946286/?utm_campaign=946286&utm_source=habrahabr&utm_medium=rss

www.BrainTools.ru

Rambler's Top100