Retrieval Augmented generation - генерация ответа с использованием результатов поиска. RAG-архитектура - это подход к созданию приложений, в которых большая языковая модель без дополнительного обучения отвечает на вопросы с использованием информации из внутренней базы знаний или документов компании. Я не описываю архитектуру, так как уже существует множество статей на эту тему (langchain, habr).

В этом году мы начали создавать RAG-систему для техподдержки клиентов в виде чат-бота. Бот парсит документацию/инструкции и отвечает на обращения пользователей в чате или по почте, как специалист первой линии поддержки. Сейчас система ежедневно обрабатывает 1000+ запросов и ей пользуются 10+ компаний.

Создать RAG может даже школьник, однако внедрить её в реальный бизнес - совершенно другая история. 

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

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

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

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

Инструкция: Что делать, если бот отвечает неправильно?

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

Если загрузить в бота неподготовленную базу знаний, бот будет отвечать, но иногда он не сможет найти ответ или ответ будет неточным.

Ядро  - большая языковая модель (далее LLM - Large Language Model). LLM обучается на текстах и большая часть успеха работы бота зависит от качества подготовленных материалов.

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

Общая логика при составлении документации:

  • Простой язык изложения статьи в документации;

  • Одна статья отвечает на один вопрос;

  • Упоминание близких по смыслу терминов при описании понятия, например: “Войти в аккаунт” и “Войти в личный кабинет”.

При получении запроса от пользователя последовательно запускаются модули:

  • Первая линия - Level 1 support (L1);

  • Семантический поиск в базе знаний;

  • Генерация ответа LLM на основе трех документов из базы знаний.

Первая линия (L1)

Первая линия (L1) – это список вопросов с точными ответами без изменений формулировок, в стиле FAQ.

L1 позволяет получить:

  • Ответ строго по регламенту;

  • Автоматическое переключение на оператора, если нужно исключить общение бота с клиентом;

  • Бюджетное решение задачи, так как L1 - дешевле, чем ответ по базе знаний, 

Особенности настройки L1:

  • Главный вопрос должен быть довольно узким, иначе ответ L1 будет срабатывать очень часто (и ошибочно по бизнес-логике);

  • Ответ должен быть чётким.

Варианты действия на вопрос пользователя:

  • Ответ;

  • Переключение на оператора.

Чтобы бот лучше понимал Главный вопрос, необходимо создать дополнительные формулировки - Похожие вопросы. Не больше 10 похожих вопросов для каждого главного.

Хороший пример L1

Главный вопрос: Стоимость (продукта/курса/услуги)?

Похожие вопросы:

  • Какая цена

  • Сколько стоит

  • Стоимость в месяц

  • Какие тарифы

Пояснение: Главный вопрос обобщает все похожие вопросы, но при этом содержит все ключевые слова из похожих вопросов

Плохой пример L1

Главный вопрос: Оставить жалобу

Похожие вопросы:

  • Ничего не работает

  • У вас плохой продукт

Пояснение: Главный вопрос чересчур сильно обобщает похожие вопросы. Такой вариант L1 будет срабатывать или очень часто, или очень редко. Главный вопрос должен быть вариацией одного из похожих вопросов с небольшим обобщением.

Семантический поиск в базе знаний

Семантический поиск ищет по индексу в базе знаний документы наиболее близкие по смыслу вопросу пользователя. Затем вопрос пользователя и три самых близких к нему документа подаются в LLM для генерации ответа. На этом этапе очень важно, чтобы статья в которой находится ответ на вопрос, попала в топ 3 (найденные статьи выделяются оранжевым, см рисунок).

Если по каким-то вопросам пользователей статья не находится, то можно усилить её вес. Необходимо добавить в статью контент. Чтобы бот лучше искал статьи, можно добавить альтернативные формулировки вопроса и синонимы. 

Генерация ответа LLM на основе трех документов из базы знаний

