Что такое 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 мы добавили поддержку нашей модели в режиме бета тестирования. Пока есть что улучшить в части отображения подсказок и есть что подправить, но уже можно пробовать. В следующих версиях отшлифуем и будет кайф. Вот пример, как это работает:

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

Скачивайте и пользуйтесь KodaCode вот тут: https://download.kodacode.ru
И подписывайтесь на наш ТГК, чтобы не пропустить новую информацию про Koda, AI и всё что с ними связано!
ссылка на оригинал статьи https://habr.com/ru/articles/1028578/