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

Почему ИИ-агентам нужна карта

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

Три слоя, из которых состоит карта

  • Структурный слой — каталог символов, вызовов функций и операторов импорта. Он отвечает на статический вопрос: «что что вызывает».
  • Временной слой — сигналы, полученные из git, такие как частота изменений файлов (churn rate) и история владения. Он показывает, какие части кода меняются чаще всего и кто обычно с ними работает.
  • Поведенческий слой — паттерны реального использования, извлеченные из истории редактирования и навигации самого агента. Он показывает, какие файлы на самом деле открываются вместе во время сессии программирования, выявляя «истинных соседей», которых упускает статический анализ.

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

Два способа передачи карты агенту

  1. Ambient Path — краткая сводка, внедряемая в каждое взаимодействие. Она дает агенту мгновенный снимок вида «вы находитесь в модуле X, рядом находятся эти символы» без дополнительных вызовов.
  2. Deep Path — инструменты запросов по требованию, которые агент может вызывать, когда ему нужны более подробные данные, например, список файлов, которые часто меняются вместе, или временная шкала недавних изменений владельцев.

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

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

  • Отказ от тяжеловесных языковых серверов. Карта опирается на поверхностный парсинг, а не на полный вывод типов. Цель состоит не в том, чтобы превзойти зрелые статические анализаторы, а в том, чтобы дополнить их поведенческими данными.
  • Ограничение графа рамками одного проекта. Система не создает глобальный граф зависимостей между репозиториями. Такое ограничение снижает потребление памяти и ускоряет обновления.
  • Использование существующего хранилища памяти. Логи изменений файлов берутся из собственной памяти агента о вызовах инструментов, что позволяет избежать дублирования данных и обеспечивает согласованность источников.

Практическая реализация карты

  1. Сбор структурных данных путем быстрого прохода по исходным файлам с извлечением символов и строк импорта.
  2. Извлечение временных метрик из git-истории репозитория с фиксацией того, какие файлы имеют больше всего коммитов и кто был их автором.
  3. Сбор поведенческих сигналов путем логирования действий агента по открытию файлов, редактированию и навигации во время реальных сессий программирования. Эти логи становятся основой для матрицы «совместного появления» (co-occurrence), которая определяет поведенческих соседей.
  4. Наполнение Ambient Path коротким упорядоченным списком наиболее релевантных символов и файлов для текущей задачи.
  5. Предоставление Deep Path в виде набора легковесных функций запроса (например, «список файлов, редактировавшихся вместе в последних сессиях»).

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

Извлеченные уроки

  • Разделение фоновой информации и запросов по требованию. Поддержание постоянно присутствующей сводки в минимальном объеме предотвращает раздувание токенов, в то время как более детальные запросы остаются опциональными.
  • Приоритизация контекста по задаче. Упорядочивание фоновых символов в соответствии с текущим фокусом редактирования дает более полезные подсказки.
  • Агрессивное, но интеллектуальное обновление. Быстрые хуки фиксируют высокочастотные изменения, а периодические сканирования обрабатывают редко меняющиеся данные и смену владельцев.
  • Поверхностный парсинг выигрывает в скорости. Глубокий анализ типов увеличивает задержку, не давая поведенческих инсайтов, которые являются главным преимуществом карты.

Итог: Накладывая статическую структуру, историю из git и паттерны реального использования на компактную двухъярусную модель доступа, разработчики могут предоставить ИИ-агентам программирования долговечную карту кодовой базы. Поддержание постоянно присутствующей сводки в минимальном объеме предотвращает раздувание токенов.