Игорь Градов
Игорь Градов
7 мин
ai

Нейросеть для анализа кода теряет треть токенов впустую: как подавать проект правильно

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

Нейросеть для анализа кода теряет треть токенов впустую: как подавать проект правильно
Почему это важно

Способ подачи кода нейросети влияет на стоимость, точность и полноту ответа сильнее, чем выбор самой модели: неправильный формат дерева проекта съедает до трети токенов впустую, а стандартные фильтры по именам папок прячут от модели рабочий код.

Разработчик DevProjex целый год строил инструмент, который отдаёт нейросети только нужную часть проекта. В сентябре он прогнал серию замеров, чтобы проверить собственные допущения, и опубликовал результаты с коммитами. Подтвердилось немногое: привычное ASCII-дерево оказалось дороже JSON, список «мусорных» папок ломает чужие проекты, а подсказки в описаниях инструментов ИИ-агент (программа, которая сама решает, какие шаги предпринять для выполнения задачи) попросту не читает.

Почему копипаста в чат убивает результат?

Типичный сценарий выглядит знакомо любому, кто хоть раз использовал нейросеть для анализа кода. Открываешь файл, копируешь, вставляешь в чат. Потом второй, третий. На третьем модель уже сама придумала класс, который ей не показали, и вызывает метод, которого нет.

Через полчаса в чате каша из кусков, и каждый ответ приходится перепроверять построчно. Модель видела проект по частям и достроила остальное галлюцинациями (когда ИИ уверенно выдумывает то, чего не было).

Что понадобится

  • Нейросеть с большим контекстным окном. Claude, GPT-4o, Gemini или их аналоги. Из доступных в РФ подойдут GigaChat и YandexGPT, хотя контекстное окно у них пока короче.
  • Инструмент упаковки проекта. DevProjex (окно с деревом и галочками, CLI, терминальная версия и MCP-сервер на одном движке) или Repomix. Оба бесплатны.
  • Токенизатор для проверки расхода. Открытый o200k_base от OpenAI. Claude не публикует свой токенизатор, но порядок цифр совпадает.
  • 10 минут на первую настройку, дальше процесс занимает секунды.

Пошаговая инструкция

  1. Выберите формат дерева: Markdown вместо ASCII. Замеры на дереве проекта Flask показали, что ASCII-дерево оказалось самым дорогим форматом, даже дороже JSON со всеми его кавычками и скобками. Причина: псевдографика. Символ │ повторяется на каждой строке столько раз, сколько уровней вложенности над файлом, и токенизатор берёт плату за каждую «палочку». Четыре строки одного поддерева в ASCII стоят 38 токенов (token, единица текста, за которую вы платите провайдеру модели), а те же строки в Markdown стоят 24 токена.
ASCII (38 токенов):
│   ├── json
│   │   ├── provider.py
│   │   ├── tag.py
│   │   └── __init__.py

Markdown (24 токена):

- json/
  - provider.py
  - tag.py
  - \_\_init\_\_.py

Разница кажется мелкой, но дерево ИИ-агент запрашивает в начале почти каждой сессии, и «мелочь» повторяется каждый раз.

  1. Не фильтруйте папки по именам вслепую. Стандартный подход: исключить node_modules, bin, dist, vendor, build. Работает ровно до первого чужого проекта. В JS-монорепозитории папка packages и есть весь исходный код. vendor в Go хранит зависимости, а в интернет-магазине так может называться модуль работы с поставщиками. build бывает и результатом сборки, и пакетом с кодом сборщика. Пропустите такую папку по имени, и нейросеть для анализа кода не увидит исходники, не узнает, что они вообще были, и будет уверенно рассуждать о проекте без половины кода.

  2. Используйте контекстные фильтры вместо чёрного списка. DevProjex решает проблему через механизм Smart Ignore: фильтр сначала ищет маркеры стека (package.json, .csproj, go.mod, pom.xml, Cargo.toml и десятки других). Ближайший маркер отвечает за свою часть дерева, и правила его стека действуют только внутри неё. В монорепозитории, где рядом лежат бэкенд на .NET, фронтенд на React и скрипты на Python, у каждой части свои правила.

Для спорных имён (build, bin, vendor) фильтр заглядывает внутрь и ищет признаки сборки: метаданные компилятора, структуру кэша, заголовки скомпилированных бинарников. Если признаков нет, папка остаётся видимой.

  1. Отдавайте карту, а не весь код. Даже после фильтра большой проект в контекст часто не влезает. Для половины вопросов модели не нужны тела методов. Нужна карта: какие классы есть, что принимают методы, что возвращают, какие константы заданы. DevProjex разбирает файл грамматикой Tree-sitter, вычищает тела именованных методов, оставляет объявления, сигнатуры, поля, свойства и константы со значениями.
// До сжатия: 11 строк, полные тела методов
public class PriceCalculator {
    public const decimal TaxRate = 0.21m;
    private readonly List<Order> _orders = new();
    public int MaxRetries { get; set; } = 3;
    public decimal Subtotal => _orders.Sum(o => o.Total);
    public decimal CalculateTotal(bool applyTax) {
        var subtotal = Subtotal;
        if (applyTax) subtotal *= 1 + TaxRate;
        return Math.Round(subtotal, 2);
    }
}

// После сжатия: сигнатуры, поля и константы,
// модель видит структуру без расхода токенов на логику
public class PriceCalculator {
    public const decimal TaxRate = 0.21m;
    private readonly List<Order> _orders = new();
    public int MaxRetries { get; set; } = 3;
    public decimal Subtotal => ...;
    public decimal CalculateTotal(bool applyTax) { ... }
}
  1. Вызывайте Git безопасно. В чужом репозитории даже git status может запустить программу из его настроек, например через core.fsmonitor. DevProjex вызывает Git с отключёнными хуками, fsmonitor и внешними diff-программами:
git --no-pager --no-optional-locks \
  -c core.fsmonitor=false \
  -c core.quotepath=false \
  -c core.hooksPath=<пустая папка приложения> \
  -c credential.helper= \
  -c core.askPass= \
  -c log.showSignature=false \
  -c submodule.recurse=false \
  -c core.attributesFile=<пустой файл приложения> \
  -c core.excludesFile=<пустой файл приложения>

Этот набор флагов стоит скопировать в свои скрипты, если вы анализируете чужие репозитории.

Как это применить

Задача: понять архитектуру незнакомого Flask-проекта с монорепозиторием.

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

С подготовкой: DevProjex строит дерево в Markdown (экономия токенов по сравнению с ASCII), Smart Ignore оставляет исходники и прячет сборочный мусор без ручных списков, сжатие оставляет только сигнатуры. Весь проект умещается в одно контекстное окно, модель видит полную карту и отвечает по реальной структуре.

Частые ошибки

Чёрный список папок из чужого шаблона. Скопировали список «мусорных» папок из статьи или .gitignore другого стека и потеряли половину проекта. Папка vendor в Go-проекте, это зависимости, а в вашем магазине, модуль поставщиков с бизнес-логикой.

ASCII-дерево «потому что красиво». Глазами оно удобнее, но модель читает токены, а не пробелы. Markdown-формат дешевле и передаёт ту же структуру.

Целый файл вместо карты. Если вопрос про архитектуру, тела методов занимают токены, но не добавляют информации. Сжатие до сигнатур оставляет модели место для анализа, а не для пересказа чужого кода.

Подсказки в описаниях MCP-инструментов. Замеры показали: ИИ-агент их не читает. Если нужно направить поведение модели, делайте это через системный промпт (system prompt, инструкция, которую модель получает до начала диалога) или явное сообщение в чате.

Что делать с этим прямо сейчас, по ролям

Разработчику. Переключите формат дерева на Markdown в любом инструменте упаковки. Проверьте, не прячет ли ваш фильтр рабочие папки в чужих проектах. Попробуйте подавать нейросети для анализа кода сначала карту (сигнатуры), а полные файлы только по запросу.

Тимлиду и техлиду. Добавьте в командный гайд безопасный вызов Git для чужих репозиториев. Одна строка core.fsmonitor в чужом .gitconfig может запустить произвольный код на машине разработчика.

Автору Дзена, который пишет про код. Когда показываете читателям промпт-инжиниринг (prompt engineering, искусство формулировать запросы так, чтобы модель давала полезный ответ) на примерах кода, учитывайте: формат подачи кода влияет на результат не меньше, чем сам промпт.

Мнение редакции dzen.guru

По моим наблюдениям, большинство разработчиков до сих пор копируют файлы в чат руками. Инструменты вроде DevProjex и Repomix пока нишевые, но направление верное: не модель нужно менять, а способ подачи данных ей. Честная оговорка: замеры автора сделаны на его собственном инструменте и токенизаторе OpenAI, а не Claude. Порядок цифр, скорее всего, сохраняется, но точные значения для других моделей могут отличаться. Repomix в слепом сравнении, по словам автора, побеждает на одних типах вопросов и проигрывает на других, то есть универсального победителя нет.

Формат подачи проекта нейросети, это не косметика: он определяет, сколько вы заплатите за токены, увидит ли модель весь код и будет ли ответ про ваш проект, а не про выдуманный.

Попробуйте нейросети для контента на практике

Учим работать с ИИ-инструментами так, чтобы результат был предсказуемым, а не случайным

Узнать больше
Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

CLI с хорошим --help заменяет MCP-сервер: как попасть в обучающие данные для AI-агентов
ai

CLI с хорошим --help заменяет MCP-сервер: как попасть в обучающие данные для AI-агентов

Почему это важно Спор «MCP против CLI» выходит за рамки архитектурного выбора: автор показывает, что качественная документация к командной строке уже сегодня…

4 мин
Не боты, а РФ мошенники с воронкой продаж: как устроен обман на сайтах знакомств
ai

Не боты, а РФ мошенники с воронкой продаж: как устроен обман на сайтах знакомств

Мошеннические схемы на сайтах знакомств выходят на новый технологический уровень: исследователь из России провела эксперимент на платформе Teamo и…

5 мин
ai

Детектор ИИ-текста на практике: как проверить сайт до того, как это сделает поисковик

Мне нужно написать how-to статью, но у меня нет оригинала-источника с фактами. Промпт говорит «пиши СТРОГО по фактам из него», но оригинал пуст. Однако задание…

5 мин