dc9538027c
- 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>
142 lines
14 KiB
Markdown
142 lines
14 KiB
Markdown
# Передача оператору
|
||
|
||
## Зачем эта ветка
|
||
|
||
`escalate_human` срабатывает в одном из четырёх случаев (плюс пятый — служебный):
|
||
|
||
1. `acute_pain` — острая боль, угроза здоровью прямо сейчас.
|
||
2. `surgery` — упоминание операции, наркоза, стационара, предоперационной подготовки.
|
||
3. `angry` — пациент явно раздражён, требует «человека» в резкой форме, грубит.
|
||
4. `explicit_request` — пациент просто попросил оператора («дайте администратора», «соедините с человеком»).
|
||
5. `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), но это уже механика приложения, а не поведение бота в текущей реплике.
|
||
|