Полтора года делаю AI-ассистентов, В копилке около 20 проектов.

И главное, что я понял: подключить GPT — самая лёгкая часть работы. Правда. Всё нервное начинается после. Как я неделю искал баг, которого не было С этой начну, потому что до сих пор смешно. На сайте клиента висит виджет-ассистент. В какой-то момент люди пишут, что вылетают ошибки. Открываю у себя — работает. Открываю ещё раз — работает. Лезу в логи n8n. А там ноль. Не ошибки, а вообще ни одного выполнения за сутки. Запросы физически не доезжают. При этом сам n8n живой, я к нему спокойно подключаюсь, и телеграм-бот на том же инстансе работает как ни в чём не бывало. Сижу, туплю. А дело было вот в чём. n8n стоял на Railway, и его айпишники тогда просто не открывались из России на уровне провайдеров. Я сижу в Дананге, у меня всё летает, поэтому и искал не там. А телеграм-бот работал, потому что в вебхук стучатся серверы самого Telegram, они снаружи, и на блокировку им плевать. Вылечилось реверс-прокси на российском VPS. Кому пригодится: не забудьте proxy_set_header Host на исходный домен, иначе Railway не поймёт, куда роутить по SNI. И proxy_ssl_server_name on, иначе TLS не встанет. С тех пор правило: пока не убедился, что запрос вообще доехал, в код не лезу. Половина «багов ассистента» живёт где угодно, только не в ассистенте.

60 000 статей, или почему «залил в Pinecone и готово» не работает. Делал AI-консультанта для закрытого журнала по налогам. База больше шестидесяти тысяч статей, аудитория бухгалтеры, отвечать надо со ссылкой на источник. Первое, обо что спотыкаешься на такой глубине: поиск путает статьи разных лет. Закон поменялся, формулировка осталась прежней. И бот уверенно цитирует норму, которой больше нет. Для налогов это, мягко говоря, плохо. Так что время ушло не на LLM, а на нарезку и метаданные. Ну и на цепочку поиска: сначала банк проверенных ответов редакции в Pinecone, если пусто — веб-поиск по сайту, если и там глухо — Meilisearch. Ещё мелочь, которая не мелочь: перед поиском модель обязательно расшифровывает аббревиатуры. «КУДиР» и «книга учёта доходов и расходов» — для векторного поиска это два разных запроса, и чинить надо до, а не после. И главное правило, зашитое в промпт жёстко: нет ответа в найденных фрагментах — так и скажи, «не знаю». Лучше пустой ответ, чем красивый и неверный. Где RAG просто заканчивается Был бот для рецептурной оптики: подбирает линзы и оправы и говорит, встанет ли линза в конкретную оправу.

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

Ещё из любимого — бот когнитивных тренировок. Таблицу Шульте пришлось выносить в Telegram Mini App: нужен таймер и реакция в реальном времени, обычный бот так не умеет. А в опросник я незаметно вшил вопросы на внимательность — человек думает, что просто рассказывает о себе кнопками, а его в этот момент тестируют.

Что в сухом остатке. Качество RAG зависит от подготовки данных, а не от модели. Дубли, старые версии, противоречащие друг другу документы — вот откуда плохие ответы. Фолбэки спасают точность и убивают скорость. Доходило до минуты на запрос, и виджет отваливался по таймауту раньше ответа. Всё длиннее трёх шагов — только через машину состояний в базе. И защита от дублей везде, где есть расписание, иначе человек однажды получит одну рассылку трижды и удалит бота.

Стек: n8n (self-hosted, Docker), Node.js, PostgreSQL, Pinecone, Meilisearch, Telegram Bot API, GPT / Claude / Gemini / Grok, amoCRM и Bitrix24, Telegram Mini Apps.

Сейчас ищу удалёнку: фулл-тайм, парт-тайм или проекты. Если у вас есть большая база знаний и вы прикидываете, можно ли сделать по ней нормального ассистента, — напишите, разберём. Скажу честно, даже если так задача не решается.