Привет, Хабр!
Я техлид группы разработки шины обмена данных в компании «Передовые Платежные Решения». И помимо этого, неформальный лидер команды внутренних ИИ проектов. В статье хочу поделиться нашим опытом внедрения ИИ с нуля: как за 6 месяцев команда из 12 разработчиков (backend, без опыта с ML/ AI) создала и вывела в пилот голосового ИИ-ассистента.

Статья может быть полезна компаниям, которые с интересом смотрят на внедрение ИИ, и выбирают между «сделать самим» или «нанять/ привлечь экспертизу со стороны». Или хотят сделать похожий внутренний продукт.

Технические параметры ассистента:

  • Задача: классификация услуг + детекция возражений → RAG → генерация ответа.

  • Входные данные: поток текстовых сегментов от встроенного транскрайбера телефонии.

  • Задержка: строго 1,5–2 секунды на генерацию ответа.

  • Стек: Python, FastAPI, PostgreSQL, дообученные BERT, локальная Qwen 8B.

  • Архитектура: on-premise (требование ИБ), интеграция с Voximplant API.

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

О проекте

«Суфлёр» — это голосовой ИИ-ассистент, который в реальном времени помогает менеджерам по продажам и сервису во время звонков с клиентами. «Суфлёр» анализирует диалог, распознаёт, о каком продукте идёт речь, определяет наличие возражений в диалоге и мгновенно выдаёт релевантную текстовую подсказку на экран менеджеру.

В нашей экосистеме более 35 продуктов. Это огромный массив информации, который нужно держать в голове менеджеру, чтобы эффективно работать с возражениями и закрывать сделки. B2B-цикл длинный, и важно, чтобы на каждом этапе диалога с клиентом у сотрудника были под рукой релевантные скрипты и аргументы. AI-ассистент помогает повысить эффективность продаж за счет лучших практик, зашитых в модель. А также сократить время выхода новых сотрудников на KPI.

Этапы разработки: от обучения до прототипа

Путь от первых идей о применении ИИ в компании до полноценного MVP первого ИИ-проекта занял около двух лет. Ключевая фаза активной разработки уложилась в 6 месяцев.

12 наших инженеров (бэкенд, тимлиды и техлиды команд) прошли обучение и с нуля освоили архитектуру нейросетей, работу с LLM, эмбеддинги и векторные базы. К концу обучения у нас была команда с общим пониманием, что такое RAG, fine-tuning и классификаторы.

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

  1. Взяли транскрипты звонков (текст) как входные данные.

  2. Написали два классификатора на BERT — по услугам и по возражениям. Обучили их примерно на полутора тысячах транскриптов звонков.

  3. Подготовили две простые векторные базы знаний FAISS с описаниями услуг и скриптами отработки возражений.

  4. Связали всё через промпты с облачной моделью GPT.

  5. Набросали за день интерфейс на Django, куда выводилась подсказка.

Через три недели с помощью этого proof-of-concept мы успешно защитили идею перед бизнесом, хоть прототип из-за облачной модели и давал подсказки с задержкой в 10–15 секунд. Уже получив зелёный свет, мы стали доводить прототип до требований, описанных в начале статьи, улучшать стабильность, интерфейс и прорабатывать интеграции.

Архитектура проекта: от монолита к реальности

Вдохновлённые учебными курсами, мы в первый месяц нарисовали большой монолитный проект, который включал:

Собственный аудиоконвейер. Набросали приложение, которое просто захватывает аудиопоток с микрофона и колонок. Тестировали на звонках в Zoom. Здесь зарыты часы работы с лагами и качеством: Whisper для транскрибации мы локально разворачивали на каждой машине, что в итоге работало довольно медленно.

Несколько классификаторов. Полученный текст параллельно отправляется в две нейросети: одна определяет одну из 15+ услуг, другая — один из 15+ типов возражений. Для каждой нужны свои датасеты, разметка, настройка. Разметка в итоге заняла больше всего времени.

Дообученная LLM. Мы планировали взять большую языковую модель (Qwen или Llama) и дообучить её через fine-tuning на наших скриптах продаж. Модель самостоятельно готовила бы подсказку на основе данных из RAG. Но оценили трудозатраты и риски ухудшения качества данных, и в итоге отказались от этой идеи.

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

Но срок реализации проекта в такой версии стал бы 12–18 месяцев, а риск провала был довольно высок. Мы оценили разные варианты, и отбросили те, что не вписывались в критерии.

Отказываемся от fine-tuning

