1. Краткая история о том, как я создавал самообучающегося AI-ассистента, не зная ML.
C чего все начиналось.
Начну с того, что я вообще не #ml инженер. Но в апреле я решил собрать ИИ-ассистента, который учится на своих ошибках, чисто факультативно)
Не просто чат-бот с памятью, а систему с замкнутым циклом самообучения. Для чего?
Вообще, все началось с того, что мне для работы нужно было нечто вроде секретаря, который бы жил в моем компьютере и телефоне, помогал мне искать информацию, делать заметки, вести мой список дел, которые я обычно забывал.
Но потом где-то я свернул не туда)) Чат-бот вроде как заработал, но был настолько туп, что я пока отложил в сторону дополнения вроде секретаря и дневника и окунулся в #ai чат. Точнее его допиливание.
Зачем? Есть же куча чатов ИИ. К чему мне еще один, казалось бы!
Сегодня расскажу, как это получилось и какие грабли я собрал по дороге. Дальше статьи пойдут по очереди чтоб не валить все кучей.
Почему меня бесили ChatGPT и DeepSeek.
Я пользовался ими с момента появления. И меня стабильно раздражала одна вещь: они не учатся на моем контексте.
Спрашиваю в понедельник — как посчитать себестоимость шкафа-купе. Он выдаёт ответ с галлюцинацией: путает ЛДСП и ДВП, не учитывает кромку. Я говорю: «неверно, пересчитай». Он извиняется, даёт новый ответ — с другой ошибкой.
В среду спрашиваю то же самое в новом чате — опять галлюцинирует. С тем же прайс-листом.
Для меня это было дико. У человека так не работает: если я один раз понял, как считать шкаф — я не забуду. А эти модели забывают всё при закрытии чата.
Я решил: соберу систему, которая помнит. Которая будет анализировать свои ошибки и больше их не повторять.
Стартовые условия
Для начала арендовал VPS с 1 CPU и 2 ГБ RAM.
Основная модель — API GigaChat. Embeddings — тоже GigaChat. Вспомогательные — DeepSeek и OpenAI для контроля качества.
И ноль опыта в RAG, векторных базах, LangChain — я даже слов таких не знал.
Шаг 1. «Просто чат с памятью»
Первая версия была смешной: взял SQLite, добавил таблицу messages, и каждый запрос отправлял в LLM вместе с последними 20 сообщениями. 200 строк на FastAPI.
Сработало!
Но через неделю понял: контекстное окно не резиновое. Прайс-лист на 85 позиций выпадал из диалога после 30 сообщений. LLM говорил: «а какой у вас прайс?».
Пришлось придумывать якоря — точки фиксации темы. По сути, я автоматически помечал ключевые моменты диалога, и система всегда видела в системном промпте: [ТЕМЫ: прайс-лист → расчёт себестоимости]. Контекст стал держаться на 50+ сообщениях.
Потом я узнал, что через полгода вышла работа MemGPT с почти такой же идеей. Случайно понял, что я шёл параллельным путём.
Шаг 2. Sufler — контроль качества
Вторая проблема: я не понимал, когда LLM врёт. Пропускал ошибки в спецификациях, путал кромку и ЛДСП.
Решение — поставил вторую LLM, которая проверяет первую. Назвал её Sufler.
Она оценивает каждый ответ по шкале 1-5 и, если находит ошибку, переписывает ответ.
Потом я нашёл работу Reflexion (NeurIPS 2023) — там была похожая идея, но мой Sufler — внешний и независимый, он сохраняет оценки в долговременную память.
Шаг 3. ЛИКБЕЗ — автообучение без человека
Когда Sufler начал стабильно ловить ошибки, появилась идея: если оценка 2 из 5 — значит, системе не хватает знаний. Что если автоматически искать эти знания в интернете и добавлять в базу?
Написал скрипт, который каждые 3 часа анализирует свежие провалы, формулирует тему, ищет статьи через SearXNG и сохраняет их в векторную базу ChromaDB.
Получился замкнутый цикл: ошибка → тема → знание → меньше ошибок. Сейчас в базе ~450 тем и более 1000 статей, найденных автоматически. Многие из них — именно те, по которым раньше были галлюцинации.
Цифры и факты- 23 компонента в архитектуре- ~50 000 строк кода: Python 20K, JavaScript 7.5K, HTML 2.7K, CSS 20K- 5 фоновых задач, 33 узла мониторинга- 1176 реальных Q&A с оценками- 1046 векторов в базе опыта.
Для сравнения: в работах Voyager и Reflexion похожие механизмы используются, но никто не собирал это в единую production-систему на 2 ГБ RAM с автономным research и weekly self-calibration оценщика.
Что я сломал по дороге
Не обошлось без боли. GigaChat отдавал expires_at в миллисекундах — токен протухал через 30 минут, и я потратил 6 часов на отладку.
Sufler начал льстить и ставить всем 5/5 — пришлось написать скрипт еженедельной самокалибровки.
ChromaDB молча сохраняла нулевые векторы при 401 — поиск превращался в шум.
Каждая такая грабля — это отдельная история, которой нет ни в одном туториале. Но это практически уже пофикшено. О чем я напишу в будущих статьях.
К чему я пришёл
Через 3 месяца я получил систему, которая реально уменьшает количество повторяющихся ошибок. За месяц она закрыла ~30% типовых провалов. Я, по сути, не изобрёл ничего нового в теории — но я собрал это всё в работающий продукт и готов поделиться архитектурой.
Зато получил и получаю знания, которые, возможно пригодятся мне когда-либо (но не факт, конечно).
Что дальше:
Эта статья, по сути пролог к другим, более подробным.
А вообще, на моем личном сайте полный разбор всей этой истории:
как устроены якоря, Sufler, ЛИКБЕЗ, что я почерпнул из MemGPT и Reflexion, где мои собственные находки, и какие уроки я бы дал себе в апреле.
Если интересно - это тут: