AAYMA
RU
Войти

Voice Router

Голосовой робот для контакт-центра страховой компании: распознаёт русскую, казахскую и смешанную речь, выбирает сценарий из 40, выполняет…

Рабочий MVP
Команда «Selea» 10💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Selea
Кейс HackAlem.ai: Коммуникации — Halyk Bank · кейс 2
Стадия: Рабочий MVP

Задача кейса: «Voice Router»: голосовой AI, маршрутизирующий звонки в контакт-центре страховой компании

Суть

Голосовой робот для контакт-центра страховой компании: распознаёт русскую, казахскую и смешанную речь, выбирает сценарий из 40, выполняет mock-действия и отвечает голосом. Супервизор видит транскрипт, причины выбора и задержки.

Как устроено

Микрофон → OpenAI STT → контекст диалога (до 10 пар реплик) → LLM Router со Structured Outputs возвращает сценарий, confidence, причины и альтернативы → сценарный движок выполняет одно из 31 mock-действия, отвечает по базе знаний и mock backend → OpenAI TTS. Несколько намерений в одной реплике ставятся в очередь, при смене темы текущий сценарий уходит в стек. Необратимые действия требуют подтверждения, есть передача оператору с полным контекстом. Сервер на стандартной библиотеке Python.

Ключевые решения

  • LLM-маршрутизация
  • Structured Outputs
  • стек/очередь намерений
  • slot filling
  • handoff оператору
  • оценка на dev-наборе

Метрики

Открытый dev-набор: 104 из 104 по основному и полному маршруту

Особенности

Мультиинтентность через очередь тем и стек сценариев: система возвращается к отложенной теме и закрывает только ту, что названа явно. Отдельно проверяются многошаговые пограничные диалоги (evaluate_edges.py). Сторонние Python-пакеты не нужны.

Стек

Python · vanilla JavaScript · HTML/CSS

Модели

gpt-4o-mini · gpt-4o-mini-transcribe · gpt-4o-mini-tts


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-5c54c0a5-selea.

README

README.md

Voice Router

Голосовой AI-робот для контакт-центра. Клиент говорит свободным текстом на русском или казахском языке, система сохраняет контекст разговора, выбирает один или несколько из 40 сценариев и формирует голосовой ответ. Супервизор видит транскрипт, причины выбора, альтернативы, действия и задержки.

Что реализовано

  • голосовой ввод через микрофон и резервный текстовый ввод;
  • OpenAI STT, LLM-маршрутизация и TTS;
  • 40 бизнес-сценариев и 3 системных маршрута;
  • русский, казахский и смешанная речь;
  • несколько намерений в одной реплике;
  • история до 10 пар реплик, очередь запросов и возврат к отложенной теме;
  • Structured Outputs с выбранным сценарием, уверенностью и альтернативами;
  • все 31 mock-действие из actions.json;
  • ответы на основе базы знаний и mock backend;
  • подтверждение перед необратимыми действиями;
  • очередь оператора с полным контекстом разговора;
  • панель супервизора со статистикой, сомнениями, ошибками и задержками;
  • официальный открытый dev-набор и локальные регрессионные тесты.

Быстрый запуск

Требуется Python 3.11 или новее. Сторонние Python-пакеты не нужны.

PowerShell:

$env:OPENAI_API_KEY="ваш-новый-ключ"
$env:OPENAI_MODEL="gpt-4o-mini"
python app.py

Откройте http://127.0.0.1:8000.

Без OPENAI_API_KEY интерфейс запускается в демонстрационном режиме. Для реальной маршрутизации, распознавания и синтеза речи ключ обязателен. Не записывайте ключ в исходный код или JSON-файлы.

Как работает система

Микрофон или текст
        ↓
OpenAI STT
        ↓
Контекст диалога и активные темы
        ↓
LLM Router → сценарий, confidence, причины, альтернативы
        ↓
Сценарный движок → mock-действия и ответ из данных
        ↓
OpenAI TTS + трассировка для супервизора

Если в реплике несколько запросов, первый становится активным, а остальные сохраняются в очереди. При смене темы текущий сценарий помещается в стек. После явного завершения или отмены система закрывает только указанную тему.

Структура проекта

