Как разобраться со спагетти-кодом от ИИ-агентов и снизить расходы на токены
Я поручил агенту написать код, после чего проект разросся до миллиона строк, а счет за API пришел в виде астрономической суммы. Эта статья о том, как с этим справиться.
Избавление от испорченной кодовой базы
Дублированный код, созданный агентом в бесконечном цикле, можно удалить всего за 30 минут. Для этого отлично подойдут knip и jscpd.
Создайте файл knip.json в корне проекта и укажите точки входа. Запустите в терминале команду npx knip, чтобы найти призрачные пакеты, которые агент использовал и бросил. Затем выполните npx jscpd ./src -t 1, чтобы выявить блоки дублирующихся функций, появившиеся из-за копирования и вставки.
В монорепозитории объемом 158 файлов можно избавиться от лишнего кода за один раз. После этого откройте biome.json, включите правило noUnusedVariables и заблокируйте повторное проникновение мертвого кода.
Ограничение расходов на токены с помощью песочницы
Если каждый раз скармливать агенту весь код целиком, токены моментально испаряются. Необходимо применить структуру Repo-Map в стиле Aider, изолируя только те файлы, с которыми идет работа прямо сейчас.
Использование опции --map-tokens 1024 позволяет сократить объем токенов, затрачиваемых на понимание структуры репозитория, до уровня ниже 2 000 даже в проектах с тысячами файлов.
Для установки лимитов по затратам решением станет LiteLLM Proxy. Настройте litellm_config.yaml и ограничьте максимальное количество циклов на сеанс до 15. Установив верхний предел расходов в 2.50 доллара, вы заставите прокси прерывать вызовы в тот момент, когда агент превышает лимит.
Контроль агента с помощью декларативных тестов
Писать длинные промпты на малайском бесполезно. Сначала нужно скормить агенту падающие юнит-тесты, чтобы он не занимался ерундой.
Согласно исследованию SWE-bench Verified, при предварительном внедрении кейсов юнит-тестов частота регрессий снизилась с 6.08 процента до 1.82 процента, а процент успешного решения проблем вырос с 24 процентов до 32 процентов.
Сначала создается файл с падающими тестами, после чего агенту отдается инструкция написать только ту реализацию, которая эти тесты пройдет.
Скрипт проверки также необходимо автоматизировать. Создайте файл local_verifier.sh и последовательно добавьте в него команды npx tsc --noEmit, npx biome check ./src, npx vitest run. Даже если агент утверждает, что весь код готов, любые ненулевые коды завершения этого скрипта заблокируют коммит.
Гибридный рабочий процесс с участием человека
Код, созданный агентом, разбивается на пулреквесты и проверяется человеком лично.
Проверяется, превысило ли количество измененных строк 200, не добавились ли странные пакеты в package.json и не были ли ошибки замазаны с помощью @ts-ignore. Интеграция Husky и lint-staged позволяет блокировать коммит на этапе отправки, если доля дублирующегося кода превышает 2 процента.
Работа разбивается на 3 этапа. Самая мощная модель распределяет задачи и создает TODO.md. Затем модель с оптимальным соотношением цены и качества реализует каждый пункт. Наконец, старший разработчик проверяет git diff. Использование этой структуры позволяет сэкономить более 70 процентов бюджета по сравнению с попытками решить все задачи с помощью одной передовой модели.