Казалось бы, собрать обратную связь — дело нехитрое. Поставил звёздочки под визитом, добавил короткий опрос, и жди ответов. Сеть клиник DocDeti, всерьёз вкладывающаяся в клиентский опыт, так и делала. Отвечали примерно 2% пациентов.
Две звёздочки из ста — это, прямо скажем, не статистика, а намёк на неё. Ни охвата, ни деталей: где именно неудобно, какой врач непонятно объяснил, в каком корпусе что не так — из звёздочек не вытащишь. А клинике нужно было видеть точечные проблемы у конкретных врачей и в конкретных корпусах.
Главный принцип: не выдать в собеседнике робота
Мы исходили из простой мысли: пациент не должен распознать в собеседнике машину. Человечность, однако, абстрактно не имитируется — «будь подобрее» модели не объяснишь. Поэтому мы разобрали внутренние материалы клиники и плотно поработали с руководителем контроля качества: его подход, интонация и манера задавать вопросы легли в основу поведения бота.
Разговор построили как интервью по трём осям: насколько комфортно было с врачом, насколько понятны рекомендации, насколько комфортно в самой клинике. Формат вытаскивает то, мимо чего опросник прошёл бы не моргнув, — вплоть до неработающей кофемашины в конкретном корпусе. Мелочь, а характеризует.
Данные пациентов наружу не уходят: обезличивание перед LLM
Тут есть тонкость, о которой в медицине забывать нельзя. Через бота проходят живые диалоги с пациентами, и в них то и дело всплывают имена — самого пациента, врача, «той самой Наташи с ресепшена». Отправлять это в сыром виде в сторонний LLM попросту нельзя.
Поэтому между диалогом и моделью мы поставили слой обезличивания на библиотеке Natasha — это Python-инструмент для распознавания именованных сущностей в русском тексте. Работает он детерминированно, без обращения к внешним моделям, прямо на нашей стороне.
Механика простая. Прежде чем реплика уйдёт в GPT, Natasha вытаскивает из неё все персоны — имена и фамилии. Каждая заменяется на хеш, а пара «хеш → исходное имя» кладётся в таблицу соответствия, живущую только в рамках текущей сессии. Фраза «мне очень помогла Наташа» уходит в модель уже как «мне очень помогла a3f9c1». Модель видит суть, тон и структуру разговора — но ни одного реального имени.
Когда модель возвращает ответ, хеши разворачиваются обратно по той же таблице: a3f9c1 снова становится Наташей. Пациент видит живой, персональный текст, а имена при этом ни разу не покидают наш контур.
Иными словами, модель делает свою работу, так и не узнав, с кем именно разговаривала. Что в медицине, согласитесь, не роскошь, а условие, без которого за проект и браться нельзя.
Бот, который не просто слушает
Отдельная гордость — реактивная логика. Бот не складывает ответы в табличку, а запускает бизнес-процессы прямо по ходу разговора:
- Тревожный медицинский признак — сигнал в систему клиники, перезванивает дежурный врач.
- Коммерческий запрос — заявка в CRM с обещанием звонка менеджера.
- Высокий уровень недовольства — разговор переключается на живого сотрудника контроля качества.
То есть жалоба не оседает мёртвым грузом до следующей планёрки, а превращается в действие тут же.
Что в итоге
- Конверсия в сбор обратной связи выросла с 2% до 50% — в двадцать пять раз. Отвечает каждый второй, а не каждый пятидесятый.
- Ответы — развёрнутые, с конкретикой до уровня «не работает кофемашина в N-корпусе».
- Тревожные и коммерческие обращения обрабатываются без задержки.
- Клиника получает не ворох звёздочек, а управляемый поток данных для улучшения сервиса.
Срок — два месяца, стек привычный: Laravel, LLM, интеграции с CRM.
Бот, которого принимают за человека, в итоге сделал вполне человеческую работу — разговорил тех, кто прежде отмалчивался. А имена их при этом так и остались при них.