.
├── app.py                 # HTTP-сервер, LLM Router, действия, STT/TTS
├── data/                  # все JSON-данные и результаты оценки
├── static/
│   ├── index.html         # интерфейс
│   ├── styles.css         # дизайн
│   └── app.js             # клиентская логика
├── predict_dev.py         # получение предсказаний на dev-наборе
├── evaluate.py            # расчёт метрик dev-набора
├── evaluate_edges.py      # многошаговые пограничные проверки
├── test_router.py         # локальные тесты логики
└── README.md

Данные

Все JSON-файлы находятся в папке data/.

ФайлНазначение
scenarios.json40 сценариев, примеры, границы, слоты и действия
slots.jsonТипы слотов и вопросы на русском и казахском
actions.json31 mock-действие и очереди операторов
knowledge_base.jsonПродукты, тарифы, офисы, клиники и правила
mock_backend.jsonТестовые клиенты, полисы, выплаты и платежи
dialogs_sample.jsonРазмеченные примеры диалогов
dev_utterances.json104 открытых тестовых реплики
edge_dialogues.jsonПограничные многошаговые диалоги
predictions.jsonПоследние предсказания модели; не добавляется в Git
dev_metrics.jsonПоследние рассчитанные метрики

Mock backend работает в памяти. Созданные полисы, заявки и изменения контактов сбрасываются после перезапуска сервера.

Проверка

Локальные тесты без запросов к OpenAI:

python -B -m unittest test_router.py

Проверка синтаксиса:

python -B -m py_compile app.py evaluate.py predict_dev.py evaluate_edges.py
node --check static/app.js

Получение предсказаний и расчёт метрик:

$env:OPENAI_API_KEY="ваш-новый-ключ"
python predict_dev.py
python evaluate.py

Результаты сохраняются в data/predictions.json и data/dev_metrics.json. Последний прогон открытого набора: 104 из 104 по основному и полному маршруту. Это не гарантирует такой же результат на скрытых данных.

Проверка многошаговых пограничных диалогов:

python -B evaluate_edges.py

API

МетодАдресНазначение
GET/api/configМодели, количество сценариев и действий
GET/api/statsСтатистика супервизора и dev-метрики
GET/api/handoffsПоследние передачи оператору
POST/api/routeМаршрутизация текстовой реплики
POST/api/transcribeРаспознавание аудио
POST/api/speechСинтез ответа

Пример текстового запроса:

{
  "session_id": "demo-1",
  "text": "Деньги списались, но полис не появился. И ещё нужен офис в Алматы"
}

Переменные окружения

ПеременнаяЗначение по умолчанию
OPENAI_API_KEYне задано
OPENAI_MODELgpt-4o-mini
OPENAI_STT_MODELgpt-4o-mini-transcribe
OPENAI_TTS_MODELgpt-4o-mini-tts
OPENAI_TTS_VOICEmarin
OPENAI_SERVICE_TIERfast
OPENAI_BASE_URLhttps://api.openai.com/v1
EVAL_WORKERS4
PORT8000

Ограничения

  • бизнес-интеграции сейчас являются mock-реализацией;
  • данные не сохраняются после перезапуска;
  • dev-набор открытый и использовался при разработке;
  • для production нужны авторизация, постоянная база данных, аудит действий, независимый hidden-набор и отдельная проверка казахского STT на реальном аудио.
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
6
Авторы
1
Файлы
20
Ветки
1

Авторы коммитов

BerdibekGTX 6

История коммитов

  • 2026-09-23 17:42finishBerdibekGTX
  • 2026-09-23 17:13v1BerdibekGTX
  • 2026-09-23 16:16change the design and fix the featuresBerdibekGTX
  • 2026-09-23 15:20testingBerdibekGTX
  • 2026-09-23 14:23Описание того, что сделалиBerdibekGTX
  • 2026-09-23 14:17testBerdibekGTX
Структура репозитория (20 файлов)
.DS_Store
.gitignore
README.md
app.py
data/actions.json
data/dev_metrics.json
data/dev_utterances.json
data/dialogs_sample.json
data/edge_dialogues.json
data/knowledge_base.json
data/mock_backend.json
data/scenarios.json
data/slots.json
evaluate.py
evaluate_edges.py
predict_dev.py
static/app.js
static/index.html
static/styles.css
test_router.py

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.