Fine-tuning требовал большого объема верно размеченных диалогов. А у нас не было ни диалогов, ни разметчиков, и для разметки потребовалось бы очень много времени. Поэтому вместо тяжёлой модели мы решили использовать более простой и контролируемый подход — RAG (Retrieval-Augmented Generation, генерация, дополненная поиском). То есть не учить модель всему с нуля, а давать ей в нужный момент релевантную информацию из нашей базы знаний. Так мы сэкономили время на разработку, и снижали риск галлюцинаций модели.

Отказываемся от своей транскрибации

В нашей телефонии Voximplant уже есть встроенный и хорошо работающий модуль транскрибации. REST-запросами из него можно получать готовые текстовые сегменты. Если бы мы писали и обрабатывали свой аудиотракт (как сначала хотели), удлинили бы разработку минимум на 2 месяца. А с Voximplant сразу получили на вход чистый и правильный текст.

Упрощаем классификаторы до предела

Наш дуэт классификаторов оказался неповоротливым. После анализа реальных диалогов мы поняли, что для первого MVP главное — не тип возражения, а его наличие. И заменили многоклассовый классификатор возражений на бинарный (есть/нет). Это в разы увеличило точность ответов. Детализацией типа возражения теперь занимается LLM, которая просто ищет релевантные скрипты по ключевым словам из диалога. Ускорили мы это все через запуск на удаленной машине с мощным видеоускорителем.

Меняем векторную БД на словари

Мы подготовили базы знаний для RAG — справочник услуг и базу скриптов отработки возражений. Получилось несколько мегабайт текста. Подключать для них тяжёлую векторную базу типа Weaviate или Qdrant было избыточно. Так что мы просто загрузили структурированные JSON-файлы в память. Поиск по JSON-файлам быстрый и не требует сетевых запросов. Сработал принцип KISS.

Облако vs локальная модель

Изначально мы тестировали GPT и другие облачные модели. Но получили результат, который нас не устроил: задержку ответа от 7 до 20 секунд. К тому же, ИБ запрещает отправлять транскрипты настоящих диалогов во внешние сервисы.

Оставалось ставить модель на свое железо. Мы получили сервер с GPU и развернули Qwen 8B. Её ответы были чуть лаконичнее, чем у 32B-версии, но для подсказок менеджеру это подходило. Задержка стабилизировалась примерно на двух секундах, а все данные остались в контуре.

Вместо CRM — HTML-страница за день

Нам хотелось интегрировать подсказки прямо в интерфейс CRM, но в тот момент он переживал миграцию. Чтобы не ждать долго, наш бэкендер за день накодил интерфейс на Django — с одной кнопкой и полем для вывода ответа. Теперь можно было показывать прототип.

Финальная архитектура

В итоге наша система превратилась в конвейер, который отрабатывал за 2 секунды:

Архитектура AI-Суфлера
Архитектура AI-Суфлера

С какими сложностями мы столкнулись и как справились

Каждый ИИ-проект сочетает как минимум три вида проблем — с данными, с инфраструктурой и с дедлайнами. Наш путь не был исключением. Расскажу чуть подробнее о трех ключевых вызовах, которые заставили нас пересмотреть подходы и найти нестандартные решения.

Разметка — это тонны ручной работы

Теория машинного обучения предписывает итеративный процесс: сбор данных, их очистка и анализ, обучение модели, а затем возврат к данным для улучшения результата. Мы взяли 200 записей звонков, разделили их между 12 участниками команды (напомню, разметчиков в ней не было) и... уперлись в стену.

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

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

Эта мысль помогла нам переформулировать задачу с «научить ИИ думать» на «дать ИИ доступ к нужной информации в нужный момент». Мы заменили многоклассовый классификатор с более чем 15 типами возражений на бинарный детектор — есть возражение или нет. А классификацию возражения переложили на LLM, пока она готовит рекомендацию. Это чуть увеличило время ответа, но было быстрее и качественнее, чем продолжать итеративно мучить BERT.

Две секунды — не пожелание, а физическое ограничение диалога

Подсказка оператору должна приходить за 1,5–2 секунды, и любая задержка здесь разрушает динамику живого разговора. Наши первые эксперименты с облачными API (OpenAI GPT, DeepSeek и другие) были неутешительны. В среднем ответ приходил за 7–10 секунд, иногда за 3, а иногда и за 20. К тому же мы здесь полностью зависели от нагрузки сторонних сервисов. Облачные модели при всей своей мощности слишком медленны и нестабильны для нашей задачи в реальном времени. Они требуют прокси для запросов, а также инжекторов для маскировки чувствительных данных.

