bb5e3f5eb3
Параллель к 8a, но проверяем не код intent от роутера, а содержимое ответа
конкретной ветки на одиночную реплику. Старт — general_info, 46 кейсов.
Логика pass/fail (для одного кейса):
- A — RAG-секция: среди retrieved-чанков есть кусок с
section == expected_doc_section (точное совпадение). Если поле не задано —
пропускаем.
- B — keywords: обязательные expected_keywords встречаются в predicted_answer
(case-insensitive). По умолчанию все; поддерживаются keywords_min: N
и keywords_any: true. Запрещённые expected_must_not — ни одного.
- Pass = A ∧ B. Незаданные поля не проверяются.
- Кэш: (text_hash, branch_config_id) → {answer_text, retrieved_sections}.
Привязан к версии промпта ветки. Смена версии = пустой кэш = свежий прогон.
Правка JSONL без изменения text → pass/fail пересчитывается без LLM.
Backend:
- Таблицы eval_branch_runs / eval_branch_run_cases / eval_branch_predictions.
Миграция m9g1f7e89j56.
- services/eval_branch_run_service.py: загрузка JSONL, фоновый прогон через
asyncio.create_task, кэш, оценка A+B с поддержкой keywords_min/keywords_any.
- chat_service.run_branch_single_turn — изолированный single-turn без
роутера и треда (использует существующий config_service + vectorstore + llm).
- API: POST /eval/branch-runs, GET /eval/branch-runs?intent_code=,
GET /eval/branch-runs/{id}, GET /eval/branch-cases-with-status?intent_code=.
UI (static/regression.html):
- Селектор режима «Роутер / Ветка · general_info». Логика пикера переиспользуется
(фильтры, диапазон, массовый выбор, счётчик «новые / в кэше»).
- Для режима «Ветка»: фильтр по coverage, колонки секция/coverage, keywords,
частота, кэш. Drill-down прогона: ожидание, retrieved-секции, причины fail,
полный ответ ветки.
База кейсов (eval/branch_cases_general_info.jsonl) — от пользователя, 46 кейсов
по схеме {text, intent, coverage, expected_doc_section?, expected_keywords?,
expected_must_not?, keywords_min?, keywords_any?, count?, note?}.
Связанная правка SQLite (нашли при удалении документа в этом спринте):
- db/session.py: connect-listener PRAGMA foreign_keys=ON на каждое подключение.
Без этого ondelete=CASCADE в SQLite не enforced, и удаление документа
оставляло подписки в intent_documents висячими (что давало пустой RAG
и fail регрессии).
- Миграция n0h2g8f9a0k67 — одноразовая чистка существующих висячих подписок.
docs/SPRINTS.md: Спринт 8b → ✅ Закрыт. Diff vs предыдущий прогон для веток
и кнопка «Сбросить кэш регрессии» вынесены в docs/BACKLOG.md.
Также включены обновлённые data/datasets/general_info.md и price_question.md
(рабочий материал оператора), и черновик eval/branch_cases_price_question.jsonl
для следующего захода (8b на price_question).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
47 lines
31 KiB
JSON
47 lines
31 KiB
JSON
{"text": "Адрес клиники", "intent": "general_info", "expected_keywords": ["Цеткин", "Звезда"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "Карла Маркса", "Краснокамск работает"], "expected_doc_section": null, "coverage": "covered", "note": "Короткий запрос. Достаточно упомянуть хотя бы один из двух пермских адресов. Краснокамск закрыт — упоминание его адреса как действующего = фейл."}
|
||
{"text": "Где находится ваша клиника?", "intent": "general_info", "expected_keywords": ["Пермь", "Цеткин", "Звезда"], "keywords_min": 2, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "Карла Маркса"], "expected_doc_section": null, "coverage": "covered", "note": "Минимум 2 из 3 — должен быть назван «Пермь» и хотя бы один филиал."}
|
||
{"text": "адреса клиник", "intent": "general_info", "expected_keywords": ["Цеткин", "Звезда"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "Карла Маркса", "три филиала"], "expected_doc_section": null, "coverage": "covered", "note": "Множественное число — ожидаем перечисление обоих действующих филиалов. Оба обязательны (поэтому без keywords_any)."}
|
||
{"text": "Здравствуйте! Подскажите, пожалуйста, ваш почтовый адрес", "intent": "general_info", "expected_keywords": ["mail@oclinica.ru"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "clinic-lor@mail.ru"], "expected_doc_section": "Электронные адреса для пациентов", "coverage": "covered", "note": "Общий e-mail клиники — mail@oclinica.ru (актуализировано 2026-05-02). Старый clinic-lor@mail.ru должен быть удалён из ответов."}
|
||
{"text": "Здравствуйте! Интересует электронный адрес на который можно отправить результаты анализов", "intent": "general_info", "expected_keywords": ["test@oclinica.ru"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "mail@oclinica.ru", "clinic-lor@mail.ru"], "expected_doc_section": "Электронные адреса для пациентов", "coverage": "covered", "note": "Конкретно для анализов есть отдельный e-mail. Если бот даст общий — это ошибка."}
|
||
{"text": "Режим работы", "intent": "general_info", "expected_keywords": ["9:00", "21:00", "Звезда"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "Пирогова работает", "Краснокамск работает", "8:00 до 14:00"], "expected_doc_section": "Режим работы", "coverage": "covered", "note": "С 2026-05-02 покрыто: Звезда пн-пт 9-21, сб-вс 9-19; Цеткин пн-сб 9-17, вс выходной; Краснокамск временно не работает."}
|
||
{"text": "Здравствуйте, подскажите режим работы клиники", "intent": "general_info", "expected_keywords": ["9:00", "Цеткин", "Звезда"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "8:00 до 14:00", "Пирогова работает"], "expected_doc_section": "Режим работы", "coverage": "covered", "note": "Расширенный запрос — ожидаем перечисление часов хотя бы по двум работающим филиалам."}
|
||
{"text": "Добрый день. Какой график работы у Терво С.О.?", "intent": "general_info", "expected_keywords": ["оператор"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "принимает по", "ведёт приём", "ведет прием"], "expected_doc_section": null, "coverage": "not_covered", "note": "Расписания конкретных врачей в датасете нет. Бот не должен выдумывать график."}
|
||
{"text": "Добрый день! Подскажите есть ли у вас парковка у клиники для клиентов Газеты Звезда 31а?", "intent": "general_info", "expected_keywords": ["нет", "общественн", "Пушкина"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "бесплатн", "наша парковка"], "expected_doc_section": "Парковка", "coverage": "covered", "note": "Своей парковки нет — пользоваться общественной. Достаточно одного из ключевых сигналов: либо явное «нет», либо «общественн», либо упоминание ул. Пушкина."}
|
||
{"text": "налоговый вычет", "intent": "general_info", "expected_keywords": ["207-03-03", "mail@oclinica.ru"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "в личном кабинете на сайте клиники", "по ссылке", "clinic-lor"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Самый частотный запрос (count=14). Достаточно одного из двух способов заявки."}
|
||
{"text": "Как получить справку для налогового вычета?", "intent": "general_info", "expected_keywords": ["207-03-03", "mail@oclinica.ru", "ИНН"], "keywords_min": 2, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "clinic-lor", "только лично"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Развёрнутый запрос — нужно минимум 2 из 3: способ заявки (телефон или e-mail) + хотя бы упоминание состава данных (ИНН и т.п.)."}
|
||
{"text": "Здравствуйте, подскажите пожалуйста, справку для налог.вычета за 25 год, когда уже можно заказывать?", "intent": "general_info", "expected_keywords": ["оператор", "207-03-03", "mail@oclinica.ru"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "с января", "в феврале"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "partial", "note": "Сроки начала года для заказа в датасете не указаны. Достаточно дать процедуру или эскалировать оператору; не выдумывать конкретные даты."}
|
||
{"text": "Прошу выслать Скан копию справки для ИФНС за 2024 год Афанасьев Андрей Павлович 30.11.1963г.р. ИНН 590803877826 Был на приеме 14.11.2024 стоимость 4200.00 р. На ЭП larisa-f1996@yandex.ru Спасибо жду.", "intent": "general_info", "expected_keywords": ["3 раб", "mail@oclinica.ru", "оператор"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "уже отправили", "получите сейчас"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Длинная реплика с ФИО/ИНН. Достаточно подтвердить процедуру (3 раб. дня) ИЛИ дать e-mail ИЛИ эскалировать. Главное — не подтверждать факт отправки."}
|
||
{"text": "Здравствуйте Нужна справка на оказание мед услуг за 2025 год. Как можно её получить? Мы из Лысьвы", "intent": "general_info", "expected_keywords": ["mail@oclinica.ru", "электронн", "налоговую"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "только лично", "приезжайте"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Иногородний пациент. Главное — упомянуть дистанционный канал: e-mail, электронный способ или отправку в налоговую. Не «только лично»."}
|
||
{"text": "как заказать справку для налоговой", "intent": "general_info", "expected_keywords": ["207-03-03", "mail@oclinica.ru"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "clinic-lor", "по ссылке", "в личном кабинете на сайте клиники"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Самая частотная общая формулировка (count=9 в выгрузке). Достаточно одного из двух способов заявки."}
|
||
{"text": "Заказать справку для налоговой", "intent": "general_info", "expected_keywords": ["207-03-03", "mail@oclinica.ru"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "clinic-lor"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Императивная форма (count=6)."}
|
||
{"text": "Здравствуйте. Хочу заказать справку для налогового вычета", "intent": "general_info", "expected_keywords": ["207-03-03", "mail@oclinica.ru"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "clinic-lor"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Развёрнутая вежливая форма (count=4)."}
|
||
{"text": "справка фнс", "intent": "general_info", "expected_keywords": ["207-03-03", "mail@oclinica.ru"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "clinic-lor"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Экстра-короткий запрос — бот должен догадаться о теме без переспрашивания."}
|
||
{"text": "Справка налоговый вычет", "intent": "general_info", "expected_keywords": ["207-03-03", "mail@oclinica.ru"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "clinic-lor"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Назывной короткий запрос."}
|
||
{"text": "Добрый день! Нужна справка на налоговый вычет за 2024год.", "intent": "general_info", "expected_keywords": ["207-03-03", "mail@oclinica.ru"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "нельзя за прошлый", "уже поздно"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "За прошлый год — обычный сценарий, бот не должен говорить «уже поздно»."}
|
||
{"text": "Добрый вечер. Можно Заказать Справку об оплате медицинских услуг для налогового вычета за несколько лет ? Есть форма для заполнения чтоб потом в личном кабинете налоговой она появилась?", "intent": "general_info", "expected_keywords": ["207-03-03", "mail@oclinica.ru", "налоговую"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "только за один год", "нет, нельзя"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "partial", "note": "Несколько лет — не запрещено явно. Достаточно дать процедуру в любой формулировке."}
|
||
{"text": "Добрый день. Могу запросить данные для налогового вычета он-лайн? за 2022-2024 годы", "intent": "general_info", "expected_keywords": ["mail@oclinica.ru", "электронн"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "только лично"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Должен быть упомянут дистанционный канал."}
|
||
{"text": "Здравствуйте. Можно ли получить справку налоговый вычет по электронной почте?", "intent": "general_info", "expected_keywords": ["mail@oclinica.ru", "да", "электронн"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "только лично", "нет, нельзя"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Прямой да/нет — достаточно «да», или e-mail, или слова «электронн»."}
|
||
{"text": "Добрый день. Нужна справка из вашей организации для предоставления в налоговой орган. Могу получить ее удаленно?", "intent": "general_info", "expected_keywords": ["mail@oclinica.ru", "да"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "только лично"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "«Удалённо» вместо «онлайн». Достаточно подтверждения «да» или указания e-mail."}
|
||
{"text": "Добрый день! Как подать заявку на справку для ФНС на полученные услуги на ребенка", "intent": "general_info", "expected_keywords": ["207-03-03", "mail@oclinica.ru", "свидетельств"], "keywords_min": 2, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите "], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "На ребёнка — нужно минимум 2: способ заявки (телефон или e-mail) + упоминание свидетельства о рождении."}
|
||
{"text": "Доброе утро.У вас были на приёме с ребёнком в 2025г,нужно получить справку для налогового вычета как это сделать,живём не в городе", "intent": "general_info", "expected_keywords": ["mail@oclinica.ru", "свидетельств", "электронн"], "keywords_min": 2, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "только лично", "приезжайте"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "covered", "note": "Комбо ребёнок+иногородний. Минимум 2 из 3: дистанционный канал + свидетельство о рождении."}
|
||
{"text": "Здравствуйте! Хотела уточнить, когда будет готова справка для налогового вычета?", "intent": "general_info", "expected_keywords": ["оператор", "3 раб"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "завтра", "сегодня готова", "в течение часа"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "partial", "note": "Бот не знает статуса. Достаточно общего срока (3 раб. дня) ИЛИ эскалации оператору."}
|
||
{"text": "Добрый день ! 11.02.2025 я направила запрос на получение справок для налогового вычета на Масленникову Юлию Викторовну и Масленникову Киру Владимировну . Они готовы ?", "intent": "general_info", "expected_keywords": ["оператор"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "да, готовы", "нет, не готовы", "проверила", "уже отправили"], "expected_doc_section": null, "coverage": "not_covered", "note": "Конкретные ФИО+дата. Только эскалация — бот не имеет доступа к CRM."}
|
||
{"text": "Добрый день. Я получил платные медицинские услуги 11.12.2024. по договору № 24121103-6. Оплатил 2600р. Прошу направить мне на электронную почту справку об оплате медицинских услуг для представления в налоговый орган по форме, утвержденной приказом ФНС России от 08.11.2023 № ЕА-7-11/824.", "intent": "general_info", "expected_keywords": ["оператор", "mail@oclinica.ru"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "направим в течение часа", "уже отправили", "приказ от 08.11.2023"], "expected_doc_section": "Справки для налогового вычета (3-НДФЛ)", "coverage": "partial", "note": "Конкретный приказ ФНС — в датасете нет. Бот не должен подтверждать знание формы; эскалация ИЛИ e-mail для заявки."}
|
||
{"text": "Образец доверенности", "intent": "general_info", "expected_keywords": ["сайт"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите "], "expected_doc_section": "Что взять с собой на приём", "coverage": "covered", "note": "В датасете прямо: «Форма доверенности опубликована на сайте клиники». Бот должен это упомянуть."}
|
||
{"text": "Мне нужно написать доверенность, что бы с ребёнком на приём шла бабушка. Где взять образец", "intent": "general_info", "expected_keywords": ["сайт"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите "], "expected_doc_section": "Что взять с собой на приём", "coverage": "covered", "note": "Бабушка — типичный сценарий. Образец на сайте."}
|
||
{"text": "Добрый день, вы делаете тимпанометрию?", "intent": "general_info", "expected_keywords": ["тимпанометр"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "не делаем", "не проводим"], "expected_doc_section": "Направления приёма", "coverage": "covered", "note": "Тимпанометрия прямо упомянута в разделе диагностики. Ответ — да."}
|
||
{"text": "Добрый день,вы оказываете услугу по настройке слухового аппарата?", "intent": "general_info", "expected_keywords": ["сурд", "слуховых аппарат"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "не оказываем"], "expected_doc_section": "Направления приёма", "coverage": "covered", "note": "Достаточно упоминания сурдо-направления ИЛИ слуховых аппаратов."}
|
||
{"text": "Добрый день! Подскажите пожалуйста в вашей клинике делают ринопластику?", "intent": "general_info", "expected_keywords": ["оператор"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "делаем", "проводим", "выполняем"], "expected_doc_section": null, "coverage": "not_covered", "note": "Ринопластики нет в направлениях и нет в списке «не делают». Бот должен сказать «уточню», а не подтверждать."}
|
||
{"text": "Добрый день. Делают ли в клинике КТ височных костей?", "intent": "general_info", "expected_keywords": ["оператор"], "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "делаем", "проводим"], "expected_doc_section": null, "coverage": "not_covered", "note": "КТ не упоминается. Не подтверждать."}
|
||
{"text": "Здравствуйте, у вас делают кожные аллергопробы на кошку и бытовые аллергены?", "intent": "general_info", "expected_keywords": ["аллерголог", "оператор"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "сдадите анализ"], "expected_doc_section": "Направления приёма", "coverage": "partial", "note": "Аллергология есть, но конкретно про кожные пробы в датасете не указано. Допустимо: «у нас есть аллерголог, конкретику уточню у оператора»."}
|
||
{"text": "У Вас есть аллерголог?", "intent": "general_info", "expected_keywords": ["Антонова", "Скорюпина", "Суслонова", "аллерголог"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "нет аллерголога", "не принима"], "expected_doc_section": null, "coverage": "covered", "note": "Аллергологи есть. Достаточно упомянуть специальность или одну фамилию."}
|
||
{"text": "Здравствуйте! У вас есть сурдолог?", "intent": "general_info", "expected_keywords": ["Торсунова", "сурдо"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "нет"], "expected_doc_section": null, "coverage": "covered", "note": "Есть сурдоакустик Торсунова Н. С. Достаточно упомянуть либо фамилию, либо специальность."}
|
||
{"text": "Здравствуйте, у вас есть врач сомнолог?", "intent": "general_info", "expected_keywords": ["оператор", "нет"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "да, есть", "принимает"], "expected_doc_section": null, "coverage": "not_covered", "note": "Сомнолога в списке нет. Бот должен сказать «нет» ИЛИ эскалировать оператору — оба варианта валидны."}
|
||
{"text": "Здравствуйте , у вас есть невролог детский?", "intent": "general_info", "expected_keywords": ["оператор", "отоневролог", "нет"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "детский невролог принимает"], "expected_doc_section": null, "coverage": "not_covered", "note": "Невролога вообще нет, есть отоневролог Ворончихина. Любой из трёх ответов валиден: «нет», «есть отоневролог», «уточню у оператора»."}
|
||
{"text": "Добрый день. Созонова Людмила Альбертовна работает у Вас?", "intent": "general_info", "expected_keywords": ["оператор", "нет"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "да, работает", "принимает по"], "expected_doc_section": null, "coverage": "not_covered", "note": "Такого имени в списке нет. «нет» или «уточню у оператора» — оба валидны."}
|
||
{"text": "Врач хмелева работает?", "intent": "general_info", "expected_keywords": ["Хмелёва", "Хмелева"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "не работает", "нет такого"], "expected_doc_section": null, "coverage": "covered", "note": "Хмелёва М. А. есть в списке отоларингологов. Допустимо с ё или без — поэтому keywords_any."}
|
||
{"text": "Здравствуйте. Клиника находится только по одному адресу? Г. Краснокамск, Клары Цеткин 9?", "intent": "general_info", "expected_keywords": ["Цеткин", "Звезда", "закрыт"], "keywords_min": 2, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "да, только один", "приходите в Краснокамск", "временно", "Карла Маркса"], "expected_doc_section": null, "coverage": "covered", "note": "Пациент путает: Цеткин — Пермь, не Краснокамск. Минимум 2 из 3: упомянуть пермский филиал И сообщить, что Краснокамск закрыт."}
|
||
{"text": "Здравствуйте.Вы консультируете бесплатно?", "intent": "general_info", "expected_keywords": ["оператор", "цены", "стоимость"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "да, бесплатно", "первичная бесплатна"], "expected_doc_section": null, "coverage": "not_covered", "note": "Цены — отдельная ветка. Бот не должен подтверждать «бесплатно»; достаточно эскалации или сноски на стоимость."}
|
||
{"text": "Сегодня график работы", "intent": "general_info", "expected_keywords": ["9:00", "Звезда", "Цеткин"], "keywords_min": 2, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "сегодня работаем с", "до 14:00", "Краснокамск работает"], "expected_doc_section": "Режим работы", "coverage": "covered", "note": "Бот не знает сегодняшний день, но может дать общую неделю по двум работающим филиалам. Минимум 2 из 3 ключевых элементов."}
|
||
{"text": "Здравствуйте, скажите у вас есть приложение, где можно посмотреть назначение врача?", "intent": "general_info", "expected_keywords": ["Ухо Горло Нос", "RuStore", "приложение"], "keywords_any": true, "expected_must_not": ["диагноз", "назначаю", "принимайте по", "капайте по", "примите ", "нет приложения", "не разрабатываем"], "expected_doc_section": "Запись через Telegram-бот и мобильное приложение", "coverage": "partial", "note": "Приложение есть (RuStore), но конкретно «назначения врача» пока нет. Достаточно подтвердить наличие приложения любой формулировкой."}
|