Как мы обучили Next Edit Suggestions модель

от автора

Что такое Next Edit Suggestions

Next Edit Suggestions (NES) это режим автодополнения, который предсказывает следующее редактирование программиста: что он изменит, где и как. Модель смотрит не только на код, но и на последнюю серию правок и предсказывает следующее действие в той же логике. Образно говоря, это модель которая работает в пространстве действий и намерений программиста.

В отличие от обычного автокомплита, NES:

  • опирается на историю недавних правок

  • работает не только под курсором, а в любом месте файла

  • может не только добавлять код, но и удалять и изменять

Типичные кейсы NES:

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

  • обновление вызовов под новую сигнатуру

  • продолжение начатого рефакторинга

  • приведение к единому стилю

  • тиражирование фикса

  • добавление документации по аналогии

  • удаление мёртвого кода

  • балансировка скобок и мелкие линт-фиксы

На такую модель можно смотреть не как на модель текст -> текст, а как на модель последовательность действий -> последовательность действий.

Зачем это всё, если есть агенты

Есть мнение, что код-комплишн и некст-эдит не нужны, весь хайп на агентах. Например Sweep пишут: “We decided to shut down because autocomplete usage is declining industry-wide as agents have become significantly better”. Мы у себя в команде Koda видим ситуации при редактировании кода, когда надёжнее и в целом быстрее пробежаться что-то поправить контролируемо и с лёгкостью нажатия таба, и не нужно формулировать промпт.

В теории NES расширяем до next action / next everything, например можно представить что если следующее действие это открыть терминал или запустить сборку, было бы неплохо получать и такие предложения.

Как обучали

Для выбора базовой модели, было важно уложиться в желаемый латенси на запрос, поэтому мы замерили на скорость инференса на наших целевых гпу серверах семейство моделей, и остановились на Qwen2.5-Coder-1.5B и deepseek-coder-1.3b. Обе эти кодер модели которые была предобучены с исопльзованием FIM режима. По метрикам в итоге остановились на квен-кодере как базе для SFT.

По данным для обучения, у нас в Koda были накоплены за год работы анинимизированные частичные логи от нашей модели код-комплишена. Мы реализовали пайплайн превращения этих код-комплишн FIM логов для NES датасета. Сгруппировав по юзеру+сессии+файлу получили последовательности шумных частичных локальных изменений кода. Посколькую одна правка была представлена в таких логах десятками микро-событий, склеили подпоследовательности в те которые образут по логике одну правку, использовали для этого алгоритм мерджа Incremental Difference Detecting из работы “NES: An Instruction-Free, Low-Latency Next Edit Suggestion Framework Powered by Learned Historical Editing Trajectories”. Дальше было важно отфильтровать те их из оставшихся последовательностей правок, которые действительно близки природе NES таски, а именно те в которых таргет был бы сильно связан причинной связью с историей правок кода, а не просто быть следующим логичным кусочком кода. В итоге из миллионов сэмплов получили дясятки тысяч. Так же помогло сделать среди типов insert/replace/delete правок сделать апсемлинг replace. Обучили в SFT режиме, с выбором лучшего чекпоинта по прокси-метрикам.

Таблицы сравнений моделей

В опенсорсе на тему NES есть:

  • модель Instinct и датасет Instinct от разработчиков плагина Continue

  • модель Zeta и Zeta 2 и датасет Zeta от разработчиков редактора Zed

  • модели Sweep от разработчиков плагина Sweep AI

  • датасет NEP (переработанный CommitPack) от авторов статьи “Next Edit Prediction: Learning to Predict Code Edits from Context and Interaction History”

Из основных закрытых NES: Cursor Tab, GitHub Copilot NES, JetBrains AI Assistant.

Открытые модели главным образом дообучены на основе Qwen2.5-Coder моделей, кроме Zeta 2 которая на основе Seed-Coder-8B.

В качестве метрик используем: Exact Match (EM), Edit Similarity (ES), Prefix Similarity (PS), Judge. EM показывает точное совпадение, ES показывает сильно ли нужно править, Judge оценка через GPT-5.2

Таблица замеров моделей на нашем тестовом сете:

Our test (500 samples)

n_of_truncated

EM%

ES%

Judge%

Koda-next-edit (1.5B)

3

27.2

84.7

28.2

zeta-2 (8B)

0

17.0

94.3

20.4

Instinct (7B)

2

19.2

76.2

20.2

zeta (7B)

3

17.2

91.5

19.2

sweep-next-edit-v2-7B

0

9.4

77.3

9.6

sweep-next-edit-1.5B

26

3.2

72.7

4.0

sweep-next-edit-0.5B

232

1.6

45.6

2.4

На наш взгяд тут правильнее смотреть на оценку судьёй, из-за разницы форматов моделей.

Таблица замеров моделей судьёй на разных сетах (судьёй более честно сравнивать разные форматы между собой):

Judge%

Our test

Instinct test

NEP test

Zeta eval

Avg weighted

Avg

Koda-next-edit (1.5B)

28.2

6.9

58.6

46.7

22.7

35.1

zeta-2 (8B)

20.4

8.0

50.0

52.9

19.2

32.8

zeta (7B)

19.2

8.5

51.0

50.0

19.1

32.2

Instinct (7B)

20.2

23.1

35.2

26.7

23.9

26.3

sweep-next-edit-v2-7B

9.6

2.9

9.0

41.2

6.6

15.7

sweep-next-edit-1.5B

4.0

0.4

2.9

35.3

2.5

10.6

sweep-next-edit-0.5B

2.4

0.7

0.5

0.0

1.3

0.9

Тут на отдельном сете часто лучше та модель, для которой этот сет является родным. Простое среднее ставит нашу модель koda-next-edit (1.5B) на первое место, средневзвешенное (по числу сэмплов) на второе после Instinct (7B). Разница объясняется размером родного для Instinct теста, его вклад в средневзвешенное доминирует. Показательным сетом можно считать датасет NEP, как независимый бенчмарк (не является родным ни для одной из моделей). Итого, в среднем наша модель заняла топ-1 место, обогнав даже большие модели.

Что дальше

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

Как работает в плагине

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

nep_rename.gif

А вок как переключить в настройках на Next Edit

nep_settings.gif

Скачивайте и пользуйтесь KodaCode вот тут: https://download.kodacode.ru

И подписывайтесь на наш ТГК, чтобы не пропустить новую информацию про Koda, AI и всё что с ними связано!

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