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