Что происходило до нас

Компания делает кровлю, фасады, заборы, отделку и продаёт материалы. Обращения приходят в сообщество ВКонтакте и в переписку на Авито. Всю первую линию вела одна сотрудница, отвечая от имени двух менеджеров.

График компании: пн-пт с 9 до 18 и суббота с 9 до 14. Вечернее обращение ждало утра, воскресное ждало понедельника. Средний срок ответа на Авито доходил до 13 часов, а человек с протекающей крышей в это время пишет дальше по списку компаний.

Квалификация делалась заново руками каждый раз: что за объект, сколько квадратов, какой район, какой материал. Заявки жили внутри переписки. В Битрикс24 они попадали только если менеджер не забыл их туда перенести.

Что сделали

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

  • Два канала на один движок: сообщения сообщества ВКонтакте и переписка Авито, до двух аккаунтов. Бот замолкает, как только менеджер вступает в диалог сам, хоть из рабочего окна, хоть из интерфейса площадки.
  • База знаний по направлениям: 13 карточек, прайс на 27 позиций с вилками, 11 стоп-тем. Всё это редактируется из рабочего окна.
  • Рабочее окно: обращения обоих каналов в одном списке, полная переписка, карточка объекта, лид с телефоном, перехват диалога, песочница для проверки бота на живых вопросах.
  • Лид уходит в Битрикс24 с поиском дубля по телефону, вводными по объекту, ссылкой на диалог и полным транскриптом в ленте. Запасной путь идёт через вебхук с подписью, очередь держит 8 повторов на срок от 10 секунд до 12 часов.
!
Шесть слов, которые отшивали лучших клиентов

Стоп-темы (вопросы, где бот обязан молча передать клиента человеку) искались простым вхождением подстроки, без границы слова. «Крыша течет, срочно нужен мастер» ловилось на «течет» и уезжало в гарантийный спор. «Сделайте смету на кровлю» ловилось на «смет», «дайте контакт менеджера» на «акт», «фасад торгового центра» на «торг», «подберите оптимальный материал» на «опт». «Длинный дом 12 метров» ловился на «инн» и превращался в запрос паспортных данных. Шаблонную отписку получали ровно те, кто пришёл с горящей проблемой. Нашли за день до запуска, прогнав десять диалогов реальных людей. Чинили в корне: детектор теперь считает границу слова сам, списки вычищены, на каждую мину поставлен приёмочный сценарий. Рабочее окно с тех пор не даёт завести слово-ловушку, которое срабатывает в обычной фразе.

Как это работает внутри

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

Модель одним вызовом возвращает структуру: текст ответа, извлечённые поля карточки, намерение клиента, нужен ли человек, задета ли стоп-тема. Поэтому извлечение данных и генерация ответа между собой не расходятся. Ответ уходит клиенту за 9-11 секунд, из них около секунды занимает сеть.

Перед отправкой ответ проходит валидатор из 29 правил. Он не даёт назвать сумму вне согласованных вилок, пообещать дату выезда, бригаду или срок работ, выдать себя за живого человека, оставить контакты в Авито (площадка это запрещает). Если проверка не пройдена, идёт один повторный запрос с указанием ошибки, затем безопасный шаблон и пометка менеджеру. Молчание в канале продаж хуже шаблона.

Где споткнулись

До первой строки кода проект прогнали три независимых аудитора: сверка с договором, техническая реализуемость, безопасность. Они нашли 92 замечания. Часть граблей это всё равно не отменило.

В JavaScript границы слова не знают кириллицы. Три валидатора из восьми молча не срабатывали: шаблон «гарантиру\w+» не ловит «гарантирую». Обнаружилось, когда бот пообещал записать телефон, которого ему никто не давал. Теперь во всех русских регулярках стоят явные проверки соседних символов.

Маскирование персональных данных знало только именительный падеж, и «дом на улице Ленина 15» уезжало в модель адресом целиком. Добавили падежи и сокращения. Слово «площадь» из шаблона адресов пришлось убрать: у кровельщиков это рабочий термин, и маскирование съедало смысл сообщения.

У ВКонтакте текст в событии нового сообщения и в событии ответа менеджера лежит по разным путям. Без разбора этой мелочи бот не видел, что менеджер уже ответил, и писал поверх человека. Там же выяснилось, что фото не скачиваются: домен, с которого ВК их раздаёт, отсутствовал в белом списке.

Ночные копии базы делались и были целыми, при этом их не существовало. Проверка смотрела три последние строки дампа, а свежий Postgres дописывает служебную строку после «dump complete». Хороший дамп браковался и удалялся, алерт поднимался каждую ночь и никем не читался. Тем же аудитом нашли три рычага-пустышки: предел расхода на модель, автоочистка и предупреждения были нарисованы в интерфейсе и не реализованы в коде.

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

