Привет! На связи Ольга Татаринова, сооснователь компании 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, нам нужно решить две задачи:
Документы должны быть сегментированы так, чтобы каждый вектор соответствовал одной логической теме. Это важно, потому что чем больше текста кодируется, тем более средним и нечетким становится полученный вектор. Соответственно, становится сложнее определить какую-либо тему в нем. Поэтому важно изначально сегментировать документ на части, и здесь нет универсального решения. Обычно сегментация выполняется с использованием некоторых структурных эвристик (главы или абзацы), затем уточняется моделями для предсказания следующего предложения (NSP), например. И в конечном итоге проверяется человеком.
В контексте FAQ этот шаг не понадобился, так как у нас были только короткие ответы. Тем не менее, для обогащения поля поиска мы сгенерировали человекоподобные вопросы к ответам, а для вопросов (если таковые имелись) создали синтетическое «изображение ответа». Все это затем преобразуется в вектор и добавляется в примеры для целевой статьи.
Нам нужно выбрать эффективный метод генерации векторов. Мы использовали кодировщик от 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 Андрей Татаринов.
Demon416
Llm тут скорее вредны чем полезны, и вообще экспертные системы уже лет 50 как существуют, ИИ тут упоминать не стоит