Когда NLU-сценарий вырастает до нескольких сотен веток, а процент автоматизации всё равно не двигается — это не проблема настройки, это потолок технологии. Рассказываем, как мы помогли крупному банку его пробить: перевели поддержку по кешбэку на LLM-агентов, добавили агента-судью против галлюцинаций и улучшили понимание семантики и контекста пользовательских запросов.
Потолок NLU-ботов и цели автоматизации в банковском сервисе
Как и многие крупные компании, наш клиент-банк давно использовал NLU-бота (бот на основе распознавания намерений) для поддержки первой линии. Но со временем система, которая когда-то казалась эффективной, превратилась в источник проблем. Команда столкнулась с классической ситуацией:
- Около 50% переводов на оператора. Как бы команда ни расширяла сценарии и ни дописывала интенты, каждый второй диалог всё равно уходил на живого человека. Это и есть технологический потолок — бот хорошо работает только в рамках заранее прописанных сценариев, а любые отклонения ведут к передаче диалога оператору: например, если пользователь задаёт комплексный вопрос с несколькими условиями, использует разговорный язык или называет акции и партнёров не так, как они заведены в системе.
- Сложность поддержки. NLU-бот работал так: входящий текст анализировался с помощью регулярных выражений или моделей машинного обучения, определялась нужная ветка сценария — и пользователь шёл по заранее заданному пути, выбирая опции, предложенные ботом. Свободный диалог был ограничен. Под каждый тип запроса лингвисты вручную прописывали фразы, которые приводят в нужное место сценария, и скрипты обработки. Появился новый продукт в банке — садись и пиши фразы, пиши скрипты, думай, как точно навигировать бота в новую ветку и при этом не сломать старые. Любое изменение требовало полного прогона сценария.
- Непонимание контекста. Бот реагировал на последнее сообщение, но плохо понимал общую суть диалога. Пользователи часто попадали не в ту ветку, злились, и всё это вело к негативу.
Стало ясно, что решение нужно не дорабатывать, а менять сам подход. Перед нами стояли чёткие цели:
- повысить уровень автоматизации и снизить долю переводов на оператора;
- обеспечить быстрые ответы без потери качества;
- давать персонализированные ответы на основе данных клиента.
Почему ИИ-агент, а не NLU-бот
Давайте поговорим о том, что меняется под капотом, когда мы переходим на агентский подход. Он предполагает, что с клиентом разговаривает не скрипт, а система на базе LLM, которая способна рассуждать.
Классический NLU-бот — это, по сути, сложная система «если... то...», работающая по заранее прописанным правилам.
ИИ-агент — это автономный исполнитель. Его работа строится на двух основных компонентах:
- «Мозг агента» — LLM (большая языковая модель), которая отвечает за понимание запроса, рассуждение и построение логики для достижения цели.
- «Руки» — инструменты — это набор функций, которые агент может вызывать. Например, сходить в базу данных банка, обратиться к API (программному интерфейсу) для получения транзакций и так далее.
Таким образом агент сам выстраивает логику решения запроса, а не просто идёт по веткам сценария.
Казалось бы, можно взять одного хорошо настроенного агента с детальной инструкцией (промптом) — и этого достаточно. В большинстве сценариев так и есть. Но банковский контекст накладывает жёсткое требование: ответ должен быть не просто релевантным, а фактически точным. Любая галлюцинация — это репутационный риск. Один агент, каким бы хорошим он ни был, не даёт нужного уровня контроля. Именно поэтому мы сразу проектировали систему как мультиагентную.
Архитектура нашего решения
Наша мультиагентная система состояла из двух агентов и набора функций, которые давали доступ к данным и бизнес-логике. Мы не можем раскрывать полный список из-за NDA (соглашения о неразглашении), но приведём типовые примеры таких функций:
- поиск одной или нескольких транзакций клиента;
- проверка активных кешбэк-программ и акций;
- расчёт и проверка начисленного кешбэка для отдельной транзакции;
- проверка лимитов и условий программ;
- получение информации из базы знаний.
Эти функции отвечают за доступ к данным, но сами по себе не решают задачу — ими нужно управлять. В нашем случае мы разделили обязанности между двумя агентами:
- Основной агент: его задача — вести диалог с клиентом, понимать его запрос и использовать инструменты для получения данных.
- Агент-судья: это наш внутренний контроль качества. Он проверяет ответ основного агента, прежде чем тот уйдёт клиенту. Если «Судья» видит галлюцинацию или неточность, он перенаправляет ответ обратно в первого агента и просит его переделать — в банковских сценариях такая проверка просто обязательна.
Собираем агентов для мультиагентной системы
Разберём, как собирается такая система на Just AI Agent Platform. Процесс очень наглядный и состоит из нескольких шагов. Можно забыть про сотни строк скриптового кода и запутанные ветки — здесь всё строится на логических блоках.
Шаг 1: Собираем каркас на холсте
Всё начинается с пустого холста — это наше рабочее пространство. Слева у нас есть палитра с четырьмя типами блоков:
- Агенты — это «мозг» нашей системы на основе LLM.
- Функции — те самые «руки», которые мы даём агенту.
- Триггеры — то, что запускает нашего агента. Чаще всего это сообщение в чате, но может быть и веб-хук, и письмо на почту.
- Технические блоки: отправка ответа, блоки с кодом и т.д.
Мы просто перетаскиваем нужные блоки на холст и соединяем их. Для нашего кейса с кешбэком базовая схема выглядит так: пользователь отправляет сообщение → агент его анализирует → при необходимости вызывает одну или несколько функций → получает данные → формирует ответ. При этом вызов функций не зашит в жёсткий сценарий: агент сам решает, нужны ли они вообще и какие именно использовать.
Шаг 2: Настраиваем первого агента
Это самый важный этап, где мы заполняем несколько полей:
- Модель: создаём интеграцию с LLM и выбираем эту LLM, которая будет «мозгом».
- Роль: прописываем, кем должен быть наш агент. Буквально: «Это дружелюбный и вежливый помощник банка, специализирующийся на вопросах кешбэка. Вы общаетесь с клиентом».
- Цель: описываем, когда задача агента считается выполненной. Это помогает избежать бесконечных циклов рассуждений. В нашем случае цель: помочь клиенту разобраться с кешбэком, объяснить правила программ и предложить персональные рекомендации.
- Промпт-инструкция. Здесь мы даём агенту все те знания, которых у LLM по умолчанию быть не может. Именно в инструкции мы прописываем:
- Как работать с конкретными запросами клиентов по кешбэку.
- Как и когда использовать доступные ему функции.
- Как реагировать на нерелевантные вопросы, грубость и попытки взломать через промпт-инъекции (атаку через подмену инструкций).
- Бизнес-правила: любая LLM обучена на широком массиве текстов, поэтому у неё уже есть знания о разнообразных темах по умолчанию (например, о том, как работают банки или кешбэк «в общем»), но их часто нужно уточнять или переопределять под конкретный продукт. Поэтому в системном промпте мы можем дополнить недостающую информацию.
Чем детальнее инструкция, тем предсказуемее и точнее будет работать агент.
Шаг 3: Настраиваем функции
Теперь даём агенту «руки» для взаимодействия с системами банка. Этот агент обладает большим количеством функций, при этом не путается в них, потому что эти функции специализированы.
Раньше для этого писали скрипты в теле бота. Сейчас мы превращаем интеграции в инструменты, которые агент может вызывать. Для кейса с кешбэком мы создали несколько функций:
get_transactions (user_id, store_name, date_range): получает транзакции клиента за определённый период.get_cashback_programs (user_id): узнаёт, какие кешбэк-программы активны у клиента.get_info_from_knowledge_base (query): ищет ответы на общие вопросы в базе знаний*
*Это лишь часть функций: полный список не приводим из-за NDA.
Мы просто настраиваем эти функции, указывая, какие параметры они принимают. Агент, получив запрос от пользователя, сам поймёт, какую функцию нужно вызвать и какие параметры в неё передать.
Шаг 4: Настраиваем второго агента-судью. Путь такой же:
- Модель: создаём интеграцию с LLM и выбираем эту LLM, которая будет «мозгом».
- Роль: специалист банка.
- Цель: проверить ответ автоматического агента на вопрос пользователя.
- Описываем подробную инструкцию.
Шаг 5: Тестирование и отладка
После того как всё готово, мы публикуем проект и запускаем тестовый виджет. Здесь мы можем вести диалог с агентом так, как это делал бы реальный клиент.
Для того чтобы продемонстрировать решение клиенту, мы собрали аналог личного кабинета банка — у нас там есть пользователь Андрей, у него есть активные программы кешбэка, список транзакций за неделю — те, за которые есть кешбэк, и за которые нет.
Именно на этом этапе мы проверяем, как агент справляется с разными формулировками. Пользователи, как вы знаете, часто пишут на разговорном языке, с ошибками и сленгом. Например: «Йо, покупал тут неделю назад курицу и яйца, кешбэк будет?».
В соседнем окне мы открываем логи (журнал событий). Это позволяет видеть весь мыслительный процесс агента:
- Какой запрос он получил.
- Как он его интерпретировал.
- Какую функцию он решил вызвать.
- С какими параметрами он её вызвал.
- Какой ответ он получил от функции.
- Как он на основе этого ответа сгенерировал финальный текст для пользователя.
Логи — ключевой инструмент для отладки и дообучения агента через уточнение инструкций.
Старый бот на таком запросе бы споткнулся: сленговое «йо», отсутствие конкретного магазина, размытый временной диапазон «неделю назад» — любой из этих факторов мог привести не в ту ветку. Агент же делает следующее:
- Он понимает запрос: речь идёт о покупках продуктов питания за последнюю неделю, магазин не уточнён.
- Вызывает функцию
get_transactions, подставив в неё ID пользователя и категорию «продукты питания», при этом временной диапазон подбирается с запасом: агент намеренно расширяет его относительно формулировки запроса, чтобы с высокой вероятностью захватить нужную операцию. - Из базы данных банка приходит информация: транзакция от 25 марта 2026 года в «Магните» на сумму 1122,57 ₽.
- Агент видит, что у клиента активна программа «Категорийный кешбэк Продукты питания» со ставкой 5%. Считает: 1122,57 × 0,05 = 56,12 ₽.
- Собирает всё это в человеческий ответ: «Привет, Андрей! Я проверил твои покупки за последнюю неделю. Нашёл транзакцию по категории "Продукты питания" от 25 марта в "Магните" на сумму 1122,57 ₽. По программе "Категорийный кешбэк Продукты питания" тебе начислят 5% — это 56,12 ₽. Кешбэк будет начислен в следующем месяце».
Второй запрос на той же сессии — другой вариант задачи, которую бот с успехом решил. Пользователь написал: «Я оплачивал недавно электричество, заплатят ли мне кешбэк?»
Агент вызывает ту же функцию get_transactions, находит платеж в Мосэнерго на 10 000 ₽ и определяет категорию — «коммунальные услуги». Дальше он обращается к бизнес-правилам из инструкции и отвечает: «Эта категория не участвует в программах лояльности, кешбэк начислен не будет».
Это важный момент: агент не просто извлекает данные, он применяет правила. Никакой ветки сценария под «оплату ЖКХ» нет — есть инструкция с логикой, и агент сам разбирается, что к ней относится.
Результаты в цифрах
Конечно, самое интересное — это то, как внедрение агента отразилось на реальных бизнес-метриках. Но сначала — о том, как именно мы это измеряли, потому что тестирование ИИ-агента принципиально отличается от тестирования NLU-бота.
Как устроено тестирование
В классическом NLU-боте можно написать детерминированные тест-кейсы: отправил фразу — получил ожидаемую ветку. С агентом так не работает: ответы не полностью предсказуемы, и стандартные сценарии с заготовленными репликами здесь не подходят. Поэтому мы выстроили другой процесс.
Исходные данные — реальная выгрузка диалогов с NLU-ботом из системы банка, включая как успешно закрытые обращения, так и те, что ушли на оператора. Дальше — несколько этапов тестирования:
- Предобработка: отсеивали неполные и бессмысленные диалоги, приводили их в формат, читаемый языковой моделью — сообщения с ролями user, assistant, system.
- Обогащение: заменяли персональные данные клиентов на похожие значения из наших тестовых заглушек.
- Разметка: добавляли теги для навигации — например, почему NLU-бот не решил вопрос, или суммаризацию цели клиента.
В роли клиента во время тестирования выступала отдельная языковая модель. Она начинала диалог с тех же запросов, что и реальный пользователь, и пыталась за несколько сообщений добиться своей цели. Если вопрос не решался за 3–4 сообщения — диалог считался нерешённым.
Результаты ответов агента оценивал ещё один независимый судья — отдельная языковая модель, которая выставляла оценки по четырём параметрам: корректность ответа, полнота, релевантность контексту и соответствие бизнес-правилам.
Оговорка про выбор модели
Не каждая модель справилась одинаково. Мы тестировали несколько вариантов на одной и той же базе диалогов. Первая — более слабая — давала результаты примерно на уровне старого NLU-бота: чуть лучше понимала контекст, но по проценту решённых вопросов принципиально не отличалась. Вторая показала совсем другой результат и была принята заказчиком. Все цифры ниже — по ней.
Вывод, который мы для себя сделали: в агентных системах выбор модели влияет на результат не меньше, чем архитектура или промпт. Иногда — даже больше.
Итак, цифры
- Нагрузка на операторов снизилась более чем на 13%.
- Качество диалогов улучшилось почти в 1,5 раза, а точность понимания вопроса, даже со сленгом и опечатками, выросла на 20%. Клиенты стали получать релевантные ответы быстрее.
- Автоматизация: уровень решения вопросов без участия человека вырос с ~37% до показателей, сопоставимых с работой опытного оператора — 64,2%.
Что хочется сказать в итоге? Агентный подход — это не волшебство (хотя порой эффект именно такой), а инженерный инструмент, с которым нужно уметь работать.
Наши главные выводы от этого проекта:
Главная сложность — это, конечно, галлюцинации LLM. Нельзя просто дать модели доступ к данным и ждать чуда. Обязательно проверяем и контролируем.
Мультиагентная архитектура — это хорошо, но важно давать подробные инструкции в промптах — чем лучше вы объясните агенту его роль и задачу, тем предсказуемее он будет себя вести.
Если планируете похожий проект, наш совет — разбивайте задачи на части. Не пытайтесь создать одного «суперагента», который умеет всё. Несколько специализированных агентов работают гораздо стабильнее.