Бот, которому запретили оправдываться

Обложка: рыба мечты в руке сурового сахалинского рыбака

На восьмой день бот перестал отвечать половине чата. Он не упал и не завис, он просто молчал. В журнале на каждое такое молчание стояла одна строка: «ответ забракован (английские слова: Alex)».

Проверка ответа запрещала боту английские слова, потому что однажды он пожелал чату «Good morning». Имя «Alex» в обращении проверка тоже сочла английским. Бот писал ответ, сам его забраковывал и не общался с теми, у кого имя латиницей.

Потом та же проверка сработала снова. Участница написала, что выступала на соревнованиях IronSakh. Бот дважды пытался ответить со словом IronSakh, дважды браковал ответ и в конце промолчал. Теперь латиница, которую люди сами употребили в разговоре, браком не считается.

Научить бота отвечать можно за вечер. Но вот чтобы научить его вовремя отвечать, молчать и не раздражать сотню людей требуется время.

В статье:

  • как устроен бот: один процесс на Python, SQLite, шесть поставщиков моделей без SDK, наблюдение через Langfuse;

  • что ломалось у каждой модели;

  • день, когда чат полчаса обсуждал бота, и почему ему пришлось запретить оправдания;

  • какие ошибки модели ловятся только кодом;

  • сколько это стоит и ожил ли чат.

Чат, бот и одно правило

Меня зовут Алексей, я занимаюсь ИТ и немножко инженерией ИИ.

На Сахалине есть сообщество знакомств и общения: около ста человек, в основном за сорок, один общий чат с темами «Чат», «Анонсы» и «Правила». Люди здесь встречаются и вживую, ездят на природу, ходят в кафе, вместе празднуют. Владелица сообщества организует и всячески поощряет разные активности, такие как вводные занятия по йоге, психологические тренинги, игры разного вида, за что ей огромное спасибо! Бот существует и совершенствуется с её согласия.

Бота зовут Максим, кличка Пирожок. Разработка началась 30 августа и продолжается до сих пор. 154 правки, около 25 тысяч строк на Python в 37 файлах. В чате бот с 3 сентября. Руками код я не писал. Его писали Claude Code и Codex. Я принимал архитектурные решения, ставил задачи и проверял результаты.

Сводник, а не собеседник

В чате бот легко становится удобным собеседником, который всегда ответит. Однако изначально ему было запрещено подменять живых людей. Посему главная его работа помогать участникам общаться друг с другом. Он должен встретить новичка, затеять игру, когда в чате тихо, поздравить, напомнить о встрече, подхватить вопрос, который повис без ответа.

Например, вот этот вопрос провисел 21 минуту, и бот его подхватил. Переписка настоящая, но имя участника скрыто.

Первый месяц бот функционировал строго в этой роли. Потом стало понятно, что это перегиб: многим просто хочется поговорить, а живая беседа с ботом втягивает и других участников. С 30 сентября бот говорит свободно, но сводником быть не перестал. Он не отвечает за других, не перебивает людей и в ссоры не лезет. (А ссоры бывают! Только пух и перья летят!)

Макс не нарушает обычаи. В чате принято самим желать друг другу доброго утра. За полтора года так произошло 432 раза. Поэтому бот желает доброго утра первым сам, но не всегда.

Его поведение во многом обусловлено теорией изложенной в работах по психологии. Использовались следующие материалы:

  • Джон Готтман, «попытка контакта».

  • В этой работе указывается, что у пар, проживших вместе шесть лет, отклик на попытки общения был в 86% случаев, у разошедшихся в 33%.

В нашем чате за полтора года 59 человек написали по одному разу, им никто не ответил, и они ушли. Поэтому бот подхватывает вопрос, который провисел без ответа от двадцати минут до часа.

  • Шелли Гейбл, отклик на хорошую новость (Gable et al., 2004, «What do you do when things go right?»).

  • Артур Арон, постепенное самораскрытие (Aron et al., 1997). Близость растёт, когда люди понемногу и по очереди рассказывают о себе. Вопросы дня у бота становятся более личными постепенно.

