Шлюхобот на продажу: восхождение 3го прототипа

Когда инженер проектирует будущего ролевого флиртующего чат бота, то важно учесть множество деталей:
- Качество ответов. Это не ветошь бабы Глаши. Ответы должны быть по контексту с множеством не видных на front параметров. С сохранением истории переписки в summary фактов. С автоинициативной моделью.
- Ориентация в времени и днях недели. В 3 ночи не стоит заявлять боту, что он пьет кофе, такая “продуктивность” нам ни к чему.
- RAG. Плевать на LLMку, но раг быть должен. Я аннигелировал 3 прототипа ботов, прежде чем это понял. Забегая вперед скажу: даже если у вас жиденькая LLM, но качественные данные под RAG, то ваш бот имеет шансы на успех. Few shot может дать стиль ответа, но не дает полноту личности.
- “Людские” мелочи. Тупняк(delay) перед ответом, вставка typing(печатает), реакции на сообщения, reply на сообщения пользователя, распознавание голосовух пользователя, отправка предгенерированных фото сельфи и видео - всё это и многое другое полирует качество вашего бота.
- Стек, конечно же. Какие пакеты, мешки и коробки мы будем юзать, чтобы упаковать ливер нашего бота.
Урок 1, в котором выучиваю новые нецензурные слова
Идет 5 час, как я трясу нейронку задавая вопрос вида “проведи анализ кода, найди проблемы и недочеты в архитектуре ответов модели”.
Это один из первых прототипов. Я захотел полный фарш и засунул в чат бота огромные промпты с переменными, состояниями, вычислением эмоции диалога и ответов, учитывающих ядро личности бота, сгенерированные нейронкой воспоминания из жизни 24-летней девушки. 8 тысяч записей в RAG созданных на основе промптов по 12ти разным сферам нашей жизни от 1 до 24 лет жизни. Сюжетку для фактов скрещивал из самых известных книг про женских персонажей. Напоследок я, предвкушающий успех всей затеи продажи этого бота за серьезные деньги, добавляю и отлаживаю парсинг списка женских каналов в телеграм, чтобы виртуальная подруга была вкурсе всех последних трендов. Нахера, а главное зачем?

Оверинженеринг и большие хотелки приводят внитуда
Итак, трясу я нейронку, не понимая, почему мой бот тормозит отвечает как последний пень в лесу. Боюсь, что я зашел не туда в реализации проекта и в этой точке начать заново чем чинить коряво созданное.
Выполнение:
Аннигилировать: rm -rf botai
Завтра начинаю процесс заново. Нужно отсечь лишнее. Не перегружать нецелевыми функциями.
Урок 2, в котором строю взрослый RAG для бота в ограниченном VPS
RAG - это набор данных как отвечать моему боту. Этакий справочник. Там обычно хранят пары или не пары данных вида вопрос-ответ. Качественный датасет для RAG позволяет отточить ответы шлюхобота, чтобы они были близки к кожаномешковским.
Итак, это уже 3 прототип на python. По ресурсам я ужат: прошло 2 месяца, бюджет у фрилансера плавающий и сейчас у меня такая vps: 1cpu 1ram 30gb. Выбор невелик. Оптимизма добавляет модуль для хранения векторов моего будущего RAG(sqlite-vec) который есть в sqlite3. Если он взлетит, будет неплохо, потому что Pinecone или Qdrant съедят мой RAM на завтрак.
Более сложной задачей выступает создание синтетики для моего RAG, ведь готовые датасеты для чат ботов с HF мне все не нравятся. Нужна русская не дубовая речь, и если я не найду нужных, подходящих на основе инженерного чутья датасетов, то путь у меня один - генерация синтетики. Так и происходит.
Для синтетики использую подход “в лоб”:
- Создаю промпт-пак для генерации диалогов с состояниями по разным сферам жизни. Мы должны генерировать диалоги в различных вариациях а не глубину личности жестянки как в прототипе 1. Промпт пак в итоге включал 42 разных промпта.
- Генерация. Я не богат на API(токены берегу для чат бота), поэтому беру нейронку с максимальным контекстным окном вывода, закидываю промпты прямо в GUI в браузере и пачками прошу генерировать диалоги. В промпт уже указана “личность” моего чат бота, ситуации и инструкции. По количеству данных на один промпт прошу сделать 100-150 в JSON. Потом добиваю еще 100-200.
- Нормализация JSON. Нейронки ошибаются в кавычках, нужна была склейка и сборка в один файл, который я при первом запуске разобью на чанки и засуну в своё векторное хранилище.
- Отладочные скрипты. До засовывания в sqlite3 я создаю ряд скриптов, которые оценивают качество моего датасета по разным параметрам: охват разных states, процентаж вопросов в диалогах(10-15%, это же не допрос пользователя, верно?) И так далее.

