feat(sprint7.6): оптимизация воронки new_booking до 4 шагов (вариант 2)
Воронка сжата с 6 шагов до 4: intro → qualify → book → close.
Спецификация: docs/OPTIMIZATION_CONVERSION_v1.md.
Цель: сравнимая с конкурентом (NEXTBOT/Александра) конверсия — ≤3 реплик
бота до запроса телефона, содержательный ответ на жалобу в первом
осмысленном сообщении.
Промпты шагов:
- intro.md — переписан. Приветствие + открытый вопрос «что беспокоит?».
Имя НЕ спрашиваем (слот name со шага снят), оно собирается на book
вместе с телефоном. Если пациент сразу написал жалобу — не зацикливаемся,
переходим в qualify.
- qualify.md — переписан. Обязательный 5-пунктовый шаблон ответа на жалобу:
эмпатия (одна фраза) → 2-3 ЛОР-гипотезы из RAG-выдержек («может быть
связано с») → специалист → услуга/цена («при необходимости назначит») →
бинарный CTA «записать?». Если в выдержках нет гипотез/цен — пункт
пропускается, не сочиняем. Если жалоба не описана (пациент сразу
«хочу записаться к ЛОРу») — пропускаем гипотезу/услугу, оставляем
эмпатию-формальность + специалист + CTA.
Три особые ситуации сохранены: ребёнок (require_legal_rep), конкретный
врач (waitlist_flag), первичная жалоба на слух (needs_surgologist_first).
- book.md — переписан. Одной репликой: подтверждение плана с
использованием {specialist}/{reason} + запрос телефона + имени (если
ещё не было в истории). При is_child=true — обращение к родителю,
legal_rep_phone используется, если уже собран.
- present.md — DEPRECATED. Файл оставлен в репо на случай отката
(вариант 1 спецификации). Внутри — заглушка «попал по ошибке —
выходи на book».
- close.md и offer_time.md не тронуты (offer_time станет актуален с
реальным календарём).
allowed_next в SEED_INTENT_STEPS:
- intro: [intro, qualify] (без изменений)
- qualify: [qualify, book] (раньше: [qualify, present])
- present: [book] (изоляция; раньше: [present, qualify, offer_time])
- offer_time: [offer_time, book] (deprecated, без изменений)
- book: [book, qualify, close] (раньше: [book, qualify, offer_time, close])
- close: [close] (без изменений)
migrate_new_booking_allowed_next_v2(session) — одноразовая миграция в
services/intent_step_service.py. При старте для каждого шага
new_booking сравнивает текущий allowed_next_json с дореформенным
значением (_PRE_SPRINT_7_6_ALLOWED_NEXT). Если совпадает — обновляет
на новое из SEED. Если оператор правил вручную — пропускает,
warning в лог. Идемпотентна (на повторных запусках ничего не делает).
Подключена в main.py lifespan после ensure_seed_guards.
Защитное условие require_legal_rep на qualify сохранено. Теперь блокирует
переход qualify → book (раньше qualify → present). Логика та же:
при is_child=true и пустых legal_rep_name/legal_rep_phone валидатор
отклоняет переход.
eval/MANUAL_CASES.md — markdown-чеклист для ручных прогонов:
- §A: 5 конверсионных кейсов (храп+уши, боль в горле, тугоухость,
насморк >месяца, звон в ушах) с чеклистом 5 пунктов на первый ответ
и проверкой ≤3 реплик до телефона.
- §B: регрессия 8 ручных сценариев из блока H Спринта 6b со ссылками
на docs/examples/*_v2.md.
SPRINTS.md: Спринт 7.6 → ✅ Закрыт по коду. Применение промптов в БД
и ручная регрессия — за оператором (через UI «Настройки → Шаги»
для каждого из 4 шагов new_booking).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+24
-14
@@ -495,31 +495,41 @@
|
||||
### Цель
|
||||
Сжать воронку `new_booking` с 6 шагов (`intro → qualify → present → offer_time → book → close`) до 4 (`intro → qualify → book → close`), переписать содержимое `qualify` под 5-пунктовый шаблон ответа (эмпатия → 2-3 ЛОР-причины → специалист → услуга/цена → CTA), перенести сбор имени с `intro` на `book`. Полная спецификация — в `docs/OPTIMIZATION_CONVERSION_v1.md`.
|
||||
|
||||
### Статус: ⏳ Запланирован
|
||||
### Статус: ✅ Закрыт по коду (применение промптов в БД и ручная регрессия — за оператором)
|
||||
|
||||
Выбран **вариант 2** блока C — `present` убран как самостоятельный шаг. Воронка: `intro → qualify → book → close`.
|
||||
|
||||
### Задачи
|
||||
|
||||
См. полный план в `docs/OPTIMIZATION_CONVERSION_v1.md`. Кратко:
|
||||
|
||||
**Блок A — сжатие воронки:**
|
||||
- [ ] `intro.md` — приветствие + открытый вопрос, имя НЕ спрашиваем.
|
||||
- [ ] `book.md` — телефон + имя в одной реплике.
|
||||
- [ ] Расширить `allowed_next` шага `intro`.
|
||||
- [x] `intro.md` — приветствие + открытый вопрос, имя НЕ спрашиваем (слот `name` со шага снят).
|
||||
- [x] `book.md` — подтверждение плана + запрос телефона/имени в одной реплике.
|
||||
- [x] `qualify.md` — снято требование «не уходи дальше пока нет name».
|
||||
|
||||
**Блок B — содержательный `qualify`:**
|
||||
- [ ] `qualify.md` — обязательный 5-пунктовый шаблон (эмпатия → гипотеза → специалист → услуга/цена → CTA).
|
||||
- [ ] Сохранить три «особые ситуации» (ребёнок, конкретный врач, жалобы на слух).
|
||||
- [x] `qualify.md` — 5-пунктовый шаблон (эмпатия → 2–3 гипотезы из RAG → специалист → услуга/цена → CTA).
|
||||
- [x] Три особые ситуации сохранены: запись ребёнка с `require_legal_rep`, конкретный врач с `waitlist_flag`, первичная жалоба на слух с `needs_surgologist_first`.
|
||||
- [x] Деградация: при отсутствии гипотез/цен в RAG — пропускать пункт, не сочинять.
|
||||
|
||||
**Блок C — `present`:**
|
||||
- [ ] Решить (с пользователем): убрать как самостоятельный шаг или переписать в одну фразу-подтверждение. Спецификация рекомендует вариант 2 (убрать).
|
||||
**Блок C — `present` (вариант 2):**
|
||||
- [x] `present.md` помечен как DEPRECATED, оставлен в репозитории на случай отката.
|
||||
- [x] `SEED_INTENT_STEPS` обновлён: `qualify → [qualify, book]`, `present → [book]` (изоляция), `book → [book, qualify, close]` (без `offer_time`).
|
||||
- [x] `migrate_new_booking_allowed_next_v2()` — одноразовая миграция при старте сервиса. Идемпотентна. Если оператор правил `allowed_next` руками — пропускает (warning в лог).
|
||||
|
||||
**Блок D — регрессия:**
|
||||
- [ ] 5 контрольных конверсионных кейсов (храп, боль в горле, тугоухость, насморк, звон в ушах) в `eval/MANUAL_CASES.md`.
|
||||
- [ ] Прогнать 8 ручных сценариев из блока H Спринта 6b — все должны проходить.
|
||||
- [x] `eval/MANUAL_CASES.md` — чеклист на 5 конверсионных кейсов + 8 ручных сценариев из блока H Спринта 6b.
|
||||
|
||||
**Применение промптов в БД (за оператором):**
|
||||
- [ ] В UI «Настройки → ветка `new_booking` → вкладка Шаги»: для каждого из 4 шагов (`intro`, `qualify`, `book`, `present`) скопировать обновлённый текст из `prompts/intents/new_booking/steps/*.md` в textarea «Промпт шага» и сохранить через PATCH. `close.md` и `offer_time.md` не трогать.
|
||||
|
||||
**Регрессия (ручная, за оператором):**
|
||||
- [ ] Прогнать в Песочнице 5 кейсов из `eval/MANUAL_CASES.md` §A — проверить структуру первого ответа (5 пунктов) и сжатие воронки (≤ 3 реплик до телефона).
|
||||
- [ ] Прогнать 8 кейсов из `eval/MANUAL_CASES.md` §B — все должны проходить как раньше.
|
||||
|
||||
### Критерий готовности
|
||||
- [ ] На контрольном кейсе из спецификации `new_booking` отвечает по 5-пунктовому шаблону, до запроса телефона ≤ 3 реплик бота.
|
||||
- [ ] Все 8 ручных сценариев из блока H Спринта 6b проходят.
|
||||
- [x] Файлы промптов и `allowed_next` обновлены в коде, миграция отрабатывает.
|
||||
- [ ] (за оператором) На контрольном кейсе «храп + заложенность ушей» бот отвечает по 5-пунктовому шаблону, до запроса телефона ≤ 3 реплик.
|
||||
- [ ] (за оператором) Все 8 ручных сценариев из блока H Спринта 6b проходят.
|
||||
- [ ] Промпты `intro.md`, `qualify.md`, `book.md` обновлены и активированы в БД.
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user