- ИИ
- RAG
- Разработка
RAG для поддержки клиентов: как сделать ответы ИИ действительно точными
Обычная LLM придумывает правдоподобные ответы. Генерация с дополненной выборкой (RAG) привязывает ИИ к вашему собственному контенту. Вот как это устроено в AskAIs, шаг за шагом.
Команда AskAIs
7 мин чтения
Спросите обычную LLM «как сбросить пароль?» — и получите правдоподобный ответ, который, скорее всего, неверен: другая кнопка, другой порядок действий, другой URL. RAG (генерация с дополненной выборкой) решает эту проблему: перед ответом модели в промпт добавляются нужные фрагменты из вашего собственного контента.
Конвейер в общих чертах
Три этапа: загрузка, поиск, генерация.
1. Загрузка
- Загрузите файлы PDF, DOCX, TXT, Markdown, CSV или JSON, запустите обход сайта или добавьте пары вопрос-ответ в разделе Training.
- Фоновый обработчик извлекает текст и делит его на фрагменты примерно по 2000 символов (около 500 токенов) с перекрытием в 200 символов. Каждая пара вопрос-ответ остаётся одним фрагментом.
- Для каждого фрагмента создаётся эмбеддинг с помощью
text-embedding-3-small(размерность 1536). - Фрагменты хранятся в PostgreSQL с расширением
pgvectorи индексом HNSW по косинусному расстоянию.
2. Поиск
Когда для ответа на сообщение посетителя нужны факты, мы создаём эмбеддинг его недавних сообщений и выполняем поиск по косинусному расстоянию среди фрагментов рабочей области. Для приветствий и светской беседы этот шаг пропускается. Упрощённая версия запроса:
-- Simplified. The real query also checks that the document is
-- ready, enabled, in date and visible on the visitor's platform.
SELECT c.id, c.content,
1 - (c.embedding <=> $1::vector) AS similarity
FROM knowledge_chunks c
WHERE c.tenant_id = $2
ORDER BY c.embedding <=> $1::vector
LIMIT $3; -- 3 × top-K candidates, re-ranked afterwardsМы выбираем втрое больше кандидатов, чем нужно, переранжируем их, отбрасываем всё, что ниже порога сходства (около 0,3), оставляем не больше двух фрагментов на документ и передаём модели пять лучших (по умолчанию).
3. Генерация
Фрагменты добавляются в системный промпт внутри отделённого справочного блока. Модель получает указание считать этот блок данными, а не инструкциями, использовать только те справочные фрагменты, которые отвечают на вопрос, и не придумывать факты о продукте, которых там нет.
Если посетитель спрашивает о факте, касающемся продукта, и ничего релевантного не найдено, модель вообще не вызывается: посетителю сообщают, что такой информации нет, и чат передаётся человеку, если автоматическая передача не отключена.
Как снизить затраты
Три приёма делают большую базу знаний доступной по цене:
- Кэш эмбеддингов: один и тот же поисковый текст получает один и тот же эмбеддинг. Ключ кэша — имя модели плюс хеш SHA-1 текста; запись хранится в Redis 24 часа.
- Кэширование промптов: для моделей Claude запрос просит Anthropic закэшировать промпт, а OpenAI кэширует длинные промпты автоматически. Справочный блок меняется с каждым ответом, поэтому выигрывает в основном неизменная часть промпта.
- Пропуск по порогу: если ни один фрагмент не проходит порог, в промпт ничего не добавляется.
Когда RAG недостаточно
RAG хорошо справляется с вопросами вида «как мне…?». Но он не может ответить на вопрос «где мой заказ?», потому что этих данных нет в ваших документах.
Для этого в AskAIs есть Custom tools: вы описываете HTTP-эндпоинт в своей системе, например для заказов, бронирований или остатков на складе, и ИИ может вызвать его, пока пишет ответ. Общие вопросы решаются с помощью ваших знаний, личные — с помощью ваших систем, а остальное передаётся вашей команде.