Тестовое задание · ветка «Возврат / двойное списание»

AI-ветка возврата средств для бота Penny

Родитель, с которого дважды списали за детскую подписку, приходит расстроенным. Ниже — аудит текущего бота, проектирование новой AI-ветки и живой прототип, которого можно потрогать прямо на этой странице.

Часть 1

Аудит текущего бота

Проходил ветку возврата в реальном приложении Kids360. Вот что происходит сейчас.

Как ветка работает сегодня

  1. Приветствие Penny → «Нажмите здесь, чтобы продолжить» → «Выберите тему» → «Вопросы по оплате».
  2. Отдельный пункт «Списали деньги два раза».
  3. Бот просит уточнить банк карты (например, «Т-Банк»).
  4. Выдаёт пошаговую инструкцию под конкретный банк, как достать чек, с картинкой-примером.
  5. Просит прислать скриншот чека («Отправьте скриншот чека мне 👇»).
  6. Если чек не распознался — эскалирует на оператора и всё равно просит прислать файлы.
Бот спрашивает банк карты
Бот спрашивает банк карты, а не канал подписки — хотя для возврата важнее канал.
Инструкция по банку
Инструкция «сходи в свой банк и достань справку» — под каждый банк своя, не масштабируется.
Отправьте скриншот чека
«Отправьте скриншот чека мне 👇» — ровно здесь пользователь застревает на загрузке файла.

Три корневые проблемы

P1 · логика

Перекладывает труд на родителя

Вместо решения — инструкция «достань чек в своём банке». Под каждый банк своя, не масштабируется.

P2 · интерфейс

UX-баг прикрепления файла

Кнопка загрузки спрятана в отдельном сообщении и неудобна — застревание в худший момент.

P3 · нет AI

Ручное чтение чека

Оператор глазами читает сумму, дату, назначение. Рутина, которую закрывает vision-модель.

Почему выбрана именно эта ветка: в базе знаний Kids360 есть статьи про отмену, активацию, покупку и восстановление подписки — но нет статьи про возврат. Сценарий держится только на ручном труде саппорта. Это самая «дырявая» ветка — потому и переделана на AI.
ПроблемаЧто делает Penny 2.0
P1 — перекладывание трудаПонимает суть текстом; сначала выясняет канал подписки (App Store / Google Play / оператор), а не банк карты.
P2 — UX прикрепленияЗагрузка чека — явная кнопка прямо в поле ввода, часть основного потока.
P3 — ручное чтениеVision-распознавание суммы/даты/назначения; человек получает готовую выжимку.
Часть 2

Проектирование новой ветки

Принцип: бот сначала понимает суть и канал подписки, только потом действует. Чек распознаётся ботом, а не превращается в домашнее задание. Человек подключается для решения о возврате, а не для чтения чека.

Схема диалога

[СТАРТ] Родитель пишет свободным текстом
        («с меня два раза списали за подписку», «верните деньги»)
   │
   ▼
[1] ЭМПАТИЯ + РАСПОЗНАВАНИЕ НАМЕРЕНИЯ
    Короткое человеческое «понимаю, разберёмся» + это ветка возврата.
   │
   ▼
[2] КАНАЛ ПОДПИСКИ  ← ключевая развилка (старый бот её пропускал)
    «Где оформлена подписка — App Store, Google Play или оператор?»
   │
   ├─ App Store ──► возврат через Apple (reportaproblem.apple.com);
   │                Kids360 не возвращает напрямую, но подтверждает
   ├─ Google Play ─► возврат через Google Play / поддержку Kids360
   └─ Оператор ────► через оператора
   │
   ▼
[3] УТОЧНЕНИЕ ДЕТАЛЕЙ — сколько раз, на какую сумму, когда
   │
   ▼
[4] ЗАПРОС ЧЕКА  ← фикс UX-бага: явная кнопка загрузки
   │
   ▼
[5] РАСПОЗНАВАНИЕ ЧЕКА (vision) — сумма, дата, назначение, канал
   │
   ├─ confidence низкий / не чек ──► переснять чёткий скрин ИЛИ эскалация
   ▼
[6] ПОДТВЕРЖДЕНИЕ — «Вижу списание N ₽ от DD.MM. Всё верно?»
   │
   ▼
[7] ЗАЯВКА + ЭСКАЛАЦИЯ НА РЕШЕНИЕ
    Готовая структурированная заявка → специалист принимает решение.
    Бот НЕ обещает возврат — описывает процесс.
   │
   ▼
[КОНЕЦ] Родитель понимает, что дальше; заявка с полным контекстом.

Системный промпт — ключевые правила

Полный текст — в app/prompts.py, база знаний — в app/knowledge_base.py.

Edge cases

1. Прислали чек, ничего не написав. Бот всё равно уточняет канал, если его не видно из чека, — не пропускает шаг диагностики.
2. Чек нечитаемый / низкий confidence. Бот не «додумывает» сумму: просит переснять чёткий скрин или эскалирует с пометкой «чек нечитаем».
3. Эмоциональное «верните немедленно». Усиленная эмпатия + честность без обещаний; при агрессии/просьбе человека — [ESCALATE] с контекстом.
(бонус) 4. Канал — App Store. Kids360 технически не возвращает за покупку в App Store. Бот честно даёт направление (Apple), но фиксирует обращение и сопровождает, а не «отфутболивает».
Почему это правильно для детского сервиса: возврат денег — чувствительная зона. Бот берёт на себя рутину (распознать чек, собрать заявку), но не берёт то, что нельзя автоматизировать без риска, — обещание возврата и решение по спорным случаям.
Часть 3

Живой прототип

Та же Penny, что в приложении, — но бот стал умным (понимает суть, распознаёт чек, не гоняет по кнопкам) и починена загрузка файла. Ответы даёт реальный gpt-4o, ключ живёт на сервере. Попробуйте: напишите «с меня дважды списали за подписку» и прикрепите скриншот чека.

🧑🐧👩
Support
Поможем найти ответ на ваш вопрос

Эндпоинты: POST /api/chat · POST /api/recognize (vision) · GET /api/config. Ключ OpenAI — только в .env на сервере.