Получив вопрос и 3 документа, LLM дает ответ. Если бот дает неправильный ответ, то сначала нужно убедиться, что нужная статья находится (раздел Семантический поиск в базе знаний).

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

Если вопрос-ответ требует очень четких формулировок, а бот дает неточный ответ по найденной статье, то данный вопрос-ответ необходимо добавить в первую линию.

Алгоритм настройки ответ

Пользователь задал вопрос

1 Бот дал ответ?

2 - Да. Ответ правильный?

2.1 - Да, правильный → Успех.

2.2 - Да, правильный, но не точный → добавить вопрос и ответ в первую линию → Успех.

2.3 - Нет, неправильный → Скорее всего, он взял похожую информацию не из того документа. Нужно:

2.3.1 - Убедиться, что нужная статья находится (раздел Семантический поиск в базе знаний).

2.3.2 - Обогатить нужную статью, добавив синонимы и другие формулировки.

3 - Нет. Нужная статья находится в семантическом поиске?

3.1 - Да, находится → Обогатить нужную статью, добавив синонимы и другие формулировки → Запустить алгоритм снова.

3.2 - Нет, не находится → Обогатить нужную статью, добавив синонимы и другие формулировки → Запустить алгоритм снова.

Итоговые замечания

  1. Иногда встречаются вопросы, где пользователь затрагивает много тем, или задает в одном сообщении 2-3 вопроса, или сначала рассказывает историю. На такие сообщения бот обычно ответить не может и переключает на оператора. Важно понимать что не стоит под каждый вопрос добавлять L1 и дополнительный контент к статьям, т.к. чрезмерно оптимизируя ответ на единственный вопрос можно ухудшить работу системы на других вопросах.

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

Поэтому некоторые вопросы бот понимать не будет. Это связано с двумя вещами: А. Продукт ориентирован на быстрое внедрение под любой домен знаний, т.е. он не располагает глубинными знаниями вашей предметной области, а просто делает выводы на основе ваших баз знаний и документов. Б. Цена использования разных LLM может сильно отличаться, например цена gpt4 примерно в 10 больше gpt3. В ряде случаев мы жертвуем качеством ради цены.

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


  1. tomleto Автор
    26.12.2023 07:09

    Эта статья про то какими возможностями обладает наша RAG-система чтобы бизнес смог настроить её как нужно и про алгоритм настройки бота для конкретного бизнеса.

    О том как работает наша  RAG-система изнутри мы напишем отдельный пост.

    Тут лишь коротко опишу вариант решения проблем.

    Очень длинные сообщения от  пользователей

    Можно нормализовывать вопрос спрашивая LLM “Коротко сформулируй что хотел пользователь {message}”. И затем запускать основной алгоритм.

     Или можно сообщения больше 1000 символов переключать на оператора.

    Сообщения от пользователей в которых больше одного вопроса

    Можно сплитать по знакам вопроса “?” и задавать в LLM по отдельности.

    Можно спрашивать LLM “Выдели главный вопрос {message}” т.к. обычно вопросы связанные.  И затем запускать основной алгоритм. Наши клиенты говорят, даже если задача решена на половину это имеет пользу. 

    Оператор беря тикет может дополнить ответ, это быстрее чем искать информацию и отвечать полностью.

    Идентификация и обработка приветствий

    Тут тоже нет универсального решения, большинство кейсов может закрыть список заранее готовых фраз. Но никто не застрахован от “Превет медвет” и снова нужно подключать LLM.

    Почта, номер телефона и другие персональные данные 

    Их лучше всегда вырезать на входе, и для клиента и для качества ответа.

    Уточняющие вопросы

    Когда пользователь получил ответ LLM, он может задать уточняющий вопрос. Можно спросить LLM “Вопрос {message_2} это уточняющий вопрос к {answer_1}”. Если да из двух вопросов сделать один и  И затем запускать основной алгоритм.

    В общем деталей  очень много и нужна отдельная статья.