Тесты, впоследствии очень помогли. Суммарно у меня выходит около 18 тыс данных, с чем уже можно работать, если они хоть немного качественные.
Python коннектор я сделал универсальным по openai либе, но прикрутил к GigaChat. Я брал DeepSeek R1 от прокси Timeweb, но мне были критичны их задержки в ответах. GigaChat с хорошим RAG отвечал уверенно быстро. Под капотом двигалось сразу несколько промпт-запросов:
- Ответ пользователю
- Суммаризатор диалога
- Отложка фактов в долгосрок
Frontend для mini app написал на React с либами для телеграм. Мне было важно, чтобы initData фиксировалась и приложение я мог закрыть из браузера - еще осваивать ИБ в ближайшее время я не планировал, а дырок в приложухе могло быть достаточно.
Мне важно было добавить легкий транскрибатор для тех пользователей, которые будут общаться голосом - не киллер-фича, но внимание к деталям, и этого удалось достичь с помощью Whisper tiny(мультиязык).
Посредством Few Shot я отладил характер ответов модели. Глубина ответов бралась из RAG, дополнительно в боте отладил мелкие детали: typing, задержку перед ответом, модуль времени(сутки, дни недели).
На серьезный прод пойдет уже переработка на postgres, кэшами в redis и нормальной векторкой. А так же reranker - почему бы уже сейчас не добавить?
Урок 3, в котором мы оберегаем свои ресурсы.
Вот она эта точка. Я понял, что бот точно будет 18+, а чего мулки бять? Ну это уже от заказчика зависит, засунуть можно любой контент, в том числе NSFW. Я пришел к этому в тот момент, когда мне отказали 3 платёжных шлюза и еще два агрегатора рекламы. Никто не стал даже разбираться, а бот на тот момент тупо общался и просто слал свои адекватные фотки. Ну суки, похуй, подумалось мне тогда матерно и тривально. Делаем, что выходит, главное, чтобы вышло интересно.
Структура теневой защиты.
Во-первых, в телеге есть специальный флаг protect_content на сообщения, чтобы в чате с ботом нельзя было сообщения переслать или сделать скриншоты - включаем опцию. Мы защищаем свой ресурс. Ведь доступ к боту будет платный + фримиум.
Во-вторых, нам нужна “тень” в виде приватных каналов, откуда бот будет брать контент. В правилах Телеграм сказано, что бот - публичная штука и ему нельзя демонстрировать 18+ и прочее. Но в приватных каналах можно(за исключением жести и прочей херни) Делаем тень: Создаем приватный канал, в который делаем предгенерированные фотки моего шлюхобота. Я делаю пока без 18+, но владелец затем может сделать что угодно. Бот будет делать пересылку сообщений из этого канала в личку с пользователем. И главное - пересылка только по запросу пользователя, типа “покажи фотки”. Это позволит на любые жалобы подавать аппеляцию, что демонстрация была по согласию и прочее. Ну и в бот добавляем акцепцию 18+ - Готово!

Канал с генерированными видосами:

Как я создавал контент и какими нейронками - сами разберётесь. Ниже пример фоток с бесплатного Freemium тарифа:



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