Кейс
ServiceCraft: как мы научили ИИ брать трубку в ветклинике
Привет! На связи Антон из MEDIABURO. Этот кейс — про входящие звонки, на которые некому ответить. Расскажу, почему полностью автоматическая база знаний не сработала и как мы в итоге собрали голосового оператора, который отвечает по скриптам клиники и сам записывает на приём.
ServiceCraft вырос из моей дипломной работы на ФКН ВШЭ. Но начался он не с диплома, а с конкретной клиники, которая пришла к нам с проблемой.
Два из пяти звонков остаются без ответа
Представьте обычную ветклинику в Москве. Администратор на ресепшене одновременно принимает пациентов, выставляет счета и отвечает на звонки. Пока он занят с клиентом у стойки, трубку взять некому.
У клиники, с которой мы работали, без ответа оставались около 40% входящих звонков. Каждый такой звонок — человек, который, скорее всего, просто наберёт следующую клинику из поиска.
Кроме того, у клиники не было единой базы знаний: ответы жили в головах администраторов. Сколько стоит прививка, что взять с собой на приём, нужно ли что-то делать перед операцией — администраторы отвечали по памяти, и у разных людей ответы не совпадали. Чем больше звонков, тем больше разнобоя.
Решить это можно по-разному. Нанять ещё администраторов — дорого, и разнобой в ответах никуда не денется. Поставить голосовое меню «нажмите 1» — на вопрос оно не ответит и на приём не запишет. Под задачу подходил ИИ-оператор: он берёт трубку в любой момент, отвечает по единым скриптам клиники и сам записывает на приём. Оставалось понять, на чём его строить.
Почему не купить готового бота
Готовые решения на рынке есть, и они делятся на три лагеря:
И одно жёсткое условие от клиники: записи разговоров с клиентами не уходят в чужое облако. Поэтому всё — от расшифровки до ответов бота — работает на собственном сервере с видеокартой.
Первая попытка: пусть нейросеть сама всё сделает
Идея выглядела красиво. У клиники тысячи записей разговоров, и в них уже есть всё: что спрашивают клиенты и что отвечают администраторы. Расшифровываем записи, нейросеть выписывает пары «вопрос — ответ», складываем их в базу, бот отвечает по ней. Человек не нужен.
Мы это построили и запустили на пилоте.
- база знаний собирается сама
- бот отвечает как лучший администратор
- клинике ничего делать не надо
- бот уверенно выдумывает
- повторяет ошибки живых администраторов
- отвечает лекциями вместо двух фраз
Нейросеть сочиняла. Если в записях не находилось ответа, модель не говорила «не знаю», а выдавала правдоподобную выдумку. Когда речь о здоровье питомца, это недопустимо.
Ошибки людей становились правилами. Записи — это живые разговоры: администратор запнулся, ответил наполовину, где-то ошибся. Всё это честно попадало в базу рядом с правильными ответами, и бот не мог отличить одно от другого.
Ответы-простыни. Клинике нужны короткие скрипты в пару фраз, а модель писала развёрнутые абзацы. По телефону такое слушать невозможно.
У всех трёх проблем один корень: между записями и клиентом не было человека, который сказал бы «вот так правильно». А если проверять вручную каждый ответ, автоматизация теряет смысл — проще было сразу всё написать самим.
Разворот: машина ищет вопросы, человек пишет ответы
Разбирая провал, мы заметили важное: половина системы работала отлично. Находить вопросы клиентов нейросеть умела, ошибалась она в ответах. Поэтому мы разделили работу. Всё, что связано с поиском и сортировкой, делает машина. Сами ответы пишет эксперт клиники.
Шаг 1. Расшифровали всю «память» клиники. 11 000 записей, около 16 000 минут — это больше 11 суток непрерывных разговоров. Нейросеть для распознавания речи1 работала на сервере у нас, записи никуда не уходили, а на всё ушло меньше двух часов. Приятный бонус: голоса администратора и клиента в записях лежат на разных каналах, как в левом и правом наушнике. Кто что сказал, было понятно сразу.
Шаг 2. Выписали все вопросы. Из расшифровок вытащили всё, что спрашивали клиенты. Получилось около 85 000 вопросов.
Шаг 3. Склеили одинаковые по смыслу. «Сколько стоит прививка?», «Почём у вас вакцинация?» и «А прививку делаете? Сколько выйдет?» — это один вопрос, просто сказанный по-разному. Специальная модель переводит каждую фразу в набор чисел, своего рода координаты смысла, и похожие по смыслу фразы оказываются рядом. Насколько близко — подобрали на 500 парах вопросов, размеченных вручную. В 9 случаях из 10 склейка оказалась верной. Итог: 798 уникальных вопросов, отсортированных по тому, как часто их задают.
Шаг 4. Ответы пишет клиника. В интерфейсе ServiceCraft сотрудник видит очередь вопросов: самые частые наверху. Можно написать ответ самому, а можно нажать «Черновик от ИИ»: нейросеть найдёт похожие куски реальных разговоров и предложит вариант. Формат простой — короткий ответ и подсказка для бота в скобках.
Начинать с верха списка — значит первыми закрывать самые частые звонки. К запуску клиника написала ответы на 122 вопроса.
И честная цифра: из этих 122 ответов только 18, примерно 15%, клиника взяла из черновиков ИИ как есть. Это не провал, а подтверждение всей схемы. ИИ хорош как стартовая точка, но последнее слово остаётся за экспертом.
Теперь ИИ берёт трубку
База готова — подключаем голос. ServiceCraft встаёт в телефонию клиники через стандарт, на котором работает большинство офисных АТС2. Номер прежний, оборудование менять не нужно.
От конца фразы клиента до начала ответа проходит меньше 1,2 секунды. Это важно: паузы длиннее полутора секунд по телефону уже ощущаются неловкими, и собеседник начинает переспрашивать «алло?». Уложиться помогают три вещи:
- Распознавание на лету. Бот не ждёт, пока клиент договорит, чтобы начать расшифровку: речь режется на кусочки по полсекунды и переводится в текст прямо по ходу разговора. Кусочки немного перекрываются, чтобы слово на стыке не потерялось.
- Детектор паузы. Отдельная маленькая модель слушает, когда человек замолчал. Как только фраза закончилась, бот сразу начинает искать ответ.
- Заготовленный голос. Самые популярные ответы озвучены заранее, поэтому на частые вопросы бот отвечает почти мгновенно. Новый ответ синтезируется за 0,2 секунды.
Если бот не уверен в ответе, он не выдумывает, а переводит звонок на администратора. Насколько осторожным быть, клиника настраивает сама. А журнал разговоров показывает, каких вопросов в базе пока нет, — так база растёт дальше.
Та же база отвечает и в чате на сайте, и в Telegram: написал ответ один раз — он работает во всех каналах.
Под капотом: как бот находит ответ и почему не выдумывает
Самое интересное происходит в тот момент, когда вопрос клиента уже превратился в текст. Обычная нейросеть отвечает «из головы» — из того, что запомнила при обучении. Про цены и расписание конкретной клиники она не знает ничего, поэтому и начинает сочинять. Мы устроили всё иначе.
RAG: экзамен с открытой книгой. Подход называется RAG3 — «генерация с поиском». Прежде чем отвечать, бот идёт в базу знаний клиники и достаёт несколько ответов, ближайших к вопросу по смыслу. Ищет он так же, как мы склеивали вопросы: по координатам смысла, а не по совпадению слов, поэтому «почём вакцинация» найдёт ответ про стоимость прививки. Найденное вместе с вопросом отдаётся языковой модели с жёстким правилом: отвечай только по этим материалам, в стиле скриптов клиники. Выходит как на экзамене, где можно подглядывать в учебник, — только учебник написала сама клиника.
Инструменты: руки вместо памяти. Часть ответов в базу знаний положить нельзя: свободные окна, история визитов питомца, сегодняшние цены меняются каждый час. Для этого у бота есть инструменты — набор действий в YClients, системе, где клиника ведёт расписание и карточки пациентов. Бот сам решает, что ему нужно: посмотреть свободные окна врача, найти карточку пациента, узнать цену услуги или создать запись. Он вызывает нужное действие, получает свежие данные и уже с ними формулирует ответ. Такие данные мы специально не копируем в базу, а каждый раз спрашиваем у YClients, чтобы бот не опирался на вчерашнее расписание.
Всё на своём сервере. Языковая модель — открытая Qwen на 8 миллиардов параметров. Она достаточно компактна, чтобы работать на одной видеокарте в контуре клиники, и при этом уверенно работает с русским языком. Ни расшифровки, ни вопросы клиентов не уходят в облака сторонних компаний.
Право сказать «не знаю». Если поиск не нашёл в базе ничего достаточно близкого, бот не пытается вытянуть ответ из воздуха. Он честно переводит звонок на человека, а вопрос попадает в очередь базы знаний, чтобы в следующий раз ответ уже был.
Главная фишка: бот сам записывает на приём
Ответить на вопрос — полдела. Чаще всего в клинику звонят не спросить, а записаться: это около 60% всех звонков.
Здесь в дело идут те самые инструменты. Клиент говорит «хочу к терапевту на завтра», бот запрашивает у YClients свободные окна, предлагает пару вариантов, подтверждает выбранный и сам создаёт запись. Клиенту приходит SMS. Окно, которое предложил бот, действительно свободно: расписание он только что посмотрел.
Самый частый тип звонков теперь проходит без администратора.
Что получилось
Про 73% подробнее, потому что проверяли честно. Мы задали боту все 122 вопроса, не показывая ему готовых ответов, и отдали его ответы клинике на оценку. 89 из 122 — «можно ставить в работу как есть». Оставшиеся не были ошибочными, они были слишком общими: по сути верно, но не так конкретно, как ответила бы сама клиника. Лечится это расширением базы: ещё 676 вопросов ждут своих ответов.
Что дальше
Расширяем базу до 300 самых частых вопросов, чтобы бот отвечал конкретнее. И пробуем ту же схему в соседних нишах, где телефон тоже разрывается: стоматологии и юридические услуги.
Полезные для команды итоги
- Нейросеть отлично находит, но не должна решать в одиночку. Пусть ИИ ищет и предлагает, а отвечает эксперт.
- Записи разговоров — золото, которое годами лежит у бизнеса без дела. В них уже есть полная карта того, что волнует клиентов.
- Ценнее всего не умный ответ, а закрытое действие. Бот, который сам записал на приём, полезнее бота, который красиво рассказал о ценах.
- Даже без бота сама карта вопросов уже полезна бизнесу: видно, о чём на самом деле спрашивают клиенты и где администраторы отвечают по-разному.
Если у вас тоже звонит телефон, а ответить некому, — приходите. Разберём записи ваших звонков и покажем, о чём на самом деле спрашивают ваши клиенты.
Стек
Go · React · PostgreSQL · Qdrant · Whisper Large v3 · Qwen 8B (локально) · SIP-телефония · YClients API · Docker Compose
- Whisper Large v3 — открытая модель распознавания речи. Мы запускали её на своей видеокарте NVIDIA A100: вся история звонков расшифровалась примерно в 150 раз быстрее, чем длились сами разговоры.↩
- SIP — стандартный протокол интернет-телефонии. Его понимает большинство АТС, поэтому бот подключается как ещё один «сотрудник» на линии, без замены оборудования.↩
- RAG (Retrieval-Augmented Generation) — схема, в которой языковая модель отвечает не по памяти, а по документам, найденным под конкретный вопрос. Базу можно обновлять в любой момент, переобучать модель не нужно.↩