Хотите заказать веб-сайт? Связаться с нами

Проблема исследования кодовой базы агентом

Главный источник ошибок при работе с ИИ-агентом — не слабая модель, а разрыв между тем, что агент знает о вашей кодовой базе, и тем, что он мог бы из неё легко узнать. Когда агент не смотрит в существующий код, он уверенно предлагает решения, которые уже есть в проекте, пишет дубли и иногда ломает работающее. Разберём, как выглядит эта проблема, почему она возникает и во что обходится на практике.

Проблема исследования кодовой базы агентом

Симптом: агент изобретает велосипед

Представьте обычную задачу: «добавь функцию валидации email». Агент пишет с нуля проверку — при том, что в проекте уже два года живёт модуль валидации, которым пользуются все формы.

Так выглядит классический велосипед: код работает, но он лишний. Симптомы проблемы узнаются без труда.

  1. Дублирование. Агент создаёт функцию, которая уже существует в другом файле, под другим именем или с тем же именем, но другой логикой.
  2. Чужой стиль. Новый код не похож на остальной проект: другие соглашения об именах, другой порядок зависимостей.
  3. Неверные допущения. Агент предполагает, что данные приходят в одном формате, а проект отдаёт их по-другому.
  4. Сломанные связи. Изменения игнорируют существующие вызовы, и работающий функционал перестаёт работать.

Самое коварное в этих симптомах — их незаметность. Код собирается, тесты проходят, задача выполнена. Проблему обнаруживают позже, когда дубликат уже влит в основной код и за него начинают платить каждым последующим изменением.

Почему агент не видит существующий код

Причина не в злом умысле: агент ограничен тем, что попало в его контекст. Он не «видит» проект целиком — только те файлы, которые оказались в текущей сессии и контексте. Если файл с нужной функцией не был прочитан, для агента функции не существует, и он честно создаёт её заново.
Агент-робот уверенно рисует в воздухе светящийся модуль-призрак

Усугубляет ситуацию недетерминированная природа модели: один и тот же запрос может дать разные ответы, и при нехватке фактов агент достраивает картину по вероятности, а не по фактам проекта. Это близко к галлюцинациям: модель не выдумывает несуществующую библиотеку, но выдумывает несуществующий модуль, уверенно называя его частью вашего кода.

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

Цена проблемы: контекст, время, деньги

Велосипед — не просто лишний код. Дубликат создаёт каскад издержек, которые уже знакомы нам по разговору об избыточности. Во-первых, теперь в проекте два места, которые надо поддерживать: найдя баг в валидации, разработчик чинит его в одном файле, а второй продолжает работать со старым поведением. Во-вторых, выросший объём кода разгорает контекст каждой будущей сессии.

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

Издержка Когда появляется
Дублирование кода Агент пишет функцию, уже существующую в проекте
Двойная поддержка Баг чинят в одном клоне, второй остаётся со старым поведением
Раздутый контекст Лишний код и лишние переписки заполняют окно сессии
Повторные правки Каждое неверное допущение порождает новый цикл «напиши-исправь»

Как провал исследования выглядит на практике

Разберём реальный сценарий. В проекте есть сервис заказов, а рядом новый коллега просит агента добавить запись в лог при создании заказа. Агент открывает файл контроллера, не заглядывая в соседние модули, и пишет самописную функцию логирования. При этом в проекте три месяца существует утилита logger.ts, через которую логируются все события.

  1. Шаг 1. Агент читает один файл — контроллер заказа — и решает, что знает всё.
  2. Шаг 2. Он не ищет существующий логгер, потому что никто не велел его искать, а его вызовы за пределами прочитанного файла.
  3. Шаг 3. Функция написана, тесты зелёные, коммит сделан.
  4. Шаг 4. Через неделю команда замечает: логи заказов приходят в другом формате, чем все остальные логи в системе.

Ключевой момент — шаг 1. Исследование остановилось на первом файле. Агент повёл себя как человек, который «не в курсе», потому что ему не дали повода узнать. Проблема не в том, что он плох, а в том, что процесс не требует исследования.

Ложные решения, которые не работают

История знает три наивные попытки справиться с проблемой, и все три не работают. Разберём, почему, чтобы не тратить на них время.
  1. «Изучи весь проект». Просьба прочитать всё сразу заливает контекст тоннами ненужного и толкает сессию за границу Smart Zone ещё до начала работы. Широкое исследование без цели дороже, чем сама задача.
  2. Ручная вставка файлов. Вставлять весь код вручную — значит возвращаться к эпохе копипасты: объёмный контекст, ошибки в версиях. Это тот самый ручной труд, ради которого мы автоматизировали процесс.
  3. Надежда на модель. «Современная модель сама догадается» — опасная иллюзия. Модель рассуждает качественно, пока получает факты; там, где фактов нет, она не исследует, а домысливает.

Объединяет эти ошибки игнорирование одной вещи: исследование — это отдельная задача с собственным процессом, а не побочный эффект хорошей модели. Пока вы не дадите агенту способ узнать проект, он будет отвечать из вероятностей, а не из кода.

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

Почему исследование — отдельная дисциплина

Мы подошли к главному выводу: исследование кодовой базы нельзя спускать с рук как «мелочь». Это такая же инженерная дисциплина, как управление контекстом, и в ней есть свои инструменты. Которые, как вы догадались, у нас уже есть в арсенале.

Умение запускать команды из оболочки даёт агенту доступ к grep, поиску по сигнатурам и спискам файлов — дёшево, точечно и без ручного копирования. Субагенты позволяют держать исследование отдельным, неперегруженным верхним контекстом: субагент изучает базу и возвращает вам только вывод, не засоряя основную сессию. А сам harness со своими командами навигации задаёт способ, которым агент передвигается по коду.

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

Фиксируйте случаи, когда агент изобрёл велосипед, в файле заметок проекта. Каждый такой случай — диагноз: где-то исследование прервалось раньше времени. Через несколько записей станет видно закономерность — например, что дубли рождаются в утилитах, которых агент не читает, потому что считает их «неинтересными». Слабое место найдено — значит, его можно лечить.

Итоги

Проблема исследования кодовой базы в том, что агент ограничен своим контекстом: если нужный файл не прочитан, агент не знает о его существовании и изобретает велосипед.

Это ведёт к дублям, двойной поддержке, раздутому контексту и лишним тратам, притом что ни модель, ни команда здесь не «плохие» — просто исследование не выстроено как процесс.

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

Глоссарий

  1. Исследование кодовой базы — процесс изучения агентом существующего кода перед написанием нового.
  2. Велосипед (изобретение велосипеда) — создание дублирующей сущности, которая уже существует в проекте из-за незнания его устройства.
  3. Дублирование кода — ситуация, когда одна сущность существует в проекте дважды.
  4. Двойная поддержка — издержка, при которой исправление в одном клоне не влияет на другой.
  5. Контекст сессии — весь текст, который отправляется модели при каждом запросе.
  6. Недетерминированность — свойство модели давать разные результаты на один и тот же запрос.
  7. Галлюцинация — правдоподобный, но не соответствующий реальности вывод модели.
  8. Избыточность контекста — наличие в контексте информации, не нужной для текущей задачи.
  9. Субагент — независимый контекст, выполняющий подзадачу, в том числе исследование, не засоряя основную сессию.
  10. Smart Zone — продуктивный диапазон заполнения context window, в котором агент рассуждает качественно.
  11. Harness — программа-оболочка, через которую пользователь взаимодействует с LLM и управляет агентом.
  12. Сессия (session) — один непрерывный разговор с агентом, ограниченный context window.

Теги: