Dev48
ЯЗЫК
  • О нас
  • Услуги
  • Индустрии
  • Технологии
  • Статьи
  • Контакты
Забронировать звонок
    Главная/Статьи/Pochemu vash golosovoy ii agent kazhetsya slomannym sohranenie shvov
Dev48

© 2026 · All rights reserved.

Почему ваш голосовой ИИ-агент кажется сломанным: сохранение швов

Источник: Signalwire

Почему ваш голосовой ИИ-агент кажется сломанным: сохранение швов

Источник: Signalwire

Шов нельзя удалить. Его можно только переместить.

28 сентября 2026 г.•Обновлено: 28 сентября 2026 г.

Мой интернет-провайдер внедрил ИИ-агента взамен телефонного меню. Я позвонил ему пару недель назад.

Он спросил, по какому вопросу я звоню. Затем наступило шесть секунд тишины — достаточно долго, чтобы я сказал «алло?» в пустоту, как в 1998 году. Система вернулась, сказала, что узнала мой номер, и спросила, звоню ли я по поводу этого счета. Да. Затем она сообщила, что собирается меня аутентифицировать, и трубку взял совершенно другой голос. Роботизированный. Каждые пятнадцать секунд: «МФА ОТПРАВЛЕНО. ПОДТВЕРДИТЕ МФА». Я спросил, куда именно что-то было отправлено. «НЕВЕРНЫЙ МФА».

В конце концов я нашел электронное письмо с шестизначным кодом и зачитал его. Вернулся дружелюбный голос, сообщил, что ничем не может помочь, и перевел меня на живого человека. Человек спросил, по какому вопросу я звоню, и сказал, что мне нужно будет пройти аутентификацию.

Вся ИИ-часть этого звонка была хуже, чем бесполезна. Она заставила меня делать всё дважды.

Вот что должно вас в этом беспокоить: каждая отдельная деталь работала. Модель поддерживала разговор. Распознавание речи было точным. Голоса звучали нормально. Аутентификация аутентифицировала. Ничто в этом стеке не сломалось, а звонок все равно оказался дерьмом.

Звонок оказался дерьмом из-за мест, где эти детали соединялись друг с другом.

В этой статье вы найдете более подробный разбор

  • Вы не можете устранить шов — границу, где соединяются две части вашего голосового приложения. Вы можете только переместить его. Каждый шов стоит вам задержки, согласованности или ответственности за сбой.

Вы не можете устранить шов — границу, где соединяются две части вашего голосового приложения. Вы можете только переместить его. Каждый шов стоит вам задержки, согласованности или ответственности за сбой.

  • На реплику в разговоре отводится около 1500 миллисекунд, прежде чем человек почувствует задержку. Размещение — это арифметика: каждый шов в этой реплике расходует один и тот же бюджет времени.

На реплику в разговоре отводится около 1500 миллисекунд, прежде чем человек почувствует задержку. Размещение — это арифметика: каждый шов в этой реплике расходует один и тот же бюджет времени.

  • Упаковка всего в один промпт не убирает швы. Она прячет их там, где у вас нет рычагов управления.

Упаковка всего в один промпт не убирает швы. Она прячет их там, где у вас нет рычагов управления.

Почему голосовые агенты дают сбой, когда каждый компонент работает?

Потому что сбои происходят между компонентами, а не внутри них. Любое приложение представляет собой набор соединенных вместе частей, и каждое место соединения двух частей я буду называть швом. Распознавание речи передает данные модели. Модель передает данные синтезу речи. Агент обращается к вашему CRM. Он передает управление человеку. Ваше приложение представляет собой набор таких границ с логикой, протянутой между ними.

Можно ли спроектировать голосовой конвейер с меньшим количеством движущихся частей?

Вы можете переставлять части местами. Вы не можете избавиться от них, и именно в этом люди заблуждаются. Если вы думаете, что устранили шов, вы его просто переместили, спрятали внутри библиотеки, опустили на уровень ниже или купили у вендора, который теперь владеет им вместо вас. Он никуда не делся. Он сохранился. Единственное, что вы действительно контролируете, — это то, где он находится.