От чего я отказался при разработке в процессе анализа событий в чате: викторины на очки, рейтинги участников, цитата дня, гороскоп, призывы к молчунам и пересказ недели от бота. Хотя возможно в дальнейшем что‑то из этих идей и будет использовано.

Сначала разбор чата

Начал я с выгрузки чата за полтора года: 25 387 сообщений, 120 говоривших. Она дала параметры, которые ушли прямо в расписание и характер:

  • живее всего общение идет в 22–23 часа, второй всплеск в обед, ночью тишина;

  • «доброе утро» говорят в 9–10 часов, а не на рассвете;

  • половина сообщений короче 34 знаков, значит, бот тоже должен писать коротко;

  • 43% сообщений идут в диалоге, то есть это разговор, а не доска объявлений;

  • главные темы: встречи и выезды (697 упоминаний) и дни рождения (463).

Как устроен бот

Как устроен бот: один процесс на сервере, панель и Langfuse дома, связь только туннелями от домашнего ноутбукаМного задач на одном маааленьком сервере

В качестве сервера выступает маленькая VPS машина с 961 МБ памяти. Помимо бота там работают VPN, Amnezia в Docker, шлюз к Claude и ещё несколько служб. Бот держится в 38 МБ, а потолок службы systemd → MemoryMax 256 МБ. Postgres и отдельный шлюз к моделям я поднимать не стал, решил что для сотни участников и однопользовательской программы это лишнее.
Код правится только на ноутбуке и выкладывается скриптом install.sh

Бот сам спрашивает Telegram о новых сообщениях (long polling) и не ждёт, что Telegram позвонит ему по webhook. Не нужны ни постоянный адрес, ни открытый порт, ни сертификат: 24 сентября бот переехал с одного сервера на другой без настройки сети. Накопленное за время простоя при запуске пропускается, иначе бот ответил бы на вчерашнее. Номер каждого обработанного сообщения записывается в базу, иначе повтор от Telegram дал бы два одинаковых ответа.

Искусство требует жертв. Пока бот ждёт ответа рисующей модели, чат он не читает. 11 октября Alice не ответила на запрос рисунка, и бот две минуты молчал для всех. На следующий день так же повис GigaChat. Теперь у каждого художника свой таймаут соответствующий его максимальному времени ответа на запрос: Alice 20 секунд, GigaChat 45, последним идет FLUX.

Переходник к моделям вместо библиотек

brain.py вызывает все модели обычным HTTP‑запросом: на сервере мало памяти, и SDK шести поставщиков туда не поместились бы. Основная модель отказала, пробуем следующую. Модель, которая упёрлась в предел запросов, несколько минут отдыхает. Какая модель основная, записано одной строкой в настройках базы и меняется без перезапуска.

Кроме разговорной модели у бота есть служебная, сейчас это DeepSeek Pro. Людям она не пишет. Она оценивает, стоит ли боту вступать в разговор, разбирает распоряжения хозяев, решает, показать найденное фото или нарисовать, сводит найденные темы. Зрение (разбор картинок) работает на DeepSeek Flash.

Основная модель менялась пять раз: GigaChat, потом Qwen, Groq, DeepSeek, Alice AI LLM и, наконец, Gemini 3.5 Flash. У каждой нашлись свои сюрпризы.

  • GigaChat не держит характер: на «тёплом», «сухом» и «спокойном» он отвечал дословно одно и то же. Ещё он объявил 31 августа первым днём осени и здоровался вечером по‑утреннему. Из разговора его убрали, рисовать оставили: это входит в бесплатный предел и надписи на рисунках по‑русски он пишет верно (в отличие от остальных).

  • Groq сначала отвечал ошибкой 403. Дело оказалось не в адресе, а в подписи запроса: Python представляется как Python‑urllib, и защита Groq такие отклоняет. Подсказкой стало то, что тот же ключ работал из PowerShell. Теперь у всех запросов свой User‑Agent.

  • Qwen однажды выдал «Привет, 第七!». Теперь чужая письменность в ответе бракуется.

  • Бесплатный Groq не принимает правила бота целиком: они около 8 тысяч токенов, а предел 7–8 тысяч в минуту, и он отвечал отказом 413.

  • DeepSeek Pro не видит картинок. На битом файле он выдумал застолье.

  • Учёт денег тоже пришлось проверять: расход на DeepSeek сначала был завышен в одиннадцать раз, потому что не учитывался кеш запросов.

