ILFA Dental

Пациент пишет в WhatsApp — ассистент консультирует и при возможности доводит до записи на прием: уточняет запрос, предлагает услугу, врачей и время из внешней МИС-системы, записывает в клинику прямо в МИС-систему и подтверждает запись на прием.

Роль

Проектирование архитектуры агентов, оркестрация, интеграция с MIS и Wazzup и Telegram, векторизация базы данных клиники, эксплуатация

Канал

— WhatsApp через Wazzup
— живая запись в 1Denta
— диалог с памятью между сообщениями

Stack
OpenAI API MongoDB FAISS Wazzup Telegram API 1Denta API Google API Python FastAPI Redis

Какие сложности были у проекта

WhatsApp — не идеальный канал для диалога

Пациенты пишут несколько сообщений подряд, отправляют одно и то же дважды, пишут через минуту после предыдущего. Я построил слой, который склеивает «залпы», фильтрует дубли и не отправляет устаревший ответ — без этого любой WhatsApp-бот ведёт себя непредсказуемо.

Запись в клинику — это не вопрос-ответ, а сценарий

Ассистент ведёт пациента по шагам: выбирает услугу, предлагает врачей, показывает свободное время, собирает контакты и создаёт визит в 1Denta. На каждом шаге используются реальные данные из MIS, а не придуманные моделью. Диалог помнит, что уже выбрано.

Архитектура: почему это не просто чат-бот

Загрузка схемы…
Колёсико — масштаб, зажатая мышь — перемещение, двойной клик — сброс
Как это читать
  • Расписание берётся из системы, а не придумывается. Услуги, врачи, даты и слоты — это реальные данные из 1Denta. LLM только решает, что спросить и когда записать.
  • Четыре слоя — четыре зоны ответственности. Маршрутизация, сценарий записи, атомарные шаги и финальный ответ разделены — каждый слой не знает лишнего.
  • Поведение ИИ для клиники меняется в любой момент. Тон, правила, ценовые политики и ответы на возражения живут в Google Sheets — редактируешь таблицу, ассистент меняет поведение в ту же минуту.
  • Диалог не ломается между сообщениями. История, состояние записи, дедупликация и debounce «залпов» — без этого 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 и обновляют поведение ассистента автоматически. Клиника управляет ассистентом сама, без деплоя.