Привет! На связи Ольга Татаринова, сооснователь компании AGIMA AI. Времена, когда звонок в техподдержку сервиса означал бесконечное ожидание на линии с музыкой вместо гудков, проходят. Искусственный интеллект не устает, не делает перерывов и, к счастью, не играет навязчивые мелодии.

В этой статье расскажу о процессе создания виртуального ассистента для NL International. Он умеет мгновенно отвечать на часто задаваемые вопросы, используя базу знаний компании. И он будет не только искать по ключевым словам, но и находить все тематически связанные документы, даже если в них нет соответствующих ключевых слов.

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

Мы затронем следующие вопросы:

  • Как организовать базу знаний вашего продукта или компании.

  • Как научить виртуального ассистента извлекать информацию из этой базы знаний и формулировать ответы на вопросы пользователей.

  • Как управлять затратами: использовать LLM и не платить кучу денег OpenAI или другим провайдерам, если у вас огромная база клиентов.

Ингредиенты

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

  • Chatwoot — интерфейс оператора с открытым исходным кодом и база знаний.

  • Rasa — фреймворк с открытым исходным кодом для создания чат-ботов.

  • Botfront — визуальный интерфейс для создания чат-ботов на RASA.

  • Qdrant — векторная база данных для хранения векторных представлений статей из базы знаний.

  • Datapipe — ETL, с помощью которого мы извлекаем статьи из Chatwoot, обрабатываем их и помещаем в Qdrant.

Рецепт

1. Контент: Подготовка базы знаний

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

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

Лучше всего делать каждую статью короткой и максимально соответствующей одной теме.
Лучше всего делать каждую статью короткой и максимально соответствующей одной теме.

2. Программирование: Преобразование всех статей из базы знаний в векторный вид

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

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

Чтобы преобразовать текст статьи в вектор и записать его в Qdrant, нам нужно решить две задачи:

  1. Документы должны быть сегментированы так, чтобы каждый вектор соответствовал одной логической теме. Это важно, потому что чем больше текста кодируется, тем более средним и нечетким становится полученный вектор. Соответственно, становится сложнее определить какую-либо тему в нем. Поэтому важно изначально сегментировать документ на части, и здесь нет универсального решения. Обычно сегментация выполняется с использованием некоторых структурных эвристик (главы или абзацы), затем уточняется моделями для предсказания следующего предложения (NSP), например. И в конечном итоге проверяется человеком.

    В контексте FAQ этот шаг не понадобился, так как у нас были только короткие ответы. Тем не менее, для обогащения поля поиска мы сгенерировали человекоподобные вопросы к ответам, а для вопросов (если таковые имелись) создали синтетическое «изображение ответа». Все это затем преобразуется в вектор и добавляется в примеры для целевой статьи.

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

3. Программирование: настройка сервиса FAQ

Сам сервис FAQ реализует простой API. API получает запрос пользователя, преобразует его в вектор и выполняет векторный поиск в Qdrant. Возвращает самые релевантные вектора вместе с заголовками и текстами статей.

4. Программирование: настройка чат-бот ассистента

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

Для создания базового чат-бота мы используем Rasa, фреймворк с открытым исходным кодом, и Botfront, визуальный интерфейс.

Когда пользователь пишет чат-боту, RASA пытается определить интент в запросе пользователя. Если интент пользователя — задать FAQ-вопрос, RASA перенаправляет запрос в сервис FAQ.

А сервис FAQ возвращает список связанных статей.

5. Опционально: ответы в свободной форме с помощью LLM (используя RAG, Retrieval-augmented Generation)

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

У этого подхода есть серьезный недостаток: лучшие LLM, такие как GPT-4, довольно дорогие, и если у вас большое количество запросов на поддержку, использование LLM может обойтись в крупную сумму.

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

6. Программирование: обеспечение актуальности всего

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

Мы должны обновлять векторное представление статей в Qdrant, если появляются новые статьи или меняются старые. Для этого мы используем ETL-фреймворк Datapipe, который автоматически отслеживает обновления, удаления и добавления контента. Мы запускаем процесс ETL каждые 15 минут. И если какое-либо содержимое в базе знаний меняется, Datapipe фиксирует изменения и пересчитывает вектора в Qdrant. Таким образом, новая информация становится доступной чат-боту через 15 минут после добавления в базу знаний.

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

Выводы проекта

В результате проекта у нас есть форк Chatwoot, который поддерживает работу ИИ-ассистента на основе базы знаний Chatwoot «из коробки», без дополнительной разработки.

Если вы используете на своих проектах Chatwoot, особенно без чат-бот-автоматизации, возможно, стоит перейти на наш форк Chatwoot, чтобы включить функциональность ИИ-ассистента.

Статистика

В результате реализации количество запросов на поддержку, обрабатываемых чат-ботом, увеличилось с 30% до 70%. Команда контента продолжает добавлять статьи, чтобы чат-бот мог обрабатывать всё больше и больше запросов.

Благодарности

Огромное спасибо команде NL International за доверие и возможность разработать для них ИИ-ассистента — мы назвали его Нелли. Поговорить с Нелли самостоятельно можно на сайте компании.

P. S. Отдельное спасибо команде проекта: Марии Родиной, Рустаму Каримову, Антону Гречкину, Сергею Серову. С нашей сторону руководил CEO/CTO Epoch8/AGIMA.AI Андрей Татаринов.

Что еще почитать

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


  1. Demon416
    03.04.2024 15:55

    Llm тут скорее вредны чем полезны, и вообще экспертные системы уже лет 50 как существуют, ИИ тут упоминать не стоит