Типичный сценарий работы с BI-дашбордом: Открываешь дашборд → ищешь нужный фильтр → понимаешь, что среза нет → идёшь к разработчику → ждёшь. Время на простой вопрос: от часов до дней.
С AI-чатом: задаёшь вопрос на естественном языке → получаешь ответ за секунды.
Проблема BI-дашбордов
Ключевая проблема BI — чтобы найти ответ, нужно знать, как задать вопрос системе.
Что происходит при работе с дашбордом
| Шаг | Действие | Время |
|---|---|---|
| 1 | Поиск нужного дашборда (их 15 штук) | 2-5 минут |
| 2 | Выбор правильных фильтров | 3-10 минут |
| 3 | Понимание, что нужного среза нет | 1 минута |
| 4 | Обращение к разработчику | — |
| 5 | Ожидание доработки | часы-дни |
Пользователи хотят задавать вопросы на человеческом языке, а не изучать интерфейс BI.
Архитектура RAG-системы для аналитики
Система состоит из трёх компонентов, каждый решает свою задачу.
Компоненты системы
| Компонент | Назначение | Когда используется |
|---|---|---|
| LLM Router | определяет тип запроса | каждый запрос |
| SQL Generator | генерирует SQL по естественному языку | точные запросы с агрегацией |
| RAG Search | семантический поиск по векторной базе | запросы с синонимами |
| Aggregator | возвращает предрасчитанные данные | частые запросы |
↓
LLM Router (определение типа)
↓
┌───┴───┬──────────┐
↓ ↓ ↓
SQL Gen RAG Aggregator
↓ ↓ ↓
└───┬───┴──────────┘
↓
Форматирование ответа
↓
Ответ в чат
Вся цепочка занимает 3-15 секунд.
SQL Generator — генерация запросов из текста
Преобразует естественный язык в SQL для конкретной схемы данных.
Принцип работы:
- Пользователь: "Топ-5 компаний по количеству экскаваторов"
- Система генерирует SQL:
SEL ECT company_name, COUNT(*) FR OM vehicles WHERE vehicle_type = 'экскаватор' GROUP BY company_name ORDER BY COUNT(*) DESC LIMIT 5 - Выполняет запрос
- Форматирует результат в текст
Проблема: галлюцинации SQL
Языковая модель может генерировать несуществующие колонки или таблицы.
Решение — валидация перед выполнением:
- Проверка, что запрос начинается с SELECT
- Блокировка опасных команд (DROP, DELETE, UPDATE)
- Проверка существования всех упомянутых колонок
- Принудительное добавление LIMIT, если его нет
- Таймаут выполнения (5 секунд)
Без валидации система может выполнить некорректный SQL или зависнуть.
RAG Search — семантический поиск
Пользователь пишет "грузовики для нефти", в базе это "бензовоз" или "автоцистерна". SQL Generator не справится — нужен семантический поиск.
Индексация синонимов
| Тип техники в БД | Синонимы для поиска |
|---|---|
| бензовоз | автоцистерна, топливозаправщик, грузовик для нефти, цистерна для топлива |
| автовоз | автомобилевоз, транспортировщик машин, перевозчик авто |
| экскаватор | землеройная машина, копатель, ковшовый экскаватор |
Процесс поиска:
- Запрос пользователя → эмбеддинг
- Поиск ближайшего вектора в базе
- Если similarity > 0.7 → найден точный термин
- Обогащение запроса: "грузовики для нефти" → "[Тип техники в базе: бензовоз]"
- Передача обогащённого запроса в SQL Generator
RAG устраняет разрыв между языком пользователя и терминологией БД.
Aggregator — предрасчитанные агрегаты
600 000 записей — не big data, но без оптимизации аналитические запросы выполняются секунды.
Проблема: медленные запросы
| Запрос | Время без оптимизации |
|---|---|
| Топ компаний по типам техники | 3-5 секунд |
| Техника по регионам | 2-4 секунды |
| Статистика лизинговых компаний | 4-6 секунд |
Решение: популярные агрегаты рассчитываются заранее и хранятся в кэше. Обновление: раз в сутки (ночью). Время ответа: менее 1 секунды. Router определяет по паттернам запроса, можно ли ответить из кэша.
| Паттерн запроса | Источник данных |
|---|---|
| "топ компаний", "рейтинг" | предрасчитанный агрегат |
| "сколько в регионе" | предрасчитанный агрегат |
| конкретное название компании | SQL Generator |
| синонимы типов техники | RAG + SQL Generator |
Кэширование ускоряет частые запросы в 10-15 раз.
Обработка запроса: полный цикл
Пример: "Компании с грузовиками для нефтепродуктов в Татарстане"
RAG Search: "грузовики для нефтепродуктов" → "бензовоз" ↓
Обогащение запроса: добавляется контекст [Тип: бензовоз] ↓
SQL Generator: создаёт запрос с условиями WHERE vehicle_type='бензовоз' AND region='Татарстан' ↓
Валидация: проверка колонок и безопасности ↓
Выполнение: запрос к PostgreSQL с LIMIT и таймаутом ↓
Форматирование: языковая модель превращает таблицу в текст ↓
Ответ: "Найдено 47 компаний с бензовозами в Татарстане. Топ-5: ..."
Время: 5 секунд.
Форматирование ответа
Языковая модель генерирует человекочитаемый ответ из табличных данных.
Входные данные: SQL результат + исходный вопрос. Выходные данные: текст с ключевыми цифрами.
Для коротких результатов (до 10 строк) — текстовый ответ с нумерацией. Для длинных (более 10 строк) — краткое резюме + предложение экспорта.
Пример:
Вопрос: "Топ-5 компаний по экскаваторам"
Данные: [(ООО "Стройтех", 234), (ООО "Землемаш", 189), ...]
Ответ: "Топ-5 компаний по количеству экскаваторов:
1. ООО 'Стройтех' — 234 единицы
2. ООО 'Землемаш' — 189 единиц ..."
Результаты внедрения
Сравнение подходов
| Параметр | BI-дашборд | AI-чат |
|---|---|---|
| Время на ответ | 5-30 минут | 3-15 секунд |
| Требуется обучение | существенное | нет |
| Доступность | только аналитики | любой сотрудник |
| Гибкость запросов | ограничена готовыми срезами | любой вопрос на естественном языке |
Метрики за месяц работы:
- • 1200 запросов обработано
- • 94% успешно отвечены без участия человека
- • 6% потребовали уточнения
Типичные запросы
| Запрос | Источник | Время |
|---|---|---|
| "Сколько экскаваторов у Сбербанк Лизинг?" | SQL | 3 сек |
| "Грузовики для нефтепродуктов в Татарстане" | RAG + SQL | 5 сек |
| "Динамика лизинга за 2024-2025" | кэш агрегатов | 2 сек |
Технические вызовы
| Проблема | Решение |
|---|---|
| LLM галлюцинирует названия колонок | строгая валидация SQL |
| Пользователи не знают точных терминов | RAG для семантического обогащения |
| Медленные аналитические запросы | предрасчитанные агрегаты |
| Сложно отлаживать | логирование всего пайплайна |
| Пользователи ожидают магии | честные ограничения в интерфейсе |
Главный вызов — управление ожиданиями. Система не всемогуща, но для 94% запросов работает отлично.
RAG-система для аналитики — альтернатива традиционным BI-дашбордам. Ключевые компоненты: SQL Generator для точных запросов, RAG Search для семантического обогащения, Aggregator для частых запросов и Router для маршрутизации.
Преимущества перед BI: не требует обучения пользователей, отвечает на произвольные вопросы, работает на естественном языке. Правильная стратегия: RAG для 90% рутинных запросов, BI-дашборды для сложной аналитики.
Частые вопросы
Почему не просто подключить LLM к базе данных?
LLM будет галлюцинировать названия колонок и таблиц, генерировать некорректный SQL. Нужна валидация: проверка существования колонок, блокировка опасных команд, таймауты. Плюс RAG для обработки синонимов.
Как обрабатываются медленные запросы?
Популярные агрегаты предрасчитываются раз в сутки и хранятся в кэше. Router по паттернам запроса определяет, можно ли ответить из кэша (время <1 сек).
Какой процент запросов не обрабатывается автоматически?
6% за месяц. Причины: слишком сложная аналитика (JOIN нескольких таблиц), неоднозначная формулировка или запрос данных, которых нет в базе.
