Бизнес-логика
Как ассистент линии поддержки магазина вырос из чата на сайте: черновики для людей, ответы волнами с замером, вопросы водителю и изменения заказа.
TL;DR
AI-ассистент линии поддержки — это бот, который отвечает клиентам интернет-магазина с курьерской доставкой в WhatsApp и в чате на сайте. Он видит заказы клиента в платформе магазина, отвечает фактами из неё, передаёт вопросы водителю и диспетчерам, а с 30 сентября 2026 года сам меняет заказ после «да» клиента. Я начал проект 29 января 2026 года с чата на сайте. С 31 июля бот готовил черновики для людей на линии, а 21 сентября первый ответ ушёл клиенту без человека. С 5 по 19 октября бот ответил первым в 77% разговоров, медиана ожидания 29 секунд. Без ответа остались 3% разговоров. Летом, когда отвечали только люди, таких было 16–18%.
С чего началось
Магазин принимает вопросы клиентов в двух местах: на обычном номере WhatsApp, с которого отвечают люди из команды, и в чате на сайте. Вопросы почти всегда одни и те же: где заказ, когда приедет, как оплатить, есть ли в наличии. Они приходят в любое время суток, а люди на линии отвечают с телефона между другими делами. Летом 2026 года медиана первого ответа человека была от 2,7 до 4,4 минуты, а 16–18% разговоров оставались без ответа вовсе.
Первым появился чат на сайте. Первый коммит я сделал 29 января 2026 года, первое сообщение клиента в чате пришло 1 февраля. Чат отвечал моделью по базе вопросов и ответов магазина и звал оператора в Telegram, если не справлялся. За первые три дня модель сменилась дважды: xAI Grok, затем GPT-4o, затем GPT-5.2, на которой проект работает до сих пор. С марта по июнь через тот же бэкенд работал продающий бот в WhatsApp на отдельных номерах. 4 июня я выключил его рубильником, и с тех пор он молчит.
Линия поддержки: сначала только черновики
Основной канал магазина — номер линии в WhatsApp. 31 июля бот подключился к нему через шлюз мессенджера. С этого дня на каждое сообщение клиента бот писал черновик ответа в ленту операторов в Telegram, а отправить черновик мог только человек, одной кнопкой. Сам бот клиенту не писал ничего: на стыке со шлюзом исхода «отправить» в первой версии не было вовсе.
Перед подключением я собрал базу знаний из примерно 2 200 вопросов, на которые линия отвечала раньше, и откалибровал пороги на проверочной выборке. Цель была такая: ни одного вредного ответа и не больше 5% неверных. На 61 вопросе получилось 0 вредных и 3 неверных (4,9%). С 4 августа бот видит заказы клиента в платформе магазина. Платформа описана в отдельном кейсе: Last-mile Delivery Platform.
Владелец и диспетчер проверяют правила
12 августа скрипт собрал из подсказки модели документ «как бот отвечает в каждой ситуации»: 85 пунктов, у каждого объяснение простыми словами. Владелец магазина и диспетчер прочитали его на отдельных страницах и поставили вердикт каждому пункту, несколько пунктов прочитал и я. Всего вердиктов 180: 165 «верно», 8 «не знаю», 4 «править», 3 «так нельзя». Пять настоящих ошибок я исправил в боте. 14 августа страницы вычитки выключены и сохранены архивом. Сам документ живёт дальше: сейчас в нём 134 карточки, и тест не даёт поменять правило в подсказке без карточки.
Как я работаю
Я единственный разработчик проекта. Код пишет Claude Code: правки, тесты, разбор каждой смены линии по журналу. Планы крупных изменений, например памяти о клиенте, до кода читала отдельная сессия Claude и находила в них дефекты. Я решаю, какой класс ответов открыть, читаю разбор смены, пишу боту с тестового номера и разрешаю каждый выкат. Правило «спрашивать перед выкатом» появилось 21 сентября, после того как агент сам отправил служебный скрипт в основную ветку и прод перезапустился.
За 263 дня с первого коммита набралось 426 коммитов, работа шла в 86 из этих дней. Больше половины, 220 из 426, пришлись на сентябрь и октябрь, когда бот начал отвечать сам.
Кто решает, что бот скажет клиенту?
Решаю я. Агент предлагает правку, проверяет её тестами и прогоном на живой модели, но включить новый класс ответов, поменять правило и выкатить изменение можно только моим словом. Каждое правило в подсказке объяснено карточкой, которую могут прочитать люди магазина. Разбор каждой смены я читаю сам и только потом решаю, что чинить.
Линия по месяцам
Цифры сняты 19 октября 2026 года из базы шлюза мессенджера и журнала бота. Разговор — сообщения одного чата с паузами меньше 45 минут: по этой же границе бот делит разговоры в памяти о клиенте. Мой тестовый чат и пробные сообщения исключены везде.
| Месяц 2026 | Разговоров | Сообщений клиентов | Ответил только бот | Бот и человек | Только человек | Без ответа | Первый ответ человека, медиана |
|---|---|---|---|---|---|---|---|
| Февраль¹ | 37 | 252 | 0 | 0 | 26 | 11 | 1,7 мин |
| Март | 270 | 1 515 | 0 | 0 | 230 | 40 | 1,8 мин |
| Апрель | 243 | 1 648 | 0 | 0 | 214 | 29 | 1,8 мин |
| Май | 128 | 641 | 0 | 0 | 116 | 12 | 2,8 мин |
| Июнь | 985 | 5 100 | 0 | 0 | 829 | 156 | 2,7 мин |
| Июль | 1 173 | 5 641 | 0 | 0 | 960 | 213 | 3,5 мин |
| Август | 1 143 | 4 667 | 0 | 0 | 932 | 211 | 4,4 мин |
| Сентябрь | 1 048 | 4 301 | 19 | 78 | 707 | 244 | 4,6 мин |
| Октябрь, 1–19² | 307 | 1 788 | 117 | 122 | 55 | 13 | 0,5 мин |
¹ Шлюз записывает линию с 23 февраля. ² Неполный месяц.
Ответом бота здесь считается и ответ водителя или диспетчера, который бот привёз клиенту. Черновик, отправленный человеком кнопкой, считается ответом человека.
Когда бот отвечает первым, медиана ожидания 28–29 секунд, а у девяти разговоров из десяти не больше 46 секунд. Из них 20 секунд шлюз ждёт, не допишет ли клиент ещё что-нибудь, остальное — время модели и проверок. В сентябре бот отправил клиентам сам 153 ответа, за 19 дней октября — 672.
С конца сентября разговоров на линии стало меньше: около 80 разных чатов в неделю против 120–180 летом. В те же недели платформа начала ставить в каждое уведомление о заказе ссылку на страницу заказа с чатом водителя, а бот начал передавать вопросы водителю. Сколько дала каждая из этих перемен, по своим данным я разделить не могу.
Как бот отвечает сейчас
Шаг 1. Сообщение приходит на номер линии
Шлюз мессенджера получает сообщение и 20 секунд ждёт, не допишет ли клиент ещё (но не дольше минуты от первой реплики). Потом он отправляет пачку боту подписанным запросом вместе с последними десятью репликами чата. Голосовое сообщение шлюз сначала расшифровывает, фотографию передаёт как есть.
Шаг 2. Бот узнаёт клиента
По номеру телефона бот спрашивает платформу, кто это и какие у него заказы. Если номер платформе не знаком, бот просит номер заказа и дальше работает с ним.
Шаг 3. Есть ли рядом человек
Если кто-то из команды писал в этом чате в последние 15 минут, бот не отвечает: разговор ведёт человек. Если человек писал от 15 до 60 минут назад, бот отвечает только в узких классах: статус заказа, оплата, правила магазина, изменение заказа, которое клиент уже подтвердил. Ответ, отложенный из-за человека, ждёт его ещё 15 минут и уходит один раз.
Шаг 4. Предварительный отбор
Короткие «ок» и «спасибо», реакции и повторы бот отсекает до модели: на явную благодарность он отвечает одной заготовленной строкой, на остальное молчит. Жалобу, юридический вопрос, деловое предложение и ещё пару классов бот сразу отдаёт людям. На просьбу позвать человека он с 6 октября отвечает заготовленным текстом: что он может сделать прямо здесь, и телефон офиса, если клиент всё же хочет позвонить.
Шаг 5. Тема и живые данные
Классификатор сравнивает сообщение с базой знаний (3 006 примеров вопросов в 25 темах), а модель называет тему сама. Затем бот собирает живые данные: статус заказа, время прибытия, ссылку на страницу заказа, открыт ли магазин, доставляют ли по адресу, что есть на полке. Эти значения он берёт из платформы как есть и ничего не досчитывает.
Шаг 6. Память о клиенте
Если клиент писал раньше, бот добавляет его карточку: короткую сводку, до 12 фактов о том, как с ним лучше говорить и как передавать заказ, и сводки трёх последних разговоров.
Шаг 7. Модель пишет ответ
Модель получает правила линии, живые данные, карточку и историю чата и отвечает в строгой схеме: текст ответа, тема, нужен ли человек, нужен ли уточняющий вопрос, насколько она уверена. Если нужно, она тут же предлагает передать вопрос водителю или изменить заказ.
Шаг 8. Сторож
Каждый ответ модели проверяет сторож: 22 вида ошибок. Среди них обещанное время, которого нет в данных заказа, чужая ссылка, выдуманный телефон, обещание перезвонить, «я настоящий человек» и предложение отменить заказ, о котором клиент не просил. Найдена ошибка — модель один раз переписывает ответ с указанием, что именно не так. Не помогло — уходит заготовленная строка, которая не может оказаться неправдой, или разговор достаётся человеку.
Шаг 9. Исход
Что видит клиент, зависит от исхода.
| Исход | Что видит клиент | Доля решений бота, 5–19 октября |
|---|---|---|
| Ответить | ответ в WhatsApp с номера линии, в том числе уточняющий вопрос или просьбу прислать номер заказа | 55% |
| Промолчать | ничего: это «ок», эмодзи, повтор или вопрос, на который уже ответил человек | 26% |
| Черновик людям | ничего от бота; ответ готов в ленте операторов | 11% |
| Отдать человеку | строку о том, что вопрос передан водителю или диспетчерам, или ничего, если вопрос ждёт человека из команды | 9% |
Передача вопроса водителю или диспетчерам в журнале записана как «отдать человеку»: человек здесь — водитель или диспетчер. Клиент получает строку о том, что вопрос передан, а потом ответ водителя в том же чате.
Шаг 10. Последняя проверка перед отправкой
Перед тем как отправить ответ, шлюз ещё раз смотрит, не написал ли в чат человек, пока бот думал. Если написал, ответ бота не уходит.
Человек важнее бота
Люди отвечают клиентам с телефона линии, и бот видит их сообщения: они приходят в тот же журнал, что и его собственные. Человеком бот считает любую реплику нашей стороны, которой нет в его журнале отправок. По ней работают окна в 15 и 60 минут из шага 3.
Каждый ответ человека бот получает как обратную связь. Из таких ответов я собрал примеры того, как линия отвечала на типовые вопросы: 42 строки по 10 темам. В подсказку они пока не идут. Я рассчитывал, что примеры сделают модель увереннее и откроют больше ответов без человека. Замер 28 сентября это опроверг: из 180 ответов за две недели, которые задел бы блок, неуверенных не было ни одного. Блок поменял бы только манеру примерно 13 ответов в сутки, и я его не включил.
Если за пять минут на линию приходит 25 сообщений и больше или пишут 8 разных людей и больше, бот не отправляет ничего сам. Так выглядит пачка старых сообщений, которая иногда приходит разом, со вчерашними вопросами внутри, и разбираться с ней должен человек.
Что бот делает с заказом
С 4 августа бот видит заказы клиента: статус, время прибытия, состав, ссылку на страницу заказа. Ссылку он берёт только из данных заказа, своих не строит.
Вопрос водителю или диспетчерам
До 28 сентября клиент, которому нужен был водитель, писал на линию, а водитель работает в приложении платформы. Отдельный замер платформы 14 августа показал разрыв: из 324 сообщений водителей клиентам 81% остались неоткрытыми, а сами клиенты написали водителю в 6,6% заказов. С 28 сентября бот передаёт вопрос клиента в чат водителя, если заказ уже у водителя, или диспетчерам магазина. Ответ водителя бот возвращает клиенту в WhatsApp.
С 28 сентября по 19 октября бот передал 82 вопроса клиентов, ещё 30 были моими проверочными. 35 раз он вопрос придержал, потому что в чате был человек. Узким местом оказался ответ людей. По данным платформы, в течение суток письменно ответили 62% водителей (медиана 5,5 минуты) и 42% диспетчеров (медиана 2,4 минуты), мои проверочные вопросы в этих долях есть. У диспетчеров значок «есть вопрос» гас, как только кто-то открывал переписку, и больше никто не напоминал. 19 октября платформа это поменяла: вопрос висит, пока на него не ответят или не отметят его обработанным. Замер «после» будет в ноябре.
Изменения заказа после «да»
С 30 сентября бот может сам добавить товар, убрать товар или отменить заказ, а с 1 октября — перенести время доставки и поменять адрес. Сначала он спрашивает клиента, что именно меняет, и делает изменение только после «да», причём это «да» должно отвечать на последний вопрос бота. Для отмены «да» рядом с «нет» или с собственными словами клиента не засчитывается, и бот спрашивает снова. Изменение идёт в платформу тем же путём, что кнопки диспетчера.
С 30 сентября по 19 октября изменений было 7: 3 отмены, 3 переноса времени, 1 добавление товара. Четыре из них — мои проверки, три — настоящих клиентов. Отказов платформы не было ни одного. Это пока маленькая выборка, и я так её и читаю.
Чат на сайте
Чат на сайте работает с февраля: 58–92 разговора в месяц, медиана ответа около 3 секунд. Если клиент вошёл в аккаунт, у чата и у линии в WhatsApp одна карточка памяти на клиента. Анонимных посетителей бот не запоминает.
До 15 октября чат жил отдельно от линии: часть ответов он искал в списке вопросов по совпадению слов. Перед переходом ИИ-агент оценил 210 ответов чата за 30 дней: верно 118, слабо 65, неверно 25, ещё 2 без оценки. Хуже всего работал поиск по совпадению слов: из его 37 ответов 10 неверных. 15 октября чат перешёл на знания линии. Теперь он отвечает моделью с теми же живыми данными магазина, читает заказы клиента, если тот вошёл в аккаунт, и проходит того же сторожа. За человеком чат отправляет в WhatsApp и не обещает, что кто-то подключится. Замера «после» пока нет: была только живая проверка, 8 вопросов по два раза.
Голос линии
3 октября у линии появился стандарт тона: тёплый и профессиональный, без длинных тире и разговорных словечек. До этого я учил модель писать, как пишет диспетчер, и замер показал, во что это обошлось: дефект стиля был в 58% ответов модели, длинные тире в 46%, разговорные словечки в 33%. Цель стандарта — меньше 5%. Соблюдение стандарта меряет прибор по журналу ответов, и та же функция проверки стоит в наборе тестов.
Что пошло не так и что я из этого вынес
Черновики, которые никто не отправлял
Семь недель бот только готовил черновики, а отправлять их должны были люди. В августе в ленту операторов ушло 1 264 черновика, кнопкой отправили 28. В сентябре — 1 228 и 58. В сентябре выяснилось, почему так: люди отвечают с телефона линии, а в ленту операторов почти никто не заглядывает. Черновик, который никто не видит, для клиента не отличается от молчания. 3 октября я поменял правило: бот держит ответ только тогда, когда в чате действительно есть человек, а всё остальное, что он может ответить, уходит клиенту. С 5 октября без ответа остаются 3% разговоров.
Вывод: перед тем как строить процесс вокруг людей, надо посмотреть, где люди на самом деле работают.
«Я настоящий человек»
18 октября клиент спросил, бот ли с ним говорит, и получил ответ, что с ним говорит настоящий человек. Правило «не говори, что ты ИИ» стояло в подсказке с 29 июля, когда каждый ответ был черновиком и отправлял его человек. Тогда правило было правдой. Когда бот начал отвечать сам, оно стало ложью, а тест продолжал его охранять. 19 октября я его заменил: бот говорит, что он автоматический помощник линии, и не предлагает за это человека. Сторож теперь ловит «я настоящий человек» в любом ответе. На живой модели 40 прогонов прошли без единого «я человек».
Вывод: правило, написанное под одну схему работы, надо перечитывать, когда схема меняется, даже если его охраняет зелёный тест.
Волна, которую выключили через 14 минут
24 сентября открылась волна «ответить на спасибо». Через 14 минут я её выключил: два ответа «не за что» ушли посреди живого разговора о покупке. Волна опиралась на проверку «можно ли здесь промолчать», а её использовали для другого вопроса: «уместно ли сказать "не за что"». Я пересчитал закрывающие реплики: из 85 явная благодарность была в 38, одни эмодзи в 8, а остальные 39 были продолжением разговора. Волну сузили до явной благодарности.
Вывод: у каждого класса ответов должен быть свой выключатель, который срабатывает со следующего сообщения. Здесь он сработал, и вреда дальше двух сообщений не было.
До и после
| Июнь–август: отвечали люди | 5–19 октября: бот и люди | |
|---|---|---|
| Разговоров без ответа | 16–18% | 3% |
| Кто отвечает первым | человек | бот в 77% разговоров |
| Медиана первого ответа | 2,7–4,4 минуты | 29 секунд |
| Разговоров без участия человека | 0 | 41% |
| Вопрос водителю | клиент пишет водителю сам | бот передаёт вопрос и привозит ответ |
Вопросы, которые задают чаще всего
Отвечает ли бот, когда в чате уже есть человек?
Нет. Если человек из команды писал в чате в последние 15 минут, бот молчит. От 15 до 60 минут он отвечает только в узких классах: статус заказа, оплата, правила, подтверждённое изменение заказа. Перед отправкой шлюз ещё раз проверяет, не написал ли человек, пока бот думал, и тогда ответ бота не уходит.
Может ли бот придумать статус заказа или время доставки?
Сторож ловит обещанное время, которого нет в данных заказа, чужие ссылки и выдуманные телефоны. Статус и время прибытия бот берёт из платформы как есть. Если ответ не проходит проверку и после переделки, клиент получает заготовленную строку, которая не может оказаться неправдой, или вопрос уходит человеку.
Сколько ждёт клиент?
Когда бот отвечает первым, медиана 29 секунд, у девяти разговоров из десяти не больше 46 секунд. Из них 20 секунд бот нарочно ждёт, не допишет ли клиент ещё. Летом, когда отвечали только люди, медиана первого ответа была от 2,7 до 4,4 минуты.
Что бот помнит о клиенте?
Короткую сводку, до 12 фактов о том, как с клиентом говорить и как передавать заказ, и сводки последних разговоров. Платёжные данные, номера телефонов и адреса фильтр отсекает до записи. Закрытые разговоры хранятся год, карточки незнакомых номеров — 90 дней. Память включена с 27 сентября.
Чего бот не делает
- Не пишет клиенту первым. Каждое его сообщение — ответ на сообщение клиента: самое позднее ушло через 52 минуты, это был привезённый ответ водителя.
- Не обещает перезвонить или вернуться позже: такие ответы ловит сторож.
- Не выдаёт себя за человека.
- Не отвечает в группах и не разбирает видео, документы и стикеры.
- Не учится на ответах людей автоматически: примеры собраны, но выключены.
- Нет кабинета и настроек для магазина: правила и рубильники меняю я.
- Нет отдельной команды «удалить всё о клиенте»: данные уходят по срокам хранения.