Рефакторинг кода нейросетью: маленькими шагами и с тестами

Агент может переписать модуль за минуту и так же быстро его сломать. Как организовать рефакторинг: тесты до начала, один тип изменений за раз, коммит на каждый шаг, откат.

5 мин · · разработка · агенты

Нейросеть для рефакторинга кода работает хорошо, когда вы задали рамки: тесты есть, шаг маленький, результат проверяется командой. Без этого агент уверенно переписывает модуль, а через час выясняется, что поведение поменялось в трёх местах, о которых никто не подумал. Ниже безопасный процесс: что подготовить до начала, как формулировать шаги, какие правила дать агенту, как откатываться и где ИИ действительно ускоряет работу, а где нет.

Шаг 0. Подготовка: тесты и чистое дерево

Рефакторинг по определению не меняет поведение, а «не меняет» можно доказать только тестами. Перед тем как подключать агента:

  1. Закоммитьте всё лишнее. Рабочее дерево должно быть чистым, чтобы дифф агента был виден отдельно: git status пуст.
  2. Создайте ветку: git switch -c refactor/orders-service.
  3. Запустите тесты и убедитесь, что они проходят до начала. Красные тесты перед рефакторингом означают, что вы не отличите старые поломки от новых.
  4. Покройте то, что будете менять. Если тестов на модуль нет, первой задачей будет написать «характеризующие» тесты: они фиксируют текущее поведение, каким бы странным оно ни было. Такую задачу удобно поручить агенту: результат проверяется запуском. Про генерацию тестов есть отдельная статья: автогенерация unit-тестов в Claude Code.
  5. Запомните команду проверки, например pytest -q или npm test. Её же дайте агенту.

Шаг 1. Правила для агента

Агенты читают файл с правилами проекта (CLAUDE.md у Claude Code, AGENTS.md у Codex и opencode). Для рефакторинга полезно записать туда несколько строк:

bash
## Правила рефакторинга
- Не меняй поведение. Публичные сигнатуры и форматы ответов остаются прежними.
- За один шаг делай один тип изменений: переименование ИЛИ вынос функции ИЛИ типизация.
- После каждого шага запускай `pytest -q` и показывай результат.
- Не трогай файлы вне указанного модуля без отдельного согласия.
- Не удаляй тесты и не ослабляй проверки, чтобы тесты прошли.
- Если шаг требует решения о дизайне, остановись и спроси.

Последние два пункта важнее остальных. Агент, которому сказали «чтобы тесты проходили», иногда выбирает кратчайший путь: правит тест, а не код. Поэтому запрет на правку тестов стоит записать явно.

Шаг 2. Мелкие диффы

Большая задача «отрефактори сервис заказов» даёт большой дифф, который невозможно прочитать. Разбейте её на шаги, каждый из которых проверяется за минуту:

ШагФормулировкаЧто проверять
1Добавь аннотации типов в orders/service.py, не меняя логикутесты зелёные, дифф только в сигнатурах
2Вынеси расчёт скидки из create_order в функцию calc_discountтесты зелёные, логика перенесена дословно
3Замени дубли проверки статуса вызовом ensure_statusсписок мест замены совпадает с grep
4Переименуй tmp и data2 по смыслув диффе только имена

После каждого шага: прочитайте дифф, запустите тесты, сделайте коммит refactor: добавил типы в orders/service. Много мелких коммитов позволяют откатить ровно один шаг, не потеряв остальные.

Пример запроса агенту для шага 2:

bash
В orders/service.py вынеси расчёт скидки из create_order в отдельную функцию
calc_discount(order). Логику не меняй и не оптимизируй. Затем запусти pytest -q
и покажи результат. Если тесты падают, не исправляй тесты, а объясни, что изменилось.

Шаг 3. Проверка и откат

После каждого шага:

bash
git diff --stat          # сколько файлов тронуто
git diff                 # читаем сами
pytest -q                # проверяем поведение
git commit -am "refactor: вынес calc_discount"

Если что-то пошло не так:

  • git restore . отменяет незакоммиченные изменения в рабочем дереве;
  • git revert <hash> откатывает конкретный коммит, не переписывая историю;
  • git reset --hard <hash> возвращает ветку к известному состоянию, но удаляет всё после него, используйте осознанно.

Автоматизировать проверку можно хуком: запускать тесты после каждой правки агента. Как это настраивается в Claude Code, описано в статье про хуки.

Нейросеть для рефакторинга кода: где ускоряет, а где нет

Ускоряет:

  • механические переименования и перенос кода по проекту;
  • вынос функций и классов, разбиение длинных функций;
  • добавление типов, docstring, аннотаций;
  • миграция на новый вызов API по шаблону (много однотипных замен);
  • написание характеризующих тестов перед изменением.

Не ускоряет или мешает:

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

Практический критерий: если результат шага можно проверить командой за минуту, шаг подходит для агента. Если проверка требует суждения о дизайне, это ваша работа, а агенту отдайте исполнение.

Сколько стоит сессия

Допустим, рефакторинг занимает 40 запросов агента: в среднем 60 000 входных токенов (история и файлы) и 1 200 выходных на запрос. Вход 2,4 млн, выход 0,048 млн. Цены Zukko на 18 октября 2026, $ за 1M токенов.

Без учёта кэша:

МодельРасчётИтого
claude-sonnet-5-5 (0,4 / 2)2,4 × 0,4 + 0,048 × 2 = 0,96 + 0,096$1.06
gpt-6.1-sol (0,27 / 1,32)2,4 × 0,27 + 0,048 × 1,32 = 0,648 + 0,0634$0.71
deepseek-v4.1-flash (0,013 / 0,038)2,4 × 0,013 + 0,048 × 0,038 = 0,0312 + 0,0018$0.03

С кэшем у Claude в Anthropic-формате (допущение: из 60 000 токенов запроса 55 000 читаются из кэша, 5 000 новых записываются): чтение 40 × 55 000 = 2,2 млн × 0,05 = 0,11; запись 40 × 5 000 = 0,2 млн × 0,5 = 0,10; выход 0,096. Итого около $0.31 вместо $1.06.

Это иллюстрация: реальная доля кэша зависит от инструмента и длины сессии. Важная оговорка: скидка за кэш у Claude есть в Anthropic-формате (Claude Code, /v1/messages), а при вызове через /v1/chat/completions весь вход оплачивается по цене входа. Чем короче сессия и чем меньше файлов агент держит в контексте, тем меньше вход на каждом шаге. Индекс силы (у claude-sonnet-5-5 48, у deepseek-v4.1-flash 39) не гарантирует результат: на своём модуле проверьте две-три модели.

Частые вопросы

Можно ли доверять нейросети рефакторинг без тестов?

Не стоит. Без тестов вы не отличите сохранённое поведение от изменённого. Сначала характеризующие тесты, потом рефакторинг.

Какую нейросеть для рефакторинга кода выбрать?

Мы не утверждаем, что одна модель делает это лучше. Сравните по цене, контексту и индексу силы, затем прогоните один и тот же небольшой шаг через две-три модели и сравните дифф и стоимость.

Как не дать агенту переписать лишнее?

Ограничьте задачу одним модулем и одним типом изменений, запишите правила в CLAUDE.md или AGENTS.md, читайте git diff --stat после каждого шага.

Что делать, если агент зациклился и тратит деньги?

Поставьте дневной лимит на ключ в кабинете и следите за расходом. Подробнее в статье как не потерять деньги, когда агент зациклился.

Подключить агента к Zukko можно по инструкции для Claude Code, ключ создаётся в кабинете.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.