Как сделать RAG-чат-бота по документам компании
Практика3 минРедакция Innovialabs
Коротко
RAG-бот находит в ваших документах фрагменты, релевантные вопросу, и передаёт их LLM, которая отвечает только по ним и указывает источник. Ключ к качеству — чистые данные, хорошее разбиение и контроль доступа на этапе поиска.
Как это работает в двух словах
RAG (Retrieval-Augmented Generation) — это схема, в которой языковая модель отвечает не «из головы», а по найденным фрагментам ваших документов. Бот не обучается на ваших данных: документы лежат в отдельном индексе, и при каждом вопросе система достаёт из него несколько самых подходящих кусков.
Конвейер состоит из двух частей:
- Индексация (один раз и при обновлениях): загрузка документов → извлечение текста → разбиение на чанки → эмбеддинги → запись в векторное хранилище.
- Ответ (на каждый вопрос): эмбеддинг вопроса → поиск похожих чанков → промпт с найденным контекстом → ответ LLM со ссылками.
Минимальный стек
Для первой рабочей версии не нужен сложный фреймворк:
| Слой | Вариант |
|---|---|
| Извлечение текста | парсер PDF/DOCX, для сканов — OCR |
| Эмбеддинги | API-модель или открытая мультиязычная модель |
| Хранилище | PostgreSQL + pgvector или Qdrant |
| LLM | любая модель с хорошим следованием инструкциям |
| Интерфейс | веб-виджет или Telegram-бот |
Шаг 1. Загрузка и очистка документов
Качество ответов ограничено качеством исходников. Перед индексацией:
- уберите дубли и устаревшие версии регламентов;
- извлекайте текст с сохранением заголовков и таблиц;
- для каждого документа сохраните метаданные: название, раздел, дата, ссылка, отдел или группа доступа.
Метаданные понадобятся для ссылок в ответе и для фильтрации.
Шаг 2. Разбиение на чанки
Документ режется на фрагменты, которые по отдельности понятны. Хорошая отправная точка — резать по структуре (заголовки, пункты), а длинные разделы делить рекурсивно с небольшим перекрытием. К каждому чанку полезно добавить заголовок раздела: «Отпуск → Порядок оформления» ищется лучше, чем голый абзац.
Шаг 3. Эмбеддинги и индекс
Каждый чанк превращается в вектор моделью эмбеддингов. Важно:
- вопросы и документы кодируются одной и той же моделью;
- если сотрудники пишут на русском и узбекском, проверьте модель на обоих языках;
- при смене модели индекс придётся пересчитать.
Шаг 4. Поиск
Базовый вариант — найти top-k ближайших чанков. Что заметно улучшает результат:
- гибридный поиск: векторный + полнотекстовый, чтобы находились артикулы, номера приказов и точные термины;
- реранкер: отдельная модель пересортировывает кандидатов по релевантности;
- фильтр по метаданным: отдел, тип документа, актуальность.
Шаг 5. Промпт с цитированием
Модели нужно явно запретить выдумывать. Пример структуры:
Отвечай только на основе фрагментов ниже.
Если ответа во фрагментах нет — скажи, что не нашёл информации.
После каждого утверждения укажи номер источника в квадратных скобках.
[1] Положение об отпусках, п. 3.2: ...
[2] Приказ о графике работы: ...
Вопрос: ...
В интерфейсе номера превращаются в ссылки на документы — так пользователь может проверить ответ.
Шаг 6. Контроль доступа
Самая частая ошибка — общий индекс, из которого бот отвечает всем обо всём. Права нужно проверять на этапе поиска, а не в промпте:
- у каждого чанка есть поле с группами доступа;
- при запросе в фильтр подставляются группы текущего пользователя;
- чанки, недоступные пользователю, вообще не попадают в контекст модели.
Просьба в промпте «не раскрывай конфиденциальное» защитой не является.
Частые ошибки
- Индексировать всё подряд, включая черновики и устаревшие версии.
- Слишком крупные чанки: в контекст попадает много лишнего.
- Нет набора тестовых вопросов, поэтому улучшения оцениваются «на глаз».
- Нет процесса обновления индекса при изменении документов.
Как проверить качество
Соберите 30–50 реальных вопросов сотрудников с правильными ответами и источниками. Проверяйте две вещи отдельно: нашёл ли поиск нужный фрагмент и правильно ли модель по нему ответила. Так вы поймёте, что чинить — поиск или промпт.