Введение
Чат-боты отлично справляются с быстрыми ответами на распространенные вопросы. Но они менее полезны, когда клиент зашел в тупик, испытывает растущее раздражение или просто хочет поговорить с живым человеком. Большинство ботов либо вообще упускают это из виду, либо отвечают шаблонным «Мне жаль это слышать», после чего задают тот же вопрос снова, что с наибольшей вероятностью приводит к потере клиента.
Что если ваше приложение сможет вовремя обнаружить этот момент и подключить живого оператора?
Смотрите далее, как создать интерфейс техподдержки на базе модели Jev от TypeSaft AI, которая непрерывно оценивает эмоциональное состояние беседы, а затем предлагает видеозвонок через Vonage Video API в тот момент, когда ситуация начинает накаляться.
Давайте разберем, как все это работает: от логики оценки с помощью ИИ до сигнализации в реальном времени, которая соединяет расстроенного клиента с человеком, способным реально помочь.
Кратко (TLDR); Сделайте форк репозитория и попробуйте его в деле на GitHub
Что мы создаем
Приложение состоит из двух частей:
- Виджет клиента: интерфейс чата, где пользователи общаются с (симулированным) агентом поддержки на базе ИИ.
Виджет клиента: интерфейс чата, где пользователи общаются с (симулированным) агентом поддержки на базе ИИ.
- Панель оператора: интерактивный интерфейс, где сотрудники видят входящие запросы на эскалацию с подробной информацией о ее причине, а также кнопку «Ответить на звонок» для подключения к видеовызову.
Панель оператора: интерактивный интерфейс, где сотрудники видят входящие запросы на эскалацию с подробной информацией о ее причине, а также кнопку «Ответить на звонок» для подключения к видеовызову.
То, что связывает их воедино — это бэкенд на Node.js/Express, который:
- Прогоняет каждое сообщение клиента через модель Jev от TypeSafe AI для оценки настроения и степени раздражения.
Прогоняет каждое сообщение клиента через модель Jev от TypeSafe AI для оценки настроения и степени раздражения.
- Принимает решение об эскалации на основе структурированных оценок ИИ.
Принимает решение об эскалацию на основе структурированных оценок ИИ.
- Использует систему сигнализации Vonage Video для трансляции событий эскалации на панель оператора в реальном времени.
Использует систему сигнализации Vonage Video для трансляции событий эскалации на панель оператора в реальном времени.
- Запускает сессию Vonage Video для живого звонка, когда оператор принимает вызов.
Запускает сессию Vonage Video для живого звонка, когда оператор принимает вызов.
Вот общая архитектура:
Предварительные требования
Node.js 22+
- Учетная запись Typesafe AI
Учетная запись Typesafe AI
- Учетная запись Vonage
Учетная запись Vonage
Начало работы
Самый быстрый способ запустить проект — использовать GitHub Codespaces, локальная настройка не требуется.
- Сделайте форк репозитория в свой аккаунт GitHub.
Сделайте форк репозитория в свой аккаунт GitHub.
- Нажмите Code → Codespaces → Create codespace on main.
Нажмите Code → Codespaces → Create codespace on main.
- Входящий в комплект скрипт setup.js запускается автоматически и последовательно запрашивает три параметра:
Входящий в комплект скрипт setup.js запускается автоматически и последовательно запрашивает три параметра:
- Ваши ключи API Key и API Secret от Vonage (из панели управления Vonage)
Ваши ключи API Key и API Secret от Vonage (из панели управления Vonage)
- Ваш ключ API Key от TypeSafe AI (из консоли TypeSafe AI)
Ваш ключ API Key от TypeSafe AI (из вкладки TypeSafe AI console)
- Имя для вашего приложения Vonage
Имя для вашего приложения Vonage
Скрипт настройки вызывает API Vonage для создания приложения с поддержкой видео, сохраняет закрытый ключ и записывает все данные в файл .env. После этого остается только выполнить npm start.
Структурированная оценка с помощью Jev
Здесь начинается самое интересное. Большинство интеграций для определения настроения просто отправляют текст сообщения в языковую модель (LLM) и пытаются извлечь свободный текст из ответа. Такой подход ненадежен. Формат вывода может варьироваться, уверенность модели непрозрачна, и по сути вы занимаетесь сопоставлением строк в сгенерированной ИИ прозе.
Модель Jev от TypeSafe AI применяет другой подход. Вместо запроса текстового ответа вы передаете состояние (в нашем случае историю переписки) и задаете типизированные вопросы (также известные как интенты/опросы) с ограниченной формой ответов.
Модель анализирует ваши входные данные и возвращает структурированные, машиночитаемые ответы со встроенными оценками достоверности. Думайте об этом как о типизированном языке запросов для инференса ИИ.
Доступны три типа вопросов:
Функция
Что она делает
choice()
Возвращает одну из заранее определенных меток вместе с оценкой уверенности
score()
Возвращает числовое значение по размеченной шкале
noul()
Возвращает вероятность (от 0 до 1) для вопроса с ответом да/нет
Вот полный вызов функции оценки из файла server.js:
Стоит отметить несколько важных моментов:
В качестве состояния передается вся история разговора. Это означает, что Jev оценивает динамику, а не только последнее сообщение. Пользователь, который был нейтрален два сообщения назад, но теперь расстроен, получит другую оценку по сравнению с тем, кто был расстроен все время, и этот контекст очень важен для приложений поддержки.
choice() возвращает как метку, так и оценку уверенности. Вы получаете evaluation.answers.sentiment.choice (например, "frustrated" — расстроен) и evaluation.answers.sentiment.confidence (например, 0.91). Это позволяет задавать разные пороговые значения для различных эмоциональных состояний и избегать реакций на предположения с низкой степенью уверенности.
score() возвращает числовое значение по непрерывной шкале, а не просто ближайшую метку. Несмотря на то, что шкала имеет четыре именованные точки, модель возвращает число с плавающей запятой. Это позволяет улавливать «промежуточные» состояния, например, оценку 1.7 (путь к раздражению, но еще не оно), и принимать тонкие решения.
noul() создан специально для вопросов о вероятности. Вместо того чтобы просить модель сказать «да» или «нет», он возвращает коэффициент вероятности от 0 до 1. В этой демоверсии оценка выше 0.8 трактуется как подтвержденный прямой запрос на связь с человеком.
Решение об эскалации
Получив результат оценки, сервер проверяет пороговые значения:
Три триггера эскалации охватывают конкретные сценарии:
- frustrationScore >= 2: фиксирует поведенческое разочарование: короткие ответы, повторяющиеся вопросы, видимое нетерпение, даже если пользователь прямо не заявлял, что расстроен.
frustrationScore >= 2: фиксирует поведенческое разочарование: короткие ответы, повторяющиеся вопросы, видимое нетерпение, даже если пользователь прямо не заявлял, что расстроен.
- Sentiment + confidence: инициирует эскалацию, когда модель уверена, что пользователь расстроен или зол, опираясь на эмоциональный тон самого языка.
Sentiment + confidence: инициирует эскалацию, когда модель уверена, что пользователь расстроен или зол, опираясь на эмоциональный тон самого языка.
- wantsHuman: обрабатывает прямые запросы: «Могу я поговорить с кем-нибудь?», «Я хочу поговорить с живым человеком» и т. д.
wantsHuman: обрабатывает прямые запросы: «Могу я поговорить с кем-нибудь?», «Я хочу поговорить с живым человеком» и т. д.
Если вызов Jev полностью завершается с ошибкой (проблема с сетью, сбой API), сервер в качестве страховки возвращает { action: 'continue' }. Работа чата никогда не прерывается, он просто продолжает функционировать без эскалации.
Видеоуровень: сеансы и сигнализация Vonage
Когда клиент соглашается на видеозвонок, приложение должно сделать две вещи: уведомить панель оператора и настроить фактический видеосеанс. Vonage берет на себя обе эти задачи.
Архитектура сеансов
Приложение использует два типа видеосеансов Vonage:
Сеансы клиентов уникальны для каждого клиента и создаются по запросу при первой загрузке приложения пользователем. Они поставляются с токеном издателя, поэтому готовы к немедленному подключению к соответствующим видеосеансам.
Сеанс диспетчеризации — это единственный общий сеанс, к которому все сотрудники подключаются в качестве подписчиков. Он не передает видео; это исключительно сигнальный канал для трансляции событий эскалации на панели мониторинга в реальном времени.
Таким образом, мы используем постоянный недорогой сеанс в качестве шины уведомлений и сохраняем изоляцию фактических видеосеансов для отдельных вызовов.
Запуск сигнала эскалации
Когда клиент нажимает «Связать меня с оператором», клиентское приложение отправляет запрос POST на адрес /api/escalate/trigger. Затем сервер использует функцию Vonage Video Signaling для трансляции события эскалации всем, кто подписан на сеанс диспетчеризации (сотрудникам):
Браузер каждого сотрудника получает этот сигнал и отображает карточку на панели мониторинга с контекстом эмоционального состояния клиента (метка настроения, уровень фрустрации и последнее сообщение) вместе с кнопкой «Ответить на звонок».
Панель мониторинга сотрудника с очередью эскалации
Принятие вызова
Когда сотрудник нажимает «Ответить на звонок», происходят две вещи:
- Сигнал о принятии транслируется в сеанс диспетчеризации, поэтому панели мониторинга других сотрудников удаляют карточку
Сигнал о принятии транслируется в сеанс диспетчеризации, поэтому панели мониторинга других сотрудников удаляют карточку
- Сотрудник получает токен издателя для конкретного видеосеанса этого клиента и присоединяется к вызову
Сотрудник получает токен издателя для конкретного видеосеанса этого клиента и присоединяется к вызову
Со стороны клиента пользовательский интерфейс представляет собой стандартный элемент <dialog> с двумя видеоконтейнерами: один для собственного потока издателя клиента, а другой для потока подписчика-сотрудника.
Снимок экрана с видом клиента и панелью мониторинга сотрудника рядом друг с другом
Все вместе: полный процесс
Вот полный путь от разочарованного клиента до живого видеозвонка:
- Клиент отправляет сообщение в чате → клиентское приложение отправляет POST-запрос с историей беседы на адрес /api/evaluate
Клиент отправляет сообщение в чате → клиентское приложение отправляет POST-запрос с историей беседы на адрес /api/evaluate
- Сервер передает всю историю в Jev через jev.systemOne() и получает в ответ настроение, оценку фрустрации и вероятность эскалации
Сервер передает всю историю в Jev через jev.systemOne() и получает в ответ настроение, оценку фрустрации и вероятность эскалации
- Сервер оценивает показатели на предмет превышения пороговых значений. Если какое-либо пороговое значение преодолено, он возвращает действие: 'offer_escalation'
Сервер оценивает показатели на предмет превышения пороговых значений. Если какое-либо пороговое значение преодолено, он возвращает действие: 'offer_escalation'
- Клиент соглашается → клиентское приложение отправляет POST-запрос на /api/escalate/trigger
Клиент соглашается → клиентское приложение отправляет POST-запрос на /api/escalate/trigger
- Сервер отправляет Vonage Video Signal в сеансе диспетчеризации, содержащий идентификатор сеанса клиента и эмоциональный контекст
Сервер отправляет Vonage Video Signal в сеансе диспетчеризации, содержащий идентификатор сеанса клиента и эмоциональный контекст
- Браузер сотрудника получает сигнал → на панели мониторинга появляется карточка
Браузер сотрудника получает сигнал → на панели мониторинга появляется карточка
- Сотрудник нажимает «Ответить на звонок» → сервер транслирует статус принятия и возвращает токен издателя для сеанса клиента
Сотрудник нажимает «Ответить на звонок» → сервер транслирует статус принятия и возвращает токен издателя для сеанса клиента
- Обе стороны теперь находятся в одном видеосеансе Vonage
Обе стороны теперь находятся в одном видеосеансе Vonage
Попробуйте сами
Репозиторий создан для того, чтобы вы могли перейти от нуля к работающей демоверсии менее чем за пять минут с помощью GitHub Codespaces:
- Сделайте форк:
Сделайте форк:
- Откройте в Codespaces → скрипт setup.js запустится автоматически
Откройте в Codespaces → скрипт setup.js запустится автоматически
- Добавьте свои учетные данные Vonage и TypeSafe AI
Добавьте свои учетные данные Vonage и TypeSafe AI
- npm start
npm start
После запуска сервера откройте две вкладки браузера (одна для просмотра клиентом, а другая для панели мониторинга сотрудника) и попробуйте ввести что-то вроде: «Я объяснял это уже три раза, и никто мне не помогает». Посмотрите, что возвращает Jev и как реагирует панель мониторинга.
Что дальше?
Эта демоверсия намеренно является отправной точкой. Вот несколько направлений, которые стоит изучить дальше:
- Запись
Запись
- Демонстрация экрана
Демонстрация экрана
- Транскрипция
Транскрипция
- Пройдите один из наших учебных курсов по Video API
Пройдите один из наших учебных курсов по Video API
Заключение
Эту демоверсию делает интересной не только видеозвонок, но и уровень принятия решений, который его инициирует. Сочетание возможностей передачи сигналов в реальном времени от Vonage Video и структурированной оценки от TypeSafe AI означает, что логика эскалации является явной, настраиваемой и поддающейся отладке. Вы не извлекаете настроения из ответа LLM свободного формата в надежде на лучший результат; вы отправляете модели запросы с типизированными вопросами и получаете обратно структурированные ответы.
Этот паттерн стоит развивать дальше. Тот же цикл оценки может лечь в основу проактивной поддержки, автоматической расстановки приоритетов в тикетах или мониторинга качества разговоров с операторами. Попробуйте это везде, где вам нужно извлекать надежные, действенные сигналы из естественного языка в реальном времени.











