Привет, Хабр! У нас на носу 2026 год, Илон Маск обещал AGI ещё вчера (раз уж упомянул: это действительно было в одном из его интервью, где он сказал, что ожидает AGI в 25-26 годах), а AI-ассистенты для кода слышны из каждого утюга. Все мы знакомы с Cursor, многие пробовали его коммерческие (Windsurf) и открытые (Cline, Continue.dev) альтернативы. И поначалу — чистый восторг. Кажется, еще чуть-чуть, и можно будет просто говорить машине, что делать.
Но эйфория проходит, как только ты начинаешь использовать эти инструменты на реальном проекте со сложной архитектурой. Ты просишь модель добавить новую фичу, а она генерирует код, который полностью игнорирует твои паттерны, сервисный слой и общие принципы проекта. Вместо того чтобы нажимать Accept, ты часами занимаешься ручными правками, потому что результат, простите, "вырвиглазный".
Знакомая боль? Давайте разберемся, почему так происходит и как с этим бороться.
Корень проблемы (во всяком случае, моё мнение)
Казалось бы, ответ очевиден — дело в контексте. Любому разработчику, чтобы писать консистентный код, нужно сначала "загрузить в голову" кодовую базу. С моделями то же самое. Но ведь все эти модные IDE и плагины как раз и созданы, чтобы давать модели контекст всего проекта! Или нет?
Здесь и кроется дьявол. Подавляющее большинство этих инструментов работают по принципу RAG (Retrieval-Augmented Generation). Если упростить:
При запуске инструмент индексирует весь ваш проект, превращая код в векторы (числовые представления смысла).
Когда вы даете задачу, система сначала ищет в этой векторной базе самые релевантные куски кода.
И только эти найденные фрагменты отправляются в модель вместе с вашим запросом.
Модель сделает вашу задачу. Но не будет знать, что в файле X лежит хитрый базовый класс, который нужно было унаследовать, а в файле Y — конвенция по именованию, и вообще Z содержит код с подобной механикой, которую бы соблюсти и здесь.
Векторный поиск не найдет файлы "заодно, чтобы учесть архитектуру косвенно аналогичного кода". Он найдет только то, что напрямую связано с вашим запросом по смыслу. В итоге модель работает с очень ограниченным, "туннельным" зрением, не видя всей картины.
Почему так сделано? Все просто: экономика и технические ограничения. Контекстные окна моделей не резиновые, а стоимость запроса прямо пропорциональна количеству токенов (почти). Отправлять весь проект при каждом чихе — значит разорить пользователя. Инструменты хотят, чтобы вы ими пользовались, а не ушли, как бабушка из продуктового, со словами "Сколько?!".
Решение "в лоб" (пришёл к нему с опытом, но, не сомневаюсь, можно и лучше)
Проблему мы осознали. А что делать? Если модель не видит всей картины, нужно ей эту картину показать. Мое решение, пусть и не на 100% универсальное, но для меня оказавшееся куда более юзабельным, — это скормить модели весь проект целиком.
Да, именно так. "Грубой силой".
Инструментарий:
code2prompt(сайт, GitHub) — простая утилита с прекрасной документацией и, на секундочку, 6.7k звёзд на GitHub, которая собирает весь ваш код (исключаяnode_modules,venv,.env, etc) в единый markdown-файл с удобной структурой.Google AI Studio и модель Gemini 2.5 Pro. Почему она? Огромное контекстное окно (до 1 млн токенов), которое, на мое удивление, почти не "забывается" даже на 600k токенов. И самое приятное — через веб-интерфейс это бесплатно и безлимитно.
Лайфхак: Если использовать Google-аккаунт/IP-адрес, зарегистрированный в ЕС, ваши данные не будут использоваться для обучения моделей, что немного повышает уровень приватности.
Процесс выглядит так:
С помощью
code2promptгенерируем один большой текстовый файл с кодом проекта.Открываем Google AI Studio, вставляем весь текст в начало промпта.
И начинаем диалог: "Это наша кодовая база. Давай спроектируем новую фичу..."
Модель, имея перед глазами абсолютно все, начинает понимать вашу архитектуру, стиль и зависимости. Результаты становятся на порядок логичнее и согласованнее. После планирования можно попросить ее написать код в формате git diff, который останется только проверить и применить.
Когда это применять?
Конечно, этот "ядерный" подход — не замена Cursor на каждый день. Это инструмент для стратегических задач, например:
Проектирование новой крупной фичи.
Проведение масштабного рефакторинга.
Поиск архитектурных несостыковок.
Онбординг в новый для вас (и для модели) проект.
Для мелких правок в стиле "поправь мне эту функцию" интегрированные плагины всё еще удобнее и быстрее, безусловно. А порой удобнее и их в этом две свои руки.
Важнейшая оговорка
Прежде чем вы побежите пробовать, давайте о главном.
Этот метод категорически не подходит для коммерческих проектов с закрытым исходным кодом, NDA или любой другой чувствительной информацией. Отправка всей кодовой базы на сторонние серверы — это колоссальный риск безопасности. Используйте его только для личных, учебных или open-source проектов, где раскрытие кода не является проблемой. Я поступаю именно так.
Кроме того, у метода есть и технический предел. Если ваша кодовая база даже после очистки весит больше контекстного окна топовых моделей, решение "в лоб" не сработает. Надеюсь, Торвальдс не встретит эту статью :)
А какой у вас опыт борьбы за качественный контекст? Сталкивались с подобными проблемами? Делитесь в комментариях своими наблюдениями, лайфхаками и решениями — думаю, эта тема актуальна для многих. Благодарю! Надеюсь узнать что-то полезное для себя ;)
Kamil_GR
Проблем будет меньше, но они останутся. Ограниченность внимания в первую очередь. Даже просьба отформатировать и вывести уже введённый относительно небольшой текст иногда приводит к потерям фрагментов.