«Там всё уже работает. Надо только немного допилить и дотащить до прода», — с этих слов мне передали сервис голосовых ИИ‑интервью. Его навайбкодил тимлид‑фронтендер, а сервис к тому моменту уже начали продавать. Оставалось, как казалось со стороны, только задеплоить. И сервис действительно работал: можно было открыть браузер, поговорить с ИИ‑аватаром и получить вполне осмысленные ответы.

Потом я пошёл смотреть подробнее. Задержки были слишком большими, ИИ‑аватар иногда «обижался» и переставал говорить, если его перебить, а качество транскрибации сильно скакало. Логов и метрик синтеза и распознавания речи (TTS и STT) не было, поэтому любые новые провайдеры и подходы приходилось проверять живым разговором. На демо всё выглядело классно, но технически мы ещё не могли нормально ответить, как сервис устроен, какую задержку и какое качество можем обещать.

Снаружи сервис уже выглядит готовым. Внутри инженерная работа только начинается.
Снаружи сервис уже выглядит готовым. Внутри инженерная работа только начинается.

Как было раньше

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

Тут же мы пошли не с конца, а скорее сбоку. Как будто эту задачу до нас уже кто‑то делал, только не совсем эту и не совсем профессионально. Мы запускали то, что уже есть, находили конкретное ограничение или баг, делали его воспроизводимым, добавляли тесты и бенчмарки, а уже из них получали новые требования и архитектурные решения. Большая часть работы оказалась удалением и упрощением сервиса, а по ходу возникло много задач на исследование: какие технологии выбрать для интервью на русском и английском, каково их качество, задержки, цены и доступность из России.

Один баг, который оказался исследованием

В какой‑то момент появилась задача «бот иногда перебивает человека». На словах она выглядела как обычный баг: есть детектор голосовой активности (Voice Activity Detection, VAD), он как‑то не так определяет конец речи, значит, надо подкрутить настройки и пойти дальше. Но оказалось, что настройки конфликтуют между собой. Если бот реагирует быстро, он начинает принимать за речь шум, эхо и иногда собственный голос. Если сделать его менее чувствительным, он уже не понимает, что человек начал говорить поверх него.

С паузами та же история. При короткой паузе бот перебивает длинный ответ, при длинной после каждой реплики все сидят и ждут. В обычном вызове программного интерфейса (API) лишняя секунда может быть не важна, а в разговоре она очень хорошо чувствуется. Поэтому мы перестали крутить параметры руками и начали собирать нормальные тестовые записи: обычную речь, длинные паузы внутри ответа, перебивания, шум и эхо.

Один и тот же набор записей: меньше ошибок получается только ценой неприемлемой паузы.
Один и тот же набор записей: меньше ошибок получается только ценой неприемлемой паузы.

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

Дальше выяснилось, что сам VAD вообще отвечает не на тот вопрос, который нам нужен. Он определяет, есть сейчас речь или нет, а нам надо понять, закончил человек отвечать или просто задумался. Так задача «подкрутить VAD» постепенно доехала до определения конца реплики (end‑of‑turn), многоступенчатого VAD и отдельных бенчмарков. С многоступенчатым VAD было похоже: на данных, на которых я его настраивал, всё выглядело хорошо, но проверка на отложенном интервью разваливала результат. В прод это, понятно, не поехало.

Что пришлось сделать с самим сервисом

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

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

Где начинается проблема

Тут возникло ещё одно противоречие. Бизнес уже видит работающий продукт и спрашивает: «Там же осталось совсем чуть‑чуть?» Разработчик видит набор неизвестных деталей и пока даже не всегда может нормально оценить объём работы. Особенно весело становится, если сервис к этому моменту уже начали продавать и клиенту надо обещать конкретные задержки, качество и стабильность.

Для стартапа такой прототип может быть единственным способом быстро проверить гипотезу и что‑то показать клиентам. Можно сразу посадить человека перед ботом, посмотреть, нужен ли он вообще, где он раздражает пользователя и какие сценарии действительно важны. Для меня главный вопрос в другом: в какой момент перестать считать это быстрым прототипом и начать относиться к нему как к неизвестной системе, которую ещё надо исследовать.

Что здесь изменил ИИ

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

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

Вместо вывода

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

Комментарии (0)