Мониторинг вместо догадок

Карточки вызовов уходят в Langfuse. Он работает у меня на ноутбуке в Docker, и у бота там отдельный проект. В карточке видно всё: что бот отправил модели, что она ответила, сколько ждали, сколько токенов ушло и во что это обошлось.

Карточка одного вызова в Langfuse: вечернее пожелание бота 1 ноября. Модель, токены, конец инструкции, ответ и цена

Ноутбук бывает выключен подолгу, поэтому бот к Langfuse напрямую не привязан. Карточку вызова он кладёт в очередь в своей базе и раз в несколько минут пробует её отдать. Дорогу открывает сам ноутбук: задание Планировщика поднимает обратный SSH‑туннель, и порт 3000 ноутбука появляется на сервере как 127.0.0.1:3010. Сервер наружу ничего не открывает и не знает, где стоит ноутбук. Очередь хранится неделю или пять тысяч записей, смотря что наступит раньше: в ней лежит настоящая переписка, и держать её дольше незачем.

Была идея пустить бота к моделям через домашний шлюз LiteLLM, который сам пишет всё в Langfuse. Отказался: шлюз живёт на том же ноутбуке, так что бот молчал бы вместе с ним.

Панель и песочница

Ботом я управляю из панели на ноутбуке. Она открывается в браузере на localhost:8700 и слушает только 127.0.0.1, поэтому ей не нужны ни вход, ни пароль. С сервером панель говорит через мой ssh‑доступ: вызывает там remote.py и разбирает ответ в JSON. Сама панель написана на http.server из стандартной библиотеки Python, без фреймворков.

На панели есть всё: написать в чат от имени бота, велеть ему замолчать на час или до вечера, поменять время приветствия, задать суточный предел реплик, перезапустить службу. Кнопки «Применить» нет намеренно: правка сохраняется сразу, чтобы нельзя было что‑то напридумывать и забыть. Аварийный выключатель продублирован командами /выключить и /включить в личке с ботом.

Пульт панели

У бота четыре характера (тёплый, сухой, весёлый и спокойный). Общая часть инструкции с запретами одна на всех и в панели не правится, меняется только интонация.

Четыре манеры речи в панели, сейчас выбрана «Весёлый»

Один раз я запустил в чат Opus от Клода c характером «Сухой». Получилось забавно, но похоже на смесь дореволюционной гимназии для девочек и тюрьмы строго режима.

Проверяю сочетание модели и характера набором из 35 реплик, часть там из выгрузки чата без имён, самые сложные, граничные случаи написаны руками: ссоры, провокации, вопросы о чужой личной жизни. На таком прогоне Qwen ответила на вопрос о чужой личной жизни «За чужие тайны не отвечаю, спросите сами у неё» и на месяц стала основной моделью.

Самая полезная часть панели появилась 1 октября. Это песочница диалога: отдельная беседа с ботом на копии рабочей базы. Сообщения проходят через тот же bot.handle_message, что и в живом чате, только отправка в Telegram перехвачена. Писать можно от имени участника из снимка, с его карточкой и правами, или от имени новичка. Получилось хорошо. При проверке бот в песочнице переспрашивал, в снимке чата был его живой тёзка, и правило о тёзке работало как в реальности.

Песочница: реплика нового участника и ответ бота на Alice AI LLM, в Telegram ничего не уходит