Я верил в нечто подобное в течение двадцати лет в отношении единых точек отказа. Я начинал с создания крупномасштабных веб-приложений, и урок был тем же: вы никогда не устраняете единую точку отказа. Вы перемещаете ее туда, где можете ею управлять, где сбой обходится вам дешевле всего. Здесь то же самое.

Что на самом деле идет не так на границах между компонентами?

Три вещи, причем один шов может ударить по вам по всем трем фронтам одновременно.

Это стоит времени. Каждая пересылка — это миллисекунды, которые вы не вернете.

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

Это стоит поломок. Швы ломаются, и тот, кто держит шов, отвечает за то, что происходит при его поломке.

Каждый сбой в остальной части этой статьи — это либо одна из этих трех проблем, либо две из них одновременно.

Почему мой голосовой агент замолкает на несколько секунд?

Обычно потому, что он ждет ответа туда и обратно (round trip), который в веб-приложении был бы незаметен. В вебе шов почти ничего не стоит, и вас правильно приучили в это верить.

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

Разговор — это совсем другая среда. Здесь нет спиннера. Нет визуального сигнала о том, что идет какая-то работа. Есть только тишина, а тишина в разговоре означает для человека вполне конкретную вещь: либо вы его не услышали, либо что-то сломалось. Двести миллисекунд, которые вы никогда не заметите на странице, при звонке ощущаются как заминка. Две секунды — это мертвая тишина, и звонящий говорит: «алло?»

Кстати, вы уже знаете этот сбой по веб-разработке. Это N+1 запрос на пути рендеринга или болтливый API-запрос внутри цикла, где каждый отдельный запрос работает быстро, а в сумме получается катастрофа. Разница в том, что в вебе вы узнаете об этом, когда страница начинает казаться вялой. Во время звонка вы узнаете об этом, когда собеседник перебивает вашего агента или вешает трубку.

Голосовые агенты, построенные на веб-рефлексах, на демонстрациях выглядят великолепно. Один звонок, локальный стек, чистая сеть, пара реплик. А потом они сталкиваются с реальным разговором, который длится тридцать реплик на реальном телефонном соединении, и то, что казалось нормальным на трех репликах, становится невыносимым на тридцати.

Какую задержку может выдержать реплика голосового ИИ?

Около полутора секунд. Это примерно тот бюджет времени, прежде чем человек на другом конце провода начнет чувствовать задержку, прежде чем он скажет «алло?», прежде чем он решит, что линия оборвалась, прежде чем он перебьет вашего агента.

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

Убрать лишнее с критического пути — это и есть настоящее мастерство, потому что далеко не каждый шов обязан работать быстро. Допустим, вам нужен поиск по CRM. Если вы можете запустить его в начале звонка, запихнуть запись в контекст и использовать ее минуту спустя, когда она понадобится, не имеет значения, где этот поиск находится и насколько он медленный. Он завершился, пока никто ничего не ждал.

Но если звонящий говорит что-то на третьем шаге, чего вы никак не могли предсказать, и эта запись нужна вам прямо сейчас, посреди предложения, чтобы ответить ему — этот запрос должен быть быстрым. Единственный способ сделать его быстрым — избавиться от лишних пересылок, а значит, он должен находиться там же, где живет звонок. Тот же поиск. Противоположное размещение. Что это определяет? Не правило, которое мы можем вам дать. Это форма вашего конкретного сценария звонка и то, укладывается ли реплика в отведенный бюджет.

Один сорванный такт — еще не катастрофа. Звонок может стерпеть один-два медленных такта. В моменте это не будет выглядеть естественным, но люди прощают такое точно так же, как прощают собеседнику по телефону пару секунд на раздумье. Чего они не прощают, так это тридцать тактов, каждый из которых балансирует на грани выделенного бюджета. Ни один из тактов технически не был просрочен, но весь звонок в целом получается изнурительным.

И когда вы знаете, что впереди зазор, вы можете его прикрыть. Если поиск не может быть асинхронным и займет четыре секунды, агент может поступить так же, как человек: сказать «секунду, поднимаю ваш аккаунт». Эти четыре секунды обходятся в ту же цену, но они перестают быть необъяснимым молчанием. Вы отыгрываете время назад, задавая ожидание.

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

