Уверенный фильтр нас подвел
Голосовой бот звонит по телефонии: двуязычные скрипты, Казахстан и Россия. Задача на вид простая: слушать абонента, понимать намерение, вести диалог. С подвохом: телефонная линия шумная, эхо, фоновые звуки, и бот не должен прерывать себя на них.
Столкнулись с явлением: бот отвечал на детский крик, на эхо своего голоса, на случайный звук как на согласие абонента. Первое, что приходит в голову: фильтр по уверенности распознавания. Yandex SpeechKit должен сказать, насколько уверен в слове? Открыли логи, confidence везде единица. На все подряд: на настоящие слова, на шум, на помехи. Сигнал мертв.
Попытались стандартным путем: поднять debounce-паузы, увеличить минимальную длину токена для turn-detection. Откатили два патча подряд, на живых звонках не помогло, просто изменился характер ошибок. Пришла неприятная мысль: мы латаем следствие, ловим не ту границу. Контроль должен быть на другом слое, не на доверии к распознавателю.
Решили архитектурно. Три слоя защиты: echo-guard проверяет, говорил ли бот эти токены недавно (это эхо громкой связи); noise-gate отсекает одиночные короткие неизвестные токены (шум, не слово); промпт-правило не приписывает намерение мусору. Комбинация держит.
Главный урок: два-три патча подряд провалились, это признак неправильной границы. Классификацию шума нельзя делать через фильтр распознавателя, если распознаватель обо всем говорит с одинаковой уверенностью. Нужна структура на другом архитектурном уровне.
#голосовойбот #архитектура #диагностика #LLM #телефония #разработка #классификация #структура