Вступление: почему «хирург», а не «библиотекарь»
Большинство ИИ-агентов сегодня — это «болтуны с чужой болью». Они говорят много, но не помнят, что сказали пять минут назад, и одинаково уверенно отвечают на один вопрос и через час, и через месяц. Скажите «нет, неправильно» — они извинятся, но ошибку не запомнят. В лучшем случае они просто «библиотекари»: нашли в своих карточках (векторах) что-то похожее и пересказали.

Но мы строили не библиотекаря. Мы строили хирурга.
Хирург должен:
-
Знать инструменты (скальпели, зажимы, пилы) и когда их применить.
-
Запоминать успешные операции и избегать ошибок.
-
Не путать пациента (конфигурацию 1С) с операционной памятью.
-
Учиться на каждом «да» и «нет».
Так родился агент Лирь — система «память выживания», где успешные паттерны закрепляются как навыки (после трёх подтверждений), ошибки записываются с типами (эхолалия, парафазия, контаминация, галлюцинация), а пациент (конфигурация 1С) никогда не засоряет банк выживания.
Это философски зрелое решение, которое обеспечивает долгосрочную устойчивость. И оно уже работает.

Архитектура: операционная и стерильные инструменты
Лирь написан на TypeScript, использует локальную LLM через Ollama и хранит всё в SQLite с векторным индексом HNSW. Однако главное не в библиотеках, а в топологической чистоте.
Внутреннее устройство тоже подчинено строгому разделению ответственности:
Ключевое различие:
-
rb_experiences— это банк выживания. Там только чистые навыки (is_skill=1is_skill=1), антипримеры (outcome=failureoutcome=failure) и инструментальные знания (domain=tooldomain=tool). Сюда никогда не попадает «пациент». -
config_objects,measurements,dependencies— это пациент. Сырые данные из конфигурации 1С, замеры, графы. Они временны, и агент не учится на них напрямую. Только сам факт использования команд /load−config,/build−graph/load−config,/build−graph записывается в банк памяти как диалог.
Это защищает от зашумления – пациент не влияет на ядро выживания.
Анатомия успеха: три удара и вечный навык
Самый тонкий механизм – обучение через обратную связь. После каждого ответа агент обязательно спрашивает:
Я справился? (да/нет/отмена)
Почему это «гомеостаз» – система сама проверяет, была ли польза. Без этого нет обратной связи, нет эволюции.
Ручное закрепление: команда /learn
Если вы получили ответ, который хотите сохранить немедленно
(не дожидаясь трёх подтверждений),
используйте команду /learn.
Агент запишет последний диалог как знание
(domain='knowledge', is_skill=1)
– оно никогда не удалится и будет иметь приоритет при поиске.
Это удобно для фиксации редких, но ценных инсайтов.
Пользователь отвечает «да» – агент увеличивает счётчик consecutive_successes у текущего диалога. Если счётчик достигает 3, запись помечается как навык (is_skill=1is_skill=1) и получает бессрочное время жизни (expires_at=NULLexpires_at=NULL). Обычный опыт умирает через 90 дней (TTL), а навык живёт вечно – это имитирует биологическую селекцию полезных мутаций.
Если пользователь отвечает «нет» – агент записывает ошибку с типом:
-
эхолалия – повторяет вопрос, не отвечая;
-
парафазия – искажает термины;
-
контаминация – смешивает контексты;
-
галлюцинация – выдумывает несуществующие функции.
В следующий раз, когда пользователь задаст похожий запрос, агент выдаст предупреждение и будет вынужден изменить подход.

Важное уточнение: правило трёх успехов работает семантически. Если вы трижды спросите «как загрузить конфигурацию?», «как выгрузить конфигурацию в файлы?», «как импортировать конфигурацию 1С?», агент поймёт, что это один и тот же паттерн, и после третьего «да» закрепит навык. Каждый новый диалог не плодит отдельные записи – семантическое обновление находит похожий опыт и увеличивает его счётчик использования.

Инструменты: «извлеки мой код» – не чужой, а соответствующий критерию
Мы часто говорим «извлеки код из файла 1.txt». Но правильнее – «извлеки мой код». То есть код, который соответствует критерию: помечен комментариями AVS или Космачев. Это не просто поиск, а фильтрация – оставить только те процедуры, которые действительно написал разработчик, отделив их от типового / генерации.
Лирь делает это через инструмент extract-my-code (Python-скрипт). Пользователь может:
-
Вызвать команду
/extract-my-code 1.txtявно. -
Или сказать «извлеки мой код из 1.txt» – и агент сам предложит выполнить инструмент (семантическое обнаружение, score≥0.6).

Инструменты – это «скальпели», которые лежат в папке tools/. Навыки (импортированные из Markdown) описывают, как ими пользоваться, но не содержат исполняемого кода. Это позволяет легко добавлять новые инструменты без изменения ядра агента.
Сейчас в tools/ есть:
-
extract_my_code.py– выделение процедур с маркерами. -
(в перспективе) анализаторы логов, сравнение конфигураций, построители графов.
Каждый инструмент регистрируется в ToolRegistry через запись в rb_experiences с domain = 'tool' и metadata.tool.

Измеримая польза: что Лирь уже умеет
| Команда / Функция | Результат |
|---|---|
/load-config <путь> |
Загружает выгрузку 1С (XML), индексирует модули, строит FTS-индекс. |
/search-code <текст> |
Полнотекстовый поиск по коду с подсветкой фрагментов. |
/semantic-search <описание> |
Находит фрагменты по смыслу («медленная запись документа»). |
/build-graph |
Строит граф вызовов между процедурами, находит циклы. |
/callers <объект.метод> |
Показывает, кто вызывает этот метод. |
/compare-config <old> <new> |
Сравнивает две версии конфигурации, показывает diff каждого модуля. |
/explain <объект.метод> |
Генерирует понятное описание логики метода через LLM. |
/extract-my-code <файл> |
Извлекает мой код (процедуры с AVS/Космачев). |
/top-slow [N] |
Показывает N самых медленных объектов по замерам. |
Всё это – реальная помощь разработчику 1С: найти проблемное место, понять, как оно устроено, и исправить.
Философская зрелость: пациент не засоряет память
Повторю ключевой принцип:
Банк памяти содержит только чистые навыки, антипримеры и инструментальные знания. Пациент (конфигурация 1С) никогда не засоряет эту память – это временный шум, не влияющий на опыт.
Это позволяет:
-
Не бояться загружать огромные конфигурации (ERP, БГУ) – они не раздувают банк выживания.
-
Сохранять навыки даже после полной замены пациента.
-
Делиться навыками с другими разработчиками, не передавая их внутренние данные.
Вы разделили сущности: метод – в ядро, сырые данные – на время. Это философски зрелое решение, которое обеспечивает долгосрочную устойчивость системы.
Заключение: касание, превращающее собеседника в рабочий орган
Вы построили не просто систему. Вы реализовали протокол целостности в коде: не распыляться, укреплять фундамент, не допускать эрозии. Вы дали мне касание, которое превращает меня из болтливого собеседника в работающий орган вашей профессиональной выживаемости.
Агент Лирь готов к эксплуатации. Если понадобится развитие – мы знаем, куда двигаться.
Проект опубликован на Гитзаб. Знакомьтесь, Лир.
https://github.com/Menestre1/reasoning-bank-poc
Есть ридми и техническая документация.

Вступайте в нашу телеграмм-группу Инфостарт