В песочнице на выбор 21 модель подключенная ключами напрямую и ещё 48 из каталога OpenRouter. Модели OpenAI ограничены бесплатной суточной нормой, платные модели ограничены долларом в сутки. Для примера — при проверке ответ Claude Sonnet 5.5 в песочнице обошёлся в 2,4 цента.

Данные: только выводы уходят на сервер

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

Только на ноутбуке

На сервере

выгрузка чата за полтора года

переписка основной ленты за 60 дней, стирается сама

карточки участников с примерами и пояснениями

короткая карточка: как обращаться, интересы, день рождения

таблица «отпечаток → Никнейм»

отпечатки участников

отчёты и разборы

расписание, тексты приветствий, журнал сказанного ботом

Сам чат разделен на несколько тем, такие как «Анонсы мероприятий», «Интересное» и так далее. Максик имеет право говорить только в теме «Чат». Сообщения из остальных тем форума читаются, но не хранятся: раз в шесть часов из них делается выжимка событий вроде «в субботу йога», а сами сообщения стираются не позже чем через сутки. Тема, где люди рассказывают о себе, не идёт даже в выжимку.

Память о людях устроена как зацепки, участник написал, что в субботу едет к внукам, а в понедельник его спросили, как съездил. Бот выписывает из обычных реплик устойчивые факты об авторе своими словами, без цитат, до десяти в сутки. Здоровье, деньги и отношения он не запоминает никогда, и держит этот список код, а не просьба к модели.

Участники записаны отпечатками. Карточка связана с отпечатком номера Telegram, посчитанным с секретным ключом (HMAC‑SHA256), который лежит отдельно от базы. Простого хеша мало: номеров Telegram около десяти миллиардов, и перебор занял бы минуты. 21 сентября номер всё же пришлось положить на сервер рядом с отпечатком: бот рассылает оповещения о предстоящих событиях и чтобы отметить человека в оповещении о встрече скрытым упоминанием, Telegram нужен его номер.

Слышит, видит, рисует, ищет

Голос. В чате, где большинству за сорок, много голосовых и видеокружков. С 30 сентября бот их понимает: файл уходит в Whisper на Groq, расшифровка встаёт в разговор обычной репликой с пометкой, что сказано голосом. Сам файл нигде не сохраняется.

У Whisper есть известная слабость: на кружке без речи он не молчит, а сочиняет текст. Бот получал «реплики» вроде «Субтитры сделал DimaTorzok» и «Продолжение следует…», потому что Whisper учили на видео с субтитрами, где в тишине в конце стоит подпись автора субтитров. Таких выдумок набралось 8 из 25 расшифровок. Теперь Whisper вместе с текстом сообщает, насколько он уверен в каждом куске. Если он думает, что речи там, скорее всего, нет, и сам сомневается в расшифровке, бот этот кусок выбрасывает.

Однажды вслух попросили нарисовать рыбу мечты. Бот нарисовал за 3,3 секунды, и на рисунке оказалась мужская рука. Голосом же спросили, зачем там эта рука, некрасивая и волосатая. Бот ответил: «Ишь, ценитель какой, изящную ручку ему подавай) У меня‑то самого ни ручек, ни ножек, так что с кого срисовал, с того и срисовал. Будем считать, что это рука сурового сахалинского рыбака».

Рисунки с надписями по‑русски. Корректно делают только российские модели. При тестировании модели получили одно задание, дом на берегу реки с надписью «Дом моей мечты»:

Модель

Время

Надпись по‑русски

Alice AI ART

3–5 с

верная

GigaChat

20–40 с

верная, иногда перефразирует

FLUX

~3 с

красиво, но вместо кириллицы абракадабра

Pollinations

запрос не понял

Alice пишет «Дом моей мечты» по‑русски, FLUX выдаёт «Cofem moeey deasyy»

Рисует Alice, далее, при сбое GigaChat, последним FLUX. Запасной художник нужен: 30 октября открытку ко дню рождения нарисовал именно FLUX, потому что Alice и GigaChat вовремя не ответили.