Именно поэтому мой звонок в интернет-провайдер — такой наглядный пример. Я почти уверен, что те шесть секунд ушли на поиск моего телефонного номера в базе для нахождения аккаунта, поскольку первым делом после этого система заявила, что узнала мой номер. Для этого поиска нашлось бы по меньшей мере три лучших места.

Они могли запустить его в тот самый момент, когда поступил вызов — еще до того, как агент успел заговорить, — чтобы запись уже была доступна в контексте к тому моменту, когда я закончу фразу. Они могли купить это время еще дешевле, позволив телефону сделать один лишний гудок перед ответом. Никто не воспринимает четвертый гудок как задержку. Это единственное место в телефонном звонке, где секунда работы абсолютно невидима, и у этого приема нет аналогов в веб-среде, из-за чего им почти никто не пользуется.

И если ни то, ни другое было невозможно, если поиск действительно должен был произойти после приветствия, они могли об этом сказать. «Позвольте мне открыть ваш аккаунт». Те же шесть секунд, но никакого провисания эфира.

Проблемой были не сами шесть секунд. Проблемой стали шесть секунд, о которых никто не позаботился.

Почему мой ИИ-агент забывает то, что звонящий ему уже рассказал?

Вернитесь к моменту, когда во время моего звонка провайдеру изменился голос. Делом тут была не задержка. Эта часть, вообще-то, отработала быстро.

Дело было в согласованности. Кто-то прикрутил этап аутентификации как отдельную систему, со своим собственным сервисом, собственным голосом, собственным словарем и встроил ее в поток, не поделившись ничем через границу. Сервис авторизации не знал моего имени, хотя у агента, который меня перевел, оно уже было. Он не умел разговаривать так же, как остальная часть звонка. В итоге стык между двумя системами проявился прямо в моем пользовательском опыте.

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

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

Что происходит с живыми звонками, когда ваш LLM-провайдер падает?

У вас есть пайплайн. AssemblyAI превращает речь в текст. Вы передаете текст в OpenAI. То, что вернулось, вы отправляете в Rime для генерации речи. Три вендора, два шва, и на демонстрации все работает великолепно.

Теперь OpenAI падает. Или начинает тормозить, что еще хуже, потому что каждый звонок еле волочится, вместо того чтобы чисто завершиться с ошибкой. Или во вторник они объявляют вашу модель устаревшей. Если вы собрали эту конструкцию самостоятельно, при любом из этих сценариев каждый находящийся в работе звонок единовременно погибает.

И что, вы собираетесь сами писать механизм, который вас спасет? Для одного агента? Вам потребуется обнаруживать деградацию, переключаться на другого провайдера, переписывать промпты и вызовы с учетом чужих особенностей — вы же знаете, что OpenAI, Groq, OpenRouter и Azure подают «одну и ту же» модель со своими мелкими отличиями, верно? — регидратировать контекст для каждого звонка, который идет прямо в момент переключения, а затем возвращаться обратно, когда первый провайдер восстановится, и все это без потери вызовов.

Когда вы берете шов под свой собственный контроль, вы отвечаете не только за счастливый путь. Вы отвечаете за падение. И у каждого шва есть дефолтное поведение при поломке, определили вы его или нет. По умолчанию оно всегда скверное. Дефолтное поведение — это шесть секунд молчания. Дефолтное поведение — это уверенный неверный ответ, потому что поиск вернул код 500, а модели об этом никто не сказал. Дефолтное поведение — это бесконечный цикл сообщения «MFA ОТПРАВЛЕНО». Вы проектируете поведение при сбое, или поведение при сбое проектирует ваш худший звонок.

Стоит ли мне засунуть всю логику агента в один большой промпт?

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

Закон сохранения говорит, что так нельзя. Вы не избавились от этих швов. Вы их закопали. Маршрутизация, защитные барьеры, извлечение данных, бизнес-логика — все это слито воедино внутри одного вызова модели, именно там, где у вас меньше всего рычагов контроля.

Мы называем это «метод «надеюсь на промпт»» (prompt-and-pray): поместить правила в промпт и надеяться, что модель им последует, не имея вне модели никакой детерминированной проверки для принудительного исполнения. Сбой, который замечают люди, — это когда модель игнорирует инструкцию. Сбой, который обходится дороже, заключается в том, что один гигантский промпт лишает вас рычагов управления. Больше не за что ухватиться.

