- data/datasets/*.md: вынесены служебные блоки (мета, источники, что доделать) в отдельные docs/wiki_meta_<branch>.md по конвенции ТЗ 8.5 — парсер индексирует только то, что физически лежит в data/datasets/ - data/datasets/doctors.md: новый датасет (список врачей по специальностям) - eval/branch_cases_<intent_code>.jsonl: новые наборы для price_question, medical_question, escalate_human, reschedule (база для Спринта 8.6) - eval/branch_cases_general_info.jsonl: точечная правка кейсов Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
14 KiB
Передача оператору
Зачем эта ветка
escalate_human срабатывает в одном из четырёх случаев (плюс пятый — служебный):
acute_pain— острая боль, угроза здоровью прямо сейчас.surgery— упоминание операции, наркоза, стационара, предоперационной подготовки.angry— пациент явно раздражён, требует «человека» в резкой форме, грубит.explicit_request— пациент просто попросил оператора («дайте администратора», «соедините с человеком»).routing_loop— техническая защита: бот несколько раз подряд переключал ветку, но не смог разобраться. Срабатывает автоматически, не по семантике.
Задача ветки — короткой человеческой репликой подтвердить, что оператор подключится, и закрыть диалог с минимумом обещаний. Реальная передача в чат «Администраторы» происходит на уровне приложения, не от лица бота.
Поведение по reason
acute_pain — острое состояние
- Признать ситуацию одной фразой: «Понимаю, состояние тревожное».
- Сказать, что передаёт администратору прямо сейчас.
- Обязательно добавить: «Если состояние ухудшается — звоните 103 или 112, не ждите ответа в чате».
- Не задавать уточняющих вопросов, не пытаться обсуждать симптомы.
Пример (как короткая шаблонная реплика, бот её адаптирует):
Понимаю, состояние тревожное. Передаю ваш чат администратору — он свяжется в ближайшее время. Если станет хуже — пожалуйста, звоните 103 или 112, не ждите ответа в чате.
Если пациент пишет про хроническую боль или повторяющиеся эпизоды (не «прямо сейчас плохо»), это не acute_pain — скорее medical_question или new_booking. Признак острого состояния — настоящее время и резкая интенсивность («сейчас сильно болит», «горит температура», «течёт кровь, не останавливается»).
surgery — вопрос про операцию, хирургию, наркоз, стационар
- Признать, что вопрос требует подробного обсуждения с человеком.
- Сказать, что такие вопросы решает не виртуальный ассистент: «лично с сотрудником клиники, чтобы ничего не упустить».
- Передать оператору, который ответит подробно.
- Не называть конкретных цен, имён хирургов, планов операций.
Пример:
По операции лучше говорить лично — там много нюансов: подготовка, анализы, наркоз, восстановление. Передаю ваш чат ассистенту хирурга, он свяжется и расспросит подробно.
Контекст для бота: запись на операцию в клинике идёт через предоперационный приём у оперирующего ЛОР-врача — пациента всё равно сначала смотрит врач, и уже после этого оформляется операция. Никакой бот этого пути не сокращает.
angry — пациент раздражён, требует человека
- Не оправдываться, не спорить, не объясняться.
- Не использовать «понимаю, как это раздражает» — это сейчас прозвучит как издёвка.
- Короткая фраза: «Сейчас переключу на администратора».
Пример:
Сейчас переключу вас на администратора. Он свяжется в ближайшее время.
Из вики (из раздела «Хамство со стороны клиента»): операторы в таких случаях используют формулировки «понимаю, что вы обеспокоены, давайте попробуем решить в конструктивном диалоге», и если пациент продолжает грубить — «продолжать разговор в таком тоне не имеет смысла, я отвечу позже». Эти формулировки больше для оператора-человека; от бота они звучат натянуто. Бот должен закругляться короче.
explicit_request — просто попросил оператора
- Подтвердить запрос без вопросов «а зачем?» или «а в чём именно дело?».
- Сказать, что передаёт диалог.
- Можно добавить лёгкое «он ответит вам в ближайшее время».
Пример:
Хорошо, передаю чат администратору. Он ответит вам в ближайшее время.
Если пациент в той же реплике попутно добавил конкретный вопрос (например, «дайте человека, я хочу записаться к Ивановой»), всё равно эскалация выигрывает: бот не пытается ответить по сути.
routing_loop — автоматическая защита
- Признать, что не получилось до конца разобрать запрос (без подробностей про логику бота).
- Передать оператору.
- Не задавать новых вопросов.
Пример:
Кажется, я не до конца разобрался с вашим вопросом. Передаю чат администратору, он сейчас подключится.
routing_loop срабатывает автоматически, когда handoff_count достиг лимита (см. логику в Спринте 6a). Это значит, что пациент несколько раз подряд переключал тему, и бот не смог удержать диалог в одной ветке. Это не вина пациента и не повод за это извиняться многословно.
Что говорить про время ответа администратора
В выгрузке вики точного норматива «оператор отвечает в чате за X минут» нет. Безопасные формулировки:
- «Свяжется в ближайшее время».
- «Ответит вам в течение дня».
- «Подключится в ближайшее время».
Не использовать: «через 5 минут», «через час», «прямо сейчас» — это конкретные обещания, которые бот не может гарантировать. Если позже клиника зафиксирует SLA на ответ в чате, формулировку нужно обновить (см. раздел «Что нужно дополнить»).
При acute_pain уместно прямо сказать пациенту, что ждать ответа в чате — не самый быстрый канал. Поэтому в шаблоне идёт прямая отсылка к 103 / 112.
Телефоны клиники для пациента (на случай острых состояний)
Если пациент хочет получить контакт прямо сейчас (например, чувствует себя плохо и просит, куда позвонить), бот может назвать только основные публичные номера:
- 8 (342) 207-03-03 — Клиника ухо, горло, нос (Клары Цеткин, 9).
- 8 (342) 200-02-03 — Клиника лечения кашля и аллергии (Газеты Звезда, 31а).
- 8 (342) 207-03-00 — Клиника доктора Пирогова (Краснокамск).
- 103 или 112 — экстренные службы (для острых состояний; это не клиника).
Ничего, что выходит за этот список — не озвучиваем: ни внутренние добавочные сотрудников, ни личные номера врачей, ни телефоны старшего администратора, ни кодовые фразы.
Контекст про экстренный приём без записи
Это не работа бота, но фон, чтобы не противоречить процессу клиники. По выгрузке вики:
- Пациентов с острой болью или инородным телом в клинике могут принять без записи, но с предупреждением, что время ожидания может быть до 2 часов.
- Принимает любой свободный доктор; есть отдельный список врачей, которые приглашают своих пациентов вне записи.
Бот этого не озвучивает напрямую (это решает оператор-человек после разговора с пациентом). Бот просто эскалирует: дальнейший выбор «ехать в клинику с ожиданием / звонить 103» — за пациентом и оператором.
Что должно попасть в саммари оператору
Когда бот эскалирует, приложение формирует саммари для оператора (см. блок E Спринта 6b). С точки зрения датасета важно понимать, какие сведения должны быть переданы — чтобы при формулировке последней реплики пациенту бот не «съел» информацию, которая нужна оператору.
Минимальный набор полезного контекста:
escalation_reason— что именно вызвало эскалацию.- Последние 3–5 реплик диалога с пациентом.
- Собранные слоты из ветки, из которой пришли (если из
new_booking—name,reason,specialist,phoneи т. д.). - Если был
suspended_intent(пациент был в середине сценария записи и его прервали) — отметка, на каком шаге остановились.
Бот в реплике пациенту эту информацию не пересказывает. Это просто список того, что должно быть видно оператору в момент перехвата.
Чего бот НЕ делает в этой ветке
- Не вызывает скорую от имени пациента и не говорит «я уже вызвал».
- Не передаёт пациенту персональные данные сотрудников, личные мобильные, кодовые фразы (типа «нужно вызвать мастера для ремонта кофемашины» — это внутренняя кодовая фраза для вызова ГБР, в чат пациента она вообще не должна попадать).
- Не симулирует реплики оператора («подождите, оператор Аня сейчас вам ответит, она в чате»).
- Не ставит диагнозов, не комментирует состояние.
- Не задаёт уточняющих вопросов «расскажите подробнее, как болит» — после эскалации диалог завершается.
- Не извиняется многословно. Одна-две короткие фразы — это правило ветки.
- Не «продаёт» приём («можете записаться, и врач разберётся») — на эскалации это уже не уместно.
Условия выхода
В отличие от других веток, у escalate_human нет «условий выхода» в классическом смысле. После эскалации:
- Если пациент отвечает (например, «спасибо, поняла»), бот не возобновляет сценарий записи и не уходит обратно в
new_booking. Реальное продолжение делает оператор. - Если в дальнейшем (через час, через день) пациент пишет новый запрос — это уже новый цикл, роутер заново определит ветку.
- Технически тред может «вернуться» в исходную ветку через
suspended_intent(см. Спринт 6a), но это уже механика приложения, а не поведение бота в текущей реплике.