Привет, Habr! Меня зовут Александр Сулейкин, архитектор Big Data решений, к. т. н. и CEO ИТ‑компании «ДЮК Технологии». Совместно с нашим экспертом по внедрению LLM, Анатолием Лапковым, мы подготовили статью по теме внедрения умного помощника в крупной некоммерческой организации. Под капотом — базовая модель от Сбера GigaChat, однако вся обвязка и подход к решению задачи — наши собственные. И это то, о чем пойдет речь в статье.

Исходная проблема

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

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

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

Про умных помощников

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

Задача автоматизации процессов техподдержки, регламентов ответов на типовые вопросы может быть достаточно неплохо шаблонизирована, по крайней мере в рамках одной и той же предметной области. Многие задачи являются по‑настоящему типовыми, и потенциал развития «умных» ассистентов / сотрудников тех. поддержки для LLM довольно неплохой. Причем речь может идти об очень серьезном уровне развития LLM для решения подобного рода задач уже в ближайшем будущем, особенно с учетом стремительного развития как базовых моделей (OpenAI, YandexGPT, GigaChat и др.), так и новых методов, решений, фреймворков, подходов и техник применения больших базовых моделей для решения узкоспециализированных задач бизнеса.

Подход на основе «Карты знаний»

«Карта знаний» — это RAG, в котором мы, разработчики, строго контролируем информацию, используемую для формирования ответа на запрос. Такой контроль достигается за счёт применения двух техник:

  1. Выявление классов запросов и разработки классификатора запросов.

  2. Извлечение и структурирование данных из исходной документации.

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

Для ответа не запросы данного класса, нам нужна та часть документации, которая описывает процесс регистрации.

Мы разрабатываем модуль, который с помощью LLM извлекает инструкцию из документации заказчика и сохраняем эту инструкцию в удобной и доступной форме, например в БД.

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

В итоге мы получаем систему, в которой исключены галлюцинации.

Система даёт ответы только на те вопросы, по которым у неё есть информация. Более того, в отличие от RAG, построенных на векторных базах данных, для формирования ответа LLM подаётся точная и однозначная информация.

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

Также данный подход позволяет интегрировать систему с CRM, ERP, сервис‑десками и др. Если при обработке запроса мы точно знаем, о чём этот запрос (его класс), то мы знаем как на него подготовить ответ. Например, при запросе «Какой статус моей заявки?» (для упрощения условимся, что у пользователя может быть только одна заявка в один момент времени), мы можем подключиться к CRM, получить статус заявки и сформировать точный ответ. В этом случае, для данного класса запросов мы не разрабатываем экстрактор, но разрабатываем коннектор к учётной системе (или берем готовый доступный) и извлекаем данные для ответа «на ходу».

Case Study: как мы внедряли умного помощника на базе «Карты знаний» области поддержки пользователей и модели GigaChat

Описание задачи

Задача ставилась максимально просто — обработать обращения клиентов к техподдержку.

Ограничения проекта

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

  • Пожелание заказчика, чтобы базовая модель была отечественной и не использовать Open‑Source модели. Выбор, по сути, делался между YandexGPT и GigaChat.

  • Очень короткий срок реализации проекта — 1 месяц. Разработку делали в режиме нонстоп, при этом большая часть реальных документов (вопросов‑ответов пользователей за несколько лет эксплуатации тех. поддержки) поступило за неделю до сдачи проекта.

  • Несколько тематик, которые строго запрещалось освещать: обработка вопросов про политику, а также в регламентах значились новые регионы РФ (с которыми GigaChat ну очень плохо работал, по крайней мере — версия с цензурой)

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

Проблемы реализации

Ключевой проблемой проекта оказались сроки предоставления информации заказчиком.

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

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

Другая проблема — это ответы GigaChat по‑разному на одни и те же вопросы, сложности с отключением цензуры и проблемы ответов на определенные темы (например, военно‑политические).

Архитектура

Общая схема архитектуры решения на основе реализованного нами подхода выглядит следующим образом:

Рис. 1. Архитектура решения обработки запроса
Рис. 1. Архитектура решения обработки запроса

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

Процесс экстракции и индексирования текста из входящих документов — отдельный процесс, который делается независимо. Для него в данном проекте использовалась модель ChatGPT от OpenAI ввиду сжатых сроков внедрения, однако в планах экстрактор также переводить на использование GigaChat (здесь ожидаем много интересного!) и реализацию интерфейса для загрузки новых документов и переиндексацию (панель администратора).

Результаты

В результате мы получили бота, который отвечает на самые частые запросы с точностью больше 90%. Бот имеет строгие рамки полномочий и в случае поступления запроса, на который бот не должен отвечать, передаёт запрос сотруднику технической поддержки. Полученный бот не способен что‑либо придумать от себя и всегда работает строго по заложенным в него инструкциям.

Что дальше?

Дальше планируем совершенствовать наше решение — уже есть наработки по фреймворку «Умного поиска» по документации с русифицированным интерфейсом системы. Планируем подход на основе «Карты знаний» встроить туда, а в остальных случаях, когда ничего не нашлось и «Карта знаний» по тематике еще не сформирована — будет использоваться стандартный подход на векторах из коробки системы (лучше, чем ничего). Так, работаем в сторону гибридного поиска. Пока этот вариант нам видится наиболее оптимальным на данном этапе, однако прогнозируем совершенствование и автоматизацию подхода «Карта знаний» со временем, по крайней мере — для конкретной области знаний.

Будем рады предоставить данную систему в пилотное использование — пишите в ЛС, кому интересно.

Общая схема развития помощника на основе «Карты знаний» нам представляется следующим образом:

Рис. 2. Общая схема развития помощника
Рис. 2. Общая схема развития помощника

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


  1. bitrix24ru
    16.07.2024 10:44

    Шьюсь в подобном амбициозном проекте, жду советчиков.


  1. dvgureev
    16.07.2024 10:44

    Вопрос на уточнение. С помощью классификации Вы определяете тему запроса (и соответственно передаёте все инструкции), либо конкретную инструкцию (которых может быть сотни).


    1. asuleykin Автор
      16.07.2024 10:44

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

      Далее сначала классифицируем запрос по группе, после чего классифицируем запрос по конкретной теме в группе.
      В этом случае, лучше делать два запроса к LLM.