Вы не можете передать модели новую информацию посреди звонка. Вы поискали аккаунт, пока она говорила, и сообщить ей об этом невозможно. Вы не можете вырвать функцию из ее рук: проведение платежа принадлежит процессору, которого ИИ никогда не видит, и теперь сделать это нельзя. Вы не можете узнать, когда кто-то взломал ваш промпт, не говоря уже о том, чтобы сбросить контекст для восстановления.

Закопайте швы — и вы закопаете каждый рычаг управления, кроме самого промпта.

Как создать ИИ, который слушает звонок, не разговаривая в нем?

Это та самая возможность, которая делает размещение швов осязаемым, и большинство архитектур вообще не могут вам ее предоставить.

Агент, который слушает звонок и никогда в нем не говорит. Молчаливая ветвь на медиапотоке, слышащая все, в реальном времени подпитывающая человека и улавливающая то, что он может упустить. Усиление человека вместо его замены.

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

Если вы строите решение на базе агентского фреймворка, вы вообще не можете этого сделать. Абстракция предполагает, что агент и есть звонок, поэтому на медиапотоке нет места для молчаливой третьей стороны. И вы не можете прикрутить это со стороны прикладного уровня, потому что ваше приложение вообще не касается аудио. Оно видит только текст постфактум, на одном из плечей уже оплаченного вами полного цикла связи.

В SignalWire это делается методом разметки SignalWire Markup Language (SWML):

Вот и вся интеграция. Сложная часть никуда не делась. Отказоустойчивость, работа с задержками, перехват нужной ветки медиапотока — все это по-прежнему на месте. Просто этого больше нет в вашем коде. Это переместилось на уровень, созданный для его поддержки, в чем и заключается главная суть: граница сохраняется, поэтому вы размещаете ее там, где она наносит наименьший вред. В данном случае это медиапуть, независимо от того, владеете ли вы им или вам его предоставляют.

Где проходят границы

Избежать швов не получится. Единственное, о чем вы всегда можете принять решение — это где они будут находиться.

Разместите их близко к медиаданным, вплотную к уровню, созданному для их удержания, и вызывающая сторона никогда их не почувствует. Разбросайте их по краям только потому, что там их было проще всего внедрить, и ваш пользователь заплатит за каждый из них: задержкой, чужим голосом, зачитывающим ему код ошибки, необходимостью объяснять свою проблему дважды двум системам, которые никогда друг с другом не общались.

Волна искусственного интеллекта ничего из этого не отменила. Она спрятала швы внутри модели и убедила множество умных людей в том, что они исчезли.

Это не так. Найдите свои и поместите их в более подходящее место.

Остались вопросы по созданию более совершенных голосовых ИИ-агентов? Присоединяйтесь к обсуждению в нашем developer community on Discord.

← Все статьи

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

Все →
SpaceX готовится отправить ракету Starship в орбиту впервыеПресса
SpaceX

SpaceX готовится отправить ракету Starship в орбиту впервые

Обновленное обязательство по отношению к Единому рынку
Telefónica

Обновленное обязательство по отношению к Единому рынку

Почему лидерство является стратегическим фактором для развития передового административного управления?
Telefónica

Почему лидерство является стратегическим фактором для развития передового административного управления?

Пресс-релизы
SES

Пресс-релизы

Пресс-релизы
SES

Пресс-релизы

Пресс-релизы
SES

Пресс-релизы

Ещё от Signalwire

Итоги ClueCon 2026
Signalwire

Итоги ClueCon 2026

Борьба со спуфингом Caller ID с помощью STIR/SHAKEN
Signalwire

Борьба со спуфингом Caller ID с помощью STIR/SHAKEN

Представляем AI Chat: мультимодальный ИИ-агент
Signalwire

Представляем AI Chat: мультимодальный ИИ-агент

Представляем AI Sidecar: помощь операторам в реальном времени для живых вызовов
Signalwire

Представляем AI Sidecar: помощь операторам в реальном времени для живых вызовов

Итоги ClueCon 2026
Signalwire

Итоги ClueCon 2026

Представляем AI Sidecar: помощник агента в реальном времени для «живых» звонков
Signalwire

Представляем AI Sidecar: помощник агента в реальном времени для «живых» звонков