ИИ7 мин чтения
Что мы узнали, подключив локальный LLM к телефонной линии
Услуги голосового ИИ с управляемым обслуживанием оплачиваются по минутам, поэтому вознаграждением для работающего агента становится более крупный счет. Разработка Vocale для работы как на хостируемом API, так и на частном графическом процессоре (GPU) позволила нам понять четыре вещи о том, с чем на самом деле возникают сложности, когда модели переносятся на внутренние серверы.

Каждая платформа искусственного интеллекта для обработки голосовых вызовов взимает плату за минуту. Это звучит разумно, пока вы не подключите такую систему к линии поддержки и она не начнёт работать, ведь вознаграждением для хорошего оператора является большее количество отвеченных звонков, а большее количество отвеченных звонков приводит к увеличению счета. Чем лучше работает система, тем дороже она обходится. Для линии поддержки, которая существует именно для того, чтобы принимать большой поток звонков, это неправильный стимул.
Мы создали Vocale для обслуживания телефонной линии компании: система снимает трубку с первого звонка, отвечает в соответствии с собственными руководствами и политиками компании и открывает заявку в службу поддержки, когда честный ответ заключается в том, что к этому вопросу должен приступить специалист. Еще на раннем этапе мы приняли решение, которое определило всё последующее развитие. Платформа предоставляет два движка в рамках одного продукта. На хостинговом тарифе распознавание речи, логический анализ и синтез речи обеспечиваются API стороннего поставщика, а каждая минута тарифицируется. На уровне самостоятельного хостинга все три компонента работают на графическом процессоре (GPU), которым управляет сама компания; ни аудиозаписи, ни документы не покидают здание, а стоимость звонка сводится к затратам на электроэнергию.
С точки зрения звонящего оба уровня работают одинаково. Самое интересное заключалось в том, как добиться этого, и вот что мы узнали.
Что на самом деле входит в цикл
Голосовой агент — это не просто чат-бот с прикрученным микрофоном. Каждая очередь в диалоге представляет собой цепочку, и каждое звено вносит задержку, которую человек может услышать.
Аудиосигнал поступает через WebRTC в комнату LiveKit. Система обнаружения голосовой активности (мы используем Silero) определяет, когда звонящий фактически начал и закончил говорить. Буферизованный аудиосигнал поступает в Faster-Whisper и возвращается в виде транскрипта. Этот ход записывается в Postgres, затем контекст чата и история передаются в языковую модель, которой на нашем самостоятельно развернутом уровне является Qwen3-8B, обслуживаемая vLLM. Токены возвращаются потоком, нормализуются и объединяются в целые предложения, и только после этого поступают в XTTS-v2, который преобразует их в аудиофреймы, которые возвращаются обратно через WebRTC.
Четыре модели, одна запись в базу данных и один цикл передачи — и всё это укладывается в паузу, которую абонент готов терпеть, прежде чем произнести «алло?» в тишине.
Запустить эту цепочку локально — не самая сложная часть. Запустить её локально со скоростью разговора на оборудовании, которое действительно может приобрести средняя компания, — вот в чём заключается инженерная задача.
Урок первый: прерывание — это особенность продукта, а не редкий случай
Звонящие перебивают оператора. Они делают это постоянно и начинают говорить, как только услышали достаточно — обычно это происходит примерно на шестом слове из двадцатисловного ответа. Агент, который продолжает говорить, создает впечатление неисправности, от которой трудно оправиться, потому что человеческий инстинкт подсказывает говорить громче, и теперь обе стороны говорят одновременно в систему, которая не слушает ни одну из них.
Отключение исходящего звука — это очевидная половина решения. Та половина, которую легко упустить из виду, — это стенограмма. Если в записи самого оператора по-прежнему содержится полное предложение, которое он намеревался произнести, разговор продолжается с того места, как будто звонок действительно состоялся. Задайте дополнительный вопрос о «втором варианте, который вы упомянули», и оператор уверенно ответит о том, чего звонящий так и не услышал.
Поэтому при обнаружении речи мы останавливаем аудиозапись, а затем сокращаем сохраненную часть речи агента до того, что было действительно сказано вслух. Разговор продолжается с того момента звонка, который услышал абонент, а не с того, который планировала система.
Урок второй: задержку устранить невозможно, поэтому её нужно заполнить
Когда для ответа на вопрос требуется факт, агент перед ответом выполняет поиск по индексированным документам. Этот поиск занимает достаточно времени, чтобы восприниматься как пропущенная фраза. Тишина во время телефонного разговора не является нейтральной. Она вызывает тревогу.
Мы вставляем короткую, естественную «заполняющую» фразу примерно через полсекунды и отменяем её, если поиск завершится раньше. Это небольшой элемент поведения с огромным эффектом: он даёт поиску необходимое время, и ни одна секунда этого времени не воспринимается абонентом как «мертвая тишина».
Это имеет ещё большее значение на уровне локального хостинга, а не меньше. Локальная модель на одном графическом процессоре (GPU) имеет иные характеристики задержки, чем API гипермасштабируемой платформы, и они не всегда хуже. Просто их распределение отличается. Разработка диалога с учетом переменной задержки позволила нам менять место работы моделей, не меняя при этом восприятие агента.
Урок третий: письменный текст не читается вслух
Денежные суммы, даты в виде цифр, время, аббревиатуры, коды товаров. Все это нормально выглядит на экране, но звучит неправильно в речи. Предоставьте речевой модели «1 250,00 к 15.03», и вы услышите то, что ни один человек никогда не произносил вслух.
Мы поместили между языковой моделью и речевой моделью слой нормализации, который переписывает суммы, даты, время и аббревиатуры в их устную форму для каждого языка, прежде чем они попадают на синтез. Vocale работает на шести языках, и этот слой реализован отдельно для каждого языка, поскольку правила действительно различаются. Здесь нет простого решения, когда достаточно написать код один раз для английского и просто перевести его.
Это самый неприглядный компонент системы, но один из тех, которые в наибольшей степени влияют на то, будет ли агент звучать как человек или как автоответчик.
Урок четвёртый: ограничивающим фактором является VRAM, а не вычислительная мощность
Вот что удивило нас больше всего и что больше всего меняет подход к подбору аппаратного обеспечения.
Во время сеанса живого голосового общения модели хранятся в видеопамяти на протяжении всего звонка. Поэтому параллелизм ограничивается объемом VRAM, а не чистой пропускной способностью. У вас может быть видеокарта с запасом вычислительной мощности, которая не сможет принять ещё один звонок, потому что негде разместить модели.
Хуже того, если по умолчанию позволить фреймворку объединять GPU в пул, задачи обработки речи и языка попадают на одну и ту же карту и начинают «забирать ресурсы» друг у друга. Симптомом этого является не ошибка, а замедление разговора под нагрузкой, которое не связано с каким-либо конкретным компонентом. Теперь мы распределяем сеансы по картам и явно распределяем рабочую нагрузку между ними.
Если вы планируете самостоятельное развертывание, в первую очередь рассчитывайте количество одновременных запросов с учётом объёма видеопамяти. Всё остальное вытекает из этого числа.
Что остаётся без изменений
Принцип работы не меняется. На обоих уровнях агент отвечает на основе загруженных компанией документов, а не из памяти модели: вопрос, требующий факта, запускает поиск, и ответ формируется из полученных результатов. Если ничего подходящего не найдено, правильным ответом будет сообщить об этом и предложить открыть заявку — и именно такой ответ агент и дает. Меньший размер локальной модели не дает права на большее количество «галлюцинаций», поскольку модель изначально не является источником истины. Им является поиск информации.
Процесс передачи вызова также не меняется. Когда агент не может помочь, он фиксирует тему, контактные данные и приоритет, пока звонящий ещё находится на линии, создаёт заявку и прикрепляет стенограмму разговора.
В этом и заключается смысл построения обоих уровней на основе одного и того же поведения. Переход между ними — это вопрос настройки, а не перестройки системы.
Так какой вариант выбрать?
Честно говоря: начните с хостинга.
Хостинг — это самый быстрый способ выяснить, полезен ли вообще оператор на вашей линии, и это вопрос продукта, а не инфраструктуры. Наша собственная консоль оценила это примерно в шесть центов за минуту разговора. Для компании, принимающей несколько десятков звонков в день, это не та статья расходов, которую стоит оптимизировать в первую очередь.
Самостоятельное хостинг окупается при достижении двух пороговых значений, и это разные пороги.
Первый — это объем. Стоимость, рассчитываемая по факту, растёт по мере роста объёма, а стоимость оборудования — нет, поэтому существует точка пересечения, в которой использование GPU просто обходится дешевле. Где именно находится эта точка, зависит от вашего объема звонков, и вам следует измерить его, а не предполагать. Именно по этой причине Vocale рассчитывает расходы по каждой модели и каждой организации: выбор между API и платой должен быть решением, подкрепленным цифрами, а не предметом спора.
Второй порог не имеет ничего общего с деньгами. Некоторые компании не могут передавать аудиозаписи звонков, стенограммы или внутренние документы третьим лицам из-за требований регулирующих органов, условий договора с клиентом или внутренней политики. Для них локальный уровень не является вариантом оптимизации. Это единственная версия данного продукта, существование которой разрешено, и отсутствие поминутной оплаты не делает хостируемый уровень приемлемым.
Эти два порога стоит разделять при оценке любого поставщика голосового ИИ. Платформа, предлагающая только инференцию с оплатой по факту, тем самым молчаливо решает, что второй порог к вам не относится.
Краткое изложение
Локальная инференция на линии поддержки сегодня вполне практична. Модели достаточно хороши, а инструментарий (vLLM, Faster-Whisper, XTTS-v2, LiveKit) достаточно зрелый, так что конвейер не представляет риска.
Риски заключаются в том, что никто не демонстрирует: прерывание речи, создание впечатления присутствия во время размышлений, чтение цифр вслух как человек и понимание того, сколько разговоров фактически помещается на одной карте. Если вы справитесь с этими проблемами, выбор между хостируемым API и собственным графическим процессором станет тем, чем он и должен был быть с самого начала, — просто строкой в бюджете, а не ограничением на то, что вам разрешено создавать.
- Local LLM
- Voice AI
- Self-hosted
- RAG
- vLLM
- LiveKit
- Support automation