От разочарованных чатов к видеоподдержке в реальном времени с Jev и Vonage

Источник: Vonage API Developer•

От разочарованных чатов к видеоподдержке в реальном времени с Jev и Vonage

Узнайте, как использовать Jev от TypeSafe AI и Vonage Video API для определения недовольства клиентов в режиме реального времени и запуска видеозвонка поддержки.

Введение

Чат-боты отлично справляются с быстрыми ответами на распространенные вопросы. Но они менее полезны, когда клиент зашел в тупик, испытывает растущее раздражение или просто хочет поговорить с живым человеком. Большинство ботов либо вообще упускают это из виду, либо отвечают шаблонным «Мне жаль это слышать», после чего задают тот же вопрос снова, что с наибольшей вероятностью приводит к потере клиента.

Что если ваше приложение сможет вовремя обнаружить этот момент и подключить живого оператора?

Смотрите далее, как создать интерфейс техподдержки на базе модели 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

  • Учетная запись 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 от 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 свободного формата в надежде на лучший результат; вы отправляете модели запросы с типизированными вопросами и получаете обратно структурированные ответы.

Этот паттерн стоит развивать дальше. Тот же цикл оценки может лечь в основу проактивной поддержки, автоматической расстановки приоритетов в тикетах или мониторинга качества разговоров с операторами. Попробуйте это везде, где вам нужно извлекать надежные, действенные сигналы из естественного языка в реальном времени.

О чём эта статья

Ещё в разделе «Телеком и сети»

Все →

Ещё от Vonage API Platform