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 - Нет, не находится → Обогатить нужную статью, добавив синонимы и другие формулировки → Запустить алгоритм снова.
Итоговые замечания
Иногда встречаются вопросы, где пользователь затрагивает много тем, или задает в одном сообщении 2-3 вопроса, или сначала рассказывает историю. На такие сообщения бот обычно ответить не может и переключает на оператора. Важно понимать что не стоит под каждый вопрос добавлять L1 и дополнительный контент к статьям, т.к. чрезмерно оптимизируя ответ на единственный вопрос можно ухудшить работу системы на других вопросах.
Современные системы искусственного интеллекта могут понимать очень сложные вопросы в узкой теме если потратить много усилий на проектирование и обучение системы. Бот понимает опечатки и разные вариации вопроса, но пока больше похож на специалиста первой линии поддержки, который может понять простые и средние вопросы, но сложные или запутанные передает оператору.
Поэтому некоторые вопросы бот понимать не будет. Это связано с двумя вещами: А. Продукт ориентирован на быстрое внедрение под любой домен знаний, т.е. он не располагает глубинными знаниями вашей предметной области, а просто делает выводы на основе ваших баз знаний и документов. Б. Цена использования разных LLM может сильно отличаться, например цена gpt4 примерно в 10 больше gpt3. В ряде случаев мы жертвуем качеством ради цены.
