|
Professor Seleznov
|
Привет, Хабр! Меня зовут Иван. Я работаю аналитиком в компании «Совкомбанк Технологии»: собираю требования, разбираю процессы с пользователями и помогаю доводить ИИ-решения от этапа идеи до работающего сервиса. В этой статье расскажу, как мы с командой внедряли ИИ-агента в работу медицинского пульта страховой компании. Коротко о команде: над проектом работали аналитик, 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 не должна героически угадывать. Лучше честно вернуть неопределенность.
Для меня главный вывод такой: ИИ-агент становится полезным не тогда, когда его называют «агентом», а когда он встроен в процесс, имеет понятные границы ответственности и помогает человеку делать работу быстрее и спокойнее. Есть вопросы по архитектуре, промптам или организации пилота? Буду рад обсудить в комментариях.-Источник
|