Привет, Хабр! Меня зовут Иван. Я работаю аналитиком в компании «Совкомбанк Технологии»: собираю требования, разбираю процессы с пользователями и помогаю доводить ИИ‑решения от этапа идеи до работающего сервиса. В этой статье расскажу, как мы с командой внедряли ИИ‑агента в работу медицинского пульта страховой компании.

Коротко о команде: над проектом работали аналитик, backend‑разработчики, специалист по интеграциям, ML/LLM‑инженеры, тестировщики и представители бизнеса.

Задача была не просто «поиграть с нейросетями», а реально встроить LLM в процесс, где цена ошибки очень высока: на линии находится клиент — застрахованный человек, который хочет быстро решить свою проблему, а мы стремимся оказать высокий уровень сервиса. Оператор должен быстро понять его проблему, корректно внести данные и не потерять важный медицинский контекст с помощью ИИ.

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

ИИ-марафон в одной картинке: дедлайн еще не завтра, но ощущается как «вчера»
ИИ‑марафон в одной картинке: дедлайн еще не завтра, но ощущается как «вчера»

Контекст: ИИ‑марафон и сжатые сроки

Проект родился внутри ИИ‑марафона Совкомбанка. Это формат, близкий к корпоративному хакатону: командам необходимо реализовать работающее бизнес‑решение, а не просто презентацию, в сжатые сроки.

ИТ‑специалисты Совкомбанк Технологий работали над проектом совместно с представителями Страховой Группы Совкомбанка. Первичная формулировка звучала просто: автоматизировать ввод данных из телефонных разговоров. Но после погружения в контекст, стало понятно, что это задача не уровня «распознать аудио и перенести результат в текстовое поле», а целый участок операционной работы.

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

Мы пошли к пользователям, посмотрели на процесс вживую и выявили ключевую боль: «Я не успеваю печатать так же быстро, как говорит человек». Поэтому мы решили спроектировать «третью руку», которая будет писать черновик за оператора.

От первой версии к промышленному сценарию

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

Первая версия

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

  • Streamlit для интерфейса. Он позволил быстро собрать экран для загрузки записи и просмотра результата без отдельной frontend‑команды.

  • FastAPI для backend‑слоя. Через него мы принимали аудиозапись, запускали обработку и возвращали структурированный ответ.

  • VoiceKey для распознавания речи. На старте это был самый быстрый путь получить текстовую расшифровку звонка и сфокусироваться на LLM‑части.

  • Qwen3-30B для извлечения данных. Модель использовали как инструмент структурирования текста, а не как самостоятельного эксперта.

На первой защите оператор загружал запись, а через несколько секунд видел заполненные поля: ФИО, причина обращения, диагноз, предполагаемый код МКБ. Это показало, что направление рабочее. Но мы прекрасно понимали: красивый прототип и сервис с реальной нагрузкой — это разные вещи.

Командный вайб на первой защите: кажется, всё уже работает, но впереди еще самое интересное
Командный вайб на первой защите: кажется, всё уже работает, но впереди еще самое интересное

Переход к рабочему контуру

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

Упрощенная схема целевого контура
Упрощенная схема целевого контура
  • Интеграция с телефонией. Записи и служебные данные приходили из связки SmartLogger и Avaya. Для нас это был источник аудио, идентификаторов звонков и метаданных, необходимых для связывания результата с операторской сессией.

  • Очереди и состояние. Redis использовали как быстрый слой для хранения промежуточного состояния и управления обработкой. Это помогало не «ронять» сервис при параллельных обращениях.

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

Промпты: почему температура 0.1 важнее красивого текста

Сердце решения — LLM Qwen3-30B. Выбрали её, потому что помимо скорости и способности стабильно извлекать суть из русскоязычной транскрибации нам было важно, чтобы LLM была безопасной и минимально загружена запросами от других команд.

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

  • Temperature 0.1. Креативность нам не нужна. Нужна повторяемость: на один и тот же текст модель должна давать максимально близкий результат.

  • Жесткий системный промпт. Мы явно описали роль, формат ответа и правило: если данных нет в транскрибации, нужно писать «Не указано», а не угадывать.

  • JSON‑подобная структура. Ответ модели сразу приводился к формату, который можно валидировать и передавать дальше.

  • Негативные примеры. В промптах отдельно описали, чего делать нельзя: выдумывать ФИО, подменять жалобу диагнозом, выбирать код МКБ только по одному слову без контекста.

Базовое правило проекта: если данных нет в разговоре, не придумываем
Базовое правило проекта: если данных нет в разговоре, не придумываем

Работа с МКБ‑кодами

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

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

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

Цепочка агентов: меньше магии, больше инженерии

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

Цепочка обработки: от сырой расшифровки до проверенного черновика для оператора
Цепочка обработки: от сырой расшифровки до проверенного черновика для оператора
  • Агент‑транскрибатор. Собирает текст из двух каналов, разделяет реплики оператора и клиента, убирает явный шум и междометия.

  • Агент‑экстрактор. Ищет сущности: ФИО, причину обращения, жалобы, диагноз, услуги, важные ограничения.

  • Агент‑нормализатор. Приводит формулировки к виду, пригодному для CRM: без разговорных оборотов и лишнего текста.

  • Агент МКБ. Сопоставляет диагноз со справочником и возвращает не только код, но и объяснение выбора.

  • Агент‑валидатор. Проверяет, подтверждаются ли извлеченные поля исходной расшифровкой. Если видит противоречие, отправляет результат на повторную обработку с уточнением.

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

Результаты и честные ограничения

Главный измеримый эффект — сокращение времени обработки примерно на 30%. Оператору больше не нужно запоминать все слова клиента во время разговора и потом судорожно переносить заметки в CRM. Он получает черновик и проверяет его.

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

Что планируем улучшать дальше: переходить на более точную онлайн‑транскрибацию, дообучать или настраивать распознавание на медицинскую лексику, расширять словари терминов и добавлять подсказки оператору прямо во время разговора.

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

Что бы я посоветовал командам, которые идут похожим путем

  • Идите к пользователям. Ни одно ТЗ не заменит часа рядом с оператором, который реально работает в системе.

  • Не продавайте магию. Объясняйте, где LLM помогает, а где остается риск и нужна проверка человеком.

  • Храните версии промптов как код. Фиксируйте изменения и регрессии, тестируйте на наборах звонков.

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

  • Смотрите на входные данные. Если транскрибация плохая, LLM не должна героически угадывать. Лучше честно вернуть неопределенность.

Для меня главный вывод такой: ИИ‑агент становится полезным не тогда, когда его называют «агентом», а когда он встроен в процесс, имеет понятные границы ответственности и помогает человеку делать работу быстрее и спокойнее.

Есть вопросы по архитектуре, промптам или организации пилота? Буду рад обсудить в комментариях.