Как не дать knowledge base устареть

Как не дать knowledge base устареть - 1

Устаревшая документация хуже, чем её отсутствие — она отравляет контекст LLM. Агент доверяет тому, что видит. Garbage in — garbage out, только garbage выглядит как аккуратный markdown.

Это вторая часть серии. Первая часть — «Слепое пятно LLM-разработки: контекст за пределами кода».

Проблема: энтропия документации

В первой части я описал workbench — централизованную knowledge base, подключаемую вторым корнем в IDE. Архитектура, реестр, ADR, иерархия правил. Но у любой документации есть фундаментальное свойство: она начинает устаревать с момента написания.

При десятках параллельно развивающихся проектов каждое изменение потенциально делает неактуальным что-то в knowledge base. Стратегический план ссылается на версию сервиса, которая уже трижды обновилась. Реестр проектов показывает статус, изменившийся две недели назад. Агент читает всё это, принимает за актуальное и ориентируется по карте, которая больше не соответствует реальности. Отсюда — ошибки, которых могло бы не быть.

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

В этом проявляется закономерность, выходящая за пределы конкретной проблемы устаревания. Переход к LLM-разработке напоминает пересадку с автомобиля с механической коробки передач на электромобиль с автопилотом высокого уровня автономности. Детали технического процесса — руль, сцепление, газ — перестают быть узким местом. Машина едет быстро и самостоятельно. На первый план выходит другое: куда ехать, зачем и какой дорогой. LLM забирает значительную часть ручной, технической работы — и принципиально повышает значимость методологии: организации процесса, верификации результатов, управления контекстом. Эта статья — о гигиене контекста: как поддерживать knowledge base в состоянии, которому LLM может доверять.

Автоматические проверки

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

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

Проверка свежести работает через дату обновления в метаданных документа. Порог по умолчанию — 60 дней. Это не означает, что каждый документ нужно переписывать — только провести ревизию: пройтись по ключевым фактам, убедиться, что версии, статусы и зависимости актуальны, поставить новую дату. Несколько минут — и документ снова заслуживает доверия.

Пример вывода при первом запуске на реальном workbench:

$ ./tools/validate.sh
[markdown links]
  WARN:  broken link in domains/infra/topology.md -> decisions/adr_007.md
  WARN:  broken link in projects/api/architecture.md -> ../shared/schema.md
  INFO:  42 broken link(s) out of 189 checked

[document freshness — threshold 60d]
  WARN:  stale (87d): projects/data-pipeline/architecture.md
  INFO:  1 document(s) exceed freshness threshold

[project coverage]
  OK:    all projects have workspace files

=== Result ===
  Errors: 0 | Warnings: 43 | Info: 2

Похожий по духу скрипт агрегирует TODO-items из всех markdown-файлов. В документах рассыпано множество незакрытых задач — в планах, бэклогах, иногда в логах сессий. Без агрегации нет единой точки, откуда можно увидеть полную картину: что нужно сделать по деплою, по CI, по конкретному проекту.

Реализация — два bash-скрипта суммарно на ~300 строк, исходники на GitHub.

Жизненный цикл документов

Не все документы стареют одинаково. Стратегический план обновляется еженедельно. Описание протокола — при его изменениях. Post-mortem инцидента — никогда, и это нормально.

Разделение на четыре статуса — active, reference, draft, archived — решает эту задачу для агента. Агент не отличает свежий план от трёхмесячного артефакта, если оба лежат в одной папке без надёжных метаданных. Явный статус и дата в заголовке каждого документа дают агенту четкую информацию.

Жизненный цикл документов

Жизненный цикл документов

Архивирование — не удаление. Документ перемещается в подкаталог archive/, где он доступен для контекста, но не смешивается с актуальными материалами. Git history не заменяет этого: в истории документ невидим для агента без целенаправленного поиска, в archive/ — видим, но помечен как устаревший.

Дисциплина в cursor rules

Инструменты обнаруживают проблему, но не решают её. Решает — поведение. В моих глобальных cursor rules (которые действуют во всех workspaces) закреплены три принципа, каждый из которых родился из конкретного класса ошибок.

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

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

Третий: планы обновляются при каждом изменении, в той же сессии, а не «потом». Устаревший план — это тот же отравленный контекст, только с виду безобидный.

Ловушки мета-оптимизации

Всё описанное выше — валидация, жизненные циклы, дисциплина сессий — звучит как выстроенный процесс. Но именно здесь начинается самый опасный анти-паттерн solo-разработки с LLM: оптимизировать процесс разработки вместо разработки.

LLM делает автоматизацию дешёвой. Написать скрипт — минуты. Задокументировать процесс — минуты. Соблазн автоматизировать всё — огромный, и именно он убивает продуктивность.

Вот как это выглядит на практике. Месяцы уходят на инфраструктуру для задачи, которая ещё ни разу не была решена вручную: оркестратор микросервисов — а ни одного сервиса в production нет. Или наоборот: десять документов описывают архитектуру фичи, но в коде — ноль. LLM делает планирование настолько дешёвым, что легко убедить себя: «я же работаю — я пишу план». На самом деле это прокрастинация в формате markdown.

Здесь проявляется свойство LLM, которое глубже, чем кажется: он придаёт убедительную форму любому контенту. Недавно на Хабре была статья с формулами, кодом и наукообразной методологией, в основе которой лежала физически абсурдная идея. Текст выглядит настолько профессионально, что люди всерьёз тратят время на аргументированные опровержения в комментариях — потому что с первого взгляда непонятно, нестандартная ли это гипотеза или наукообразно оформленный бред. По сути — новая форма троллинга.

Когда LLM позволяет облечь любую идею в убедительную форму — критерий «выглядит профессионально» перестаёт быть сигналом качества. Это касается и собственной работы: план, написанный с помощью LLM, выглядит как работа. Инфраструктура, спроектированная с помощью LLM, выглядит как прогресс. Отличить деятельность от результата становится сложнее, чем до появления этих инструментов.

Или ещё: невозможность начать работу, пока все предпосылки не выполнены. Все типы конвертированы, все тесты написаны, все файлы декомпозированы — и вот три дня ушли на типизацию вместо того, чтобы выкатить первую версию с тем, что есть. LLM охотно поддерживает эту иллюзию: «конечно, сначала нужно добавить типы, потом тесты, потом рефакторинг…»

Отдельная ловушка — переоценка ROI автоматизации. Десять часов на скрипт, который будет использован пять раз. Формально: (50 минут экономии × 5 использований) / (600 минут инвестиции) = 0.42x. Потрачено больше, чем сэкономлено. Люди систематически завышают ожидаемое число использований и занижают реальную стоимость разработки.

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

Дистанция от результата

Для ориентации в этом пространстве помогает простая иерархия: насколько далека текущая активность от практического результата.

На одном полюсе — прямой результат: работающий продукт, приносящий измеримую пользу. На шаг дальше — опорные системы, без которых качественный результат невозможен: staging-окружение, мониторинг, CI/CD. Ещё дальше — ускорители разработки: статическая типизация, тесты, cursor rules, сам workbench. Затем — мета-ускорители: локальный LLM-кластер, автоматизация LLM-workflow. И наконец — мета-уровень: рефлексия о самом процессе, переосмысление подхода.

Дистанция от результата

Дистанция от результата

Последний уровень неоднозначен. Большая часть времени, проведённого здесь, — это чистые потери: оптимизация оптимизации, не приносящая измеримого результата. Но именно на этом уровне рождаются концептуальные сдвиги, которые меняют всё остальное. Version control, CI/CD, сам подход test-driven development — всё это когда-то было мета-мета, прежде чем стать нормой. Опасность не в том, чтобы иногда оказываться на этом уровне, а в том, чтобы застрять на нём, перепутав рефлексию с работой.

Ориентир простой: на каждом уровне не более 30% времени уходит на работу следующего, более далёкого от результата уровня. Если больше половины времени уходит на ускорители и мета-ускорители — это тревожный сигнал.

Workbench — это ускоритель. Cursor rules — ускоритель. Эта статья — мета-мета. Возможно, кому-то из читателей она поможет пересмотреть свой подход к LLM-разработке, и тогда это окажется оправданным. Но я отдаю себе отчёт: прямо сейчас она не приближает ни одну задачу в production. Впрочем, делиться наработками — тоже форма ценности: чужой опыт, переведённый в оформленное знание, экономит другим месяцы проб, которые автор уже прошёл.

Зрелость автоматизации

Уровни зрелости автоматизации

Уровни зрелости автоматизации

Связанное наблюдение: автоматизация работы с LLM проходит через уровни, и перепрыгивать их — типичная ошибка. Сначала ты ставишь задачу агенту и ревьюишь результат. Когда ревью стабильно проходит без серьёзных правок, а CI ловит регрессии — можно давать агенту больше автономии. И только когда автономный цикл стабилен — есть смысл строить pipeline.

Типичная ошибка: пытаться автоматизировать полный цикл «гипотеза → генерация → деплой» (верхний уровень), когда CI не блокирует merge при сломанных тестах (базовый уровень не пройден). Каждый уровень имеет предпосылки, и без них следующий не работает — он только создаёт иллюзию прогресса.

Что это стоило

Создание workbench: примерно день. Подключение проектов и написание скриптов валидации: ещё день. Ретроспективные ADR по ключевым решениям: около часа. Суммарно — порядка двух дней инвестиций.

Окупаемость — в течение первой недели. Каждая LLM-сессия стартует быстрее на 3-5-10 минут, что при нескольких сессиях в день суммируется в существенную экономию. Но важнее, чем время, — качество: агент принимает решения на основе актуального контекста, а не на основе того, что было актуально два месяца назад.

Вместо заключения

Workbench — не серебряная пуля. Это дисциплина, обёрнутая в структуру папок и несколько bash-скриптов. Агент не станет умнее от того, что рядом лежит документация. Он станет умнее от того, что документация актуальна, структурирована и предсказуема.

Но сама по себе эта дисциплина — ускоритель, не результат. Инвестировать в контекст имеет смысл ровно в той мере, в которой это ускоряет работу, приносящую практический результат. Не больше.

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

Автор: VsBirdEye

Источник

Оставить комментарий