Пациенты пишут несколько сообщений подряд, отправляют одно и то же дважды, пишут через минуту после предыдущего. Я построил слой, который склеивает «залпы», фильтрует дубли и не отправляет устаревший ответ — без этого любой WhatsApp-бот ведёт себя непредсказуемо.
ILFA Dental
Пациент пишет в WhatsApp — ассистент консультирует и при возможности доводит до записи на прием: уточняет запрос, предлагает услугу, врачей и время из внешней МИС-системы, записывает в клинику прямо в МИС-систему и подтверждает запись на прием.
Какие сложности были у проекта
Ассистент ведёт пациента по шагам: выбирает услугу, предлагает врачей, показывает свободное время, собирает контакты и создаёт визит в 1Denta. На каждом шаге используются реальные данные из MIS, а не придуманные моделью. Диалог помнит, что уже выбрано.
Архитектура: почему это не просто чат-бот
- Расписание берётся из системы, а не придумывается. Услуги, врачи, даты и слоты — это реальные данные из 1Denta. LLM только решает, что спросить и когда записать.
- Четыре слоя — четыре зоны ответственности. Маршрутизация, сценарий записи, атомарные шаги и финальный ответ разделены — каждый слой не знает лишнего.
- Поведение ИИ для клиники меняется в любой момент. Тон, правила, ценовые политики и ответы на возражения живут в Google Sheets — редактируешь таблицу, ассистент меняет поведение в ту же минуту.
- Диалог не ломается между сообщениями. История, состояние записи, дедупликация и debounce «залпов» — без этого WhatsApp-бот работает непредсказуемо.
Как выглядит результат?
Живые диалоги из WhatsApp, логи работы системы, правила поведения ассистента и данные клиники — не демо, а следы работающего сервиса.
Знания клиники — отдельный управляемый слой
Услуги, цены, правила скидок, тон общения и границы компетенции хранятся в Google Sheets. Администратор клиники редактирует таблицу — ассистент меняет поведение без единой строки кода. Данные динамически векторизуются через cron-job в FAISS и ИИ обладает актуальным контекстом.
Агентная логика LLM
Система не отвечает сразу — сначала принимает решение: нужна ли запись, какой врач подходит, что уже выбрано. Затем модель-оркестратор выбирает агента для выполнения задачи. И только потом составляется финальный ответ.
Сценарий записи управляется правилами, а не промптом
Когда предлагать альтернативы, когда переспросить, как не давить на пациента — это не импровизация модели, а явно заданный policy-слой. Поведение можно читать, менять и проверять.
Живой диалог: вопрос про имплантацию и запись за два сообщения
Пациент спрашивает про импланты, гарантии и скидки — ассистент отвечает по данным клиники и сразу предлагает записаться на консультацию. Диалог не рассыпается, контекст сохраняется.
Профгигиена и выбор врача
Пациент выбирает профессиональную гигиену и уточняет категорию услуги. Ассистент запоминает выбранный вариант, держит цену и длительность в контексте, предлагает подходящих врачей и продолжает запись даже после свободного ответа “любой врач”.
Этапы разработки проекта
Шесть независимых задач для эффективной агентной логики
Backend / runtime
FastAPI-сервис принимает WhatsApp-сообщения через webhook, напрямую общается с 1Denta и держит всё — диалог, данные клиники, запись — в рамках одного работающего процесса.
Многоуровневая оркестрация
Не один промпт на всё. Маршрутизатор решает, что делать. Обработчик записи в клинику ведёт сценарий шаг за шагом. Нижнеуровневые агенты обращаются к МИС-системам. Финальный слой собирает ответ пациенту.
Четыре интеграции — один сценарий
WhatsApp (Wazzup) — входящий канал. 1Denta — живое расписание и создание визита. Google Sheets — данные и политики клиники. OpenAI — принятие решений и финальный ответ. Всё работает вместе, а не по отдельности.
Знания клиники обновляются без перезапуска
Редактор правит Google Sheets → данные попадают в YAML → индекс обновляется автоматически. Ассистент начинает отвечать по новым правилам без деплоя и без участия разработчика.
Диалог помнит, что уже выбрано
Выбранная услуга, врач, дата, слот и контакты хранятся в MongoDB. При смене шага зависимые поля сбрасываются автоматически. История переписки и дедупликация — отдельно. Именно это делает диалог связным, а не рассыпающимся.
Защита от реальных проблем WhatsApp-диалога
Одно сообщение не обрабатывается дважды. «Залп» из нескольких сообщений склеивается в один запрос. Устаревший ответ не отправляется. Внешние API переподключаются при сбое. Всё это — не теория, а работающие механизмы.
Два решения, которые определили всю архитектуру
Один промпт на всё — это ловушка
Когда маршрутизация, сценарий записи, вызовы MIS и финальный ответ живут в одном месте, система начинает ломаться при любом изменении. Я разделил это на четыре независимых слоя — каждый делает одно и отлаживается отдельно.
Поведение ассистента не должно требовать разработчика
Тон, правила скидок, ограничения компетенции — это бизнес-данные, а не код. Они живут в Google Sheets, попадают в YAML и обновляют поведение ассистента автоматически. Клиника управляет ассистентом сама, без деплоя.
Sergey Shumov