Данные остались в России, контур у заказчика

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

OpenAI не обслуживает российские адреса, а 152-ФЗ требует держать персональные данные россиян в базе на территории России. Схема вышла из двух серверов. База, переписка и телефоны в России. Выход к модели идёт через маленькую машину в Казахстане, которая работает переливкой TCP и ничего не расшифровывает: шифрование сквозное. Полдня потеряли на мелочи: порт, указанный прямо в адресе модели, попадает в заголовок Host, OpenAI такой Host не принимает, и Cloudflare отдаёт 522 через сорок секунд.

Контур целиком у заказчика: его серверы, его ключи, его GitHub, его реестр образов. Контейнеры работают без root и в режиме read-only, наружу открыты только 22, 80 и 443, база не публикуется. Дампы шифруются, восстановление проверяется. Переписка хранится 90 дней, фото объектов 60, сроки настраивает заказчик.

Что получилось

Приёмочный прогон: 35 сценариев и 79 обязательных проверок из 79. Плюс пять диалогов на манеру речи, десять живых диалогов и девять стресс-случаев. За день сплошных проверок 121 успешное обращение к модели из 123, два таймаута закрыты безопасным шаблоном и пометкой менеджеру.

Живой поток пошёл в два шага: ВКонтакте 26.08.2026, Авито днём позже. За первые дни 25 обращений (14 ВКонтакте, 11 Авито), 56 ответов бота, 11 заявок.

Расход на модель за весь август составил 140 ₽. Один ответ клиенту стоит около 20 копеек, при 15 обращениях в день это 550-600 ₽ в месяц. На всякий случай стоят предохранители: 300 ₽ в сутки и 3 000 ₽ в месяц. На пределе бот молчит и передаёт диалог человеку.

Сроки видны по репозиторию: первый коммит 06.08.2026, итоговая приёмка 28.08.2026, 171 коммит за 23 календарных дня и 28 миграций базы. По договору на работы отводилось до шести недель с момента получения доступов. Живой поток пошёл примерно через три с половиной недели после подписания.

Что сказал заказчик

Проект вёл Евгений Харьковский, директор по развитию «Дома Фасадов». Он оценивал работу по деньгам бизнеса, а не по коду.

«Бот работает и на Авито, и на ВК, отвечает сразу. Большую базу знаний построили, всё синхронизировано с нашей CRM, одновременно перешли на Битрикс24 — и этот вопрос AVAT тоже решил. Конверсия во ВКонтакте была высокая, 51 процент, а стала 59, и я думаю, она ещё подрастёт. Мне очень понравился подход: мы оплачивали работу спринтами, за каждый этап платили постфактум, сначала видели результат и только потом платили. Браво, это лучший подход, который может быть».

Евгений Харьковский, директор по развитию, «Дом Фасадов»

Бизнес-итог словами заказчика: срок ответа на Авито упал с 13 часов до секунд, конверсия во ВКонтакте выросла с 51 до 59 процентов, а первую линию теперь можно нагружать сильнее — заявки обрабатываются сами, круглосуточно.

Частые вопросы

Можно ли подключить бота одновременно к Авито и ВКонтакте?

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

Сколько стоит один ответ ИИ-бота клиенту?

Около 20 копеек. Расход на модель за весь август составил 140 ₽, при 15 обращениях в день это 550-600 ₽ в месяц. На случай всплеска стоят предохранители: 300 ₽ в сутки и 3 000 ₽ в месяц. На пределе бот молчит и передаёт диалог человеку.

Как заявка из переписки попадает в Битрикс24?

Лид уходит в Битрикс24 сам, с поиском дубля по телефону. В карточку идут вводные по объекту, ссылка на диалог и полный транскрипт разговора в ленте. Запасной путь работает через вебхук с подписью, очередь держит 8 повторов на срок от 10 секунд до 12 часов.

Законно ли пропускать переписку клиентов через нейросеть по 152-ФЗ?

Персональные данные вырезаются из текста до обращения к модели: телефон, имя, почта, улица с номером дома, СНТ, кадастровый номер. База, переписка и телефоны лежат на сервере в России. Выход к модели идёт через маленькую машину в Казахстане, которая работает переливкой TCP и ничего не расшифровывает.

Клиент поймёт, что ему отвечает бот?

Ответ приходит за 9-11 секунд, скорость печати регулируется тремя положениями, всё время паузы клиент видит индикатор «печатает». Мгновенный длинный ответ выдаёт робота сильнее любой формулировки, поэтому паузу сделали заметной. Перед отправкой текст проходит валидатор из 29 правил: он не даёт назвать сумму вне согласованных вилок, пообещать дату выезда и выдать себя за живого человека.