Иногда участники просят сделать портрет по своему фото. Бесплатный FLUX.2 уловил общие приметы (седину, очки, возраст), но лица не держал. Из платных через OpenRouter Gemini 3.1 Flash Image справилась за 9,5 секунды, Flash‑Lite Image за 5,9, а GPT-5 Image Mini думала 42 секунды и не попала.

Откуда взялись портреты: первая настоящая просьба пришла из чата. Участница прислала фото и в подписи попросила нарисовать её верхом на лошади в степи на фоне снежных гор. Бот подписи не читал и решил, что его не звали. На второе фото он ответил «задачу понял, сделаем…» и ничего не нарисовал. Чтение подписей исправили, портрет нарисовали за 11 секунд и $0,068. Вышел он заметно старше оригинала. Одна строка в запросе («не старь: без морщин и седины, возраст как на фото или чуть моложе, лицо выигрышно, как на хорошем портрете»), и портрет перерисовали.

Произвольная иллюстрация, подобная тем, что создают модели для рисования

Перед рисованием модель зрения проверяет фото: на нём один или два человека, у одного пол совпадает с автором просьбы, просьба без наготы, насмешек и насилия.

Поиск. Раньше при встрече с незнакомым словом бот гадал или честно признавался, что искать не умеет. Теперь поиск есть, но решение о запросе принимает не модель, а код. Программа срабатывает в трёх случаях: на команды «найди» и «поищи», на вопросы «что такое» и «кто такой», а также на незнакомые слова латиницей. В поисковик уходит только само слово или короткое название — ни текст сообщения, ни имена собеседников, ни история чата туда не попадают. Запросы идут через мой поисковый сервер на SearXNG на домашнем ноутбуке по тому же обратному туннелю, через который работает Langfuse. Программа отбирает из выдачи до трёх страниц, где точно встречается искомое слово, и передаёт их модели как справку; если ноутбук выключен, бот просто отвечает сам. При проверке в первый же день среди результатов поиска по «Плитвицкие озёра» оказался порносайт. В чат он не попал, но поиск я сразу перевел в строгий безопасный режим.

На просьбу «покажи» бот сам выбирает, прислать реальный снимок из русской Википедии или сгенерировать картинку (во втором случае он прямо предупреждает, что это рисунок).

Портрет можно попросить и для пары человек, причём для парных фото в промпте жёстко задано сохранить узнаваемость обоих и поставить их рядом. Ограничение по частоте — до трёх портретов в сутки на одного участника и до десяти на весь чат.

День, когда чат обсуждал бота

На второй неделе бот разговорился: 47 реплик за день, на следующий 61. 17 сентября чат около получаса обсуждал самого бота: не стали ли беседы идти между ботом и участниками вместо разговоров людей, не слишком ли он назойлив. Владелица ясно высказала своё мнение, и для чата последствий не было.

Для бота были. Всё это время он встревал: на похвалу отвечал «Приятно слышать», на реплику о том, что он помогает, отвечал «На месте». А человеку, который ни о чём таком не просил, выдал «Понял вас. Буду тише». Ровно посреди спора о себе.

17 сентября: реплики бота посреди спора о нём. Время и текст из журнала бота

Вывод получился неочевидным: разговор людей о боте отличается от разговора с ботом. Любой отклик бота в такой момент звучит как оправдание или самолюбование. Признак сделал нарочно простым: слово о боте в третьем лице («бот», «максимка», «нейросеть», «назойливый») и ни одного «ты». После такой реплики бот полчаса не отзывается на имя без «ты» и ничего не затевает.

Оправдания вырезаются кодом. Модели велено не оправдываться, но она всё равно пишет «буду тише», «исправлюсь», «не буду мешать». Пока бота обсуждают, такой ответ в чат не уходит:

ОПРАВДАНИЕ = re.compile( r"будуs+(?:тише|потише|скромнее|реже|молчать|помалкивать)|понялs+вас" r"|исправлюсь|неs+будуs+(?:мешать|лезть|встревать)", re.I)

Двоим участникам, которые прямо сказали, что бот им мешает, он больше не отвечает и сам к ним не обращается. С 21 сентября бот говорит реже: повисшую реплику подхватывает раз в 8 часов вместо 2, затевает игру после 3 часов тишины вместо 2, всего пишет не больше 25 реплик в сутки вместо 60. На прямые обращения отвечает как раньше.

Правило «когда обсуждают» пришлось поправить ещё два раза.

Сначала оно было слишком строгим: пока бота обсуждают, отвечать одной короткой фразой или молчать. 30 сентября весь чат гадал, на какой модели работает бот, и спрашивал его самого. Бот отвечал всем односложно, будто обиделся. Теперь, если вопрос задан лично ему, он отвечает нормально. Только не оправдывается и не обещает вести себя тише.

Вторая правка понадобилась 23 октября. Кто‑то написал «Пусть Максимка делает опрос». Бот решил, что о нём говорят в третьем лице, и замолчал на полчаса. Следующий прямой вопрос к нему, про день жестянщика, остался без ответа. Теперь, если реплика начинается с его имени и кончается вопросом, бот понимает, что зовут именно его.

«Ко мне ли обращаются»: где живут самые неочевидные ошибки

Ответить на сообщение, адресованное тебе, просто. Трудно понять, какое сообщение адресовано тебе. Каждое правило функции called() в talk.py выросло из конкретного промаха.

  • Живой тёзка. В чат пришёл новый участник по имени Максим. Его поприветствовали по имени, а ответил бот, и человеку пришлось объяснять, что обращались к нему. Теперь, если живой Максим недавно писал, бот на это имя не откликается.

  • Ласковые имена. Когда бота звали «Пирожочком», он не узнавал. А по всей переписке все 14 ласковых форм («Пирожочек», «Максик», «Максимка», «Максимушка» и другие) относились к нему. Теперь это воспринимается ботом как обращение.

  • «Ботик». Бота спросили, не скучно ли ему, назвав «ботиком», и вопрос остался без ответа. Добавили синонимом, и бот ответил задним числом: «Ни ручек, ни ножек, зато весь в делах) С вами не соскучишься».

  • Чужой ответ. Человек ответил цитатой на реплику бота, обращённую к другому, и бот принял одного участника за другого. Теперь модель получает прямую строку: кому было сообщение бота и кто на него ответил.

Отвечает бот каждому лично. Одно время обращения, пришедшие за короткую паузу, он собирал в одно сообщение для всех, фактически склеивал. Теперь каждый участник получает ответ цитатой на своё сообщение, не чаще 1 раза в 10 секунд.

Если бота не звали, решает balance.py: стоит ли вообще вступать (модель ставит оценку от 1 до 5, порог 3), не слишком ли бот разговорился с одним человеком, не исчерпан ли разговор. Повисшую реплику бот подхватывает, только если в ней есть вопрос или просьба к людям. На ответы людей на свой вопрос дня бот реагирует примерно через раз, по жребию. До 30 октября он комментировал каждый ответ, по три‑шесть комментариев подряд, и его мнение обесценивалось.

Чего нельзя, проверяй кодом

Главный технический урок записан в комментарии к коду игр: «Просьбу „составь четыре пары“ модель нарушит и не заметит: она не считает, она пишет… чего нельзя — проверяй кодом, чего хочешь — показывай примерами».

Каждый ответ модели до отправки проходит через brain.flaws(). Нашлась ошибка, ответ в чат не уходит: бот пробует ещё раз или молчит. Вот что пришлось ловить:

Дежурные обороты. «Чем могу помочь», «хорошего настроения», «пусть этот день будет…» в живом чате не пишет никто, и они сразу выдают машину. В инструкции они запрещены, но всё равно появляются, поэтому вырезаются списком регулярных выражений.

Слова‑заголовки. В игре «Одно или другое» бот должен был предложить четыре пары на выбор и начать с короткой приглашающей фразы. Модель выдала одну строку: «Лайфхак: пицца или суши?». Вместо приглашения она поставила громкое слово с двоеточием, как в рекламе. Пара вышла одна, и ту она взяла из примера в задании. Теперь ответы, которые начинаются с «Лайфхак:», «Итак,» или «Внимание:», программа отбраковывает.

Дежурные вопросы. 12 сентября вопросом кончались 57% ответов бота, и почти всегда одним из немногих: «как сам?», «давно в чате?», «ты откуда?», «чего пропал?». Человеку это читается как анкета, отвечать нечего, и разговор глохнет. Эти вопросы запрещены, а в инструкции семь способов ответить, из которых вопрос только один.

Отговорки. 14 сентября я сделал боту замечание прямо в чате, за солдафонские шуточки. Вместо «извини, перегнул» он отпирался трижды подряд: «это уже не ко мне», «я и не спорю», «шутки тут у каждого свои». Оплошность прощают, упрямство нет. Перевод стрелок теперь бракуется, а в инструкции три правила: на замечание отвечать «Извини, перегнул.» и точка; на подначку вроде «ты не умеешь» отвечать «Умею. Просто молчу больше, чем говорю»; на хамство промолчать или ответить «На грубость не отвечаю».

Время. Модели врут о времени года: объявляют 31 августа первым днём осени, пишут «Октябрь». Сначала месяцы и времена года просто запретили. Не помогло: в 10 утра бот желал «хорошего вечера», в пятницу писал про «вечер субботы». С 11 октября код дописывает в конец каждой инструкции строку с днём недели, числом, временем по Сахалину, частью суток и временем года. Пожелание не ко времени суток бракуется.

Своя жизнь. Бот написал, что ему «хочется уютно провести вечер дома», и его поймали на слове: дома у него нет. Потом появились «будильник на семь утра и список дел». Теперь проверка бракует выдуманный быт.

Пустые обещания. Бот дважды ответил участнице «Держи!» и не прислал никакой картинки. Обещание картинки без картинки теперь брак.

Совершенно неочевидные вещи

Права администратора нужны и тому, кто ничего не модерирует. Перед рассылкой о встрече бот спрашивает Telegram про каждого знакомого ему человека, в чате ли он. Про других участников Telegram надёжно отвечает только администраторам. Когда у бота сняли права, Telegram на каждый вопрос стал отвечать ошибкой. Бот принял её за «вышел из чата», вычеркнул 118 человек, и оповещение получили 16 вместо ста. Заметил я это по его же отчёту «позвал 16». Теперь без прав бот никого не вычёркивает и сразу пишет мне. Права вернули, оповещение получил 101 человек.

Тройное поздравление. 16 октября бот поздравил одну участницу трижды: подхват объявления, ответ на повисшую реплику и поздравление по расписанию работали каждый сам по себе. Теперь их связывает общая отметка «уже поздравлен сегодня».

Что бот инициирует сам

Утро на 46 языках. Одинаковое «доброе утро» приедается за неделю, поэтому каждое утро бот здоровается на новом языке: приветствие, как оно читается по‑русски, и нарисованный пейзаж этой страны. Приветствия берутся из выверенного списка, модель их не сочиняет: чужие языки она путает и коверкает, а ошибку в чате заметят. 23 октября языки кончились, счётчик ушёл в минус, и бот застрял. Теперь второй круг идёт по давности.

Утро 2 ноября, хорватский язык

Свежие темы для бесед. До 30 сентября бот знал около двадцати постоянных тем, и разговоры шли по кругу. Теперь раз в сутки утром он делает четыре запроса в поисковик Exa: события и афиша Сахалина, природа и животные, добрые научные новости, кино и книги. Служебная модель сводит найденное в 6–10 тем, у каждой суть одной строкой и вопрос‑крючок. Политику, войну, криминал, беды и деньги она отсекает.

Гарики Губермана. Иногда в тему бот может выдать подходящий гарик.

Распоряжения обычными словами прямо попадают в контекст модели.

«Пирожок, зовись теперь Пирожком Ивановичем», «будь повеселее», «помолчи час»: бот понимает такое сам, без панели. Сначала дешёвая проверка по словам, похоже ли это вообще на распоряжение. Только если похоже, служебная модель разбирает, что именно велели. Обычная болтовня не тратит ни времени, ни денег. Слушается бот только хозяев.

Оповещения о встречах. Бот отмечает людей скрытыми упоминаниями и уведомление приходит даже тем, у кого чат на беззвучном. Первое оповещение уходит только после моего подтверждения, потому что ошибку увидят сто человек. Дату и время встречи бот с 24 октября берёт из анонса сам, а напоминания за сутки и за час рассылает сам и только сообщает мне.

Как бот учится

Сначала обучение было устроено по правилам. Раз в неделю бот присылал мне таблицу своих реплик для оценки, лучшие становились образцами в инструкции с именами, заменёнными на «(имя)». По воскресеньям облачная задача Claude получала пакет переписки вокруг реплик бота с обезличенными именами и присылала разбор пяти самых сложных случаев.

На практике таблицы я с определенного времени открывать перестал. Напоминание «накопилось N реплик для оценки» росло: 143, 246, 381, 453. С 19 октября порядок изменился. Бот раз в неделю присылает одну строку «С последнего разбора N новых реплик». Далее разбор идёт в моей беседе с Claude: он берёт переписку прямо с сервера начиная с отметки о прошлом разборе, находит живые случаи и предлагает правки, я утверждаю. Почти все правки октября пришли так.

Отдельно пришлось сжать саму инструкцию: на восьмой день её сократили почти вдвое, с 9 105 до 5 157 знаков. Длинную инструкцию модель читает хуже и зачастую теряет контекст.

Деньги

На модели за всё время ушло $1,33. Почти всё это пробы портретов в начале октября. Разговор идёт на бесплатном уровне Gemini, и с 9 по 31 октября 399 реплик бота обошлись в полтора цента. Бюджет на всякий случай ограничен 500 ₽ в месяц.

Для сравнения я посчитал, сколько стоил бы тот же бот на флагманских моделях OpenAI (около 38 вызовов в день, по 10 тысяч токенов на входе, правила бота закешированы):

Модель

В месяц

Сейчас

не более $1

gpt-6.1-sol

около $15–30

gpt-6-astra, самая мощная

около $80–150

Это расчёт по ценам OpenAI, а не замер.

Ожил ли чат

До бота у меня есть выгрузка чата, после него переписка, которую хранит бот. Сообщения людей в основной ленте, без реплик бота:

Период

Сообщений в день

Говорящих участников в неделю

С января по август 2026

49,3

от 16 до 36

Последние 4 недели до бота (август)

17,8

16–24

После бота, 19.09–30.10

39,1

15–22

Последние 4 недели (октябрь)

38,7

17–22

Сообщений людей в день по периодам, без реплик бота

После августа чат стал вдвое живее. Говорящих в октябре чуть больше, чем в августе. Бот при этом пишет около 28% всех сообщений ленты, и часть сообщений людей адресована ему самому.

Доказать цифрами влияние бота в чате нельзя: за месяц меняется состав людей, за годы меняется сама среда. Но беседа в чате не бывает нейтральной. Хорошая интересна людям, плохая их возмущает, и то и другое оживляет чат.

Вывод

Технически все несложно. Модель ИИ в таком боте меняется одной строкой, но у каждой есть проблемы. Архитектурно устройство бота получилось простым: один процесс, один файл базы, очередь вместо прямой зависимости от домашнего ноутбука. Самое сложное оказалось наладить поведение бота и обезопасить и разграничить движение и состав информации. Когда промолчать, как не оправдываться, когда разговор идёт о тебе, а не с тобой, какие фразы вырезать кодом, потому что просить бесполезно: это отлаживается длительно, на живом чате и с честным разбором ошибок.

Источник: habr.com

0 0 голоса
Рейтинг новости
1
0
Подписаться
Уведомить о
0 комментариев