Как упоминалось выше, мы развернули локальную языковую модель на выделенном GPU-сервере. Qwen 32B выдавала качественные и детальные ответы, но за 5–7 секунд. Qwen 8B — более короткие, но при этом содержательные, да еще и укладывалась примерно в 2 секунды. Так что мы пожертвовали красноречием модели ради скорости и предсказуемости.

Безопасность данных — не бюрократия, а необходимость

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

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

  • дополнительные 200–500 мс задержки на каждый запрос,

  • риск искажения контекста при маскировке важных для понимания сущностей.

В итоге мы согласовали с ИБ иную архитектуру, предусматривающую полный цикл обработки внутри защищённого периметра компании:

  1. Транскрибация — силами нашего провайдера (Voximplant). Это единственное, что происходит в облаке, а не в периметре. Из облака в периметр приходят запросы с транскрибациями.

  2. Обработка текста — на наших серверах.

  3. Генерация ответов — локальной моделью на нашем железе.

Это решение одновременно удовлетворило строгие требования безопасности и решило проблему скорости — за счёт отказа от облачных моделей.

Сложности связаны между собой

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

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

Метрики по итогам пилота

Технические метрики:

  • Средняя задержка формирования подсказки — 2 секунды. В 2–3% случаев подскакивало до 3 секунд, но это не критично.

  • Услуги классифицировались «Суфлёром» с точностью более 70%. Для MVP этого достаточно, и мы знаем, как увеличить этот показатель до 90%.

  • Качество распознавания речи — от 92% в зависимости от качества связи.

«Суфлёр» прошел обкатку в пилотной группе и показал первые качественные и количественные результаты (обратную связь, юзабилити, снижение нагрузки на наставников и пр.).  Но для статистически значимых цифр по конверсии и KPI нужно время и масштабирование на все команды. Сейчас мы сфокусированы на доработке архитектуры и бесшовной интеграции в CRM. Как только накопим чистые данные на потоке — обязательно вернемся с цифрами.

Выводы и рекомендации

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

Лучший ИИ — тот, что решает конкретную боль, а не демонстрирует технологию

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

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

  • Рискуем ли мы деньгами или чем-то еще из-за проблемы прямо сейчас?

  • Повторяется ли проблема массово?

  • Можно ли с внедрением ИИ получить эффект в течение 6–12 месяцев? Или решение можно найти без ИИ, и за сроки короче?

  • Что в дальнейшем нам даст применение в этом проекте ИИ? (если это разовый кейс применения, который к тому же обошелся дороже, то какой смысл в ИИ)

  • Можно ли встроить решение в текущие процессы без революции?

  • Можно ли масштабировать результат?

Инвестиции в своих людей окупаются синергией, которую не купить на стороне

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

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

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

Движение маленькими, но быстрыми шагами

На мой взгляд, ключевой результат нашей команды не в самом продукте (мы не первые, кто делает ИИ-ассистента). А скорее в том, что мы показали работающий прототип уже через 3 недели. Пусть и с задержкой в 15 секунд, пусть с интерфейсом на скорую руку — но он работал. Классика Agile :) Это дало команде веру в свои силы, а бизнесу — уверенность, что мы движемся в верном направлении.

Мы придерживались подхода «сначала закройте 90% потребности простым способом». Последовательно отказывались от «важных, но не критичных» функций — fine-tuning, векторные базы, петля обратной связи — чтобы сохранить критичную - скорость.

Нам оказалось полезно разложить путь на короткие итерации с явным результатом в конце каждой. И делать не «идеально», а «работоспособно и полезно».

Коммуникация со смежными командами — необходимая часть технического дизайна

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

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

Вместо MLOps - ML-стек под конкретную задачу

Наш финальный техстек: FastAPI, PostgreSQL, локально запущенная легкая LLM, классификаторы на базе BERT. Без сложных MLOps-пайплайнов на первом этапе. Это помогло получить контроль над производительностью и безопасностью.

«Коробочное» решение потребовало бы от нас 60–80% тех же усилий по интеграции, адаптации данных и встраиванию в процессы, но лишило бы гибкости, скорости изменений и применения накопленной экспертизы.

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

На мой взгляд, внедрение ИИ — это больше об инженерной культуре, управлении ожиданиями и умении делать сложные выборы. Важный навык, который мы с коллегами получили благодаря кейсу «Суфлёра», — способность отличать «must have» от «could have» и без сожаления отказываться от второго ради скорости и результата.

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

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