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. В ряде случаев мы жертвуем качеством ради цены.