Мы привыкли, что в нашем любимом программировании постоянно происходят изменения. Новые версии фреймворков и библиотек, новые языки и подходы к разработке ПО. Именно поэтому «ИТ — это сфера, где нужно постоянно учиться», так звучит наша традиционная мантра.
В последнее время всё меняется слишком быстро. Причина тому — генеративные языковые модели. Новые знания становятся deprecated спустя несколько месяцев. Вчерашние революционные подходы сегодня выглядят как рудимент. Есть один большой плюс такой тенденции: если вы вдруг проспали старт ИИ-гонки, наверстать упущенное и догнать лидеров можно достаточно быстро.
В данной статье я хочу рассмотреть несколько приёмов, которые помогут выстроить рабочую систему или повысить эффективность уже существующих практик работы с ИИ. Содержание статьи представлено ниже, если вы захотите пропустить тот материал, который вам уже знаком.
Содержание:
Context engineering: agents, skills, commands

Мы знаем, что генеративный ИИ не размышляет в полном смысле этого слова. Он лишь предсказывает, каким должен быть ответ на вопрос пользователя.
Чем более подробный поступает запрос, тем более точным будет предсказание. Или нет?
Избыток информации — практически такая же проблема для LLM, как и её недостаток. Поэтому стратегия пихать всё в один промпт — не лучшая идея. Здесь ИИ более чем похож на нас с вами: если мы прочитаем большую книгу разом, то в момент применения знаний очень трудно будет вспомнить, о чём там точно говорилось в главе N. О том, почему так происходит у языковых моделей, можно прочитать в этой статье.
Решение этой проблемы есть, и оно стало фактически стандартом индустрии. Каждая среда для работы с LLM позволяет разделить контекст задачи на несколько небольших кусочков, чтобы модель порционно получала необходимую информацию в нужное время. Вариант исполнения кусочков — MD-файлы в корневой папке.
Стандартная структура контекста может выглядеть так:
корневой файл с контекстом проекта. В разных клиентах он зовётся по своему: AGENTS.MD, CLAUDE.MD;
файлы со специализированными агентами и саб-агентами;
навыки агентов, skills — небольшие инструкции для решения конкретной задачи;
commands — шаблоны промптов для запуска типовых задач.
Такая структура позволяет читать нашей модели не всю инструкцию разом, а иметь под рукой оглавление книги и открывать нужную главу в момент решения конкретной подзадачи.
Оптимизация контекста
Есть некоторые операции, запуск которых необходим для выполнения агентом текущей задачи: поиск и изучение файлов, запуск программы для проверки компиляции, чтение логов. Эти действия длительные и приводят к наполнению контекста избыточной информацией. Пример для мобильного приложения — логи сборки или запуск тестов. Вот пример размера токенов для одного запуска команды с тестами.

Цифра в ~500 токенов может показаться незначительной. Но представьте, если агент работает в автономном цикле и раз за разом запускает проверку компиляции или успешность тестов.
Чтобы помочь модели работать автономно без риска потерять фокус или забить контекстное окно, можно сделать следующее:
-
фильтрация логов и вывода в терминале. Т.е. чтобы в промпт попадали только существенные данные без воды и мусора. С этой задачей справляется инструмент https://github.com/rtk-ai/rtk, демонстрация эффекта утилиты на скриншоте ниже:

-
индексация проекта для ускорения поиска. Для этого тоже есть готовое решение — https://github.com/defendend/Claude-ast-index-search. Мнение модели об этом инструменте на скрине ниже:

периодически сжимать контекст текущей сессии. Ряд клиентов для работы с LLM имеют встроенную функцию, контекст автоматически сжимается при критическом наполнении. Если такой функции в вашем клиенте нет, можно сделать отдельный промпт/скилл и запускать вручную или через инструкции агента после выполнения каждой подзадачи. Этим инструментом не стоит злоупотреблять, очевидно, что сжатие сессии может привести к потере части информации из исходного контекста.
Todo list
Суть идеи: чтобы агент не держал в голове, пардон, в контекстном окне ход выполнения задачи, можно попросить вначале создать md-файл с todo-листом. Это позволит сохранить информацию о том, что нужно сделать и прогрессе выполнения. Такой todo-лист можно шарить между сессиями, если задача большая. Например, todo-лист покрытия модуля тестами.
Интервью пользователя
Если модели не хватает контекста, она его придумает. И тот образ реализации, который был у пользователя, будет сильно отличаться от итога работы агента. Решение: попросить модель перед выполнением задачи задать несколько вопросов, чтобы уточнить требования и нюансы реализации. Лучше реализовывать это через отдельный skil. Так действия модели будут точнее, а сам навык можно прописать нескольким агентам.
Пример такого интервью на скрине ниже:

