Эксперимент, проведённый JetBrains, показал, что предоставление ИИ-агентам прямого доступа к механизму рефакторинга в Rider может коренным образом изменить выполнение задач на C#, вместо того чтобы заставлять агента изменять текст, а затем запускать компилятор, чтобы выяснить, что именно испортили изменения. В тесте, включавшем 15 задач, медианное время выполнения задачи сократилось со 157,9 до 26,6 секунды, то есть на 83%, а количество вызовов инструментов уменьшилось с 17 до 6,2 на задачу.
Эта возможность реализована во встроенном навыке под названием refactoring-code, доступном в Rider начиная с версии 2026.2.1. По данным JetBrains, пользователю не нужно активировать его вручную: агент автоматически вызывает навык, когда его просят выполнить рефакторинг кода C#. Механизм использует технологии ReSharper и аналитическую архитектуру Rider для понимания связей между символами и ссылками внутри проекта.
Проблема подхода «изменить, затем собрать»
До появления навыка JetBrains наблюдала за передовой моделью во время выполнения тех же задач. За 2513 вызовов различных инструментов агент не выполнил ни одной непосредственной структурной операции рефакторинга, поскольку у него не было специализированного инструмента для этого. Вместо этого он 468 раз использовал интерактивные команды для ввода текста, 422 раза вызывал git и 392 раза — sed, а также 163 раза запускал dotnet build.
Это не означает, что агент избегал рефакторинга: он пытался приблизить его с помощью поиска и текстового редактирования, а затем использовал результаты сборки для оценки произошедшего. JetBrains поясняет, что, например, переименование символа требует различать ссылки, связанные с определённым определением, вызовы полиморфных методов, частичные классы, явные реализации интерфейсов и ссылки в документации. Эти связи невозможно надёжно обеспечить с помощью регулярного выражения.
В свою очередь, механизм Rider работает с разрешённым синтаксическим деревом, которое определяет, с каким определением связан каждый идентификатор, какую версию вызывает каждый вызов и где находятся ссылки в программном решении. Таким образом, структурная часть задачи передаётся механизму, вместо того чтобы агент постепенно обнаруживал эти связи посредством повторяющихся циклов редактирования, сборки и чтения ошибок.
Что измеряла JetBrains?
Оценка была сосредоточена на восьми операциях с однозначно проверяемыми результатами:
- Переименование символа и всех ссылок на него.
- Извлечение набора инструкций в новую функцию.
- Извлечение интерфейса из существующего типа.
- Извлечение базового класса и перенос в него членов.
- Изменение сигнатуры программного интерфейса и обновление мест вызова.
- Перенос типа в другое пространство имён и исправление операторов using.
- Реорганизация пространств имён в соответствии со структурой папок.
- Безопасное удаление символа, если от него не зависит ни одна другая часть.
Задачи включали как простые случаи, так и более сложные — с большим количеством мест вызова или переплетёнными зависимостями. Обе стороны запускали одну и ту же модель, gpt-5.5, через Codex CLI примерно десять раз для каждой задачи. Единственным различием было наличие или отсутствие навыка refactoring-code. Сравнение основывалось на зарегистрированных результатах и парном permutation-тесте.
Практические результаты и стоимость
После активации навыка количество операций dotnet build сократилось со 163 до всего трёх, а общее число вызовов инструментов в оценке уменьшилось с 2513 до 926. Текстовые изменения не исчезли: sed по-прежнему оставался наиболее используемым инструментом, однако распределение ролей изменилось. Обычные изменения выполнялись с помощью инструментов текстового редактирования, тогда как механизм обрабатывал структурные изменения, последствия которых могли распространяться на части, непосредственно невидимые агенту.
Время на 95-м процентиле сократилось с 346,4 до 56,9 секунды; это особенно связано с исчезновением случаев, застревавших в цикле редактирования, сборки и обработки ошибок. Медианная стоимость одной задачи снизилась с 0,33 до 0,12 доллара, а стоимость каждой успешной задачи — с 0,52 до 0,19 доллара. Число введённых токенов также уменьшилось с 436 745 до 208 524 на задачу, количество чтений временной памяти — с 2 973 158 до 1 257 600, а объём вывода — с 32 532 до 15 538.
Что это означает для пользователей?
Эксперимент показывает, что польза инструментов для агентов зависит не только от способности модели создавать код, но и от типа инструментов, которые она может вызывать. В восьми из 15 задач сторона с доступом к навыку была быстрее и дешевле и не использовала больше инструментов, при этом обе стороны успешно проходили тесты. В шести задачах, выполнение которых в базовом режиме занимало более двух минут, улучшение составило от 82 до 94%.
Однако результаты не означают общего выигрыша для каждого случая. Обе стороны не справились с двумя задачами, базовый режим успешно выполнил одну задачу, с которой не справился режим с навыком, а четыре задачи изначально выполнялись настолько быстро, что вызов механизма Rider оказался экономически нецелесообразным. Поэтому эти цифры подтверждают эффективность навыка для определённого набора операций рефакторинга, но не гарантируют одинакового улучшения для каждой задачи.
Чтобы показать разницу, JetBrains представила задачу по извлечению базового класса из типа ReportExporter. Без навыка выполнение заняло 336,7 секунды, потребовало 24 вызовов и стоило 1,15 доллара; оно включало несколько циклов изменения файлов и запуска сборки для обработки ошибок наследования, конструкторов и прав доступа. С навыком задача заняла 19,8 секунды, потребовала три вызова и стоила 0,09 доллара: агент выполнил операцию extract_base_class, создал ExporterBase, обновил четыре файла и переписал 11 ссылок.
Функцию можно попробовать, обновив Rider до версии 2026.2.1, открыв решение C# и попросив агента переименовать элемент, извлечь интерфейс или переместить тип. В статье рекомендуется формулировать запросы с указанием конкретной операции, например попросить извлечь интерфейс из OrderProcessor, а не использовать общую формулировку вроде «приведи этот класс в порядок».