Неожиданный бонус подхода — после одного из таких интервью я понял, что сам не до конца разобрался в бизнес-требованиях, ведь вопросы модели поставили меня в тупик. Метод уточки, XXI век :-).
Важный момент: если прописать агенту: «задай мне 3 вопроса», он именно так и сделает. Вопросы будут просто заданы, даже если в них нет особого смысла. Лучше подробнее написать этот момент, например, «задай мне от 2 до 6 вопросов, если задача небольшая и контекст очевиден, пропусти этап интервью».
Рефлексия агента
Суть идеи: в конце выполнения задачи спросить у агента, если бы ты делал задачу заново, что бы ты сделал лучше. Если агент ошибся на одном из этапов, спросить о причинах. Ирония судьбы, тут мы пытаемся получить от агента то, на что способны не все люди. Это уже AGI или нет? ?
Здесь могут всплывать забавные моменты. Один мой агент написал тесты на репозиторий, но покрыл только 1 метод из трёх. Когда я спросил, почему так произошло, он ответил, что его задачей было написать успешный тест. И поскольку он не смог сделать тест на методы, который успешно проходил, он их просто удалил. Наглядный пример, что если машина сможет "хакнуть" требования, она это сделает.
Полученную рефлексию можно использовать для улучшения инструкций для агентов. Причём необязательно это делать вручную. Подробности дальше.
God-agent

Изначально я думал, что если агенты будут писать код, то хотя бы config-файлы для настройки агентов — это моя зона ответственности. В итоге лень прогресс победил, и я подумал: почему бы не сделать отдельного агента, который будет настраивать всех остальных?
Сказано — сделано. Так в моей виртуальной команде появился God-agent — отдельный агент, задачей которого было создавать конфигурационные файлы для остальных агентов.
А вот приём, который я подсмотрел в одном видео на ютубе: чтобы skills для агентов получались качественными, можно сформировать специальный навык для создания скилов. Обратите внимание, что в качестве references в навыке лежат md-файлы с гайдом Anthropic для написания скилов, чтобы навыки агентов разрабатывались по первоисточнику. Всё гениальное просто.

Вернёмся к самообучению агентов. Теперь когда мы создали God agent, после каждой сессии мы можем переключаться на него и просить обновить конфигурационные файлы агента, исполнявшего задачу, с учётом рефлексии.
И тут у вас может выработаться процесс, который с очень большой натяжкой можно назвать обучением модели на верхнем слое абстракции:
даём агенту типовую задачу;
оцениваем результат, вносим комментарии, запрашиваем рефлексию;
вызываем God-agent, обновляем config-файлы;
запускаем ту же или подобную задачу ещё раз, проверяем результат, при необходимости повторяем пункты 2 и 3.
Безусловно, степень идемпотентности ответов ЛЛМ выставляет предел эффективности такого обучения. Ведь на 2 одинаковых промпта в параллельных сессиях одна и та же модель может ответить по-разному. Но личный субъективный опыт свидетельствует о том, что определённого улучшения качества ответов таким способом добиться можно.
Давайте вспомним основные шаги, описанные в статье:
Использование системы agents и skills для структуры передаваемого контекста;
Использование rtk, ast-index и подобных решений для оптимизации размера контекстного окна, ускорения навигации по файлам в проекте;
Todo-lists в отдельном md-файле чтобы модель помнила, что делает и на каком этапе находится;
Интервью пользователя, уточнение технических требований перед выполнением задачи;
God-agent, сущность для создания конфигурационных файлов: агентов, skills;
Рефлексия агента после выполнения задачи, вызов God-agent для улучшения инструкций на основе рефлексии.
Как мы обсудили в начале статьи, в сфере ИИ всё меняется стремительно. Каждый день появляются новые подходы и решения. Здорово, что большая часть решений — результат экспериментов программистов, энтузиастов, нас с вами.
Уверен, многие из читателей смогут поделиться своим опытом использования ИИ. Буду рад увидеть ваши советы и рекомендации в комментариях. Всем чистого кода и послушных ИИ-агентов!